bootstrap: avoid creating duplicate objects 93/260493/1
authorHosang Kim <hosang12.kim@samsung.com>
Fri, 25 Jun 2021 10:26:08 +0000 (19:26 +0900)
committerHosang Kim <hosang12.kim@samsung.com>
Fri, 25 Jun 2021 10:26:08 +0000 (19:26 +0900)
Change-Id: Ie289fb4d877636207b0fa8d12b4b20944a9e0623

org.tizen.aurum-bootstrap/inc/ObjectMapper.h
org.tizen.aurum-bootstrap/src/Commands/FindElementCommand.cc
org.tizen.aurum-bootstrap/src/ObjectMapper.cc

index a997f685fe1d6e595ac80e27eadc19249731f6fa..7f4f651a95f962d148e2594540051323789f24c5 100644 (file)
@@ -8,7 +8,7 @@
 class ObjectMapper {
 private:
     std::map<std::string, std::shared_ptr<UiObject>> mObjectMap;
-    std::map<std::shared_ptr<UiObject>, std::string> mObjectMapReverse;
+    std::map<std::string, std::string> mObjectMapReverse;
     unsigned long long                               mObjCounter;
 
 private:
@@ -28,4 +28,4 @@ public:
     bool removeElement(std::shared_ptr<UiObject> object);
 
     void cleanUp();
-};
\ No newline at end of file
+};
index fb9bd1dde17816a3a215c71066a03bbb7031f9c0..8524db9588ce67be914ae7a49bf511a0e0d9f91a 100644 (file)
@@ -67,7 +67,10 @@ std::vector<std::shared_ptr<UiSelector>> FindElementCommand::getSelectors(void)
     if (founds.size() > 0) {
         for (auto& found : founds) {
             UiObject*   obj = found.get();
-            std::string key = mObjMap->addElement(std::move(found));
+            std::string key{};
+            key = mObjMap->getElement(found);
+            if (key.length() <= 0)
+              key = mObjMap->addElement(std::move(found));
             LOG_F(INFO, "found object : %s key:%s",
                   obj->getAutomationId().c_str(), key.c_str());
             ::aurum::Element* elm = mResponse->add_elements();
index 645dece67f01185cb2ad1dfb755a7dabb18aaff9..32b97c3caf0746ffeffd48ed22135f2b530bc166 100644 (file)
@@ -19,8 +19,9 @@ std::string ObjectMapper::addElement(std::shared_ptr<UiObject> object)
     ++mObjCounter;
     std::string key = std::to_string(mObjCounter);
     mObjectMap[key] = object;
-    mObjectMapReverse[object] = key;
-    LOG_SCOPE_F(INFO, "addElement %p as key %s", object.get(), key.c_str());
+    std::string value = object->getId();
+    mObjectMapReverse[value] = key;
+    LOG_SCOPE_F(INFO, "addElement %p as key %s, id %s", object.get(), key.c_str(), value.c_str());
     return key;
 }
 
@@ -42,9 +43,10 @@ std::shared_ptr<UiObject> ObjectMapper::getElement(std::string key)
 std::string ObjectMapper::getElement(std::shared_ptr<UiObject> object)
 {
     LOG_SCOPE_F(INFO, "getElement for object(%p)", object.get());
-    if (object && mObjectMapReverse.count(object)) {
+    std::string value = object->getId();
+    if (mObjectMapReverse.count(value)) {
         LOG_F(INFO, "succeeded");
-        return mObjectMapReverse[object];
+        return mObjectMapReverse[value];
     }
     LOG_F(INFO, "failed(object not found)");
     return std::string{""};
@@ -55,7 +57,8 @@ bool ObjectMapper::removeElement(const std::string key)
     LOG_SCOPE_F(INFO, "removeElement for key(%s)", key.c_str());
     std::shared_ptr<UiObject> obj = getElement(key);
     if (obj) {
-        if (mObjectMap.erase(key) && mObjectMapReverse.erase(obj))
+        std::string value = obj->getId();
+        if (mObjectMap.erase(key) && mObjectMapReverse.erase(value))
             return true;
     }
     return false;
@@ -74,22 +77,23 @@ void ObjectMapper::cleanUp()
     std::stringstream ss{};
 
     LOG_SCOPE_F(INFO, "clean up object map");
-        ss << "mObjectMap: ";
-    for(auto iter = mObjectMap.begin(); iter != mObjectMap.end(); ) {
-        if (!iter->second->isValid()) {
-            iter = mObjectMap.erase(iter);
+    ss << "mObjectMapReverse: ";
+    for(auto iter = mObjectMapReverse.begin(); iter != mObjectMapReverse.end(); ) {
+       auto obj = mObjectMap[iter->second];
+        if (obj && !obj->isValid()) {
+            iter = mObjectMapReverse.erase(iter);
         } else {
-            ss << "(" << iter->first << "," << iter->second.get() << ") ";
+            ss << "(" << iter->first << "," << iter->second << ") ";
             ++iter;
         }
     }
     ss << std::endl;
-    ss << "mObjectMapReverse: ";
-    for(auto iter = mObjectMapReverse.begin(); iter != mObjectMapReverse.end(); ) {
-        if (!iter->first->isValid()) {
-            iter = mObjectMapReverse.erase(iter);
+    ss << "mObjectMap: ";
+    for(auto iter = mObjectMap.begin(); iter != mObjectMap.end(); ) {
+        if (!iter->second->isValid()) {
+            iter = mObjectMap.erase(iter);
         } else {
-            ss << "(" << iter->first.get() << "," << iter->second << ") ";
+            ss << "(" << iter->first << "," << iter->second.get() << ") ";
             ++iter;
         }
     }
@@ -108,4 +112,4 @@ void ObjectMapper::cleanUp()
             return !pair.second->isValid();
         });
     }
-    */
\ No newline at end of file
+    */