[openrtm-commit:00765] r526 - in branches/work/OpenRTM-aist-Python/OpenRTM_aist: . test

openrtm @ openrtm.org openrtm @ openrtm.org
2012年 3月 13日 (火) 16:15:16 JST


Author: kurihara
Date: 2012-03-13 16:15:16 +0900 (Tue, 13 Mar 2012)
New Revision: 526

Modified:
   branches/work/OpenRTM-aist-Python/OpenRTM_aist/GlobalFactory.py
   branches/work/OpenRTM-aist-Python/OpenRTM_aist/test/test_GlobalFactory.py
Log:
Factory now manages created objects. refs #2332

Modified: branches/work/OpenRTM-aist-Python/OpenRTM_aist/GlobalFactory.py
===================================================================
--- branches/work/OpenRTM-aist-Python/OpenRTM_aist/GlobalFactory.py	2012-03-13 05:30:45 UTC (rev 525)
+++ branches/work/OpenRTM-aist-Python/OpenRTM_aist/GlobalFactory.py	2012-03-13 07:15:16 UTC (rev 526)
@@ -21,6 +21,8 @@
 
 
 class Factory:
+  """
+  """
 
   FACTORY_OK     = 0
   FACTORY_ERROR  = 1
@@ -29,9 +31,53 @@
   INVALID_ARG    = 4
   UNKNOWN_ERROR  = 5
 
+  ##
+  # @if jp
+  #
+  # @class FactoryEntry
+  # @brief FactoryEntry クラス
+  #
+  # @else
+  #
+  # @class FactoryEntry
+  # @brief FactoryEntry class
+  #
+  # @endif
+  class FactoryEntry:
+    """
+    """
 
+    ##
+    # @if jp
+    #
+    # @brief コンストラクタ
+    #
+    # コンストラクタ。
+    #
+    # @param creator クリエータ用ファンクタ
+    # @param destructor デストラクタ用ファンクタ
+    #
+    # @else
+    #
+    # @brief Constructor
+    #
+    # Constructor
+    #
+    # @param creator Functor for creator.
+    # @param destructor Functor for destructor.
+    #
+    # @endif
+    # FactoryEntry(Identifier id, Creator creator, Destructor destructor)
+    def __init__(self, id, creator, destructor):
+      self.id_ = id
+      self.creator_ = creator
+      self.destructor_ = destructor
+      return
+
+
   def __init__(self):
     self._creators = {}
+    self._objects = {}
 
 
   ## bool hasFactory(const Identifier& id)
@@ -55,13 +101,13 @@
   ##                       Creator creator,
   ##                       Destructor destructor)
   def addFactory(self, id, creator, destructor):
-    if not creator:
+    if not creator or not destructor:
       return self.INVALID_ARG
 
     if self._creators.has_key(id):
       return self.ALREADY_EXISTS
     
-    self._creators[id] = creator
+    self._creators[id] = Factory.FactoryEntry(id, creator, destructor)
     return self.FACTORY_OK
 
 
@@ -79,18 +125,170 @@
     if not self._creators.has_key(id):
       print "Factory.createObject return None id: ", id
       return None
-    return self._creators[id]()
+    obj_ = self._creators[id].creator_()
+    assert(not self._objects.has_key(obj_))
+    self._objects[obj_] = self._creators[id]
+    return obj_
 
 
-  ## void deleteObject(const Identifier& id, AbstractClass*& obj)
+  ## ReturnCode deleteObject(const Identifier& id, AbstractClass*& obj)
   def deleteObject(self, obj, id=None):
     if id:
-      if not self._creators.has_key(id):
-        return
+      if self._creators.has_key(id):
+        self._creators[id].destructor_(obj)
+        del self._objects[obj]
+        return self.FACTORY_OK
 
-    del obj
-    return
+    if not self._objects.has_key(obj):
+      return self.NOT_FOUND
 
