NamingManager.py

説明を見る。
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file NamingManager.py
00006 # @brief naming Service helper class
00007 # @date $Date: 2007/08/27$
00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00009 #
00010 # Copyright (C) 2006-2008
00011 #     Task-intelligence Research Group,
00012 #     Intelligent Systems Research Institute,
00013 #     National Institute of
00014 #         Advanced Industrial Science and Technology (AIST), Japan
00015 #     All rights reserved.
00016 
00017 
00018 import threading
00019 import traceback
00020 import sys
00021 
00022 import OpenRTM
00023 
00024 
00025 
00026 ##
00027 # @if jp
00028 # @class ScopedLock
00029 # @brief ScopedLock クラス
00030 #
00031 # 排他処理用ロッククラス。
00032 #
00033 # @since 0.4.0
00034 #
00035 # @else
00036 #
00037 # @endif
00038 class ScopedLock:
00039 
00040 
00041 
00042   ##
00043   # @if jp
00044   # @brief コンストラクタ
00045   #
00046   # コンストラクタ
00047   #
00048   # @param self
00049   # @param mutex ロック用ミューテックス
00050   #
00051   # @else
00052   #
00053   # @endif
00054   def __init__(self, mutex):
00055     self.mutex = mutex
00056     self.mutex.acquire()
00057 
00058 
00059   ##
00060   # @if jp
00061   # @brief デストラクタ
00062   #
00063   # デストラクタ
00064   #
00065   # @param self
00066   #
00067   # @else
00068   #
00069   # @endif
00070   def __del__(self):
00071     self.mutex.release()
00072 
00073 
00074 
00075 ##
00076 # @if jp
00077 #
00078 # @class NamingBase
00079 # @brief NamingService 管理用抽象クラス
00080 #
00081 # NamingServer 管理用抽象インターフェースクラス。
00082 # 具象管理クラスは、以下の関数の実装を提供しなければならない。
00083 # - bindObject() : 指定したオブジェクトのNamingServiceへのバインド
00084 # - unbindObject() : 指定したオブジェクトのNamingServiceからのアンバインド
00085 #
00086 # @since 0.4.0
00087 #
00088 # @else
00089 #
00090 # @endif
00091 class NamingBase:
00092 
00093 
00094 
00095   ##
00096   # @if jp
00097   #
00098   # @brief NamingServiceへバインドする関数(サブクラス実装用)
00099   #
00100   # 指定したオブジェクトをNamingServiceへバインドする<BR>
00101   # ※サブクラスでの実装参照用
00102   #
00103   # @param self
00104   # @param name バインド時の名称
00105   # @param rtobj バインド対象オブジェクト
00106   #
00107   # @else
00108   #
00109   # @endif
00110   def bindObject(self, name, rtobj):
00111     pass
00112 
00113 
00114   ##
00115   # @if jp
00116   #
00117   # @brief NamingServiceからアンバインドする関数(サブクラス実装用)
00118   #
00119   # 指定したオブジェクトをNamingServiceからアンバインドする<BR>
00120   # ※サブクラスでの実装参照用
00121   #
00122   # @param self
00123   # @param name アンバインド対象オブジェクト
00124   #
00125   # @else
00126   #
00127   # @endif
00128   def unbindObject(self, name):
00129     pass
00130 
00131 
00132 
00133 ##
00134 # @if jp
00135 #
00136 # @class NamingOnCorba
00137 # @brief CORBA 用 NamingServer 管理クラス
00138 #
00139 # CORBA 用 NamingServer 管理用クラス。
00140 # CORBA コンポーネントのNamingServiceへの登録、解除などを管理する。
00141 #
00142 # @since 0.4.0
00143 #
00144 # @else
00145 #
00146 # @biref ModuleManager class
00147 #
00148 # @endif
00149 class NamingOnCorba(NamingBase):
00150 
00151 
00152 
00153   ##
00154   # @if jp
00155   #
00156   # @brief コンストラクタ
00157   #
00158   # コンストラクタ
00159   #
00160   # @param self
00161   # @param orb ORB
00162   # @param names NamingServer 名称
00163   #
00164   # @else
00165   #
00166   # @endif
00167   def __init__(self, orb, names):
00168     self._cosnaming = OpenRTM.CorbaNaming(orb,names)
00169 
00170 
00171   ##
00172   # @if jp
00173   #
00174   # @brief 指定した CORBA オブジェクトのNamingServiceへバインド
00175   # 
00176   # 指定した CORBA オブジェクトを指定した名称で CORBA NamingService へ
00177   # バインドする。
00178   # 
00179   # @param self
00180   # @param name バインド時の名称
00181   # @param rtobj バインド対象オブジェクト
00182   #
00183   # @else
00184   #
00185   # @endif
00186   def bindObject(self, name, rtobj):
00187     try:
00188       self._cosnaming.rebindByString(name, rtobj.getObjRef(), True)
00189     except:
00190       pass
00191 
00192 
00193   ##
00194   # @if jp
00195   #
00196   # @brief 指定した CORBA オブジェクトをNamingServiceからアンバインド
00197   # 
00198   # 指定した CORBA オブジェクトを CORBA NamingService からアンバインドする。
00199   # 
00200   # @param self
00201   # @param name アンバインド対象オブジェクト
00202   #
00203   # @else
00204   #
00205   # @endif
00206   def unbindObject(self, name):
00207     try:
00208       self._cosnaming.unbind(name)
00209     except:
00210       traceback.print_exception(*sys.exc_info())
00211 
00212 
00213 
00214 ##
00215 # @if jp
00216 #
00217 # @class NamingManager
00218 # @brief NamingServer 管理クラス
00219 #
00220 # NamingServer 管理用クラス。
00221 # コンポーネントのNamingServiceへの登録、解除などを管理する。
00222 #
00223 # @since 0.4.0
00224 #
00225 # @else
00226 #
00227 # @biref ModuleManager class
00228 #
00229 # @endif
00230 class NamingManager:
00231   """
00232   """
00233 
00234 
00235 
00236   ##
00237   # @if jp
00238   #
00239   # @brief コンストラクタ
00240   #
00241   # コンストラクタ
00242   #
00243   # @param self
00244   # @param manager マネージャオブジェクト
00245   #
00246   # @else
00247   #
00248   # @endif
00249   def __init__(self, manager):
00250     self._manager = manager
00251     self._rtcout = manager.getLogbuf()
00252     #self._rtcout.setLogLevel(manager.getConfig().getProperty("logger.log_level"))
00253     #self._rtcout.setLogLock(OpenRTM.toBool(manager.getConfig().getProperty("logger.stream_lock"), "enable", "disable", False))
00254     self._names = []
00255     self._namesMutex = threading.RLock()
00256     self._compNames = []
00257     self._compNamesMutex = threading.RLock()
00258 
00259 
00260   ##
00261   # @if jp
00262   #
00263   # @brief NameServer の登録
00264   #
00265   # 指定した形式の NameServer を登録する。
00266   # 現在指定可能な形式は CORBA のみ。
00267   #
00268   # @param self
00269   # @param method NamingService の形式
00270   # @param name_server 登録する NameServer の名称
00271   #
00272   # @else
00273   #
00274   # @endif
00275   def registerNameServer(self, method, name_server):
00276     self._rtcout.RTC_TRACE("NamingManager::registerNameServer(%s, %s)",
00277                  (method, name_server))
00278     name = self.createNamingObj(method, name_server)
00279     self._names.append(self.Names(method, name_server, name))
00280 
00281 
00282   ##
00283   # @if jp
00284   #
00285   # @brief 指定したオブジェクトのNamingServiceへバインド
00286   # 
00287   # 指定したオブジェクトを指定した名称で CORBA NamingService へバインドする。
00288   # 
00289   # @param self
00290   # @param name バインド時の名称
00291   # @param rtobj バインド対象オブジェクト
00292   #
00293   # @else
00294   #
00295   # @endif
00296   def bindObject(self, name, rtobj):
00297     self._rtcout.RTC_TRACE("NamingManager::bindObject(%s)", name)
00298     guard = ScopedLock(self._namesMutex)
00299     for i in range(len(self._names)):
00300       if self._names[i].ns:
00301         self._names[i].ns.bindObject(name, rtobj)
00302     self.registerCompName(name, rtobj)
00303 
00304 
00305   ##
00306   # @if jp
00307   #
00308   # @brief NamingServer の情報の更新
00309   # 
00310   # 設定されている NameServer 内に登録されているオブジェクトの情報を
00311   # 更新する。
00312   # 
00313   # @param self
00314   # 
00315   # @else
00316   #
00317   # @endif
00318   def update(self):
00319     self._rtcout.RTC_TRACE("NamingManager::update()")
00320     guard = ScopedLock(self._namesMutex)
00321     for i in range(len(self._names)):
00322       if self._names[i].ns is None:
00323         nsobj = self.createNamingObj(self._names[i].method,
00324                        self._names[i].nsname)
00325         if nsobj:
00326           self._rtcout.RTC_INFO("New name server found: %s/%s",
00327                       (self._names[i].method,
00328                       self._names[i].nsname))
00329           self._names[i].ns = nsobj
00330           self.bindCompsTo(nsobj)
00331 
00332 
00333   ##
00334   # @if jp
00335   #
00336   # @brief 指定したオブジェクトをNamingServiceからアンバインド
00337   # 
00338   # 指定したオブジェクトを NamingService からアンバインドする。
00339   # 
00340   # @param self
00341   # @param name アンバインド対象オブジェクト
00342   #
00343   # @else
00344   #
00345   # @endif
00346   def unbindObject(self, name):
00347     self._rtcout.RTC_TRACE("NamingManager::unbindObject(%s)", name)
00348     guard = ScopedLock(self._namesMutex)
00349     for i in range(len(self._names)):
00350       if self._names[i].ns:
00351         self._names[i].ns.unbindObject(name)
00352     self.unregisterCompName(name)
00353 
00354 
00355   ##
00356   # @if jp
00357   #
00358   # @brief 全てのオブジェクトをNamingServiceからアンバインド
00359   # 
00360   # 全てのオブジェクトを CORBA NamingService からアンバインドする。
00361   # 
00362   # @param self
00363   # 
00364   # @else
00365   #
00366   # @endif
00367   def unbindAll(self):
00368     self._rtcout.RTC_TRACE("NamingManager::unbindAll(): %d names.", len(self._compNames))
00369     guard = ScopedLock(self._compNamesMutex)
00370     for i in range(len(self._compNames)):
00371       self.unbindObject(self._compNames[i].name)
00372 
00373 
00374   ##
00375   # @if jp
00376   #
00377   # @brief バインドされている全てのオブジェクトを取得
00378   # 
00379   # バインドされている全てのオブジェクトを 取得する。
00380   # 
00381   # @param self
00382   #
00383   # @return バインド済みオブジェクト リスト
00384   # 
00385   # @else
00386   #
00387   # @endif
00388   def getObjects(self):
00389     comps = []
00390     guard = ScopedLock(self._compNamesMutex)
00391     for i in range(len(self._compNames)):
00392       comps.append(self._compNames[i].rtobj)
00393     return comps
00394 
00395 
00396   ##
00397   # @if jp
00398   #
00399   # @brief NameServer 管理用オブジェクトの生成
00400   # 
00401   # 指定した型のNameServer 管理用オブジェクトを生成する。
00402   #
00403   # @param self
00404   # @param method NamingService 形式
00405   # @param name_server NameServer 名称
00406   # 
00407   # @return 生成した NameServer オブジェクト
00408   # 
00409   # @else
00410   #
00411   # @endif
00412   def createNamingObj(self, method, name_server):
00413     mth = method
00414     if mth == "corba":
00415       try:
00416         name = OpenRTM.NamingOnCorba(self._manager.getORB(),name_server)
00417         if name is None:
00418           return None
00419         self._rtcout.RTC_INFO("NameServer connection succeeded: %s/%s",
00420                     (method, name_server))
00421         return name
00422       except:
00423         self._rtcout.RTC_INFO("NameServer connection failed: %s/%s",
00424                     (method, name_server))
00425         return None
00426 
00427     return None
00428 
00429 
00430   ##
00431   # @if jp
00432   #
00433   # @brief 設定済みコンポーネントを NameServer に登録
00434   # 
00435   # 設定済みコンポーネントを指定した NameServer に登録する。
00436   #
00437   # @param self
00438   # @param ns 登録対象 NameServer
00439   # 
00440   # @else
00441   #
00442   # @endif
00443   def bindCompsTo(self, ns):
00444     for i in range(len(self._compNames)):
00445       ns.bindObject(self._compNames[i].name, self._compNames[i].rtobj)
00446 
00447 
00448   ##
00449   # @if jp
00450   #
00451   # @brief NameServer に登録するコンポーネントの設定
00452   # 
00453   # NameServer に登録するコンポーネントを設定する。
00454   #
00455   # @param self
00456   # @param name コンポーネントの登録時名称
00457   # @param rtobj 登録対象オブジェクト
00458   # 
00459   # @else
00460   #
00461   # @endif
00462   def registerCompName(self, name, rtobj):
00463     for i in range(len(self._compNames)):
00464       if self._compNames[i].name == name:
00465         self._compNames[i].rtobj = rtobj
00466         return
00467 
00468     self._compNames.append(self.Comps(name, rtobj))
00469     return
00470 
00471 
00472   ##
00473   # @if jp
00474   #
00475   # @brief NameServer に登録するコンポーネントの設定解除
00476   # 
00477   # NameServer に登録するコンポーネントの設定を解除する。
00478   #
00479   # @param self
00480   # @param name 設定解除対象コンポーネントの名称
00481   # 
00482   # @else
00483   #
00484   # @endif
00485   def unregisterCompName(self, name):
00486     len_ = len(self._compNames)
00487     for i in range(len_):
00488       idx = (len_-1) - i
00489       if self._compNames[idx].name == name:
00490         del self._compNames[idx]
00491         return
00492     return
00493     
00494 
00495 
00496   # Name Servers' method/name and object
00497   ##
00498   # @if jp
00499   # @class Names
00500   # @brief NameServer 管理用クラス
00501   # @else
00502   #
00503   # @endif
00504   class Names:
00505     def __init__(self, meth, name, naming):
00506       self.method = meth
00507       self.nsname = name
00508       self.ns     = naming
00509 
00510 
00511   # Components' name and object
00512   ##
00513   # @if jp
00514   # @class Comps
00515   # @brief コンポーネント管理用クラス
00516   # @else
00517   #
00518   # @endif
00519   class Comps:
00520     def __init__(self, n, obj):
00521       self.name = n
00522       self.rtobj = obj

OpenRTMに対してMon Mar 17 15:11:05 2008に生成されました。  doxygen 1.5.4