[openrtm-commit:00232] r498 - in branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC: . port
openrtm @ openrtm.org
openrtm @ openrtm.org
2011年 7月 12日 (火) 15:57:46 JST
Author: fsi-katami
Date: 2011-07-12 15:57:46 +0900 (Tue, 12 Jul 2011)
New Revision: 498
Added:
branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceAdmin.java
branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceConsumerBase.java
branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceConsumerFactory.java
branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceProviderBase.java
branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceProviderFactory.java
Modified:
branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/FactoryGlobal.java
branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/PostComponentActionListenerArgument.java
branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/PortBase.java
Log:
SdoServiceAdmin class has been implemented . refs #2039
Modified: branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/FactoryGlobal.java
===================================================================
--- branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/FactoryGlobal.java 2011-05-09 02:00:39 UTC (rev 497)
+++ branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/FactoryGlobal.java 2011-07-12 06:57:46 UTC (rev 498)
@@ -1,5 +1,6 @@
package jp.go.aist.rtm.RTC;
+import java.util.Hashtable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
@@ -82,6 +83,32 @@
}
/**
+ * {@.ja FactoryGlobalをインスタス化する。}
+ * {@.en Creates FactoryGlobal.}
+ * @param clazz
+ * {@.ja class name}
+ * {@.en class name}
+ * @return
+ * {@.ja オブジェクト}
+ * {@.en object}
+ */
+ public static Object instance(String clazz) {
+ Object obj = (Object)factory_table.get(clazz);
+ if(obj != null){
+ return obj;
+ }
+ else {
+ try{
+ Object obj2 = (Object)(Class.forName(clazz).newInstance());
+ factory_table.put(clazz,obj2);
+ return obj2;
+ }
+ catch(Exception e){
+ return null;
+ }
+ }
+ }
+ /**
* <p>コンポーネントを生成します。</p>
*
* @param mgr Managerオブジェクト
@@ -340,5 +367,7 @@
UNKNOWN_ERROR
};
+ private static Hashtable factory_table = new Hashtable();
+
}
Modified: branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/PostComponentActionListenerArgument.java
===================================================================
--- branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/PostComponentActionListenerArgument.java 2011-05-09 02:00:39 UTC (rev 497)
+++ branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/PostComponentActionListenerArgument.java 2011-07-12 06:57:46 UTC (rev 498)
@@ -2,7 +2,7 @@
import RTC.ReturnCode_t;
/**
- * {@.ja PostComponentActionListenerArgument ・ッ・鬣ケ}
+ * {@.ja PostComponentActionListenerArgument クラス}
* {@.en PostComponentActionListenerArgumen class}
*
*
Added: branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceAdmin.java
===================================================================
--- branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceAdmin.java (rev 0)
+++ branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceAdmin.java 2011-07-12 06:57:46 UTC (rev 498)
@@ -0,0 +1,488 @@
+package jp.go.aist.rtm.RTC;
+
+import java.lang.Exception;
+
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.Vector;
+
+import _SDOPackage.InvalidParameter;
+import _SDOPackage.NVListHolder;
+import _SDOPackage.ServiceProfile;
+import _SDOPackage.ServiceProfileListHolder;
+import _SDOPackage.SDOService;
+import _SDOPackage.SDOServiceHolder;
+
+import jp.go.aist.rtm.RTC.log.Logbuf;
+import jp.go.aist.rtm.RTC.util.CORBA_SeqUtil;
+import jp.go.aist.rtm.RTC.util.NVUtil;
+import jp.go.aist.rtm.RTC.util.Properties;
+import jp.go.aist.rtm.RTC.util.StringUtil;
+
+ /**
+ * {@.ja SDO service 管理クラス}
+ * {@.en SDO service administration class}
+ * <p>
+ * {@.ja
+ * このクラスは、SDO Service を管理するためのクラスである。SDO
+ * Service は OMG SDO Specification において定義されている、SDOが特定
+ * の機能のために提供また要求するサービスの一つである。詳細は仕様にお
+ * いて定義されていないが、本クラスでは以下のように振る舞うサービスで
+ * あるものとし、これらを管理するためのクラスが本クラスである。
+ *
+ * SDO Service においては、SDO/RTCに所有され、ある種のサービスを提供
+ * するものを SDO Service Provider、他のSDO/RTCやアプリケーションが提
+ * 供するサービスオブジェクトの参照を受け取り、それらの機能を利用する
+ * ものを、SDO Service Consumer と呼ぶ。
+ *
+ * SDO Service Provider は他のアプリケーションから呼ばれ、SDO/RTC内部
+ * の機能にアクセスするために用いられる。他のSDO/RTCまたはアプリケー
+ * ションは、
+ *
+ * - SDO::get_service_profiles ()
+ * - SDO::get_service_profile (in UniqueIdentifier id)
+ * - SDO::get_sdo_service (in UniqueIdentifier id)
+ *
+ * のいずれかのオペレーションにより、ServiceProfile または SDO
+ * Service の参照を取得し、機能を利用するためのオペレーションを呼び出
+ * す。他のSDO/RTCまたはアプリケーション上での参照の破棄は任意のタイ
+ * ミングで行われ、サービス提供側では、どこからどれだけ参照されている
+ * かは知ることはできない。一方で、SDO/RTC側も、任意のタイミングでサー
+ * ビスの提供を停止することもできるため、サービスの利用側では、常にい
+ * サービスが利用できるとは限らないものとしてサービスオペレーションを
+ * 呼び出す必要がある。
+ *
+ * 一方、SDO Service Consumer は当該SDO/RTC以外のSDO/RTCまたはアプリ
+ * ケーションがサービスの実体を持ち、当該SDO/RTCにオブジェクト参照を
+ * 含むプロファイルを与えることで、SDO/RTC側からサービスオペレーショ
+ * ンが呼ばれ外部のSDO/RTCまたはアプリケーションが提供する機能を利用
+ * できる。また、オブザーバ的なオブジェクトを与えることで、SDO/RTC側
+ * からのコールバックを実現するためにも利用することができる。コンシュー
+ * マは、プロバイダとは異なり、SDO Configurationインターフェースから
+ * 追加、削除が行われる。関連するオペレーションは以下のとおりである。
+ *
+ * - Configuration::add_service_profile (in ServiceProfile sProfile)
+ * - Configuration::remove_service_profile (in UniqueIdentifier id)
+ *
+ * 外部のSDO/RTCまたはアプリケーションは、自身が持つSDO Servcie
+ * Provider の参照をIDおよびinterface type、プロパティとともに
+ * ServcieProfile にセットしたうえで、add_service_profile() の引数と
+ * して与えることで、当該SDO/RTCにサービスを与える。この際、IDはUUID
+ * など一意なIDでなければならない。また、削除する際にはIDにより対象と
+ * するServiceProfileを探索するため、サービス提供側では削除時までIDを
+ * 保持しておかなければならない。}
+ *
+ *
+ */
+public class SdoServiceAdmin {
+ /**
+ * {@.ja コンストラクタ}
+ * {@.en Constructor}
+ *
+ *
+ */
+ public SdoServiceAdmin(RTObject_impl rtobj) {
+ m_rtobj = rtobj;
+ m_allConsumerAllowed = true;
+ rtcout = new Logbuf("SdoServiceAdmin");
+ rtcout.println(Logbuf.TRACE, "SdoServiceAdmin.SdoServiceAdmin(" + rtobj.getProperties().getProperty("instance_name") + ")");
+
+ Properties prop = m_rtobj.getProperties();
+ //------------------------------------------------------------
+ // SDO service provider
+ String[] enabledProviderTypes
+ = prop.getProperty("sdo.service.provider.enabled_services").split(",");
+ rtcout.println(Logbuf.DEBUG,"sdo.service.provider.enabled_services:"+
+ prop.getProperty("sdo.service.provider.enabled_services"));
+
+ Set availableProviderTypes
+ = SdoServiceProviderFactory.instance().getIdentifiers();
+ prop.setProperty("sdo.service.provider.available_services", StringUtil.flatten(availableProviderTypes));
+ rtcout.println(Logbuf.DEBUG,"sdo.service.provider.available_services:"+
+ prop.getProperty("sdo.service.provider.available_services"));
+
+
+ // If types include '[Aa][Ll][Ll]', all types enabled in this RTC
+ Set activeProviderTypes = new HashSet();
+ for (int ic=0; ic < enabledProviderTypes.length; ++ic) {
+ String tmp = enabledProviderTypes[ic];
+ if(tmp.toLowerCase().equals("all")){
+ activeProviderTypes = availableProviderTypes;
+ rtcout.println(Logbuf.DEBUG,"sdo.service.provider.enabled_services: ALL");
+ break;
+ }
+ for (Iterator jc=availableProviderTypes.iterator(); jc.hasNext();) {
+ String str = (String)jc.next();
+ if (str.equals(tmp)) {
+ activeProviderTypes.add(str);
+ }
+ }
+ }
+
+ SdoServiceProviderFactory<SdoServiceProviderBase,String> factory = SdoServiceProviderFactory.instance();
+ for (Iterator ic=activeProviderTypes.iterator(); ic.hasNext();) {
+ String str = (String)ic.next();
+ SdoServiceProviderBase svc
+ = factory.createObject(str);
+
+ ServiceProfile prof = new ServiceProfile();
+ prof.id = str;
+ prof.interface_type = str;
+ prof.service = (SDOService)svc;
+ String propkey = ifrToKey(str);
+ NVListHolder nvholder =
+ new NVListHolder(prof.properties);
+ NVUtil.copyFromProperties(nvholder, prop.getNode(propkey));
+ prof.properties = nvholder.value;
+
+ svc.init(rtobj, prof);
+ m_providers.add(svc);
+ }
+
+ //------------------------------------------------------------
+ // SDO service consumer
+ // getting consumer types from RTC's properties
+
+ String constypes = prop.getProperty("sdo.service.consumer.enabled_services");
+ m_consumerTypes = Arrays.asList(constypes.split(","));
+ rtcout.println(Logbuf.DEBUG,"sdo.service.consumer.enabled_services:"+constypes);
+
+ prop.setProperty("sdo.service.consumer.available_services",
+ StringUtil.flatten(SdoServiceConsumerFactory.instance().getIdentifiers()));
+ rtcout.println(Logbuf.DEBUG,"sdo.service.consumer.available_services:"+ prop.getProperty("sdo.service.consumer.available_services"));
+
+ // If types include '[Aa][Ll][Ll]', all types enabled in this RTC
+ for (Iterator ic=m_consumerTypes.iterator(); ic.hasNext();) {
+ String tmp = (String)ic.next();
+ if(tmp.toLowerCase().equals("all")){
+ m_allConsumerEnabled = true;
+ rtcout.println(Logbuf.DEBUG,"sdo.service.consumer.enabled_services: ALL");
+ }
+ }
+ }
+
+ /**
+ * {@.ja 仮想デストラクタ}
+ * {@.en Virtual destractor}
+ */
+ //public ~SdoServiceAdmin();
+
+ /**
+ *
+ * {@.ja SDO Service Provider の ServiceProfileList を取得する}
+ * {@.en Get ServiceProfileList of SDO Service Provider}
+ *
+ */
+ public ServiceProfile[] getServiceProviderProfiles() {
+ ServiceProfileListHolder prof
+ = new ServiceProfileListHolder();
+ ServiceProfileListHolder prof2
+ = new ServiceProfileListHolder();
+ synchronized (m_provider_mutex) {
+ for(Iterator ic=m_providers.iterator();ic.hasNext();){
+ SdoServiceProviderBase sspb = (SdoServiceProviderBase)ic.next();
+ CORBA_SeqUtil.push_back(prof2, sspb.getProfile());
+ }
+ }
+ return prof.value;
+ }
+
+ /**
+ * {@.ja SDO Service Provider の ServiceProfile を取得する}
+ * {@.en Get ServiceProfile of an SDO Service Provider}
+ * <p>
+ * {@.ja id で指定されたIFR IDを持つSDO Service Provider の
+ * ServiceProfile を取得する。id が NULL ポインタの場合、指定された
+ * id に該当するServiceProfile が存在しない場合、InvalidParameter
+ * 例外が送出される。}
+ * {@.en This operation returnes ServiceProfile of an SDO Service
+ * Provider which has the specified id. If the specified id is
+ * NULL pointer or the specified id does not exist in the
+ * ServiceProfile list, InvalidParameter exception will be thrown.}
+ *
+ * @param id
+ * {@.ja SDO Service provider の IFR ID}
+ * {@.en IFR ID of an SDO Service provider}
+ * @return
+ * {@.ja 指定された id を持つ ServiceProfile}
+ * {@.en ServiceProfile which has the specified id}
+ */
+ public ServiceProfile getServiceProviderProfile(final String id) throws InvalidParameter {
+ String idstr = id;
+ synchronized (m_provider_mutex) {
+ for(Iterator ic=m_providers.iterator();ic.hasNext();){
+ SdoServiceProviderBase sspb = (SdoServiceProviderBase)ic.next();
+ if (idstr.equals(sspb.getProfile().id)) {
+ return sspb.getProfile();
+ }
+ }
+ }
+ throw new InvalidParameter();
+ //return new ServiceProfile();
+ }
+
+ /**
+ * {@.ja SDO Service Provider の Service を取得する}
+ * {@.en Get ServiceProfile of an SDO Service}
+ * <p>
+ * {@.ja id で指定されたIFR IDを持つSDO Service のオブジェクトリファレン
+ * ス を取得する。id が NULL ポインタの場合、指定された id に該当す
+ * るServiceProfile が存在しない場合、InvalidParameter 例外が送出さ
+ * れる。}
+ * {@.en This operation returnes an object reference of an SDO Service
+ * Provider which has the specified id. If the specified id is
+ * NULL pointer or the specified id does not exist in the
+ * ServiceProfile list, InvalidParameter exception will be thrown.}
+ *
+ * @param id
+ * {@.ja SDO Service provider の IFR ID}
+ * {@.en IFR ID of an SDO Service provider}
+ * @return
+ * {@.ja 指定された id を持つ SDO Service のオブジェクトリファレンス}
+ * {@.en an SDO Service reference which has the specified id}
+ *
+ */
+ public SDOService getServiceProvider(final String id) {
+ try{
+ ServiceProfile prof;
+ prof = getServiceProviderProfile(id);
+ SDOServiceHolder sdo
+ = new SDOServiceHolder(prof.service);
+ return sdo.value;
+ }
+ catch (Exception e) {
+ return null;
+ }
+ }
+
+ /**
+ * {@.ja SDO service provider をセットする}
+ * {@.en Set a SDO service provider}
+ */
+ public boolean addSdoServiceProvider(final ServiceProfile prof,
+ SdoServiceProviderBase provider) {
+ rtcout.println(Logbuf.TRACE,"SdoServiceAdmin.addSdoServiceProvider(if="+prof.interface_type+")");
+ synchronized (m_provider_mutex) {
+ String id = prof.id;
+ for(Iterator ic=m_providers.iterator();ic.hasNext();){
+ SdoServiceProviderBase sspb = (SdoServiceProviderBase)ic.next();
+ if (id.equals(sspb.getProfile().id)) {
+ rtcout.println(Logbuf.ERROR,"SDO service(id="+prof.id+", ifr="+prof.interface_type+") already exists");
+ return false;
+ }
+ }
+ m_providers.add(provider);
+ }
+ return true;
+ }
+
+ /**
+ * {@.ja SDO service provider を削除する}
+ * {@.en Remove a SDO service provider}
+ */
+ public boolean removeSdoServiceProvider(final String id) {
+ rtcout.println(Logbuf.TRACE,"removeSdoServiceProvider("+id+")");
+ synchronized (m_provider_mutex) {
+ String strid = id;
+ for(Iterator it=m_providers.iterator();it.hasNext();){
+ SdoServiceProviderBase sspb = (SdoServiceProviderBase)it.next();
+ if (strid.equals(sspb.getProfile().id)) {
+ sspb.finalize();
+ SdoServiceProviderFactory
+ factory = SdoServiceProviderFactory.instance();
+ factory.deleteObject(sspb);
+ m_providers.remove(sspb);
+ rtcout.println(Logbuf.INFO,"SDO service provider has been deleted: "+id);
+ return true;
+ }
+ }
+ rtcout.println(Logbuf.WARN,"Specified SDO service provider not found: "+id);
+ }
+ return false;
+
+ }
+
+ /**
+ * {@.ja Service Consumer を追加する}
+ * {@.en Add Service Consumer}
+ */
+ public boolean addSdoServiceConsumer(final ServiceProfile sProfile){
+ synchronized (m_provider_mutex) {
+ rtcout.println(Logbuf.TRACE,"addSdoServiceConsumer(IFR = "+sProfile.interface_type+")");
+ // Not supported consumer type -> error return
+ if (!isEnabledConsumerType(sProfile)) { return false; }
+ if (!isExistingConsumerType(sProfile)) { return false; }
+ rtcout.println(Logbuf.DEBUG,"Valid SDO service required");
+ if (sProfile.id.length() < 1) {
+ rtcout.println(Logbuf.WARN,"No id specified. It should be given by clients.");
+ return false;
+ }
+ rtcout.println(Logbuf.DEBUG,"Valid ID specified");
+ }
+ { // re-initialization
+ String id=sProfile.id;
+ for(Iterator it=m_consumers.iterator();it.hasNext();){
+ SdoServiceConsumerBase sscb = (SdoServiceConsumerBase)it.next();
+ if (id.equals(sscb.getProfile().id)) {
+ rtcout.println(Logbuf.INFO,"Existing consumer is reinitilized.");
+ NVListHolder nvlist = new NVListHolder(sProfile.properties);
+ rtcout.println(Logbuf.DEBUG,"Propeteis are: "+
+ NVUtil.toString(nvlist));
+ return sscb.reinit(sProfile);
+ }
+ }
+ }
+ rtcout.println(Logbuf.DEBUG,"SDO service properly initialized.");
+
+ // new pofile
+ SdoServiceConsumerFactory<SdoServiceConsumerBase,String>
+ factory = SdoServiceConsumerFactory.instance();
+ final String ctype = sProfile.interface_type;
+ if (ctype.length() < 1) { return false; }
+ SdoServiceConsumerBase consumer = factory.createObject(ctype);
+ if (consumer == null) {
+ rtcout.println(Logbuf.ERROR,"Hmm... consumer must be created.");
+ return false;
+ }
+ rtcout.println(Logbuf.DEBUG,"An SDO service consumer created.");
+
+ // initialize
+ if (!consumer.init(m_rtobj, sProfile)) {
+ rtcout.println(Logbuf.WARN,"SDO service initialization was failed.");
+ rtcout.println(Logbuf.DEBUG,"id: "+sProfile.id);
+ rtcout.println(Logbuf.DEBUG,"IFR: "+
+ sProfile.interface_type);
+ NVListHolder nvlist = new NVListHolder(sProfile.properties);
+ rtcout.println(Logbuf.DEBUG,"properties: "+
+ NVUtil.toString(nvlist));
+ factory.deleteObject(consumer);
+ rtcout.println(Logbuf.INFO,"SDO consumer was deleted by initialization failure");
+ return false;
+ }
+ rtcout.println(Logbuf.DEBUG,"An SDO service consumer initialized.");
+ rtcout.println(Logbuf.DEBUG,"id: "+sProfile.id);
+ rtcout.println(Logbuf.DEBUG,"IFR: "+
+ sProfile.interface_type);
+ NVListHolder nvlist = new NVListHolder(sProfile.properties);
+ rtcout.println(Logbuf.DEBUG,"properties: "+
+ NVUtil.toString(nvlist));
+
+ // store consumer
+ m_consumers.add(consumer);
+
+ return true;
+ }
+ /**
+ * {@.ja Service Consumer を削除する}
+ * {@.en Remove Service Consumer}
+ *
+ */
+ public boolean removeSdoServiceConsumer(final String id) {
+ synchronized (m_consumer_mutex) {
+ if (id.length() < 1) {
+ rtcout.println(Logbuf.ERROR,"removeSdoServiceConsumer(): id is invalid.");
+ return false;
+ }
+ rtcout.println(Logbuf.TRACE,"removeSdoServiceConsumer(id = "+id+")");
+
+ String strid = id;
+ for(Iterator it=m_consumers.iterator();it.hasNext();){
+ SdoServiceConsumerBase sscb = (SdoServiceConsumerBase)it.next();
+ if (strid.equals(sscb.getProfile().id)) {
+ sscb.finalize();
+ SdoServiceConsumerFactory
+ factory = SdoServiceConsumerFactory.instance();
+ factory.deleteObject(sscb);
+ m_consumers.remove(sscb);
+ rtcout.println(Logbuf.INFO,"SDO service has been deleted: "+id);
+ return true;
+ }
+ }
+ }
+ rtcout.println(Logbuf.WARN,"Specified SDO consumer not found: "+id);
+ return false;
+ }
+
+ /**
+ * {@.ja 許可されたサービス型かどうか調べる}
+ * {@.en If it is enabled service type}
+ *
+ */
+ protected boolean isEnabledConsumerType(final ServiceProfile sProfile){
+ if (m_allConsumerEnabled) { return true; }
+
+ for (Iterator ic=m_consumerTypes.iterator(); ic.hasNext();) {
+ if (ic.next().equals(sProfile.interface_type)) {
+ rtcout.println(Logbuf.DEBUG,sProfile.interface_type+" is supported SDO service.");
+ return true;
+ }
+ }
+ rtcout.println(Logbuf.WARN,"Consumer type is not supported: "+
+ sProfile.interface_type);
+ return false;
+ }
+
+ /**
+ * {@.ja 存在するサービス型かどうか調べる}
+ * {@.en If it is existing service type}
+ *
+ */
+ protected boolean isExistingConsumerType(final ServiceProfile sProfile){
+ SdoServiceConsumerFactory factory=SdoServiceConsumerFactory.instance();
+ Set consumerTypes = factory.getIdentifiers();
+
+ for (Iterator ic=consumerTypes.iterator(); ic.hasNext();) {
+ String str = (String)ic.next();
+ if (str.equals(sProfile.interface_type)) {
+ rtcout.println(Logbuf.DEBUG,sProfile.interface_type+" exists in the SDO service factory.");
+ rtcout.println(Logbuf.PARANOID,"Available SDO serices in the factory: "+ StringUtil.flatten(consumerTypes));
+ return true;
+ }
+ }
+ rtcout.println(Logbuf.WARN,"No available SDO service in the factory: "+
+ sProfile.interface_type);
+ return false;
+ }
+
+ final String getUUID() {
+ return UUID.randomUUID().toString();
+ }
+
+ private String ifrToKey(String ifr) {
+ String[] ifrvstr = ifr.split(":");
+ String str = ifrvstr[1].toLowerCase();
+ str = str.replace(".", "_");
+ str = str.replace("/", ".");
+ return str;
+ }
+ private RTObject_impl m_rtobj;
+
+ private List<String> m_consumerTypes = new ArrayList<String>();
+ private boolean m_allConsumerEnabled;
+ private boolean m_allConsumerAllowed;
+
+ /**
+ * {@.ja Lock 付き SDO ServiceProfileList}
+ * {@.en SDO ServiceProfileList with mutex lock}
+ */
+ private Vector<SdoServiceProviderBase> m_providers = new Vector<SdoServiceProviderBase>();
+ private String m_provider_mutex = new String();
+
+ /**
+ * {@.ja Lock 付き SDO ServiceProfileList}
+ * {@.en SDO ServiceProfileList with mutex lock}
+ */
+ private Vector<SdoServiceConsumerBase> m_consumers = new Vector<SdoServiceConsumerBase>();
+ private String m_consumer_mutex = new String();
+
+ /**
+ * {@.ja logger}
+ * {@.en logger}
+ */
+ protected Logbuf rtcout;
+}
Added: branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceConsumerBase.java
===================================================================
--- branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceConsumerBase.java (rev 0)
+++ branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceConsumerBase.java 2011-07-12 06:57:46 UTC (rev 498)
@@ -0,0 +1,184 @@
+package jp.go.aist.rtm.RTC;
+
+import _SDOPackage.ServiceProfile;
+ /**
+ * {@.ja SdoServiceConsumerBase インターフェース。}
+ * {@.en SdoServiceConsumerBase Interface.}
+ * <p>
+ * {@.ja SDOで定義されているSDOサービスのコンシューマを実装するための基底ク
+ * ラス。SDOサービスには、外部から提供サービスをRTC(SDO)側で利用する
+ * SDOサービスコンシューマと、RTC(SDO)自身がSDOサービスを提供するSDO
+ * サービスプロバイダがある。すべてのSDOサービスコンシューマはこの基
+ * 底クラスを継承して実装される。
+ *
+ * このオブジェクトのライフサイクルは以下の通り。
+ * <ul>
+ * <li># オブジェクトは通常、共有オブジェクト (so, DLL) としてコンパイル・
+ * リンクされる。
+ * <li># マネージャに対してロードされるとモジュール初期化関数によりオブ
+ * ジェクトファクトリが、SdoServiceConsumerFactory に対して登録さ
+ * れる。登録のキーにはサービスインターフェースの IFR (interface
+ * repository) ID が利用され、これによりサービスが区別される。
+ * <li># 外部のツールなどからサービスプロバイダがアタッチされた場合、サー
+ * ビスインターフェースの IFR ID が同一である SDO コンシューマがイ
+ * ンスタンス化され、提供されたSDOサービスの ServiceProfile (この
+ * 構造体はサービスのオブジェクトリファレンスを含む) がコンシュー
+ * マにアタッチされる。
+ * <li># このときのアタッチシーケンスは以下の通り。
+ * -# SDO::get_configuration() により Configuration オブジェクトを取得
+ * -# Configuration::add_service_profile() により外部側の
+ * SdoServiceProvider を ServiceProfile により RTC に与える。
+ * -# RTC側でサービスを呼び出す必要が有った場合、この
+ * SdoServiceConsumer が保持しているサービスオブジェクトプロキシ
+ * に対して呼び出しを行う
+ * <li># 最終的に SdoServiceConsumer が不要になった場合には、
+ * Configuration::remove_service_profile() が id とともに呼び出され
+ * SDOサービスコンシューマが RTC から削除される。
+ * </ul>
+ * <pre>
+ *
+ * [RTC] [SDO consumer] [Configuration] [SDO service] [Other]
+ * | : | | |
+ * | : get_configuration() | |
+ * |<---------:-------------------------------|------------|
+ * | : | | |
+ * | : | add_service_profile(prof) |
+ * | : create() |<----------------|------------|
+ * | |<------------| | |
+ * | | call_sdo_service() | |
+ * | |-------------|---------------->| |
+ * | | call_sdo_service2() | |
+ * | |-------------|---------------->| |
+ * | | | : | |
+ * | | | | |
+ * | | | remove_service_profile(id) |
+ * | | delete() |<----------------|------------|
+ * | x<------------| | |
+ * | | x x
+ *
+ * </pre>
+ *
+ * このクラスの実装に当たっては、少なくとも以下の純粋仮想関数を実装す
+ * る必要がある。
+ * <ul>
+ * <li> init(): 初期化関数。与えられた RTObject および ServiceProfile か
+ * ら、当該オブジェクトを初期化する。
+ * <li> reinit(): 再初期化関数。ServiceProfile は設定情報更新のため同一
+ * IDで呼び出されることが有るが、その際にこの関数が新たな
+ * ServiceProfile とともに呼び出される。関数内では、設定の変更など
+ * 再初期化処理を実装する。
+ * <li> getProfile(): 設定されたプロファイルを返す関数。
+ * <li> finalize(): 終了処理。コンシューマがデタッチされる際に呼び出され
+ * る関数。関数内では終了処理を実装する。
+ * </ul>
+ * SdoServiceConsumer は通常共有オブジェクトとしてコンパイル・リンク
+ * される。共有オブジェクトのエントリポイントは通常コンパイルされたファ
+ * イル名の basename + "Init" にしておく。以下に、クラス名、ファイル
+ * 名、エントリポイント関数名の推奨例を示す。
+ * <ul>
+ * <li> 実装クラス名: MySdoServiceConusmer
+ * <li> ファイル名: MySdoServiceConsumer.h. MySdoServiceConsumer.cpp
+ * <li> 共有オブジェクト名: MySdoServiceConsumer.so (or DLL)
+ * <li> エントリポイント関数名: MySdoServiceConsumerInit()
+ * </ul>
+ * エントリポイント関数は通常以下のように、SdoServiceConsumerFactory
+ * に当該コンシューマのファクトリ (と解体ファンクタ) を登録する以下の
+ * ような関数になる。
+ *
+ * <pre>
+ * extern "C"
+ * {
+ * void MySdoServiceConsumerInit()
+ * {
+ * RTC::SdoServiceConsumerFactory& factory
+ * = RTC::SdoServiceConsumerFactory::instance();
+ * factory.addFactory(CORBA_Util::toRepositoryId<OpenRTM::MySdoService>(),
+ * ::coil::Creator< ::RTC::SdoServiceConsumerBase,
+ * ::RTC::MySdoServiceConsumer>,
+ * ::coil::Destructor< ::RTC::SdoServiceConsumerBase,
+ * ::RTC::MySdoServiceConsumer>);
+ * }
+ * };
+ * </pre>}
+ * </p>
+ *
+ */
+
+
+public interface SdoServiceConsumerBase {
+
+ /**
+ * {@.ja コンシューマクラスの初期化関数}
+ * {@.en Initialization function of the consumer class}
+ * <p>
+ * {@.ja このオブジェクトの初期化を行う。外部からSDOサービスが
+ * ServiceProfile とともにアタッチされると、SDOコンシューマがインス
+ * タンス化され、その直後に SDO サービスがアタッチされた RTC と与え
+ * られた ServiceProfile を引数としてこの関数が呼ばれる。
+ *
+ * 関数内では、ServiceProfile 内の SDO サービスリファレンスを
+ * CorbaConsumer クラス等を利用しオブジェクト内に保持するとともに、
+ * properties から設定内容を読み込みサービス固有の設定等を行う。与
+ * えられたサービスのオブジェクトリファレンスが不正、あるいは
+ * properties の内容が不正、等の場合は戻り値に false を返す。}
+ *
+ * @param rtobj
+ * {@.ja このオブジェクトがインスタンス化された RTC}
+ * @param profile
+ * {@.ja 外部から与えられた SDO ServiceProfile}
+ * @return
+ * {@.ja 与えられた SDO Service や ServiceProfile が不正の場合 false}
+ *
+ */
+ public boolean init(RTObject_impl rtobj,
+ final _SDOPackage.ServiceProfile profile);
+ /**
+ * {@.ja コンシューマクラスの再初期化関数}
+ * {@.en Reinitialization function of the consumer class}
+ * <p>
+ * {@.ja このオブジェクトの再初期化を行う。ServiceProfile には id フィー
+ * ルドにセッション固有の UUID がセットされているが、同一の id の場
+ * 合、properties に設定された設定情報の変更や、service フィールド
+ * のサービスの参照の変更が行われる。その際に呼ばれるのがこの
+ * reinit() 関数である。実装では、service フィールドのオブジェクト
+ * リファレンスの同一性を確認し、異なっている場合保持しているリファ
+ * レンスを更新する必要がある。また properties には新たな設定が与え
+ * られている可能性があるので、内容を読み込み設定を更新する。}
+ *
+ * @param profile
+ * {@.ja 新たに与えられた SDO ServiceProfile}
+ * @return
+ * {@.ja 不正な ServiceProfile が与えられた場合は false}
+ *
+ *
+ */
+ public boolean reinit(final _SDOPackage.ServiceProfile profile);
+
+ /**
+ * {@.ja ServiceProfile を返す}
+ * {@.en Getting ServiceProfile}
+ * <p>
+ * {@.ja init()/reinit()で与えられた ServiceProfile は通常オブジェクト内
+ * で保持される。SDO Service 管理フレームワークは管理上このオブジェ
+ * クトに対応する ServiceProfile を必要とするので、この関数では保持
+ * されている ServiceProfile を返す。}
+ *
+ * @return
+ * {@.ja このオブジェクトが保持している ServiceProfile}
+ *
+ */
+ public _SDOPackage.ServiceProfile getProfile();
+
+ /**
+ * {@.ja 終了処理}
+ * {@.en Finalization}
+ * <p>
+ * {@.ja SDOサービスがでタッチされる際に呼び出される終了処理用関数。サー
+ * ビスのでタッチに際して、当該オブジェクトが保持するリソースを解放
+ * するなどの処理を行う。}
+ *
+ *
+ */
+ public void finalize();
+
+}
Added: branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceConsumerFactory.java
===================================================================
--- branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceConsumerFactory.java (rev 0)
+++ branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceConsumerFactory.java 2011-07-12 06:57:46 UTC (rev 498)
@@ -0,0 +1,53 @@
+package jp.go.aist.rtm.RTC;
+
+/**
+ * {@.ja SdoServiceConsumer用ファクトリの実装}
+ * {@.en Implement of factory for SdoServiceConsumer}
+ */
+
+public class SdoServiceConsumerFactory<ABSTRACTCLASS,IDENTIFIER> extends FactoryGlobal<ABSTRACTCLASS,IDENTIFIER> {
+
+ /**
+ * {@.ja コンストラクタ。}
+ * {@.en Constructor}
+ */
+ private SdoServiceConsumerFactory() {
+
+ }
+ /**
+ * {@.ja インスタンス生成。}
+ * {@.en Create instance}
+ *
+ * <p>
+ * {@.ja インスタンスを生成する。}
+ *
+ * @return
+ * {@.ja インスタンス}
+ * {@.en SdoServiceConsumerFactory object}
+ *
+ */
+ public static SdoServiceConsumerFactory instance() {
+ if (factory_global == null) {
+ synchronized (factory_global_mutex) {
+ if (factory_global == null) {
+ try {
+ factory_global = new SdoServiceConsumerFactory();
+ } catch (Exception e) {
+ factory_global = null;
+ }
+ }
+ }
+ }
+
+ return factory_global;
+ }
+ /**
+ * <p> mutex </p>
+ */
+ private static String factory_global_mutex = new String();
+ /**
+ * <p> object </p>
+ */
+ private static SdoServiceConsumerFactory factory_global;
+}
+
Added: branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceProviderBase.java
===================================================================
--- branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceProviderBase.java (rev 0)
+++ branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceProviderBase.java 2011-07-12 06:57:46 UTC (rev 498)
@@ -0,0 +1,183 @@
+package jp.go.aist.rtm.RTC;
+
+import _SDOPackage.ServiceProfile;
+import _SDOPackage.SDOServicePOA;
+ /**
+ * {@.ja SdoServiceProviderBase インターフェース。}
+ * {@.en SdoServiceProviderBase Interface.}
+ * <p>
+ * {@.ja SDOで定義されているSDOサービスのプロバイダを実装するための基底クラ
+ * ス。SDOサービスには、外部から提供サービスをRTC(SDO)側で利用する
+ * SDOサービスコンシューマと、RTC(SDO)自身がSDOサービスを提供するSDO
+ * サービスプロバイダがある。すべてのSDOサービスプロバイダはこの基底
+ * クラスを継承して実装される。
+ *
+ * このオブジェクトのライフサイクルは以下の通り。
+ *
+ * -# オブジェクトは通常、共有オブジェクト (so, DLL) としてコンパイル・
+ * リンクされる。
+ * -# マネージャに対してロードされるとモジュール初期化関数によりオブ
+ * ジェクトファクトリが、SdoServiceProviderFactory に対して登録さ
+ * れる。登録のキーにはサービスインターフェースの IFR (interface
+ * repository) ID が利用され、これによりサービスが区別される。
+ * -# rtc.conf等のコンフィギュレーション指定により、有効化することが
+ * 指定されているサービスインプロバイダは、RTCの起動と同時にインス
+ * タンス化される。
+ * -# インスタンス化後、初期化関数 init() が呼ばれる。引数には当該サー
+ * ビスのためのコンフィギュレーションオプションが coil::Propertyに
+ * より渡される。
+ * -# インスタンス化されたSDOサービスプロバイダは
+ * SDO::get_get_sdo_service() により外部からアクセスされる。このと
+ * き、サービスを指定するIDはIFR IDと同じである。このときのアタッ
+ * チシーケンスは以下の通り。
+ * -# RTCがfinalizeされ解体されると同時にSDOサービスプロバイダも解体
+ * されるが、その際にはSdoServiceProviderBase::finalize()がコール
+ * されるので、ここでリソースの解放など終了処理を行う。
+ *
+ * <pre>
+ *
+ * [RTC] [SDO service] [Other]
+ * | : |
+ * | instantiate : |
+ * |------------->: |
+ * | init() | |
+ * |------------->| |
+ * | | get_service_profiles() |
+ * |<--------------------------------------|
+ * | | get_sdo_service() |
+ * |<--------------------------------------|
+ * | | use service |
+ * | |<-----------------------|
+ * | | |
+ * | finalize() | |
+ * |------------->x |
+ * x x |
+ *
+ * </pre>
+ *
+ * このクラスの実装に当たっては、少なくとも以下の純粋仮想関数を実装す
+ * る必要がある。
+ *
+ * - init(): 初期化関数。与えられた RTObject および ServiceProfile か
+ * ら、当該オブジェクトを初期化する。
+ * - reinit(): 再初期化関数。ServiceProfile は設定情報更新のため同一
+ * IDで呼び出されることが有るが、その際にこの関数が新たな
+ * ServiceProfile とともに呼び出される。関数内では、設定の変更など
+ * 再初期化処理を実装する。
+ * - getProfile(): 設定されたプロファイルを返す関数。
+ * - finalize(): 終了処理。コンシューマがデタッチされる際に呼び出され
+ * る関数。関数内では終了処理を実装する。
+ *
+ * SdoServiceProvider は通常共有オブジェクトとしてコンパイル・リンク
+ * される。共有オブジェクトのエントリポイントは通常コンパイルされたファ
+ * イル名の basename + "Init" にしておく。以下に、クラス名、ファイル
+ * 名、エントリポイント関数名の推奨例を示す。
+ *
+ * - 実装クラス名: MySdoServiceConusmer
+ * - ファイル名: MySdoServiceProvider.h. MySdoServiceProvider.cpp
+ * - 共有オブジェクト名: MySdoServiceProvider.so (or DLL)
+ * - エントリポイント関数名: MySdoServiceProviderInit()
+ *
+ * エントリポイント関数は通常以下のように、SdoServiceProviderFactory
+ * に当該コンシューマのファクトリ (と解体ファンクタ) を登録する以下の
+ * ような関数になる。
+ *
+ * <pre>
+ * extern "C"
+ * {
+ * void MySdoServiceProviderInit()
+ * {
+ * RTC::SdoServiceProviderFactory& factory
+ * = RTC::SdoServiceProviderFactory::instance();
+ * factory.addFactory(CORBA_Util::toRepositoryId<OpenRTM::MySdoService>(),
+ * ::coil::Creator< ::RTC::SdoServiceProviderBase,
+ * ::RTC::MySdoServiceProvider>,
+ * ::coil::Destructor< ::RTC::SdoServiceProviderBase,
+ * ::RTC::MySdoServiceProvider>);
+ * }
+ * };
+ * </pre>}
+ *
+ *
+ *
+ */
+
+
+//public interface SdoServiceProviderBase extends SDOServicePOA{
+public interface SdoServiceProviderBase {
+
+ /**
+ * {@.ja コンシューマクラスの初期化関数}
+ * {@.en Initialization function of the consumer class}
+ * <p>
+ * {@.ja このオブジェクトの初期化を行う。外部からSDOサービスが
+ * ServiceProfile とともにアタッチされると、SDOコンシューマがインス
+ * タンス化され、その直後に SDO サービスがアタッチされた RTC と与え
+ * られた ServiceProfile を引数としてこの関数が呼ばれる。
+ *
+ * 関数内では、ServiceProfile 内の SDO サービスリファレンスを
+ * CorbaProvider クラス等を利用しオブジェクト内に保持するとともに、
+ * properties から設定内容を読み込みサービス固有の設定等を行う。与
+ * えられたサービスのオブジェクトリファレンスが不正、あるいは
+ * properties の内容が不正、等の場合は戻り値に false を返す。}
+ *
+ * @param rtobj
+ * {@.ja このオブジェクトがインスタンス化された RTC}
+ * @param profile
+ * {@.ja 外部から与えられた SDO ServiceProfile}
+ * @return
+ * {@.ja 与えられた SDO Service や ServiceProfile が不正の場合 false}
+ *
+ */
+ public boolean init(RTObject_impl rtobj,
+ final _SDOPackage.ServiceProfile profile);
+ /**
+ * {@.ja コンシューマクラスの再初期化関数}
+ * {@.en Reinitialization function of the consumer class}
+ * <p>
+ * {@.ja このオブジェクトの再初期化を行う。ServiceProfile には id フィー
+ * ルドにセッション固有の UUID がセットされているが、同一の id の場
+ * 合、properties に設定された設定情報の変更や、service フィールド
+ * のサービスの参照の変更が行われる。その際に呼ばれるのがこの
+ * reinit() 関数である。実装では、service フィールドのオブジェクト
+ * リファレンスの同一性を確認し、異なっている場合保持しているリファ
+ * レンスを更新する必要がある。また properties には新たな設定が与え
+ * られている可能性があるので、内容を読み込み設定を更新する。}
+ *
+ * @param profile
+ * {@.ja 新たに与えられた SDO ServiceProfile}
+ * @return
+ * {@.ja 不正な ServiceProfile が与えられた場合は false}
+ *
+ *
+ */
+ public boolean reinit(final _SDOPackage.ServiceProfile profile);
+
+ /**
+ * {@.ja ServiceProfile を返す}
+ * {@.en Getting ServiceProfile}
+ * <p>
+ * {@.ja init()/reinit()で与えられた ServiceProfile は通常オブジェクト内
+ * で保持される。SDO Service 管理フレームワークは管理上このオブジェ
+ * クトに対応する ServiceProfile を必要とするので、この関数では保持
+ * されている ServiceProfile を返す。}
+ *
+ * @return
+ * {@.ja このオブジェクトが保持している ServiceProfile}
+ *
+ */
+ public _SDOPackage.ServiceProfile getProfile();
+
+ /**
+ * {@.ja 終了処理}
+ * {@.en Finalization}
+ * <p>
+ * {@.ja SDOサービスがでタッチされる際に呼び出される終了処理用関数。サー
+ * ビスのでタッチに際して、当該オブジェクトが保持するリソースを解放
+ * するなどの処理を行う。}
+ *
+ *
+ */
+ public void finalize();
+
+}
Added: branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceProviderFactory.java
===================================================================
--- branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceProviderFactory.java (rev 0)
+++ branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/SdoServiceProviderFactory.java 2011-07-12 06:57:46 UTC (rev 498)
@@ -0,0 +1,56 @@
+package jp.go.aist.rtm.RTC;
+
+/**
+ * {@.ja SdoServiceProvider用ファクトリの実装}
+ * {@.en Implement of factory for SdoServiceProvider}
+ */
+
+public class SdoServiceProviderFactory<ABSTRACTCLASS,IDENTIFIER> extends FactoryGlobal<ABSTRACTCLASS,IDENTIFIER> {
+
+ /**
+ * {@.ja コンストラクタ。}
+ * {@.en Constructor}
+ */
+ private SdoServiceProviderFactory() {
+
+ }
+ /**
+ * {@.ja インスタンス生成。}
+ * {@.en Create instance}
+ *
+ * <p>
+ * {@.ja インスタンスを生成する。}
+ *
+ * @return
+ * {@.ja インスタンス}
+ * {@.en SdoServiceConsumerFactory object}
+ *
+ */
+ public static SdoServiceProviderFactory instance() {
+/*
+ if (factory_global == null) {
+ synchronized (factory_global_mutex) {
+ if (factory_global == null) {
+ try {
+ factory_global = new SdoServiceProviderFactory();
+ } catch (Exception e) {
+ factory_global = null;
+ }
+ }
+ }
+ }
+ return factory_global;
+*/
+ return (SdoServiceProviderFactory)instance("SdoServiceProviderFactory");
+ }
+ /**
+ * <p> mutex </p>
+ */
+ private static String factory_global_mutex = new String();
+ /**
+ * <p> object </p>
+ */
+ private static SdoServiceProviderFactory factory_global;
+}
+
+
Modified: branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/PortBase.java
===================================================================
--- branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/PortBase.java 2011-05-09 02:00:39 UTC (rev 497)
+++ branches/RELENG_1_0/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/port/PortBase.java 2011-07-12 06:57:46 UTC (rev 498)
@@ -158,9 +158,12 @@
}
/**
- * <p>当該PortのCORBAオブジェクト参照を取得します。</p>
+ * {@.ja 当該PortのCORBAオブジェクト参照を取得する。}
+ * {@.en Gets CORBA object referense of this PortService}
*
- * @return 当該PortのCORBAオブジェクト参照
+ * @return
+ * {@.ja 当該PortのCORBAオブジェクト参照}
+ * {@.en CORBA object referense of this OpenRTM.OutPortCdr}
*/
public PortService _this() {
if (this.m_objref == null) {
@@ -176,25 +179,60 @@
}
/**
- * <p>デフォルトコンストラクタです。ポート名には空文字列が割り当てられます。</p>
+ * {@.ja デフォルトコンストラクタ}
+ * {@.en Default constructor}
+ * <p>
+ * {@.ja ポート名には空文字列が割り当てらる。}
+ * {@.en Empty string is assigned port name.}
*/
public PortBase() {
this("");
}
/**
- * <p>PortProfileを取得します。なお、PortProfileは次のメンバを持っています。
+ * {@.ja [CORBA interface] PortProfileを取得する}
+ * {@.en [CORBA interface] Get the PortProfile of the Port}
+ * <p>
+ * {@.ja Portが保持するPortProfileを返す。この関数は CORBA オペレーション
+ * であり、CORBA のメモリ管理規則に従い、呼び出し側は返される
+ * PortProfile オブジェクトを解体する責任がある。PortProfile 構造体
+ * は以下のメンバーを持つ。
* <ul>
- * <li>name [String型] Port名</li>
- * <li>interfaces [PortInterfaceProfile配列型] Port が保持するPortInterfaceProfileのシーケンス</li>
- * <li>port_ref [Port型] Port自身のCORBAオブジェクト参照</li>
- * <li>connector_profile [ConnectorProfile配列型] Portが現在保持するConnectorProfileのシーケンス</li>
- * <li>owner [RTObject型] このPortを所有するRTObjectのCORBAオブジェクト参照</li>
- * <li>properties [NameValue配列型] その他のプロパティ</li>
+ * <li>- name [string 型] Port の名前。
+ * <li>- interfaces [PortInterfaceProfileList 型] Port が保持する
+ * PortInterfaceProfile のシーケンス
+ * <li>- port_ref [Port Object 型] Port 自身のオブジェクトリファレンス
+ * <li>- connector_profile [ConnectorProfileList 型] Port が現在保持する
+ * ConnectorProfile のシーケンス
+ * <li>- owner [RTObject Object 型] この Port を所有する
+ * RTObjectのリファレンス
+ * <li>- properties [NVList 型] その他のプロパティ。
* </ul>
- * </p>
- *
- * @return 本ポートに関するPortProfileオブジェクト
+ * 事後条件:この関数を呼び出すことにより内部状態が変更されることはない。}
+ * {@.en This operation returns the PortProfile of the Port. Since this
+ * function is CORBA operation, callers have responsibility to
+ * destruction of the returned PortProfile object according to the
+ * CORBA memory management rules.
+ *
+ * PortProfile struct has the following members:
+ * <ul>
+ * <li>- name [string type] The name of the Port.
+ * <li>- interfaces [PortInterfaceProfileList type] The sequence of
+ * PortInterfaceProfile owned by the Port
+ * <li>- port_ref [Port Object type] The object reference of the Port.
+ * <li>- connector_profile [ConnectorProfileList type] The sequence of
+ * ConnectorProfile owned by the Port.
+ * <li>- owner [RTObject Object type] The object reference of
+ * RTObject that is owner of the Port.
+ * <li>- properties [NVList type] The other properties.
+ * </ul>
+ * post:This function never changes the state of the object.}
+ *
+ *
+ * @return
+ * {@.ja PortProfile}
+ * {@.en PortProfile of the Port}
+ *
*/
public PortProfile get_port_profile() {
rtcout.println(Logbuf.TRACE, "get_port_profile()");
@@ -206,29 +244,69 @@
}
/**
- * <p>[Local interface] PortProfileを取得します。</p>
- *
- * @return 本ポートに関するPortProfile
+ * {@.ja PortProfile を取得する。}
+ * {@.en Get the PortProfile of the Port}
+ * <p>
+ * {@.ja この関数は、オブジェクト内部に保持されている PortProfile の
+ * const 参照を返す const 関数である。
+ *
+ * 事後条件:この関数を呼び出すことにより内部状態が変更されることはない。}
+ * {@.en This function is a const function that returns a const
+ * reference of the PortProfile stored in this Port.
+ *
+ * post:This function never changes the state of the object.}
+ *
+ * @return
+ * {@.ja PortProfile}
+ * {@.en PortProfile}
*/
public final PortProfile getPortProfile() {
return m_profile;
}
/**
- * <p>ConnectorProfileリストを取得します。
- * ConnectorProfileはポート間の接続プロファイル情報を保持するクラスであり、
- * 接続時にポート間で情報交換を行い、関連するすべてのポートで同一の値が保持されます。</p>
- *
- * <p>ConnectorProfileは以下のメンバを保持しています。
+ * {@.ja [CORBA interface] ConnectorProfileListを取得する}
+ * {@.en [CORBA interface] Get the ConnectorProfileList of the Port}
+ * <p>
+ * {@.ja Portが保持する ConnectorProfile の sequence を返す。この関数は
+ * CORBA オペレーションであり、CORBA のメモリ管理規則に従い、呼び出
+ * し側は返される ConnectorProfileList オブジェクトを解体する責任が
+ * ある。
+ *
+ * ConnectorProfile は Port 間の接続プロファイル情報を保持する構造体であり、
+ * 接続時にPort間で情報交換を行い、関連するすべての Port で同一の値が
+ * 保持される。
+ * ConnectorProfile は以下のメンバーを保持している。
* <ul>
- * <li>name [String型] コネクタ名</li>
- * <li>connector_id [String型] ユニークなコネクタID</li>
- * <li>ports [Port配列型] このコネクタに関連するPortのCORBAオブジェクト参照のシーケンス
- * <li>properties [NameValue配列型] その他のプロパティ</li>
+ * <li>- name [string 型] このコネクタの名前。
+ * <li>- connector_id [string 型] ユニークなID
+ * <li>- ports [Port sequnce] このコネクタに関連する Port のオブジェクト
+ * リファレンスのシーケンス。
+ * <li>- properties [NVList 型] その他のプロパティ。
* </ul>
- * </p>
+ * 事後条件:この関数を呼び出すことにより内部状態が変更されることはない。}
+ * {@.en This operation returns a list of the ConnectorProfiles of the
+ * Port. Since this function is CORBA operation, callers have
+ * responsibility to destruction of the returned ConnectorProfileList
+ * object according to the CORBA memory management rules.
*
- * @return このポートに関連するConnectorProfileオブジェクトの配列
+ * ConnectorProfile includes the connection information that
+ * describes relation between (among) Ports, and Ports exchange
+ * the ConnectionProfile on connection process and hold the same
+ * information in every Port. ConnectionProfile has the following
+ * members:
+ * <ul>
+ * <li>- name [string type] The name of the connection.
+ * <li>- connector_id [string type] Unique identifier.
+ * <li>- ports [Port sequnce] The sequence of Port's object reference
+ * that are related the connection.
+ * <li>- properties [NVList type] The other properties.
+ * </ul>
+ * post:This function never changes the state of the object.}
+ *
+ * @return
+ * {@.ja この Port が保持する ConnectorProfile}
+ * {@.en ConnectorProfileList of the Port}
*/
public RTC.ConnectorProfile[] get_connector_profiles() {
rtcout.println(Logbuf.TRACE, "get_connector_profiles()");
@@ -248,10 +326,37 @@
}
/**
- * <p>指定されたコネクタIDに対応する接続プロファイルを取得します。</p>
- *
- * @param connector_id コネクタID
- * @return 指定されたコネクタIDに対応する接続プロファイル
+ * {@.ja [CORBA interface] ConnectorProfile を取得する}
+ * {@.en [CORBA interface] Get the ConnectorProfile}
+ * <p>
+ * {@.ja connector_id で指定された ConnectorProfile を返す。この関数は
+ * CORBA オペレーションであり、CORBA のメモリ管理規則に従い、呼び出
+ * し側は返される ConnectorProfile オブジェクトを解体する責任がある。
+ *
+ * 事前条件:引数に与える connector_id は有効な文字列でなければならない。
+ * 空文字を指定した場合、または指定した connector_id を持つ
+ * ConnectorProfile が見つからない場合は、空の ConnectorProfile を
+ * 返す。
+ *
+ * 事後条件:この関数を呼び出すことにより内部状態が変更されることはない。}
+ * {@.en This operation returns the ConnectorProfiles specified
+ * connector_id. Since this function is CORBA operation, callers
+ * have responsibility to destruction of the returned
+ * ConnectorProfile object according to the CORBA memory
+ * management rules.
+ *
+ * If ConnectorProfile with specified connector_id is not included,
+ * empty ConnectorProfile is returned.
+ *
+ * post:This function never changes the state of the object.}
+ *
+ *
+ * @param connector_id
+ * {@.ja ConnectorProfile の ID}
+ * {@.en ID of the ConnectorProfile}
+ * @return
+ * {@.ja connector_id で指定された ConnectorProfile}
+ * {@.en the ConnectorProfile identified by the connector_id}
*/
public ConnectorProfile get_connector_profile(final String connector_id) {
@@ -298,6 +403,168 @@
* @param connector_profile 接続プロファイル
* @return ReturnCode_t型による戻り値
*/
+ /**
+ * {@.ja [CORBA interface] Port の接続を行う}
+ * {@.en [CORBA interface] Connect the Port}
+ * <p>
+ * {@.ja 与えられた ConnectoionProfile の情報に基づき、Port間の接続を確立
+ * する。この関数は主にアプリケーションプログラムやツールから呼び出
+ * すことを前提としている。
+ * <b>事前条件:</b>
+ * <ul>
+ * <li> アプリケーションプログラムは、コンポーネント間の複数の
+ * Port を接続するために、適切な値をセットした ConnectorProfile を
+ * connect() の引数として与えて呼び出さなければならない。</li>
+ *
+ * <li> connect() に与える ConnectorProfile のメンバーのうち、
+ * name, ports, properties メンバーに対してデータをセットしなければ
+ * ならない。connector_id には通常空文字を設定するか、適当なUUIDを
+ * 文字列で設定する必要がある。</li>
+ *
+ * <li> ConnectorProfile::name は接続につける名前で CORBA::string
+ * 型に格納できる任意の文字列である必要がある。</li>
+ *
+ * <li> ConnectorProfile::connector_id はすべての接続に対して一意な
+ * ID (通常はUUID) が格納される。UUIDの設定は connect() 関数内で行
+ * われるので、呼び出し側は空文字を設定する。既存の接続と同じUUIDを
+ * 設定し connect() を呼び出した場合には PRECONDITION_NOT_MET エラー
+ * を返す。ただし、将来の拡張で既存の接続プロファイルを更新するため
+ * に既存の UUID を設定して呼び出す使用法が用いられる可能性がある。</li>
+ *
+ * <li> ConnectorProfile::ports は RTC::PortService のシーケンスで、
+ * 接続を構成する通常2つ以上のポートのオブジェクト参照を代入する必
+ * 要がある。例外として、ポートのオブジェクト参照を1つだけ格納して
+ * connect()を呼び出すことで、ポートのインターフェース情報を取得し
+ * たり、特殊なポート(CORBAのRTC::PortService以外の相手)に対して接
+ * 続を行う場合もある。</li>
+ *
+ * <li> ConnectorProfile::properties はポートに関連付けられたインター
+ * フェースに対するプロパティを与えるために使用する。プロパティは、
+ * string 型をキー、Any 型を値としてもつペアのシーケンスであり、値
+ * には任意のCORBAデータ型を格納できるが、可能な限り string 型とし
+ * て格納されることが推奨される。</li>
+ *
+ * <li> 以上 connect() 呼び出し時に設定する ConnectorProfile のメン
+ * バをまとめると以下のようになる。
+ * <ul>
+ * <li>- ConnectorProfile::name: 任意の接続名
+ * <li>- ConnectorProfile::connector_id: 空文字
+ * <li>- ConnectorProfile::ports: 1つ以上のポート
+ * <li>- ConnectorProfile::properties: インターフェースに対するプロパティ
+ * </ul>
+ * </li>
+ * </ul>
+ * <b>事後条件:</b>
+ * <ul>
+ * <li> connect() 関数は、ConnectorProfile::portsに格納されたポー
+ * トシーケンスの先頭のポートに対して notify_connect() を呼ぶ。</li>
+ *
+ * <li> notify_connect() は ConnectorProfile::ports に格納されたポー
+ * ト順に notify_connect() をカスケード呼び出しする。このカスケード
+ * 呼び出しは、途中のnotify_connect() でエラーが出てもポートのオブ
+ * ジェクト参照が有効である限り、必ずすべてのポートに対して行われる
+ * ことが保証される。有効でないオブジェクト参照がシーケンス中に存在
+ * する場合、そのポートをスキップして、次のポートに対して
+ * notify_connect() を呼び出す。</li>
+ *
+ * <li> connect() 関数は、notify_connect()の戻り値がRTC_OKであれば、
+ * RTC_OK を返す。この時点で接続は完了する。RTC_OK以外
+ * の場合は、この接続IDに対してdisconnect()を呼び出し接続を解除し、
+ * notify_connect() が返したエラーリターンコードをそのまま返す。</li>
+ *
+ * <li> connect() の引数として渡した ConnectorProfile には、
+ * ConnectorProfile::connector_id および、途中のポートが
+ * publishInterfaces() で公開したポートインターフェースの各種情報が
+ * 格納されている。connect() および途中の notify_connect() が
+ * ConnectorProfile::{name, ports} を変更することはない。</li></ul>}
+ *
+ * {@.en This operation establishes connection according to the given
+ * ConnectionProfile inforamtion. This function is premised on
+ * calling from mainly application program or tools.
+ *
+ * <b>Preconditioin:</b>
+ * <ul>
+ * <li>To establish the connection among Ports of RT-Components,
+ * application programs must call this operation giving
+ * ConnectorProfile with valid values as an argument.</li>
+ *
+ * <li>Out of ConnectorProfile member variables, "name", "ports"
+ * and "properties" members shall be set valid
+ * data. "connector_id" shall be set as empty string value or
+ * valid string UUID value.</li>
+ *
+ * <li>ConnectorProfile::name that is connection identifier shall
+ * be any valid CORBA::string.</li>
+ *
+ *
+ * <li>ConnectorProfile::connector_id shall be set unique
+ * identifier (usually UUID is used) for all connections. Since
+ * UUID string value is usually set in the connect() function,
+ * caller should just set empty string. If the connect() is called
+ * with the same UUID as existing connection, this function
+ * returns PRECONDITION_NOT_MET error. However, in order to update
+ * the existing connection profile, the "connect()" operation with
+ * existing connector ID might be used as valid method by future
+ * extension</li>
+ *
+ * <li>ConnectorProfile::ports, which is sequence of
+ * RTC::PortService references, shall store usually two or more
+ * ports' references. As exceptions, the "connect()" operation
+ * might be called with only one reference in ConnectorProfile, in
+ * case of just getting interfaces information from the port, or
+ * connecting a special port (i.e. the peer port except
+ * RTC::PortService on CORBA).</li>
+ *
+ * <li>ConnectorProfile::properties might be used to give certain
+ * properties to the service interfaces associated with the port.
+ * The properties is a sequence variable with a pair of key string
+ * and Any type value. Although the A variable can store any type
+ * of values, it is not recommended except string.</li>
+ *
+ * <li>The following is the summary of the ConnectorProfile
+ * member to be set when this operation is called.
+ * <ul>
+ * <li>- ConnectorProfile::name: The any name of connection</li>
+ * <li>- ConnectorProfile::connector_id: Empty string</li>
+ * <li>- ConnectorProfile::ports: One or more port references</li>
+ * <li>- ConnectorProfile::properties: Properties for the interfaces</li>
+ * </li>
+ * </ul>
+ * <b>Postcondition:</b>
+ * <ul>
+ * <li> connect() operation will call the first port in the
+ * sequence of the ConnectorProfile.</li>
+ *
+ * <li> "noify_connect()"s perform cascaded call to the ports
+ * stored in the ConnectorProfile::ports by order. Even if errors
+ * are raised by intermediate notify_connect() operation, as long
+ * as ports' object references are valid, it is guaranteed that
+ * this cascaded call is completed in all the ports. If invalid
+ * or dead ports exist in the port's sequence, the ports are
+ * skipped and notify_connect() is called for the next valid port.</li>
+ *
+ * <li> connect() function returns RTC_OK if all the
+ * notify_connect() return RTC_OK. At this time the connection is
+ * completed. If notify_connect()s return except RTC_OK,
+ * connect() calls disconnect() operation with the connector_id to
+ * destruct the connection, and then it returns error code from
+ * notify_connect().</li>
+ *
+ * <li> The ConnectorProfile argument of the connect() operation
+ * returns ConnectorProfile::connector_id and various information
+ * about service interfaces that is published by
+ * publishInterfaces() in the halfway ports. The connect() and
+ * halfway notify_connect() functions never change
+ * ConnectorProfile::{name, ports}. </li></ul>}
+ *
+ * @param connector_profile
+ * {@.ja ConnectorProfile}
+ * {@.en The ConnectorProfile.}
+ * @return
+ * {@.ja ReturnCode_t 型のリターンコード}
+ * {@.en ReturnCode_t The return code of ReturnCode_t type.}
+ *
+ */
public ReturnCode_t connect(ConnectorProfileHolder connector_profile) {
rtcout.println(Logbuf.TRACE, "connect()");
@@ -534,6 +801,68 @@
* @param connector_id コネクタID
* @return ReturnCode_t型の戻り値
*/
+ /**
+ * {@.ja [CORBA interface] Port の接続を解除する}
+ * {@.en [CORBA interface] Disconnect the Port}
+ * <p>
+ * {@.ja このオペレーションは与えられた connector_id に対応する接続を解除
+ * する。connector_id は通常、システム全体において一意な UUID の文
+ * 字列であり、事前に connect()/notify_connect() の呼び出しにより確
+ * 立された接続プロファイル ConnectorProfile::connector_id に対応す
+ * る。
+ * <b>事前条件:</b>
+ * <ul>
+ * <li> connector_id は Port が保持する ConnectorProfile の少なくと
+ * も一つの ID に一致する文字列でなければならない。当該 Port が持つ
+ * ConnectorProfile のリスト内に connector_id と同一の ID を持つ
+ * ConnectorProfile が存在しなければこの関数は BAD_PARAMETER エラー
+ * を返す。</li>
+ *
+ * <li> connector_id と同じ ID を持つ ConnectorProfile::ports には
+ * 有効な Port の参照が含まれていなければならない。</li>
+ *
+ * <li> disconnect() 関数は、ConnectorProfile::ports の Port の参
+ * 照リストの先頭に対して、notify_disconnect() を呼び出す。参照が無
+ * 効であるなど、notify_disconnect() の呼び出しに失敗した場合には、
+ * 参照リストの先頭から順番に成功するまで notify_disconnect() の呼
+ * び出しを試す。notify_disconnect() の呼び出しに一つでも成功すれば、
+ * notify_disconnect() の返却値をそのまま返し、一つも成功しなかった
+ * 場合には RTC_ERROR エラーを返す。</li></ul>}
+ *
+ * {@.en This operation destroys connection between this port and the
+ * peer port according to given connector_id. Usually connector_id
+ * should be a UUID string that is unique in the system. And the
+ * connection, which is established by connect()/notify_connect()
+ * functions, is identified by the ConnectorProfile::connector_id.
+ * <b>Precondition</b>
+ * <ul>
+ * <li> connector_id shall be a character string which is same
+ * with ID of at least one of the ConnectorProfiles stored in this
+ * port. If ConnectorProfile that has same ID with the given
+ * connector_id does not exist in the list of ConnectorProfile,
+ * this operation returns BAD_PARAMTER error.</li>
+ *
+ * <li> ConnectorProfile::ports that is same ID with given
+ * connector_id shall store the valid ports' references.</li>
+ *
+ * <li> disconnect() function invokes the notify_disconnect() for
+ * the port that is stored in the first of the
+ * ConnectorProfile::ports. If notify_disconnect() call fails for
+ * the first port, It tries on calling "notify_disconnect()" in
+ * order for ports stored in ConnectorProfile::ports until the
+ * operation call is succeeded. If notify_disconnect() succeeded
+ * for at least one port, it returns return code from
+ * notify_disconnect(). If none of notify_connect() call
+ * succeeded, it returns RTC_ERROR error.</li></ul>}
+ *
+ * @param connector_id
+ * {@.ja ConnectorProfile の ID}
+ * {@.en The ID of the ConnectorProfile.}
+ * @return
+ * {@.ja ReturnCode_t 型のリターンコード}
+ * {@.en ReturnCode_t The return code of ReturnCode_t type.}
+ *
+ */
public ReturnCode_t disconnect(final String connector_id) {
rtcout.println(Logbuf.TRACE, "disconnect("+connector_id+")");
@@ -716,9 +1045,17 @@
}
/**
- * <p>当該ポートに関連したすべての接続を解除します。</p>
- *
- * @return ReturnCode_t型の戻り値
+ * {@.ja [CORBA interface] Port の全接続を解除する}
+ * {@.en [CORBA interface] Disconnect the All Ports}
+ *
+ * <p>
+ * {@.ja このオペレーションはこの Port に関連した全ての接続を解除する。}
+ * {@.en This operation destroys all connections associated with this Port.}
+ *
+ * @return
+ * {@.ja ReturnCode_t 型のリターンコード}
+ * {@.en ReturnCode_t The return code of ReturnCode_t type.}
+ *
*/
public ReturnCode_t disconnect_all() {
@@ -744,25 +1081,37 @@
}
/**
- * <p> Activate all Port interfaces </p>
+ * {@.ja Port の全てのインターフェースを activates する}
+ * {@.en Activate all Port interfaces}
*
- * <p> This operation activate all interfaces that is registered in the
- * ports. </p>
+ * <p>
+ * {@.ja Port に登録されている全てのインターフェースを activate する。}
+ * {@.en This operation activate all interfaces that is registered in the
+ * ports.}
*/
public abstract void activateInterfaces();
/**
- * <p> Deactivate all Port interfaces </p>
- *
- * <p> This operation deactivate all interfaces that is registered in the
- * ports. </p>
- *
+ * {@.ja 全ての Port のインターフェースを deactivates する}
+ * {@.en Deactivate all Port interfaces}
+ * <p>
+ * {@.ja Port に登録されている全てのインターフェースを deactivate する。}
+ * {@.en This operation deactivate all interfaces that is registered in the
+ * ports.}
*/
public abstract void deactivateInterfaces();
/**
- * <p>ポート名を設定します。指定されたポート名は、PortProfileのnameメンバに設定されます。</p>
- *
- * @param name ポート名
+ * {@.ja Port の名前を設定する}
+ * {@.en Set the name of this Port}
+ * <p>
+ * {@.ja Port の名前を設定する。この名前は Port が保持する PortProfile.name
+ * に反映される。}
+ * {@.en This operation sets the name of this Port. The given Port's name is
+ * applied to Port's PortProfile.name.}
+ *
+ * @param name
+ * {@.ja Port の名前}
+ * {@.en The name of this Port.}
*/
public void setName(final String name) {
synchronized (this.m_profile) {
@@ -771,9 +1120,15 @@
}
/**
- * <p> Get the name of this Port </p>
- * <p> This operation returns the name of this Port. </p>
- * @return The name of this Port.
+ * {@.ja Port の名前を取得する}
+ * {@.en Get the name of this Port}
+ * <p>
+ * {@.ja Port の名前を取得する。}
+ * {@.en This operation returns the name of this Port.}
+ *
+ * @return
+ * {@.ja Port の名前}
+ * {@.en The name of this Port.}
*/
public final String getName() {
rtcout.println(Logbuf.TRACE, "getName() = "+m_profile.name);
@@ -781,9 +1136,15 @@
}
/**
- * <p>当該ポートが保持しているPortProfileオブジェクトを取得します。</p>
- *
- * @return 当該ポートが保持しているPortProfileオブジェクト
+ * {@.ja PortProfileを取得する}
+ * {@.en Get the PortProfile of the Port}
+ * <p>
+ * {@.ja Portが保持する PortProfile の const 参照を返す。}
+ * {@.en This operation returns const reference of the PortProfile.}
+ *
+ * @return
+ * {@.ja この Port の PortProfile}
+ * {@.en PortProfile of the Port}
*/
public final PortProfile getProfile() {
synchronized (this.m_profile) {
@@ -792,11 +1153,17 @@
}
/**
- * <p>指定されたポートCORBAオブジェクト参照を設定します。</p>
- * <p>本メソッドは、当該ポート自身のCORBAオブジェクト参照を設定するために用います。
- * 当該ポートのCORBAオブジェクト参照以外は設定しないでください。</p>
- *
- * @param port_ref 当該ポートのCORBAオブジェクト参照
+ * {@.ja Port のオブジェクト参照を設定する}
+ * {@.en Set the object reference of this Port}
+ * <p>
+ * {@.ja このオペレーションは Port の PortProfile にこの Port 自身の
+ * オブジェクト参照を設定する。}
+ * {@.en This operation sets the object reference itself
+ * to the Port's PortProfile.}
+ *
+ * @param port_ref
+ * {@.ja この Port のオブジェクト参照}
+ * {@.en port_ref The object reference of this Port.}
*/
public void setPortRef(PortService port_ref) {
synchronized (this.m_profile) {
@@ -805,9 +1172,17 @@
}
/**
- * <p>当該ポートのPortProfileが保持している、当該ポート自身のCORBAオブジェクト参照を取得します。</p>
- *
- * @return 当該ポートのCORBAオブジェクト参照
+ * {@.ja Port のオブジェクト参照を取得する}
+ * {@.en Get the object reference of this Port}
+ * <p>
+ * {@.ja このオペレーションは Port の PortProfile が保持している
+ * この Port 自身のオブジェクト参照を取得する。}
+ * {@.en This operation returns the object reference
+ * that is stored in the Port's PortProfile.}
+ *
+ * @return
+ * {@.ja この Port のオブジェクト参照}
+ * {`.en The object reference of this Port.}
*/
public PortService getPortRef() {
synchronized (this.m_profile) {
openrtm-commit メーリングリストの案内