+    tmp = obj
+    self._objects[obj].destructor_(obj)
+    del self._objects[tmp]
+    return self.FACTORY_OK
+
+
+  ##
+  # @if jp
+  #
+  # @brief 生成済みオブジェクトリストの取得
+  #
+  # このファクトリで生成されたオブジェクトのリストを取得する。
+  #
+  # @return 生成済みオブジェクトリスト
+  #
+  # @else
+  #
+  # @brief Getting created objects
+  #
+  # This operation returns a list of created objects by the factory.
+  #
+  # @return created object list
+  #
+  # @endif
+  # std::vector<AbstractClass*> createdObjects()
+  def createdObjects(self):
+    objects_ = []
+    for id_ in self._objects.keys():
+      objects_.append(id_)
+
+    return objects_
+
+
+  ##
+  # @if jp
+  #
+  # @brief オブジェクトがこのファクトリの生成物かどうか調べる
+  #
+  # @param obj 対象オブジェクト
+  # @return true: このファクトリの生成物
+  #         false: このファクトリの生成物ではない
+  #
+  # @else
+  #
+  # @brief Whether a object is a product of this factory
+  #
+  # @param obj A target object
+  # @return true: The object is a product of the factory
+  #         false: The object is not a product of the factory
+  #
+  # @return created object list
+  #
+  # @endif
+  # bool isProducerOf(AbstractClass* obj)
+  def isProducerOf(self, obj):
+    return self._objects.has_key(obj)
+
+
+  ##
+  # @if jp
+  #
+  # @brief オブジェクトからクラス識別子(ID)を取得する
+  #
+  # 当該オブジェクトのクラス識別子(ID)を取得する。
+  #
+  # @param obj [in] クラス識別子(ID)を取得したいオブジェクト
+  # @param id [out] クラス識別子(ID)
+  # @return リターンコード NOT_FOUND: 識別子が存在しない
+  #                        FACTORY_OK: 正常終了
+  # @else
+  #
+  # @brief Getting class identifier (ID) from a object
+  #
+  # This operation returns a class identifier (ID) from a object.
+  #
+  # @param obj [in] An object to investigate its class ID.
+  # @param id [out] Class identifier (ID)
+  # @return Return code NOT_FOUND: ID not found
+  #                        FACTORY_OK: normal return
+  # @endif
+  # ReturnCode objectToIdentifier(AbstractClass* obj, Identifier& id)
+  def objectToIdentifier(self, obj, id):
+    if not self._objects.has_key(obj):
+      return self.NOT_FOUND
+
+    id[0] = self._objects[obj].id_
+    return self.FACTORY_OK
+
+
+  ##
+  # @if jp
+  #
+  # @brief オブジェクトのコンストラクタを取得する
+  #
+  # このファクトリで生成されたオブジェクトのコンストラクタを取得する。
+  # obj はこのファクトリで生成されたものでなければならない。予め
+  # isProducerOf() 関数で当該オブジェクトがこのファクトリの生成物で
+  # あるかどうかをチェックしなければならない。
+  #
+  # @return オブジェクトのデストラクタ
+  #
+  # @else
+  #
+  # @brief Getting destructor of the object
+  #
+  # This operation returns a constructor of the object created by
+  # the factory.  obj must be a product of the factory.  User must
+  # check if the object is a product of the factory by using
+  # isProducerOf()-function, before using this function.
+  #
+  # @return destructor of the object
+  #
+  # @endif
+  #Creator objectToCreator(AbstractClass* obj)
+  def objectToCreator(self, obj):
+    return self._objects[obj].creator_
+
+
+  ##
+  # @if jp
+  #
+  # @brief オブジェクトのデストラクタを取得する
+  #
+  # このファクトリで生成されたオブジェクトのデストラクタを取得する。
+  # obj はこのファクトリで生成されたものでなければならない。予め
+  # isProducerOf() 関数で当該オブジェクトがこのファクトリの生成物で
+  # あるかどうかをチェックしなければならない。
+  #
+  # @return オブジェクトのデストラクタ
+  #
+  # @else
+  #
+  # @brief Getting destructor of the object
+  #
+  # This operation returns a destructor of the object created by
+  # the factory.  obj must be a product of the factory.  User must
+  # check if the object is a product of the factory by using
+  # isProducerOf()-function, before using this function.
+  #
+  # @return destructor of the object
+  #
+  # @endif
+  #Destructor objectToDestructor(AbstractClass* obj)
+  def objectToDestructor(self, obj):
+    return self._objects[obj].destructor_
+
+
     
 gfactory = None
 

Modified: branches/work/OpenRTM-aist-Python/OpenRTM_aist/test/test_GlobalFactory.py
===================================================================
--- branches/work/OpenRTM-aist-Python/OpenRTM_aist/test/test_GlobalFactory.py	2012-03-13 05:30:45 UTC (rev 525)
+++ branches/work/OpenRTM-aist-Python/OpenRTM_aist/test/test_GlobalFactory.py	2012-03-13 07:15:16 UTC (rev 526)
@@ -24,91 +24,129 @@
 from GlobalFactory import *
 
 class Test:
