EntityInstance.cpp
Go to the documentation of this file.
1 // Header
2 #include "EntityInstance.h"
3 
4 // STD / STL
5 #include <SimoxUtility/algorithm/string/string_tools.h>
6 
7 // ArmarX
10 
13 
15 {
16  EntityInstance::EntityInstance(const std::string& exportName,
17  const armem::MemoryID& id /* UNESCAPED */,
18  const std::shared_ptr<Processors>& filters,
19  const std::shared_ptr<persistence::MemoryPersistenceStrategy>& persistenceStrategy) :
20  EntityInstanceBase(exportName, id, filters),
21  persistenceStrategy_(persistenceStrategy)
22  {
23  //start();
24  }
25 
26  void
28  {
29  std::lock_guard l(ltm_mutex);
30 
32 
33  int index = std::stoi(getMemoryID().getEntityInstanceID().getLeafItem());
34 
35  armem::wm::EntityInstance wmEntityInstance = armem::wm::EntityInstance(index, wmEntitySnapshot.id());
36 
37  // add instance. Do not set data, since we only return references
38  wmEntitySnapshot.addInstance(wmEntityInstance);
39  }
40 
41  void
43  {
44  std::lock_guard l(ltm_mutex);
45 
47 
48  ARMARX_DEBUG << "Resolve entity instance id=" << id().cleanID().str();
49 
50  std::string origin = "undefined3";
51 
52  auto& dictConverter = processors->defaultObjectConverter;
53 
54 
55  aron::data::DictPtr datadict = nullptr;
56  aron::data::DictPtr metadatadict = nullptr;
57 
58 
59  std::string dataFilename = (persistence::MemoryPersistenceStrategy::DATA_FILENAME + dictConverter.suffix);
60  std::string metadataFilename = (persistence::MemoryPersistenceStrategy::METADATA_FILENAME + dictConverter.suffix);
61 
62  if (persistenceStrategy_->containsItem(id(), dataFilename))
63  {
64  auto datafilecontent = persistenceStrategy_->retrieveItem(id(), dataFilename);
65 
66  try
67  {
68  auto dataaron = dictConverter.convert({datafilecontent, ""}, {});
69  datadict = aron::data::Dict::DynamicCastAndCheck(dataaron);
70  }
71  catch (std::exception& ex)
72  {
73  ARMARX_ERROR << "Exception during conversion from file into json object. At entity instance=" << id().cleanID().str() << ", file=" << dataFilename << ", error message=" << ex.what();
74  return;
75  }
76  }
77  else
78  {
79  ARMARX_WARNING << "Could not find the data file '" << dataFilename
80  << "'. Continuing without data.";
81  }
82 
83  if (persistenceStrategy_->containsItem(id(), metadataFilename))
84  {
85  auto itemResult = persistenceStrategy_->retrieveItemWithOrigin(id(), metadataFilename);
86  auto metadatafilecontent = itemResult.data;
87  origin = itemResult.origin;
88 
89  try
90  {
91  auto metadataaron = dictConverter.convert({metadatafilecontent, ""}, {});
92  metadatadict = aron::data::Dict::DynamicCastAndCheck(metadataaron);
93  }
94  catch (std::exception& ex)
95  {
96  ARMARX_ERROR << "Exception during conversion from file into json object. At entity instance=" << id().cleanID().str() << ", file=" << metadataFilename << ", error message=" << ex.what();
97  return;
98  }
99  }
100  else
101  {
102  ARMARX_WARNING << "Could not find the metadata file '" << metadataFilename
103  << "'. Continuing without metadata.";
104  }
105 
106  for (const auto& [key, m] : datadict->getElements())
107  {
108  for (auto& f : processors->converters)
109  {
110  // iterate over all files and search for matching ones.
111  // We cannot simply check for the existence of a file because we do not know the
112  // mode (filename = memberName.mode.suffix)
113  for (const auto& entityInstanceKey : persistenceStrategy_->getItemKeys(id()))
114  {
115  if (simox::alg::starts_with(entityInstanceKey, key) and
116  simox::alg::ends_with(entityInstanceKey, f->suffix))
117  {
118  std::string mode = simox::alg::remove_suffix(
119  simox::alg::remove_prefix(entityInstanceKey, key), f->suffix);
120 
121  auto memberfilecontent = persistenceStrategy_->retrieveItem(id(), entityInstanceKey);
122  auto memberaron = f->convert(
123  {memberfilecontent, mode},
124  armarx::aron::Path(datadict->getPath(), std::vector<std::string>{key}));
125  datadict->setElement(key, memberaron);
126  break;
127  }
128  }
129  }
130  }
131 
132  from_aron(metadatadict, datadict, wmEntityInstance);
133 
134  // TODO: as parameter
135  bool usePersistenceStrategyAsOrigin = true;
136 
137  if (usePersistenceStrategyAsOrigin)
138  {
139  wmEntityInstance.metadata().origin = origin;
140  }
141  }
142 
143  nlohmann::json
145  {
146  std::lock_guard l(ltm_mutex);
147 
148  ARMARX_TRACE;
149 
150  if (id().instanceIndex < 0)
151  {
153  << "During storage of segment '" << wmEntitySnapshot.id().str()
154  << "' I noticed that the corresponding LTM has no id set. "
155  << "I set the id of the LTM to the same name, however this should not happen!";
156  id().timestamp = wmEntitySnapshot.id().timestamp;
157  }
158 
159  auto& dictConverter = processors->defaultObjectConverter;
160 
161  ARMARX_DEBUG << "Storing entity instance id=" << id().cleanID().str();
162 
163  // data
164  auto dataAron = std::make_shared<aron::data::Dict>();
165  auto metadataAron = std::make_shared<aron::data::Dict>();
166  to_aron(metadataAron, dataAron, wmEntitySnapshot);
167 
168  std::shared_ptr<aron::data::Dict> source;
169 
170  bool saveAndExtract =
171  false; //if true the data is saved in extracted form and in data.aron.json
172  // this is needed if several LTMs are recorded at once because otherwise the data from the data.aron.json
173  // is not there anymore to extract from
174 
175  if (saveAndExtract)
176  {
177  source = dataAron->clone();
178  }
179  else
180  {
181  source = dataAron;
182  }
183 
184  // check special members for special converters
185  for (auto& converter : processors->converters)
186  {
187  ARMARX_CHECK_NOT_NULL(converter);
188  ARMARX_CHECK_NOT_NULL(converter->extractor);
189  auto dataExt = converter->extractor->extract(source);
190 
191  for (const auto& [memberName, var] : dataExt.extraction)
192  {
194 
195  auto [memberDataVec, memberDataModeSuffix] = converter->convert(var);
196 
197  std::string filename = (memberName + memberDataModeSuffix + converter->suffix);
198 
199  persistenceStrategy_->storeItem(id(), filename, memberDataVec);
200  }
201  }
202 
203  // convert dict and metadata
204  auto [dataVec, dataVecModeSuffix] = dictConverter.convert(dataAron);
205  auto [metadataVec, metadataVecModeSuffix] = dictConverter.convert(metadataAron);
206  ARMARX_CHECK_EMPTY(dataVecModeSuffix);
207  ARMARX_CHECK_EMPTY(metadataVecModeSuffix);
208 
209  auto dataToReturn = nlohmann::json::parse(std::string(dataVec.begin(), dataVec.end()));
210 
211  {
212  std::string dataFilename = (persistence::MemoryPersistenceStrategy::DATA_FILENAME + dictConverter.suffix);
213  std::string metadataFilename = (persistence::MemoryPersistenceStrategy::METADATA_FILENAME + dictConverter.suffix);
214 
215  persistenceStrategy_->storeItem(id(), dataFilename, dataVec);
216  persistenceStrategy_->storeItem(id(), metadataFilename, metadataVec);
217  }
218 
221 
222  return dataToReturn;
223  }
224 } // namespace armarx::armem::server::ltm
armarx::armem::server::ltm::EntityInstance::_loadAllReferences
void _loadAllReferences(armem::wm::EntitySnapshot &wmEntitySnapshot) const override
Definition: EntityInstance.cpp:27
armarx::armem::MemoryID::timestamp
Time timestamp
Definition: MemoryID.h:54
armarx::armem::server::ltm::EntityInstance::_resolve
void _resolve(armem::wm::EntityInstance &wmEntitySnapshot) const override
Definition: EntityInstance.cpp:42
armarx::armem::server::wm::EntityInstance
armem::wm::EntityInstance EntityInstance
Definition: forward_declarations.h:65
armarx::armem::server::ltm::detail::MemoryItem::getMemoryID
MemoryID getMemoryID() const
Definition: MemoryItem.h:33
armarx::armem::server::ltm::detail::MemoryItem::processors
std::shared_ptr< Processors > processors
Definition: MemoryItem.h:54
MemoryPersistenceStrategy.h
index
uint8_t index
Definition: EtherCATFrame.h:59
armarx::armem::wm::EntityInstance
Client-side working entity instance.
Definition: memory_definitions.h:32
armarx::armem::base::EntitySnapshotBase::addInstance
EntityInstanceT & addInstance(const EntityInstanceT &instance)
Add a single instance with data.
Definition: EntitySnapshotBase.h:264
ARMARX_CHECK_EMPTY
#define ARMARX_CHECK_EMPTY(c)
Definition: ExpressionException.h:218
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:206
armarx::armem::MemoryID::str
std::string str(bool escapeDelimiters=true) const
Get a string representation of this memory ID.
Definition: MemoryID.cpp:102
armarx::aron::data::detail::SpecializedVariantBase< data::dto::Dict, Dict >::DynamicCastAndCheck
static PointerType DynamicCastAndCheck(const VariantPtr &n)
Definition: SpecializedVariant.h:134
armarx::starts_with
bool starts_with(const std::string &haystack, const std::string &needle)
Definition: StringHelpers.cpp:47
Dict.h
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
armarx::armem::to_aron
void to_aron(aron::data::DictPtr &metadata, aron::data::DictPtr &data, const wm::EntityInstance &)
convert to metadata and aron instance
Definition: aron_conversions.cpp:60
armarx::armem::server::ltm::detail::EntityInstanceBase::ltm_mutex
std::recursive_mutex ltm_mutex
Definition: EntityInstanceBase.h:71
EntityInstance.h
armarx::armem::server::ltm::detail::EntityInstanceBase::Statistics::recordedData
long recordedData
Definition: EntityInstanceBase.h:20
armarx::armem::server::ltm::persistence::MemoryPersistenceStrategy::METADATA_FILENAME
static const constexpr char * METADATA_FILENAME
Definition: MemoryPersistenceStrategy.h:193
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
filename
std::string filename
Definition: VisualizationRobot.cpp:86
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:196
armarx::armem::server::ltm::persistence::MemoryPersistenceStrategy::DATA_FILENAME
static const constexpr char * DATA_FILENAME
Definition: MemoryPersistenceStrategy.h:192
armarx::armem::wm::EntitySnapshot
Client-side working memory entity snapshot.
Definition: memory_definitions.h:80
armarx::armem::server::ltm::EntityInstance::EntityInstance
EntityInstance(const std::string &exportName, const MemoryID &memoryId, const std::shared_ptr< Processors > &filters, const std::shared_ptr< persistence::MemoryPersistenceStrategy > &persistenceStrategy)
Definition: EntityInstance.cpp:16
boost::source
Vertex source(const detail::edge_base< Directed, Vertex > &e, const PCG &)
Definition: point_cloud_graph.h:661
armarx::armem::base::detail::MemoryItem::id
MemoryID & id()
Definition: MemoryItem.h:25
armarx::armem::server::ltm
Definition: forward_declarations.h:20
armarx::aron::data::DictPtr
std::shared_ptr< Dict > DictPtr
Definition: Dict.h:41
armarx::armem::from_aron
void from_aron(const aron::data::DictPtr &metadata, const aron::data::DictPtr &data, wm::EntityInstance &)
convert from metadata and data aron instance
Definition: aron_conversions.cpp:16
armarx::armem::server::ltm::detail::MemoryItem::id
MemoryID id() const
Definition: MemoryItem.cpp:37
armarx::armem::MemoryID::cleanID
MemoryID cleanID() const
Definition: MemoryID.cpp:133
TimeUtil.h
armarx::armem::server::ltm::detail::EntityInstanceBase::Statistics::recordedMetaData
long recordedMetaData
Definition: EntityInstanceBase.h:21
armarx::navigation::core::Path
std::vector< Pose > Path
Definition: basic_types.h:46
armarx::ends_with
bool ends_with(const std::string &haystack, const std::string &needle)
Definition: StringHelpers.cpp:53
Logging.h
armarx::armem::server::ltm::EntityInstance::_store
nlohmann::json _store(const armem::wm::EntityInstance &wmEntityInstance) override
Definition: EntityInstance.cpp:144
armarx::armem::base::EntityInstanceBase::metadata
MetadataT & metadata()
Definition: EntityInstanceBase.h:120
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::armem::server::ltm::detail::EntityInstanceBase::statistics
Statistics statistics
Definition: EntityInstanceBase.h:73
armarx::armem::base::EntityInstanceMetadata::origin
std::string origin
Indicates the source of the instance e.g. from a specific LTM.
Definition: EntityInstanceBase.h:63
armarx::armem::wm::EntityInstanceBase
base::EntityInstanceBase< AronDtoT, EntityInstanceMetadata > EntityInstanceBase
Entity instance with a concrete ARON DTO type as data.
Definition: memory_definitions.h:74