ConfigAdmin.py

説明を見る。
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*- 
00003 
00004 ##
00005 # @file ConfigAdmin.py
00006 # @brief Configuration Administration classes
00007 # @date $Date: 2007/09/04$
00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00009 # 
00010 # Copyright (C) 2007-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 
00019 import copy
00020 import OpenRTM
00021 
00022 
00023 ##
00024 # @if jp
00025 # @class ConfigBase
00026 # @brief ConfigBase 抽象クラス
00027 # 
00028 # 各種コンフィギュレーション情報を保持するための抽象クラス。
00029 # 具象コンフィギュレーションクラスは、以下の関数の実装を提供しなけれ
00030 # ばならない。
00031 # 
00032 # publicインターフェースとして以下のものを提供する。
00033 #  - update(): コンフィギュレーションパラメータ値の更新
00034 # 
00035 # @since 0.4.0
00036 # 
00037 # @else
00038 # 
00039 # @endif
00040 class ConfigBase:
00041 
00042 
00043 
00044   ##
00045   # @if jp
00046   # 
00047   # @brief コンストラクタ
00048   # 
00049   # コンストラクタ
00050   # 
00051   # @param self 
00052   # @param name コンフィギュレーション名
00053   # @param def_val 文字列形式のデフォルト値
00054   # 
00055   # @else
00056   # 
00057   # @endif
00058   def __init__(self, name, def_val):
00059     self.name = name
00060     self.default_value = def_val
00061 
00062 
00063   ##
00064   # @if jp
00065   # 
00066   # @brief コンフィギュレーションパラメータ値更新用関数(サブクラス実装用)
00067   # 
00068   # コンフィギュレーション設定値でコンフィギュレーションパラメータを更新する
00069   # ための関数。<BR>
00070   # ※サブクラスでの実装参照用
00071   # 
00072   # @param self 
00073   # @param val パラメータ値の文字列表現
00074   # 
00075   # @return 設定結果
00076   # 
00077   # @else
00078   # 
00079   # @endif
00080   def update(self, val):
00081     pass
00082 
00083 
00084 
00085 ##
00086 # @if jp
00087 # @class Config
00088 # @brief Config クラス
00089 # 
00090 # コンフィギュレーションパラメータの情報を保持するクラス。
00091 # コンフィギュレーションのデータ型と設定されたデータ型を文字列に変換する
00092 # 変換関数を指定する。
00093 # 
00094 # @since 0.4.0
00095 # 
00096 # @else
00097 # 
00098 # @endif
00099 class Config(ConfigBase):
00100 
00101 
00102 
00103   ##
00104   # @if jp
00105   # 
00106   # @brief コンストラクタ
00107   # 
00108   # コンストラクタ
00109   # 
00110   # @param self 
00111   # @param name コンフィギュレーションパラメータ名
00112   # @param var コンフィギュレーションパラメータ格納用変数
00113   # @param def_val 文字列形式のデフォルト値
00114   # @param trans 文字列形式変換関数(デフォルト値:None)
00115   # 
00116   # @else
00117   # 
00118   # @endif
00119   def __init__(self, name, var, def_val, trans=None):
00120     ConfigBase.__init__(self, name, def_val)
00121     self._var = var
00122     if trans:
00123       self._trans = trans
00124     else:
00125       self._trans = OpenRTM.stringTo
00126 
00127 
00128   ##
00129   # @if jp
00130   # 
00131   # @brief バインドパラメータ値を更新
00132   # 
00133   # コンフィギュレーション設定値でコンフィギュレーションパラメータを更新する
00134   # 
00135   # @param self 
00136   # @param val パラメータ値の文字列表現
00137   # 
00138   # @return 更新処理結果(更新成功:true,更新失敗:false)
00139   # 
00140   # @else
00141   # 
00142   # @endif
00143   def update(self, val):
00144     if self._trans(self._var, val):
00145       return True
00146     self._trans(self._var, self._default_value)
00147     return False
00148 
00149 
00150 
00151 ##
00152 # @if jp
00153 # @class ConfigAdmin
00154 # @brief ConfigAdmin クラス
00155 # 
00156 # 各種コンフィギュレーション情報を管理するクラス。
00157 # 
00158 # @since 0.4.0
00159 # 
00160 # @else
00161 # 
00162 # @endif
00163 class ConfigAdmin:
00164   """
00165   """
00166 
00167 
00168 
00169   ##
00170   # @if jp
00171   # 
00172   # @brief コンストラクタ
00173   # 
00174   # コンストラクタ
00175   # 
00176   # @param self 
00177   # @param configsets 設定対象プロパティ名
00178   # 
00179   # @else
00180   # 
00181   # @endif
00182   def __init__(self, configsets):
00183     self._configsets = configsets
00184     self._activeId   = "default"
00185     self._active     = True
00186     self._changed    = False
00187     self._params     = []
00188     self._emptyconf  = OpenRTM.Properties()
00189     self._newConfig  = []
00190 
00191 
00192   ##
00193   # @if jp
00194   # 
00195   # @brief デストラクタ
00196   # 
00197   # デストラクタ。
00198   # 設定されているパラメータを削除する。
00199   # 
00200   # @param self 
00201   # 
00202   # @else
00203   # 
00204   # @endif
00205   def __del__(self):
00206     del self._params
00207 
00208 
00209   ##
00210   # @if jp
00211   # 
00212   # @brief コンフィギュレーションパラメータの設定
00213   # 
00214   # コンフィギュレーションパラメータと変数をバインドする
00215   # 指定した名称のコンフィギュレーションパラメータが既に存在する場合は
00216   # falseを返す。
00217   # 
00218   # @param self 
00219   # @param param_name コンフィギュレーションパラメータ名
00220   # @param var コンフィギュレーションパラメータ格納用変数
00221   # @param def_val コンフィギュレーションパラメータデフォルト値
00222   # @param trans コンフィギュレーションパラメータ文字列変換用関数
00223   #             (デフォルト値:None)
00224   # 
00225   # @return 設定結果(設定成功:true,設定失敗:false)
00226   # 
00227   # @else
00228   # 
00229   # @endif
00230   def bindParameter(self, param_name, var, def_val, trans=None):
00231     if trans is None:
00232       trans = OpenRTM.stringTo
00233     
00234     if self.isExist(param_name):
00235       return False
00236 
00237     if not OpenRTM.stringTo(var, def_val):
00238       return False
00239     
00240     self._params.append(Config(param_name, var, def_val, trans))
00241     return True
00242 
00243 
00244   ##
00245   # @if jp
00246   # 
00247   # @brief コンフィギュレーションパラメータの更新
00248   # 
00249   # 引数の設定状況によって以下の処理を行う。
00250   # - config_setのみが設定されている場合
00251   #     指定したIDのコンフィギュレーションセットに設定した値で、
00252   #     コンフィギュレーションパラメータの値を更新する。
00253   #     指定したIDのコンフィギュレーションセットが存在しない場合は、
00254   #     何もせずに終了する。
00255   # - config_setとconfig_paramが設定されている場合
00256   #     指定したパスのコンフィギュレーションに設定した値で、
00257   #     コンフィギュレーションパラメータの値を更新する。
00258   # - config_setとconfig_paramが両方とも設定されていない場合
00259   #     コンフィギュレーションセットが更新されている場合に、
00260   #     現在アクティブになっているコンフィギュレーションに設定した値で、
00261   #     コンフィギュレーションパラメータの値を更新する。
00262   #     この処理での更新は、アクティブとなっているコンフィギュレーションセット
00263   #     が存在している場合、前回の更新からコンフィギュレーションセットの内容が
00264   #     更新されている場合のみ実行される。
00265   # 
00266   # @param self 
00267   # @param config_set コンフィギュレーション名称。「.」区切りで最後の要素を
00268   #                   除いた名前
00269   # @param config_param コンフィギュレーションセットの最後の要素名
00270   # 
00271   # @else
00272   # 
00273   # @endif
00274   def update(self, config_set=None, config_param=None):
00275     # update(const char* config_set)
00276     if config_set and config_param is None:
00277       if self._configsets.hasKey(config_set) is None:
00278         return
00279       prop = self._configsets.getNode(config_set)
00280       for i in range(len(self._params)):
00281         if prop.hasKey(self._params[i].name):
00282           self._params[i].update(prop.getProperty(self._params[i].name))
00283 
00284     # update(const char* config_set, const char* config_param)
00285     if config_set and config_param:
00286       key = config_set
00287       key = key+"."+config_param
00288       for conf in self._params:
00289         if conf.name == config_param:
00290           conf.update(self._configsets.getProperty(key))
00291           return
00292 
00293     # update()
00294     if config_set is None and config_param is None:
00295       if self._changed and self._active:
00296         self.update(self._activeId)
00297         self._changed = False
00298       return
00299 
00300 
00301   ##
00302   # @if jp
00303   # 
00304   # @brief コンフィギュレーションパラメータの存在確認
00305   # 
00306   # 指定した名称を持つコンフィギュレーションパラメータが存在するか確認する。
00307   # 
00308   # @param self 
00309   # @param param_name コンフィギュレーションパラメータ名称。
00310   # 
00311   # @return 存在確認結果(パラメータあり:true,パラメータなし:false)
00312   # 
00313   # @else
00314   # 
00315   # @endif
00316   def isExist(self, param_name):
00317     if self._params is None:
00318       return False
00319     
00320     for conf in self._params:
00321       if conf.name == param_name:
00322         return True
00323 
00324     return False
00325 
00326 
00327   ##
00328   # @if jp
00329   # 
00330   # @brief コンフィギュレーションパラメータの変更確認
00331   # 
00332   # コンフィギュレーションパラメータが変更されたか確認する。
00333   # 
00334   # @param self 
00335   # 
00336   # @return 変更確認結果(変更あり:true、変更なし:false)
00337   # 
00338   # @else
00339   # 
00340   # @endif
00341   def isChanged(self):
00342     return self._changed
00343 
00344 
00345   ##
00346   # @if jp
00347   # 
00348   # @brief アクティブ・コンフィギュレーションセットIDの取得
00349   # 
00350   # 現在アクティブなコンフィギュレーションセットのIDを取得する。
00351   # 
00352   # @param self 
00353   # 
00354   # @return アクティブ・コンフィギュレーションセットID
00355   # 
00356   # @else
00357   # 
00358   # @endif
00359   def getActiveId(self):
00360     return self._activeId
00361 
00362 
00363   ##
00364   # @if jp
00365   # 
00366   # @brief コンフィギュレーションセットの存在確認
00367   # 
00368   # 指定したコンフィギュレーションセットが存在するか確認する。
00369   # 
00370   # @param self 
00371   # @param config_id 確認対象コンフィギュレーションセットID
00372   # 
00373   # @return 存在確認結果(指定したConfigSetあり:true、なし:false)
00374   # 
00375   # @else
00376   # 
00377   # @endif
00378   def haveConfig(self, config_id):
00379     if self._configsets.hasKey(config_id) is None:
00380       return False
00381     else:
00382       return True
00383 
00384 
00385   ##
00386   # @if jp
00387   # 
00388   # @brief コンフィギュレーションセットのアクティブ化確認
00389   # 
00390   # コンフィギュレーションセットがアクティブ化されているか確認する。
00391   # 
00392   # @param self 
00393   # 
00394   # @return 状態確認結果(アクティブ状態:true、非アクティブ状態:false)
00395   # 
00396   # @else
00397   # 
00398   # @endif
00399   def isActive(self):
00400     return self._active
00401 
00402 
00403   ##
00404   # @if jp
00405   # 
00406   # @brief 全コンフィギュレーションセットの取得
00407   # 
00408   # 設定されている全コンフィギュレーションセットを取得する。
00409   # 
00410   # @param self 
00411   # 
00412   # @return 全コンフィギュレーションセット
00413   # 
00414   # @else
00415   # 
00416   # @endif
00417   def getConfigurationSets(self):
00418     return self._configsets.getLeaf()
00419 
00420 
00421   ##
00422   # @if jp
00423   # 
00424   # @brief 指定したIDのコンフィギュレーションセットの取得
00425   # 
00426   # IDで指定したコンフィギュレーションセットを取得する。
00427   # 指定したコンフィギュレーションセットが存在しない場合は、
00428   # 空のコンフィギュレーションセットを返す。
00429   # 
00430   # @param self 
00431   # @param config_id 取得対象コンフィギュレーションセットのID
00432   # 
00433   # @return コンフィギュレーションセット
00434   # 
00435   # @else
00436   # 
00437   # @endif
00438   def getConfigurationSet(self, config_id):
00439     prop = self._configsets.getNode(config_id)
00440     if prop is None:
00441       return self._emptyconf
00442     return prop
00443 
00444 
00445   ##
00446   # @if jp
00447   # 
00448   # @brief 指定したプロパティのコンフィギュレーションセットへの追加
00449   # 
00450   # 指定したプロパティをIDで指定したコンフィギュレーションセットへ追加する。
00451   # 指定したIDと一致するコンフィギュレーションセットが存在しない場合は、
00452   # false を返す。
00453   # 
00454   # @param self 
00455   # @param config_id 追加対象コンフィギュレーションセットのID
00456   # @param config_set 追加するプロパティ
00457   # 
00458   # @return 追加処理実行結果(追加成功:true、追加失敗:false)
00459   # 
00460   # @else
00461   # 
00462   # @endif
00463   def setConfigurationSetValues(self, config_id, config_set):
00464     if config_set.getName() != config_id:
00465       return False
00466     if not self._configsets.hasKey(config_id):
00467       return False
00468 
00469     p = self._configsets.getNode(config_id)
00470     if p is None:
00471       return False
00472     p.mergeProperties(config_set)
00473 
00474     self._changed = True
00475     self._active  = False
00476     return True
00477 
00478 
00479   ##
00480   # @if jp
00481   # 
00482   # @brief アクティブ・コンフィギュレーションセットを取得
00483   # 
00484   # 現在アクティブとなっているコンフィギュレーションセットを取得する。
00485   # アクティブとなっているコンフィギュレーションセットが存在しない場合は、
00486   # 空のコンフィギュレーションセット を返す。
00487   # 
00488   # @param self 
00489   # 
00490   # @return アクティブ・コンフィギュレーションセット
00491   # 
00492   # @else
00493   # 
00494   # @endif
00495   def getActiveConfigurationSet(self):
00496     p = self._configsets.getNode(self._activeId)
00497     if p is None:
00498       return self._emptyconf
00499 
00500     return p
00501 
00502 
00503   ##
00504   # @if jp
00505   # 
00506   # @brief コンフィギュレーションセットに設定値を追加
00507   # 
00508   # コンフィギュレーションセットに設定値を追加する。
00509   # 
00510   # @param self 
00511   # @param configset 追加するプロパティ
00512   # 
00513   # @return 追加処理結果(追加成功:true、追加失敗:false)
00514   # 
00515   # @else
00516   # 
00517   # @endif
00518   def addConfigurationSet(self, configset):
00519     if self._configsets.hasKey(configset.getName()):
00520       return False
00521     node = configset.getName()
00522 
00523     # Create node
00524     self._configsets.createNode(node)
00525 
00526     p = self._configsets.getNode(node)
00527     p.mergeProperties(configset)
00528     self._newConfig.append(node)
00529 
00530     self._changed = True
00531     self._active  = False
00532 
00533     return True
00534 
00535 
00536   ##
00537   # @if jp
00538   # 
00539   # @brief コンフィギュレーションセットの削除
00540   # 
00541   # 指定したIDのコンフィギュレーションセットを削除する。
00542   # 指定したIDのコンフィギュレーションセットが存在しない場合は、
00543   # falseを返す。
00544   # 
00545   # @param self 
00546   # @param config_id 削除対象コンフィギュレーションセットのID
00547   # 
00548   # @return 削除処理結果(削除成功:true、削除失敗:false)
00549   # 
00550   # @else
00551   # 
00552   # @endif
00553   def removeConfigurationSet(self, config_id):
00554     idx = 0
00555     for conf in self._newConfig:
00556       if conf == config_id:
00557         break
00558       idx += 1
00559 
00560     if idx == len(self._newConfig):
00561       return False
00562 
00563     p = self._configsets.getNode(config_id)
00564     if p:
00565       p.getRoot().removeNode(config_id)
00566       del p
00567 
00568     del self._newConfig[idx]
00569 
00570     self._changed = True
00571     self._active  = False
00572 
00573     return True
00574 
00575 
00576   ##
00577   # @if jp
00578   # 
00579   # @brief コンフィギュレーションセットのアクティブ化
00580   # 
00581   # 指定したIDのコンフィギュレーションセットをアクティブ化する。
00582   # 指定したIDのコンフィギュレーションセットが存在しない場合は、
00583   # falseを返す。
00584   # 
00585   # @param self 
00586   # @param config_id 削除対象コンフィギュレーションセットのID
00587   # 
00588   # @return アクティブ処理結果(成功:true、失敗:false)
00589   # 
00590   # @else
00591   # 
00592   # @endif
00593   def activateConfigurationSet(self, config_id):
00594     if config_id is None:
00595       return False
00596     if self._configsets.hasKey(config_id) is None:
00597       return False
00598     self._activeId = config_id
00599     self._active   = True
00600     self._changed  = True
00601     return True

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