-	def __init__(self):
-		pass
+  def __init__(self):
+    pass
 
-	def test(self):
-		return True
+  def test(self):
+    return True
 
 class TestGlobalFactory(unittest.TestCase):
 
-	def setUp(self):
-		self.factory = GlobalFactory.instance()
-		self.factory.addFactory("test",Test,OpenRTM_aist.Delete)
-		return
+  def setUp(self):
+    self.factory = GlobalFactory.instance()
+    self.creator = Test
+    self.destructor = OpenRTM_aist.Delete
+    self.factory.addFactory("test",self.creator,self.destructor)
+    return
 
-	def tearDown(self):
-		self.factory.removeFactory("test")
-		return
+  def tearDown(self):
+    self.factory.removeFactory("test")
+    return
 
-	def test_isinstance(self):
-		self.assertEqual(self.factory,GlobalFactory.instance())
+  def test_isinstance(self):
+    self.assertEqual(self.factory,GlobalFactory.instance())
 
-	def test_hasFactory(self):
-		# addFactoryにて登録したファクトリオブジェクトの問い合わせ。
-		self.assertEqual(self.factory.hasFactory("test"),True)
-		# addFactoryにて登録していないファクトリオブジェクトの問い合わせ。
-		self.assertEqual(self.factory.hasFactory("testtest"),False)
-		# addFactoryにて登録していないファクトリオブジェクトの問い合わせ(空文字)。
-		self.assertEqual(self.factory.hasFactory(""),False)
-		return
+  def test_hasFactory(self):
+    # addFactoryにて登録したファクトリオブジェクトの問い合わせ。
+    self.assertEqual(self.factory.hasFactory("test"),True)
+    # addFactoryにて登録していないファクトリオブジェクトの問い合わせ。
+    self.assertEqual(self.factory.hasFactory("testtest"),False)
+    # addFactoryにて登録していないファクトリオブジェクトの問い合わせ(空文字)。
+    self.assertEqual(self.factory.hasFactory(""),False)
+    return
 
-	def test_getIdentifiers(self):
-		# ファクトリが登録済みの場合の問い合わせ。
-		self.assertEqual(self.factory.getIdentifiers(),["test"])
-		GlobalFactory.instance().addFactory("test2",Test,OpenRTM_aist.Delete)
-		self.assertEqual(self.factory.getIdentifiers(),["test","test2"])
-		# ファクトリが登録されていない場合の問い合わせ。
-		self.factory.removeFactory("test")
-		self.factory.removeFactory("test2")
-		self.assertEqual(self.factory.getIdentifiers(),[])
-		return
-	
-	def test_addFactory(self):
-		# creatorを指定しない場合、INVALID_ARGが返されるか?
-		self.assertEqual(GlobalFactory.instance().addFactory("test",None,OpenRTM_aist.Delete),
-				 GlobalFactory.INVALID_ARG)
+  def test_getIdentifiers(self):
+    # ファクトリが登録済みの場合の問い合わせ。
+    self.assertEqual(self.factory.getIdentifiers(),["test"])
+    GlobalFactory.instance().addFactory("test2",Test,OpenRTM_aist.Delete)
+    self.assertEqual(self.factory.getIdentifiers(),["test","test2"])
+    # ファクトリが登録されていない場合の問い合わせ。
+    self.factory.removeFactory("test")
+    self.factory.removeFactory("test2")
+    self.assertEqual(self.factory.getIdentifiers(),[])
+    return
+  
+  def test_addFactory(self):
+    # creatorを指定しない場合、INVALID_ARGが返されるか?
+    self.assertEqual(GlobalFactory.instance().addFactory("test",None,OpenRTM_aist.Delete),
+                     GlobalFactory.INVALID_ARG)
 
-		# 既に登録済みのIDにてaddFactory()をコールした場合、ALREADY_EXISTSが返されるか?
-		self.assertEqual(GlobalFactory.instance().addFactory("test",Test,OpenRTM_aist.Delete),
-				 GlobalFactory.ALREADY_EXISTS)
+    # 既に登録済みのIDにてaddFactory()をコールした場合、ALREADY_EXISTSが返されるか?
+    self.assertEqual(GlobalFactory.instance().addFactory("test",Test,OpenRTM_aist.Delete),
+                     GlobalFactory.ALREADY_EXISTS)
 
