[openrtm-commit:00511] r609 - branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC
openrtm @ openrtm.org
openrtm @ openrtm.org
2011年 12月 22日 (木) 10:24:17 JST
Author: fsi-katami
Date: 2011-12-22 10:24:17 +0900 (Thu, 22 Dec 2011)
New Revision: 609
Added:
branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceAdmin.java
branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceBase.java
branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceFactory.java
branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceProfile.java
Modified:
branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/DefaultConfiguration.java
branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/Manager.java
Log:
Implemented LocalService. refs #2301
Modified: branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/DefaultConfiguration.java
===================================================================
--- branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/DefaultConfiguration.java 2011-12-22 01:02:00 UTC (rev 608)
+++ branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/DefaultConfiguration.java 2011-12-22 01:24:17 UTC (rev 609)
@@ -62,6 +62,7 @@
"manager.command", "rtcd",
"sdo.service.provider.enabled_services", "ALL",
"sdo.service.consumer.enabled_services", "ALL",
+ "manager.local_service.enabled_services","ALL",
""
};
}
Added: branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceAdmin.java
===================================================================
--- branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceAdmin.java (rev 0)
+++ branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceAdmin.java 2011-12-22 01:24:17 UTC (rev 609)
@@ -0,0 +1,296 @@
+package jp.go.aist.rtm.RTC;
+
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+import jp.go.aist.rtm.RTC.log.Logbuf;
+import jp.go.aist.rtm.RTC.util.Properties;
+import jp.go.aist.rtm.RTC.util.StringUtil;
+
+ /**
+ * {@.ja LocalService 管理クラス}
+ * {@.en SDO service administration class}
+ *
+ */
+public class LocalServiceAdmin {
+ /**
+ * {@.ja コンストラクタ}
+ * {@.en Constructor}
+ * <p>
+ * {@.ja コンストラクタ}
+ * {@.en Constructor}
+ *
+ */
+ private LocalServiceAdmin() {
+ rtcout = new Logbuf("LocalServiceAdmin");
+ rtcout.println(Logbuf.TRACE, "LocalServiceAdmin::LocalServiceAdmin()");
+ }
+
+
+ /**
+ *
+ */
+ public static LocalServiceAdmin instance() {
+ return _instance;
+ }
+ /**
+ * {@.ja "all" 文字列探索Functor}
+ * {@.en A functor to search "all"}
+ */
+ private class find_all {
+ public boolean is_all(final String str) {
+ String a = str;
+ if(StringUtil.normalize(a).equals("all")){
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+ public int find_if(String str[]) {
+ int ic;
+ for(ic=0;ic<str.length;++ic){
+ if(this.is_all(str[ic])){
+ break;
+ }
+ }
+ return ic;
+ }
+ };
+ /**
+ * {@.ja LocaServiceAdminの初期化}
+ * {@.en Initialization of LocalServiceAdmin}
+ *
+ */
+ public void init(Properties props) {
+ rtcout.println(Logbuf.TRACE, "LocalServiceAdmin::init():");
+ String str = new String();
+ props._dump(str,props,0);
+ rtcout.println(Logbuf.TRACE, str);
+ String es = props.getProperty("enabled_services");
+ String svcs[] = es.split(",");
+ find_all fa = new find_all();
+ boolean all_enable = false;
+
+ if(fa.find_if(svcs)!=svcs.length){
+ rtcout.println(Logbuf.INFO,"All the local services are enabled.");
+ all_enable = true;
+ }
+
+ LocalServiceFactory<LocalServiceBase,String> factory = LocalServiceFactory.instance();
+ Set ids = factory.getIdentifiers();
+ rtcout.println(Logbuf.DEBUG,"Available services: " + StringUtil.flatten(ids));
+
+ Vector vsvcs = new Vector();
+ for (int ic = 0; ic < svcs.length; ++ic) {
+ vsvcs.add(svcs[ic]);
+ }
+
+ Iterator it = ids.iterator();
+ while (it.hasNext()) {
+ String id_str = (String)it.next();
+ if (all_enable || isEnabled(id_str, vsvcs)) {
+ if (notExisting(id_str)) {
+ LocalServiceBase service = factory.createObject(id_str);
+ rtcout.println(Logbuf.DEBUG,"Service created: "+id_str);
+ Properties prop = props.getNode(id_str);
+ service.init(prop);
+ addLocalService(service);
+ }
+ }
+ }
+ }
+ /**
+ * {@.ja LocalserviceAdmin の終了処理}
+ * {@.en Finalization ofLocalServiceAdmin}
+ *
+ *
+ */
+ public void _finalize() {
+ LocalServiceFactory factory = LocalServiceFactory.instance();
+ Iterator it = m_services.iterator();
+ while (it.hasNext()) {
+ LocalServiceBase lsb = (LocalServiceBase)it.next();
+ lsb._finalize();
+ factory.deleteObject(lsb);
+ }
+ m_services.clear();
+ }
+
+
+ /**
+ * {@.ja LocalServiceProfileListの取得}
+ * {@.en Getting LocalServiceProfileList}
+ *
+ */
+ public LocalServiceProfile[] getServiceProfiles() {
+ LocalServiceProfile[] profs = new LocalServiceProfile[m_services.size()];
+ for (int ic=0; ic < m_services.size(); ++ic) {
+ profs[ic] = m_services.get(ic).getProfile();
+ }
+ return profs;
+ }
+
+ /**
+ * {@.ja LocalServiceProfile を取得する}
+ * {@.en Get LocalServiceProfile of an LocalService}
+ * <p>
+ * {@.ja id で指定されたIDを持つLocalService の
+ * LocalServiceProfile を取得する。id が NULL ポインタの場合、指定された
+ * id に該当するServiceProfile が存在しない場合、falseを返す。}
+ * {@.en This operation returns LocalServiceProfile of a LocalService
+ * which has the specified id. If the specified id is
+ * NULL pointer or the specified id does not exist in the
+ * ServiceProfile list, false will be returned.}
+ *
+ * @param name
+ * {@.ja LocalService の IFR ID}
+ * {@.en ID of an LocalService}
+ * @param prof
+ * @return
+ * {@.ja 指定された id を持つ LocalServiceProfile}
+ * {@.en LocalServiceProfile which has the specified id}
+ *
+ */
+ public boolean getServiceProfile(String name,
+ LocalServiceProfile prof) {
+ synchronized (m_services) {
+ Iterator it = m_services.iterator();
+ while (it.hasNext()) {
+ LocalServiceBase lsb = (LocalServiceBase)it.next();
+ if (name == lsb.getProfile().name) {
+ prof = lsb.getProfile();
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * {@.ja LocalService の Service を取得する}
+ * {@.en Get a pointer of a LocalService}
+ * <p>
+ * {@.ja id で指定されたIDを持つLocalService のポインタを取得する。id が
+ * NULL ポインタの場合、指定された id に該当するServiceProfile が存
+ * 在しない場合、NULLを返す。}
+ * {@.en This operation returnes a pointer to the LocalService
+ * which has the specified id. If the specified id is
+ * NULL pointer or the specified id does not exist in the
+ * ServiceProfile list, NULL pointer will be returned.}
+ *
+ * @param id
+ * {@.ja LocalService の ID}
+ * {@.en ID of a LocalService}
+ * @return
+ * {@.ja 指定された id を持つ LocalService のポインタ}
+ * {@.en a pointer which has the specified id}
+ *
+ */
+ public LocalServiceBase getService(final String id) {
+ Iterator it = m_services.iterator();
+ while (it.hasNext()) {
+ LocalServiceBase lsb = (LocalServiceBase)it.next();
+ if (lsb.getProfile().name == id) {
+ return lsb;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * {@.ja SDO service provider をセットする}
+ * {@.en Set a SDO service provider}
+ *
+ */
+ public boolean addLocalService(LocalServiceBase service) {
+ if (service == null) {
+ rtcout.println(Logbuf.ERROR,"Invalid argument: addLocalService(service == NULL)");
+ return false;
+ }
+ rtcout.println(Logbuf.TRACE,"LocalServiceAdmin::addLocalService("+
+ service.getProfile().name+")");
+ synchronized (m_services) {
+ m_services.add(service);
+ }
+ return true;
+ }
+
+ /**
+ * {@.ja LocalService を削除する}
+ * {@.en Remove a LocalService}
+ *
+ *
+ */
+ public boolean removeLocalService(final String name) {
+ rtcout.println(Logbuf.TRACE,"removeLocalService("+name+")");
+ synchronized (m_services){
+
+ Iterator it = m_services.iterator();
+ while (it.hasNext()) {
+ LocalServiceBase lsb = (LocalServiceBase)it.next();
+ if (name == lsb.getProfile().name) {
+ lsb._finalize();
+ LocalServiceFactory
+ factory = LocalServiceFactory.instance();
+ factory.deleteObject(lsb);
+ m_services.remove(lsb);
+ rtcout.println(Logbuf.INFO,"SDO service has been deleted: "+name);
+ return true;
+ }
+ }
+ rtcout.println(Logbuf.WARN,"Specified SDO service not found: "+name);
+ return false;
+ }
+ }
+
+ /**
+ * {@.ja 指定されたIDが有効かどうかチェックする}
+ * {@.en Check if specified ID is enabled}
+ */
+ private boolean isEnabled(final String id, final Vector<String> enabled) {
+ boolean ret = enabled.contains(id);
+ rtcout.println(Logbuf.DEBUG,"Local service "+id +" "+ ret +" enabled.");
+ return ret;
+ }
+
+ /**
+ * {@.ja 指定されたIDがすでに存在するかどうかチェックする}
+ * {@.en Check if specified ID is existing}
+ */
+ private boolean notExisting(final String id) {
+ synchronized (m_services) {
+ Iterator it = m_services.iterator();
+ while (it.hasNext()) {
+ LocalServiceBase lsb = (LocalServiceBase)it.next();
+ if (lsb.getProfile().name == id) {
+ rtcout.println(Logbuf.WARN, "Local service "+id+" already exists.");
+ return false;
+ }
+ }
+ rtcout.println(Logbuf.DEBUG,"Local service "+id+" does not exist.");
+ }
+ return true;
+ }
+
+ /**
+ * {@.ja Lock 付き SDO ServiceProfileList}
+ * {@.en SDO ServiceProfileList with mutex lock}
+ */
+ private Vector<LocalServiceBase> m_services = new Vector<LocalServiceBase>();
+ private String m_services_mutex;
+
+ /**
+ * {@.ja logger}
+ * {@.en logger}
+ */
+ private Logbuf rtcout;
+ /**
+ * {@.ja The only instance}
+ * {@.en The only instance}
+ */
+ private static final LocalServiceAdmin _instance = new LocalServiceAdmin();
+}
+
Added: branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceBase.java
===================================================================
--- branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceBase.java (rev 0)
+++ branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceBase.java 2011-12-22 01:24:17 UTC (rev 609)
@@ -0,0 +1,155 @@
+package jp.go.aist.rtm.RTC;
+
+import jp.go.aist.rtm.RTC.util.Properties;
+ /**
+ * {@.ja LocalService 基底クラス}
+ * <p>
+ * {@.ja Local Service とは RT-Middlewareのマネージャデーモン内で各種サービ
+ * スを提供するための仕組みである。Local Serviceにはいくつかのユース
+ * ケースが考えられる。
+ *
+ * 1. RTCの内部ロジックに対してサービスを提供する。コンポーネントの開
+ * 発者は、一定の艇順を経て、Local Serviceのインスタンスへの参照を得
+ * て、このサービスを利用することができる。
+ *
+ * 2. マネージャ等に機能を追加するためのサービス。たとえは、RTCの名前
+ * を登録するCORBAネームサービスの代わりに、新たなディレクトリサービ
+ * スやブロードキャストによる名前通知機能などを新たな機能をマネージャ
+ * に追加するために利用することができる。マネージャには、様々なアクショ
+ * ンに対するフックが用意されており、これを利用することで、マネージャ
+ * の様々なイベントに対してアクションを起こすことができる。
+ *
+ * 3. マネージャは自身のサービス以外に付加的に外部に対してサービスを
+ * 提供する機能を有する。外部からCORBA経由で、ローカルの機能、たとえ
+ * ばデバイスやリソースのマネジメント機能に対してアクセスする方法を提
+ * 供する。サービスのインスタンス化後に、マネージャに対して、マネージャ
+ * サービスとして登録することで、外部からのアクセスを受け付けることが
+ * できるようになる。
+ *
+ * Local Service はモジュールとしてロードされ、通常唯一のインスタンス
+ * が生成される。すなわち、LocalService はシングルトンとして実装され
+ * る。インスタンス化されたサービスはサービスリストに登録され、RTC等
+ * からは名前やUUIDによってインスタンスの参照を入手することができる。
+ *
+ * このオブジェクトのライフサイクルは以下の通り。
+ *
+ * -# オブジェクトは通常、共有オブジェクト (so, DLL) としてコンパイル・
+ * リンクされる。
+ * -# マネージャに対してロードされるとモジュール初期化関数によりオブ
+ * ジェクトファクトリが、LocalServiceFactory に対して登録される。
+ * 登録のキーにはUUIDと名前が利用され、これによりサービスが区別さ
+ * れる。
+ * -# rtc.conf等のコンフィギュレーション指定により、有効化することが
+ * 指定されているサービスインプロバイダは、RTCの起動と同時にインス
+ * タンス化される。
+ * -# インスタンス化後、初期化関数 init() が呼ばれる。引数には当該サー
+ * ビスのためのコンフィギュレーションオプションが coil::Propertyに
+ * より渡される。
+ * -# マネージャサービスオペレーション reinit が呼ばれると、すべての
+ * Local Service お reinit が呼び出され、更新されたコンフィギュレー
+ * ション情報が読み込まれる。
+ * -# マネージャ解体時には、すべての Local Service の finalizeが呼び
+ * 出され、解体されるので、ここでリソースの解放など終了処理を行
+ * う。
+ *
+ * このクラスの実装に当たっては、少なくとも以下の純粋仮想関数を実装す
+ * る必要がある。
+ *
+ * - init(): 初期化関数。与えられた RTObject および ServiceProfile か
+ * ら、当該オブジェクトを初期化する。
+ * - reinit(): 再初期化関数。ServiceProfile は設定情報更新のため同一
+ * IDで呼び出されることが有るが、その際にこの関数が新たな
+ * ServiceProfile とともに呼び出される。関数内では、設定の変更など
+ * 再初期化処理を実装する。
+ * - getProfile(): 設定されたプロファイルを返す関数。
+ * - finalize(): 終了処理。コンシューマがデタッチされる際に呼び出され
+ * る関数。関数内では終了処理を実装する。
+ *
+ * LocalService は通常共有オブジェクトとしてコンパイル・リンク
+ * される。共有オブジェクトのエントリポイントは通常コンパイルされたファ
+ * イル名の basename + "Init" にしておく。以下に、クラス名、ファイル
+ * 名、エントリポイント関数名の推奨例を示す。
+ *
+ * - 実装クラス名: MyLocalService
+ * - ファイル名: MyLocalService.h. MyLocalService.cpp
+ * - 共有オブジェクト名: MyLocalService.so (or DLL)
+ * - エントリポイント関数名: MyLocalServiceInit()
+ *
+ * エントリポイント関数は通常以下のように、LocalServiceFactory
+ * に当該コンシューマのファクトリ (と解体ファンクタ) を登録する以下の
+ * ような関数になる。}
+ *
+ * <pre>
+ * extern "C"
+ * {
+ * void MyLocalServiceInit()
+ * {
+ * RTC::LocalServiceFactory& factory
+ * = RTC::LocalServiceFactory::instance();
+ * factory.addFactory(::RTC::MyLocalSerivce::name,
+ * ::coil::Creator< ::RTC::LocalServiceBase,
+ * ::RTC::MyLocalService>,
+ * ::coil::Destructor< ::RTC::LocalServiceBase,
+ * ::RTC::MyLocalService>);
+ * }
+ * };
+ * </pre>
+ *
+ *
+ */
+public interface LocalServiceBase {
+ /**
+ * {@.ja LocalServiceクラスの初期化関数}
+ * {@.en Initialization function of the LocalService class}
+ * <p>
+ * {@.ja このオブジェクトの初期化を行う。LocalService を実装する場合、外
+ * 部からの設定情報は、このinit()関数により与えられる。}
+ *
+ * @param props
+ * {@.ja 外部から与えられた Properties}
+ * @return
+ * {@.ja 与えられた LocalServiceProfile が不正の場合 false}
+ *
+ *
+ */
+ public boolean init(final Properties props);
+ /**
+ * {@.ja LocalServiceクラスの再初期化関数}
+ * {@.en Reinitialization function of the LocalService class}
+ * <p>
+ * @param props
+ * {@.ja 新たに与えられた Properties}
+ * @return
+ * {@.ja 不正な LocalServiceProfile が与えられた場合は false}
+ *
+ *
+ *
+ */
+ public boolean reinit(final Properties props);
+
+ /**
+ * {@.ja LocalServiceProfile を返す}
+ * {@.en Getting LocalServiceProfile}
+ * <p>
+ * {@.ja init()/reinit()で与えられた LocalServiceProfile は通常オブジェク
+ * ト内で保持される。この関数では保持されている ServiceProfile を返
+ * す。}
+ *
+ * @return
+ * {@.ja このオブジェクトが保持している LocalServiceProfile}
+ *
+ */
+ public LocalServiceProfile getProfile();
+
+ /**
+ * {@.ja 終了処理}
+ * {@.en Finalization}
+ * <p>
+ * {@.ja LocalService が終了する際に呼び出される終了処理用関数。当該オブ
+ * ジェクトが保持するリソースを解放するなどの処理を行う。}
+ *
+ */
+ public void _finalize();
+
+
+}
Added: branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceFactory.java
===================================================================
--- branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceFactory.java (rev 0)
+++ branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceFactory.java 2011-12-22 01:24:17 UTC (rev 609)
@@ -0,0 +1,36 @@
+package jp.go.aist.rtm.RTC;
+
+/**
+ * {@.ja LocalService用ファクトリの実装。}
+ * {@.en This class is a factory for LocalService.}
+ */
+public class LocalServiceFactory<ABSTRACTCLASS,IDENTIFIER> extends FactoryGlobal<ABSTRACTCLASS,IDENTIFIER> {
+
+ /**
+ * {@.ja コンストラクタ}
+ * {@.en Constructor}
+ */
+ private LocalServiceFactory() {
+
+ }
+ /**
+ * {@.ja LocalServiceFactoryのインスタンスを生成する。}
+ * {@.en Creates a instance of LocalServiceFactory.}
+ * @return
+ * {@.ja LocalServiceFactoryオブジェクト}
+ * {@.en LocalServiceFactory object}
+ */
+ public static LocalServiceFactory instance() {
+ return (LocalServiceFactory)instance("jp.go.aist.rtm.RTC.LocalServiceFactory");
+ }
+ /**
+ * <p> mutex </p>
+ */
+ private static String factory_global_mutex = new String();
+ /**
+ * <p> object </p>
+ */
+ private static BufferFactory factory_global;
+}
+
+
Added: branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceProfile.java
===================================================================
--- branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceProfile.java (rev 0)
+++ branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/LocalServiceProfile.java 2011-12-22 01:24:17 UTC (rev 609)
@@ -0,0 +1,30 @@
+package jp.go.aist.rtm.RTC;
+
+import jp.go.aist.rtm.RTC.util.Properties;
+ /**
+ * {@.ja LocalServiceのプロファイルデータ}
+ * {@.en Profile data structure of LocalService}
+ */
+public interface LocalServiceProfile {
+ /**
+ * {@.ja LocalServiceのサービス名}
+ * {@.en The name of LocalService}
+ */
+ public String name = new String();
+ /**
+ * {@.ja LocalServiceの固有ID}
+ * {@.en The unique ID of LocalService}
+ */
+ public String uuid = new String();
+ /**
+ * {@.ja @brief LocalServiceのプロパティ}
+ * {@.en Properties of LocalService}
+ */
+ public Properties properties = new Properties();
+ /**
+ * {@.ja LocalServiceのポインタ}
+ * {@.en The pointer to LocalService}
+ */
+ public LocalServiceBase service = null;
+}
+
Modified: branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/Manager.java
===================================================================
--- branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/Manager.java 2011-12-22 01:02:00 UTC (rev 608)
+++ branches/work/ForLocalService/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/Manager.java 2011-12-22 01:24:17 UTC (rev 609)
@@ -373,6 +373,8 @@
bindManagerServant();
+ initLocalService();
+
preloadComponent();
if (m_initProc != null) {
@@ -3458,6 +3460,30 @@
}
}
/**
+ * {@.ja LocalService の初期化}
+ * {@.en LocalService initialization}
+ * @return Timer
+ * {@.ja 初期化処理実行結果(初期化成功:true、初期化失敗:false)}
+ * {@.en Initialization result (Successful:true, Failed:false)}
+ */
+ protected boolean initLocalService(){
+ rtcout.println(Logbuf.TRACE,"Manager::initLocalService()");
+
+ LocalServiceAdmin admin = LocalServiceAdmin.instance();
+ Properties prop = m_config.getNode("manager.local_service");
+ admin.init(prop);
+ rtcout.println(Logbuf.DEBUG,"LocalServiceAdmin's properties:");
+ String str = new String();
+ prop._dump(str,prop,0);
+ rtcout.println(Logbuf.TRACE, str);
+
+ LocalServiceProfile[] svclist = admin.getServiceProfiles();
+ for (int ic=0; ic < svclist.length; ++ic) {
+ rtcout.println(Logbuf.INFO,"Available local service: "+svclist[ic].name+" "+svclist[ic].uuid);
+ }
+ return true;
+ }
+ /**
* {@.ja コンポーネント削除用クラス}
* {@.en Class}
*
openrtm-commit メーリングリストの案内