25 #include <Ice/ObjectAdapter.h>
26 #include <IceUtil/UUID.h>
33 #include <MemoryX/interface/workingmemory/WorkingMemoryListenerInterface.h>
39 const DatabaseInterfacePrx& databasePrx) :
40 name(name),
ic(
ic), databasePrx(databasePrx)
42 iceId.name = IceUtil::generateUUID();
45 PersistentEntitySegmentBasePrx
48 addSegmentToMap(segName);
53 WorkingMemorySnapshot::addSegmentPtr(
const std::string& segName)
55 addSegmentToMap(segName);
56 return getSegmentPtr(segName);
60 WorkingMemorySnapshot::addSegmentToMap(
const std::string& segName)
62 segmentNames[segName] = getSegmentCollectionName(segName);
65 PersistentEntitySegmentBasePrx
73 segId.name +=
"_" + IceUtil::generateUUID();
75 openedSegments[segId] = segment;
77 Ice::ObjectPrx node =
c.adapter->add(segment, segId);
78 return PersistentEntitySegmentBasePrx::uncheckedCast(node);
82 return PersistentEntitySegmentBasePrx();
87 WorkingMemorySnapshot::getSegmentPtr(const ::std::string& segName)
89 SegmentMap::const_iterator itSeg = segmentNames.find(segName);
91 if (itSeg != segmentNames.end())
94 CollectionInterfacePrx segmentColl = databasePrx->requestCollection(itSeg->second);
98 PersistentEntitySegmentBasePtr segment =
100 segment->setSegmentName(segName);
101 return PersistentEntitySegmentPtr::dynamicCast(segment);
117 return segmentNames.count(segName);
125 for (SegmentMap::const_iterator it = segmentNames.begin(); it != segmentNames.end(); ++it)
127 result.push_back(it->first);
136 for (SegmentMap::const_iterator it = segmentNames.begin(); it != segmentNames.end(); ++it)
138 databasePrx->dropCollection(it->second);
141 segmentNames.clear();
152 const ::Ice::Current&)
154 NameList wmSegNames = workingMemory->getSegmentNames();
156 for (NameList::const_iterator itSeg = wmSegNames.begin(); itSeg != wmSegNames.end();
159 WorkingMemoryEntitySegmentBasePrx wmSegment =
160 WorkingMemoryEntitySegmentBasePrx::uncheckedCast(workingMemory->getSegment(*itSeg));
164 PersistentEntitySegmentBasePtr snapSegment = addSegmentPtr(*itSeg);
165 EntityIdList ids = wmSegment->getAllEntityIds();
167 for (EntityIdList::const_iterator itEntity = ids.begin(); itEntity != ids.end();
170 snapSegment->addEntity(wmSegment->getEntityById(*itEntity));
178 const AbstractWorkingMemoryInterfacePrx& workingMemory,
179 const Ice::StringSeq& entityIdList,
182 NameList wmSegNames = workingMemory->getSegmentNames();
183 auto sortedEntities = entityIdList;
184 std::sort(sortedEntities.begin(), sortedEntities.end());
185 auto newEnd = std::unique(sortedEntities.begin(), sortedEntities.end());
186 sortedEntities.erase(newEnd, sortedEntities.end());
188 for (
const auto& segName : wmSegNames)
190 WorkingMemoryEntitySegmentBasePrx wmSegment =
191 WorkingMemoryEntitySegmentBasePrx::uncheckedCast(
192 workingMemory->getSegment(segName));
196 PersistentEntitySegmentBasePtr snapSegment = addSegmentPtr(segName);
197 EntityIdList ids = wmSegment->getAllEntityIds();
198 std::sort(ids.begin(), ids.end());
199 Ice::StringSeq intersectionList(ids.size());
200 auto intersectionEnd = std::set_intersection(ids.begin(),
202 sortedEntities.begin(),
203 sortedEntities.end(),
204 intersectionList.begin());
205 intersectionList.resize(intersectionEnd - intersectionList.begin());
206 auto newEnd = std::unique(intersectionList.begin(), intersectionList.end());
207 intersectionList.erase(newEnd, intersectionList.end());
209 for (EntityIdList::const_iterator itEntity = intersectionList.begin();
210 itEntity != intersectionList.end();
213 snapSegment->addEntity(wmSegment->getEntityById(*itEntity));
221 const AbstractWorkingMemoryInterfacePrx& workingMemory,
222 const ::Ice::Current&)
224 std::set<WorkingMemoryListenerInterfacePrx> listeners;
225 for (SegmentMap::const_iterator itSeg = segmentNames.begin(); itSeg != segmentNames.end();
228 PersistentEntitySegmentBasePtr snapSegment = getSegmentPtr(itSeg->first);
229 WorkingMemoryEntitySegmentBasePrx wmSegment =
230 WorkingMemoryEntitySegmentBasePrx::uncheckedCast(
231 workingMemory->getSegment(itSeg->first));
236 EntityIdList ids = snapSegment->getAllEntityIds();
238 for (EntityIdList::const_iterator itEntity = ids.begin(); itEntity != ids.end();
242 wmSegment->addEntity(snapSegment->getEntityById(*itEntity));
245 ARMARX_INFO <<
"Loaded " << wmSegment->size() <<
" elements into segment "
248 WorkingMemoryListenerInterfacePrx l = wmSegment->getListenerProxy();
252 l->reportSnapshotLoaded(itSeg->first);
257 <<
"Unable to load segment " << itSeg->first
258 <<
" from snapshot: Corresponding WM segment not exists or has invalid type";
260 for (
auto& l : listeners)
262 l->reportSnapshotCompletelyLoaded();
273 WorkingMemorySnapshot::getSegmentCollectionName(
const std::string& segName)
275 return name +
"_" + segName;
281 const ::Ice::Current&
c)
const
284 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
286 obj->setString(
"name", name);
290 for (SegmentMap::const_iterator it = segmentNames.begin(); it != segmentNames.end(); ++it)
292 objSegments->setString(it->first, it->second);
295 obj->setElement(
"segments", objSegments);
300 const ::Ice::Current&
c)
303 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
305 name = obj->getString(
"name");
308 const std::vector<std::string> segNames = objSegments->getElementNames();
309 segmentNames.clear();
311 for (std::vector<std::string>::const_iterator it = segNames.begin(); it != segNames.end();
314 segmentNames[*it] = objSegments->getString(*it);