-		# idとcreatorを指定してaddFactory()をコールした場合、FACTORY_OKが返されるか?
-		self.assertEqual(GlobalFactory.instance().addFactory("test1",Test,OpenRTM_aist.Delete),
-				 GlobalFactory.FACTORY_OK)
-		self.factory.removeFactory("test1")
+    # idとcreatorを指定してaddFactory()をコールした場合、FACTORY_OKが返されるか?
+    self.assertEqual(GlobalFactory.instance().addFactory("test1",Test,OpenRTM_aist.Delete),
+                     GlobalFactory.FACTORY_OK)
+    self.factory.removeFactory("test1")
 
+    return
 
-		return
+  def test_removeFactory(self):
+    # 登録していないIDでコールした場合、NOT_FOUNDが返されるか?
+    self.assertEqual(self.factory.removeFactory("testtest"),
+                     GlobalFactory.NOT_FOUND)
+         
+    # 登録済みのIDでコールした場合、FACTORY_OKが返されるか?
+    self.assertEqual(self.factory.removeFactory("test"),
+                     GlobalFactory.FACTORY_OK)
 
-	def test_removeFactory(self):
-		# 登録していないIDでコールした場合、NOT_FOUNDが返されるか?
-		self.assertEqual(self.factory.removeFactory("testtest"),
-				 GlobalFactory.NOT_FOUND)
-				 
-		# 登録済みのIDでコールした場合、FACTORY_OKが返されるか?
-		self.assertEqual(self.factory.removeFactory("test"),
-				 GlobalFactory.FACTORY_OK)
+    # ファクトリが正しく削除されたか?
+    self.assertEqual(self.factory.getIdentifiers(),[])
+    return
 
-		# ファクトリが正しく削除されたか?
-		self.assertEqual(self.factory.getIdentifiers(),[])
-		return
+  def test_createObject(self):
+    # 登録していないIDでコールした場合、Noneが返されるか?
+    self.assertEqual(self.factory.createObject("testtest"),
+                     None)
+    # 登録済みのIDでコールした場合、正しいオブジェクトが返されるか?
+    obj = self.factory.createObject("test")
+    self.assertEqual(obj.test(),True)
+    self.factory.deleteObject(obj)
+    return
 
-	def test_createObject(self):
-		# 登録していないIDでコールした場合、Noneが返されるか?
-		self.assertEqual(self.factory.createObject("testtest"),
-				 None)
-		# 登録済みのIDでコールした場合、正しいオブジェクトが返されるか?
-		self.assertEqual(self.factory.createObject("test").test(),True)
-		return
+  def test_deleteObject(self):
+    # 登録していないIDでコールした場合
+    self.factory.deleteObject(self.factory.createObject("test"),"testtest")
+    # IDを指定しないでコールした場合
+    self.factory.deleteObject(self.factory.createObject("test"))
+    return
 
-	def test_deleteObject(self):
-		# 登録していないIDでコールした場合
-		self.factory.deleteObject(self.factory.createObject("test"),"testtest")
-		# IDを指定しないでコールした場合
-		self.factory.deleteObject(self.factory.createObject("test"))
-		return
+  def test_createdObjects(self):
+    self.assertEqual(0, len(self.factory.createdObjects()))
+    obj = self.factory.createObject("test")
+    self.assertEqual(obj.test(),True)
+    self.assertEqual(1, len(self.factory.createdObjects()))
+    self.factory.deleteObject(obj)
+    return
 
+  def test_isProducerOf(self):
+    obj = self.factory.createObject("test")
+    self.assertEqual(True, self.factory.isProducerOf(obj))
+    self.factory.deleteObject(obj)
+    return
+
+  def test_objectToIdentifier(self):
+    obj = self.factory.createObject("test")
+    id_ = [None]
+    self.assertEqual(Factory.FACTORY_OK, self.factory.objectToIdentifier(obj, id_))
+    self.assertEqual("test",id_[0])
+    self.factory.deleteObject(obj)
+    return
+
+  def test_objectToCreator(self):
+    obj = self.factory.createObject("test")
+    self.assertEqual(self.creator, self.factory.objectToCreator(obj))
+    self.factory.deleteObject(obj)
+    return
+
+  def test_objectToDestructor(self):
+    obj = self.factory.createObject("test")
+    self.assertEqual(self.destructor, self.factory.objectToDestructor(obj))
+    self.factory.deleteObject(obj)
+    return
+
+
 ############### test #################
 if __name__ == '__main__':
         unittest.main()



openrtm-commit メーリングリストの案内