LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
mediaticData.cpp
Go to the documentation of this file.
1// Copyright 2002-2022 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
11#include "mediaticData.h"
12
13// ---------------------------------------------------------------------------
14// Local includes
15// ---------------------------------------------------------------------------
16#include "common/LimaCommon.h"
17#include "common/QsLog/QsLog.h"
22
23
24// ---------------------------------------------------------------------------
25// Standard libraries includes
26// ---------------------------------------------------------------------------
27#include <iostream>
28#include <sstream>
29#include <stdexcept>
30#include <fstream>
31#include <deque>
32
33#include <QFileInfo>
34#include <QReadWriteLock>
35#include <QRegularExpression>
36#include <QSet>
37#include <QString>
38#include <QDir>
39
40using namespace std;
41
43using namespace Lima::Common::Misc;
44using namespace Lima::Common::MediaticData;
45
46namespace Lima
47{
48namespace Common
49{
50using namespace XMLConfigurationFiles;
51//using namespace Misc;
52
53namespace MediaticData
54{
55
57{
58 friend class MediaticData;
59
60private:
63 MediaticDataPrivate& operator=(const MediaticDataPrivate&) = delete;
64 virtual ~MediaticDataPrivate() = default;
65
66protected:
67
68 virtual void initMedias(
70 const std::deque< std::string >& meds);
71
74
75 void initRelations(
77
79
82
83 EntityType addEntity(const LimaString& groupName, const LimaString& entityName);
84 EntityType addEntity(EntityGroupId groupId, const LimaString& entityName);
85
86 void addEntityParentLink(const EntityType& child, const EntityType& parent);
87
88 void initMediaData(MediaId med);
89
90 void initMedia(const std::string& media);
91
92 bool isValidMedia(const std::string& media);
93
94 const MediaData& mediaData(MediaId media) const;
95
96 const std::string& getMediaId(MediaId idNum);
97 MediaId getMediaId(const std::string& stringId);
98
99 EntityGroupId getEntityGroupId(const LimaString& groupName) const;
100
101 EntityType getEntityType(const LimaString& groupName, const LimaString& entityName) const;
102
103 EntityType getEntityType(EntityGroupId groupId, const LimaString& entityName) const;
104
105 EntityGroupId addEntityGroup(const LimaString& groupName);
106
107private:
108 QReadWriteLock m_lock;
109 bool m_alreadyInitialized = false;
110 static const LimaString s_entityTypeNameSeparator;
111
112 std::deque< std::string > m_medias;
113 std::map< std::string, MediaId > m_mediasIds;
114 std::map< MediaId, std::string > m_mediasSymbol;
115 std::map< MediaId, QString > m_mediaDefinitionFiles;
116 std::map< MediaId, std::shared_ptr<MediaData> > m_mediasData;
117
118
119 std::map< std::string, std::string > m_options;
120
121 // entity types
124 EntityGroupMap m_entityGroups;
125 std::vector< std::shared_ptr<EntityTypeMap> > m_entityTypes;
126 EntityTypeHierarchy m_entityHierarchy;
127
128 std::map< std::string, uint8_t > m_relTypes;
129 std::map< uint8_t, std::string > m_relTypesNum;
130
131 static std::string s_undefinedRelation;
132
133
134 std::map<MediaId, std::shared_ptr<FsaStringsPool> > m_stringsPool;
135 bool m_releaseStringsPool;
136
137 std::string m_resourcesPath;
138 std::string m_configPath;
139 std::string m_configFile;
140
141 static const std::string s_nocateg;
142
143 std::map< std::string, ConceptType > m_conceptTypes;
144 std::map< ConceptType, std::string > m_conceptNames;
145};
146
147const LimaString MediaticDataPrivate::s_entityTypeNameSeparator=Common::Misc::utf8stdstring2limastring(".");
148
149
150std::string MediaticDataPrivate::s_undefinedRelation("Unknown");
151const std::string MediaticDataPrivate::s_nocateg=SYMBOLIC_NONE;
152
153MediaticDataPrivate::MediaticDataPrivate() :
154 m_lock(QReadWriteLock::Recursive),
155 m_releaseStringsPool(false)
156
157{
158 // null first element
159 m_entityTypes.push_back( std::shared_ptr<EntityTypeMap>(nullptr));
160}
161
164 m_d(new MediaticDataPrivate())
165{
166}
167
169{
170 delete m_d;
171}
172
173const std::map< std::string, MediaId >& MediaticData::getMediasIds() const
174{
175 return m_d->m_mediasIds;
176}
177
178const std::string& MediaticData::media(MediaId media) const
179{
180 return getMediaId(media);
181}
182
183MediaId MediaticData::media(const std::string& media) const
184{
185 return getMediaId(media);
186}
187
188const std::deque<std::string>& MediaticData::getMedias() const
189{
190 return m_d->m_medias;
191}
192
193/*********************************************************************
194 * Configuration functions
195 ********************************************************************/
196
198{
199 return m_d->m_releaseStringsPool;
200}
201
202const std::string& MediaticData::getResourcesPath() const
203{
204 return m_d->m_resourcesPath;
205}
206
207const std::string& MediaticData::getConfigPath() const
208{
209 return m_d->m_configPath;
210}
211
213 const std::string& resourcesPath,
214 const std::string& configPath,
215 const std::string& configFile,
216 const std::deque< std::string >& meds,
217 const std::map< std::string, std::string >& opts)
218{
219 QWriteLocker lock(&m_d->m_lock);
220// TimeUtils::updateCurrentTime();
222 LINFO << "MediaticData::init " << resourcesPath << " "
223 << configPath << " " << configFile << "; already initialized?:" << m_d->m_alreadyInitialized;
224 if (m_d->m_alreadyInitialized)
225 {
226#ifdef DEBUG_CD
227 LERROR << "MediaticData::init already initialized. Updating";
228#endif
229 // return;
230 }
231 m_d->m_alreadyInitialized = true;
232 if (m_d->m_resourcesPath.empty())
233 m_d->m_resourcesPath = resourcesPath;
234 else
235 m_d->m_resourcesPath = resourcesPath + LIMA_PATH_SEPARATOR + m_d->m_resourcesPath ;
236 if (m_d->m_configPath.empty())
237 m_d->m_configPath = configPath;
238 else
239 m_d->m_configPath = configPath + LIMA_PATH_SEPARATOR + m_d->m_configPath;
240 if (m_d->m_configFile.empty())
241 m_d->m_configFile = configFile;
242 else
243 m_d->m_configFile = configFile + LIMA_PATH_SEPARATOR + m_d->m_configFile;
244
245 for (auto [k, v]: opts)
246 {
247 m_d->m_options[k] = v;
248 }
249
250 //LINFO << "initialize XMLParser";
251 QStringList configPaths = QString::fromUtf8(configPath.c_str()).split(LIMA_PATH_SEPARATOR);
252 QStringList configFiles = QString::fromUtf8(configFile.c_str()).split(LIMA_PATH_SEPARATOR);
253 bool configurationFileFound = false;
254 for(QString confPath: configPaths)
255 {
256 for(QString confFile: configFiles)
257 {
258 if (QFileInfo::exists(confPath + QDir::separator() + confFile))
259 {
260 LDEBUG << "MediaticData::init parse configuration file: "
261 << (confPath + QDir::separator() + confFile);
262 configurationFileFound = true;
263 XMLConfigurationFileParser configuration(confPath + QDir::separator() + confFile);
264
265 LDEBUG << "MediaticData::init initialize global parameters";
266 m_d->initReleaseStringsPool(configuration);
267
268 m_d->initEntityTypes(configuration);
269
270 m_d->initRelations(configuration);
271
272 m_d->initConceptTypes(configuration);
273
277 LINFO << "!!! MediaticData::init for ";
278 for (auto it = meds.cbegin(); it != meds.cend(); it++)
279 LINFO << " " << (*it).c_str();
280
281 m_d->initMedias(configuration, meds);
282 }
283 if (configurationFileFound) break;
284 }
285 if (configurationFileFound) break;
286 }
287 if (!configurationFileFound)
288 {
290 LERROR << "No configuration file has been found with" << configPath
291 << "and" << configFile;
292 }
293 //LINFO << "Mediatic data initialization finished";
294// TimeUtils::logElapsedTime("MediaticDataInit");
295}
296
297bool MediaticDataPrivate::isValidMedia(const std::string& media)
298{
299 QRegularExpression re("^(ud-)?...?$");
300 QRegularExpressionMatch match = re.match(media.c_str());
301 return match.hasMatch();
302}
303
304void MediaticDataPrivate::initMedia(const std::string& media)
305{
306 if(!isValidMedia(media))
307 {
309 LERROR << "MediaId for string '" << media << "' is invalid. It will not be initialized ! ";
310 throw MediaNotInitialized(media);
311 }
312// TimeUtils::updateCurrentTime();
314
315 std::deque< std::string > meds({media});
316 LINFO << "MediaticData::initMedia" << media << "parse configuration file: " << m_configPath
317 << "/" << m_configFile;
318 XMLConfigurationFileParser configuration(findFileInPaths(m_configPath.c_str(), m_configFile.c_str()));
319 initMedias(configuration, meds);
320
321 initEntityTypes(configuration);
322}
323
324void MediaticData::initMedia(const std::string& media)
325{
326 QWriteLocker lock(&m_d->m_lock);
327 return m_d->initMedia(media);
328}
329
330const std::string& MediaticDataPrivate::getMediaId(MediaId idNum)
331{
332 auto it = m_mediasSymbol.find(idNum);
333 if (it == m_mediasSymbol.end())
334 {
335// MDATALOGINIT;
336// LERROR << "No media id for " ;//<< (int)idNum;
337 throw MediaNotInitialized(idNum);
338 }
339 return it->second;
340}
341
342const std::string& MediaticData::getMediaId(MediaId idNum) const
343{
344 // QReadLocker lock(&m_d->m_lock);
345 return m_d->getMediaId(idNum);
346}
347
348MediaId MediaticDataPrivate::getMediaId(const std::string& stringId)
349{
350 if (stringId.empty())
351 {
353 LERROR << "MediaticData::getMediaId invalid empty argument stringId at" << __FILE__ << ", line" << __LINE__;
354 throw LimaException(
355 std::string("MediaticData::getMediaId invalid empty argument stringId") );
356 }
357 auto it = m_mediasIds.find(stringId);
358 if (it == m_mediasIds.end())
359 {
360 // try on-demand initialization
362 LINFO << "MediaticData::getMediaId On-demand initialization of media" << stringId.c_str();
363 initMedia(stringId);
364 it = m_mediasIds.find(stringId);
365 if (it == m_mediasIds.end())
366 {
367 // printing of error message suppressed as calling getMediaId on a
368 // non-initialized media string can be wanted in case of on-demand media
369 // initialization if this is a real error, the catcher can print this
370 // message.
372 LERROR << "MediaId for string " << stringId.c_str()
373 << " is still not initialized after on-demand initialization ! ";
374 throw MediaNotInitialized(stringId);
375 }
376 }
377 return it->second;
378}
379
380MediaId MediaticData::getMediaId(const std::string& stringId) const
381{
382 QReadLocker lock(&m_d->m_lock);
383 return m_d->getMediaId(stringId);
384}
385
386const MediaData& MediaticDataPrivate::mediaData(MediaId media) const
387{
388 auto it = m_mediasData.find(media);
389 if (it == m_mediasData.end())
390 {
392 LERROR << "Media data for id " << (int)media << " is not initialized ! ";
393 throw MediaNotInitialized(media);
394 }
395 return *(it->second);
396}
397
398const MediaData& MediaticData::mediaData(MediaId media) const
399{
400 QReadLocker lock(&m_d->m_lock);
401 return m_d->mediaData(media);
402}
403
404const MediaData& MediaticData::mediaData(const std::string& med) const
405{
406 QReadLocker lock(&m_d->m_lock);
407 MediaId medId=m_d->getMediaId(med);
408 return m_d->mediaData(medId);
409}
410
412{
413 QReadLocker lock(&m_d->m_lock);
414 auto it = m_d->m_mediasData.find(media);
415 if (it == m_d->m_mediasData.end())
416 {
418 LERROR << "Media data for id " << (int)media << " is not initialized ! ";
420 }
421 return *(it->second);
422}
423
425 const std::deque< std::string >& meds)
426{
427#ifdef DEBUG_CD
429 LDEBUG << "MediaticDataPrivate::initMedias" << meds.size();
430#endif
431
432 std::set< std::string > qmeds;
433 for (const auto& med: m_medias)
434 {
435 qmeds.insert(med);
436 }
437
438 // med_str can be modified below. thus, do not use const reference
439 // TODO skip media init if already initialized
440 for (auto med_str: meds)
441 {
442 MediaId id(0);
443 try
444 {
445 ModuleConfigurationStructure& mod_config = configParser.getModuleConfiguration("common");
446 GroupConfigurationStructure& grp_config = mod_config.getGroupNamed("mediasIds");
447 std::string value;
448 bool key_found = grp_config.getParamsValueAtKey(med_str, value);
449 if (!key_found)
450 {
451#ifdef DEBUG_CD
452 LDEBUG << "There is no language '" << med_str.c_str() << "' in LIMA. Trying 'ud'.";
453#endif
454 if (med_str.find("ud-") != 0)
455 med_str = std::string("ud-") + med_str;
456 if (m_options.find("udlang") == m_options.end())
457 m_options["udlang"] = med_str;
458 else
459 m_options["udlang"] = m_options["udlang"] + "," + med_str;
460 med_str = "ud";
461 }
462 id = static_cast<MediaId>(std::atoi(configParser.getModuleGroupParamValue("common","mediasIds",med_str).c_str()));
463#ifdef DEBUG_CD
464 LDEBUG << "media '" << med_str.c_str() << "' has id " << id;
465 if (m_mediasData.find(id) != m_mediasData.end())
466 {
468 LINFO << "Media" << med_str << "already initialized. Skipping.";
469 continue;
470 }
471
472
473 LDEBUG << (void*)this << " initialize string pool";
474#endif
475 }
476 catch (NoSuchParam& e)
477 {
479 LERROR << "Param common/mediasIds/" << med_str << "missing:" << e.what();
480 throw InvalidConfiguration(std::string("Failed to init media ")+med_str+": "+e.what());
481 }
482
483 if (qmeds.find(med_str) != qmeds.end())
484 {
486 LINFO << "media" << med_str.c_str() << "already initialized: reinit";
487 // clear initialization
488 // do not need to erase from strings pool here: the smart pointer is replaced below
489 // m_stringsPool.erase(id);
490 }
491 else
492 {
493 m_medias.push_back(med_str);
494 qmeds.insert(med_str);
495 }
496 // always perform initialization, even if language already initialized
497 // (allows dynamic reinitialization of lima client)
498 // {
499 try
500 {
501 // initialize strings pool
502 m_stringsPool[id] = std::shared_ptr<FsaStringsPool>(nullptr);
503 m_stringsPool[id].reset(new FsaStringsPool());
504
505 m_mediasIds[med_str] = id;
506 m_mediasSymbol[id] = med_str;
507
508 QString deffile = QString::fromUtf8(configParser.getModuleGroupParamValue("common",
509 "mediaDefinitionFiles",
510 med_str).c_str());
511 QStringList configPaths = QString::fromUtf8(m_configPath.c_str()).split(LIMA_PATH_SEPARATOR);
512 bool mediaDefinitionFileFound = false;
513 for(auto confPath = configPaths.begin(); confPath != configPaths.end(); ++confPath)
514 {
515 if (QFileInfo::exists(*confPath + "/" + deffile))
516 {
517 m_mediaDefinitionFiles[id] = (*confPath+"/"+deffile);
518#ifdef DEBUG_CD
519 LDEBUG << "media definition file for" << med_str << "; id" << id << "is" << m_mediaDefinitionFiles[id];
520#endif
521 mediaDefinitionFileFound = true;
522 break;
523 }
524 }
525 if (!mediaDefinitionFileFound)
526 {
528 LERROR << "No media definition file'" << deffile << "' has been found for media id" << id
529 << "in config paths:" << configPaths;
530 // Cleanup: remove data we just added concerning this failed language
531 for (auto med = m_medias.begin(); med != m_medias.end(); med++)
532 {
533 if (*med == med_str)
534 m_medias.erase(med);
535 }
536 m_mediasIds.erase(med_str);
537 m_mediasSymbol.erase(id);
538 m_mediasData.erase(id);
539 m_mediaDefinitionFiles.erase(id);
540
541 throw InvalidConfiguration();
542 }
543 }
544 catch (NoSuchParam& e)
545 {
547 LERROR << "Param common/mediaDefinitionFiles/" << med_str << "missing:" << e.what();
548 // Cleanup: remove data we just added concerning this failed language
549 for (auto med = m_medias.begin(); med != m_medias.end(); med++)
550 {
551 if (*med == med_str)
552 m_medias.erase(med);
553 }
554 m_mediasIds.erase(med_str);
555 m_mediasSymbol.erase(id);
556 m_mediaDefinitionFiles.erase(id);
557 m_mediasData.erase(id);
558
560 std::string("Failed to init media ")+(med_str)+": "+e.what());
561 }
562#ifdef DEBUG_CD
563 LDEBUG << "MediaticData::initMedias" << med_str << "call initMediaData" << m_mediasIds[med_str];
564#endif
565 initMediaData(m_mediasIds[med_str]);
566 // }
567 }
568
569#ifdef DEBUG_CD
570 LDEBUG << "MediaticDataPrivate::initMedias done successfuly";
571#endif
572}
573
575{
576#ifdef DEBUG_CD
578 LDEBUG << "MediaticDataPrivate::initMediaData" << (int)med;
579#endif
580 auto it = m_mediaDefinitionFiles.find(med);
581 if (it == m_mediaDefinitionFiles.end())
582 {
584 std::ostringstream oss;
585 oss << "No media definition file for med id " << (int)med;
586 LERROR << oss.str();
587 const auto& media = m_mediasSymbol[med];
588 LDEBUG << "Cleanup: remove data added previously concerning this failed language" << (int)med << media
589 << "and then throw";
590 for (auto medit = m_medias.begin(); medit != m_medias.end(); medit++)
591 {
592 if (*medit == media)
593 m_medias.erase(medit);
594 }
595 m_mediasIds.erase(media);
596 m_mediasSymbol.erase(med);
597 m_mediasData.erase(med);
598 throw InvalidConfiguration(oss.str());
599 }
600#ifdef DEBUG_CD
601 LDEBUG << "MediaticDataPrivate::initMediaData Parse MediaConfigurationFile "
602 << (it->second);
603#endif
604 XMLConfigurationFileParser parser(it->second);
605
606#ifdef DEBUG_CD
607 LDEBUG << "MediaticDataPrivate::initMediaData Class: "
608 << parser.getModuleGroupParamValue("MediaData",
609 "Class","class").c_str();
610#endif
611 std::string& param = parser.getModuleGroupParamValue("MediaData",
612 "Class",
613 "class");
614 if (!param.empty())
615 {
616 auto ldata = MediaData::Factory::getFactory(param)->create(
617 parser.getModuleGroupConfiguration("MediaData","Class"),0);
618
619 // MediaData* ldata=new MediaData();
620 m_mediasData[med] = ldata;
621 ldata->initialize(med, m_resourcesPath, parser);
622 }
623 else
624 {
626 LERROR << "Empty class name for MediaData/Class/class for media" << med;
627 std::ostringstream oss;
628 oss << "Empty class name for MediaData/Class/class for media " << med;
629 // Cleanup: remove data added previously concerning this failed language
630 for (auto medit = m_medias.begin(); medit != m_medias.end(); medit++)
631 {
632 if (*medit == m_mediasSymbol[med])
633 m_medias.erase(medit);
634 }
635 m_mediasIds.erase(m_mediasSymbol[med]);
636 m_mediasSymbol.erase(med);
637 m_mediasData.erase(med);
638 throw InvalidConfiguration(oss.str());
639 }
640}
641
643const std::string& MediaticData::getRelation(uint8_t relation) const
644{
645 QReadLocker lock(&m_d->m_lock);
646 auto it = m_d->m_relTypesNum.find(relation);
647 if (it == m_d->m_relTypesNum.end())
648 {
650 LWARN << "ask getRelation for undefined relation " << (int)relation;
651 return m_d->s_undefinedRelation;
652 }
653 return ( (*it).second );
654}
655
657uint8_t MediaticData::getRelation(const std::string& relation) const
658{
659 QReadLocker lock(&m_d->m_lock);
660 auto it = m_d->m_relTypes.find(relation);
661 if (it == m_d->m_relTypes.end())
662 {
664 LWARN << "ask getRelation for undefined relation " << relation.c_str();
665 return 0;
666 }
667 return ( (*it).second );
668}
669
671{
672#ifdef DEBUG_CD
674 LDEBUG << "MediaticDataPrivate::initRelations";
675#endif
676 m_relTypes[s_undefinedRelation] = 0;
677 m_relTypesNum[0] = s_undefinedRelation;
678
679 try
680 {
681 const auto& rels = configParser.getModuleConfiguration("common")
682 .getGroupNamed("semanticRelations").getMapAtKey("declaration");
683 for (auto it = rels.cbegin(); it != rels.cend(); it++)
684 {
685 uint8_t relId = atoi(it->second.c_str());
686#ifdef DEBUG_CD
687 LDEBUG << "read relation " << it->first.c_str() << " -> " << (int)relId;
688#endif
689 m_relTypes[it->first]=relId;
690 m_relTypesNum[relId]=it->first;
691 }
692 }
693 catch (NoSuchGroup& e)
694 {
696 LNOTICE << "No group 'semanticRelations' in 'common' module of lima-common configuration file";
697 // throw InvalidConfiguration(
698 // std::string("No group 'semanticRelations' in 'common' module of lima-common configuration file:")+e.what());
699 }
700 catch (NoSuchMap& e)
701 {
703 LERROR << "No map 'declaration' in 'semanticRelations' group of lima-common configuration file";
705 std::string("No map 'declaration' in 'semanticRelations' group of lima-common configuration file:")+e.what());
706 }
707}
708
710{
711#ifdef DEBUG_CD
713 LDEBUG << "MediaticDataPrivate::initConceptTypes";
714#endif
715
716 try
717 {
718 const auto& mapping = configParser.getModuleConfiguration("common")
719 .getGroupNamed("SemanticData").getMapAtKey("conceptTypes");
720 for (auto it = mapping.cbegin(); it != mapping.cend(); it++)
721 {
722 ConceptType type = static_cast<ConceptType>(atoi(it->second.c_str()));
723#ifdef DEBUG_CD
724 LDEBUG << "read concept type " << it->first.c_str() << " -> " << type;
725#endif
726 m_conceptTypes[it->first] = type;
727 m_conceptNames[type] = it->first;
728 }
729 }
730 catch (NoSuchGroup& e)
731 {
733 LNOTICE << "No group 'SemanticData' in 'common' module of lima-common configuration file:" << e.what();
734 }
735 catch (NoSuchMap& e)
736 {
738 LERROR << "No map 'conceptTypes' in 'SemanticData' group of lima-common configuration file:" << e.what();
739 throw InvalidConfiguration(e.what());
740 }
741}
742
743ConceptType MediaticData::getConceptType(const std::string& typeName) const
744{
745 QReadLocker lock(&m_d->m_lock);
746 if (m_d->m_conceptTypes.find(typeName)==m_d->m_conceptTypes.end())
747 {
749 LERROR << "Concept type name " << typeName.c_str()
750 << " not found. Returning value for LatticeDown (should be '0').";
751 return (*(m_d->m_conceptTypes.find("LatticeDown"))).second;
752 }
753 else
754 {
755 return (*(m_d->m_conceptTypes.find(typeName))).second;
756 }
757}
758
759
760const std::string& MediaticData::getConceptName(const ConceptType& type) const
761{
762 QReadLocker lock(&m_d->m_lock);
763 if (m_d->m_conceptNames.find(type) == m_d->m_conceptNames.end())
764 {
766 LERROR << "Concept type " << type
767 << " not found. Returning for 0 (should be 'LatticeDown').";
768 return (*(m_d->m_conceptNames.find(static_cast<ConceptType>(0)))).second;
769 }
770 else
771 {
772 return (*(m_d->m_conceptNames.find(type))).second;
773 }
774}
775
776
778 XMLConfigurationFileParser& configParser)
779{
781 LINFO << "initializes the release of strings pool on each text: ";
782 m_releaseStringsPool = false;
783 try
784 {
785 std::string release = configParser.getModuleGroupParamValue("common",
786 "stringPool",
787 "release") ;
788 std::istringstream releaseS(release);
789 releaseS >> std::boolalpha >> m_releaseStringsPool;
790 LINFO << int(m_releaseStringsPool);
791 }
792 catch (const NoSuchParam& )
793 {
794 LINFO << "ReleaseStringsPool parameter not found. Using " << m_releaseStringsPool;
795 }
796}
797
798
799//***********************************************************************
800// entity types initialization
801
802// internal output function for debug
804 QsLogging::Logger& logger,
806 const std::vector<DoubleAccessObjectToIdMap<LimaString,
807 EntityTypeId>* >& types)
808{
809 const auto& g = groups.getAccessMap();
810 for (auto it = g.cbegin(); it != g.cend(); it++)
811 {
812 LDEBUG << *((*it).first) << "(" << (*it).first << ")"
813 << "->" << (*it).second;
814 if ((*it).second < types.size())
815 {
816 const auto& t = types[(*it).second]->getAccessMap();
817 for (auto it2 = t.cbegin() ; it2 != t.cend(); it2++)
818 {
819 LDEBUG << " " << *((*it2).first) << "(" << (*it2).first << ")"
820 << "->" << (*it2).second;
821 }
822 }
823 }
824 // reverse maps
825 const auto& rg = groups.getReverseAccessMap();
826 for (uint32_t i(0); i<rg.size(); i++)
827 {
828 LDEBUG << "reverse " << i << "->" << rg[i];
829 if (rg[i]!=0)
830 {
831 const auto& rt = types[i]->getReverseAccessMap();
832 for (uint32_t j(0);j<rt.size(); j++)
833 {
834 LDEBUG << " reverse " << j << "->" << rt[j];
835 }
836 }
837 }
838}
839
841{
843 LINFO << "MediaticData::initEntityTypes" << configParser.getConfigurationFileName();
844 // look at all groups : ModuleConfigurationStructure is a map
845 try
846 {
847 auto& moduleConf = configParser.getModuleConfiguration("entities");
848
849 for (auto it = moduleConf.begin(); it != moduleConf.end(); it++)
850 {
851#ifdef DEBUG_CD
852 LDEBUG << "initEntityTypes: looking at group " << (*it).first;
853#endif
854
855 auto groupName = QString::fromStdString((*it).first);
856
857 if (groupName == "include")
858 {
859 auto includeList = moduleConf.getListValuesAtKeyOfGroupNamed("includeList", "include");
860 string::size_type i;
861 string moduleName("");
862 for (std::size_t k=0; k<includeList.size(); k++)
863 {
864 i=includeList[k].find("/");
865 if (i==string::npos)
866 {
867 LERROR << "Cannot include resources " << includeList[k] << ": must specify file and module name";
868 continue;
869 }
870 auto configPaths = QString::fromStdString(m_configPath).split(LIMA_PATH_SEPARATOR);
871 for(auto confPath : configPaths)
872 {
873 if (QFileInfo::exists(confPath + "/" + string(includeList[k],0,i).c_str()))
874 {
875 auto fileName= confPath + "/" + std::string(includeList[k], 0,i).c_str();
876 XMLConfigurationFileParser lpconfig2(fileName);
878 break;
879 }
880 }
881 }
882 }
883 else
884 {
885#ifdef DEBUG_CD
886 LDEBUG << "initEntityTypes: read list as " << groupName;
887#endif
888 addEntityGroup(groupName);
889 auto& groupConf=(*it).second;
890 try
891 {
892 deque<string>& entityList = groupConf.getListsValueAtKey("entityList");
893 for (const auto& ent: entityList)
894 {
895 auto entityName = QString::fromStdString(ent);
896#ifdef DEBUG_CD
897 LDEBUG << "initEntityTypes: add entityType " << ent.c_str() << " in group " << groupName;
898#endif
899 auto type = addEntity(groupName, entityName);
900#ifdef DEBUG_CD
901 LDEBUG << "initEntityTypes: type is " << type;
902#endif
903 }
904 }
905 catch(NoSuchList& e)
906 {
908 QString errorString;
909 QTextStream qts(&errorString);
910 qts << "missing list 'entityList' in entity types configuration:" << e.what();
911 LERROR << errorString;
912 throw InvalidConfiguration(errorString.toStdString());
913 }
914 }
915 }
916 }
917 catch(NoSuchModule& e)
918 {
920 LWARN << "no module 'entities' in entity types configuration:" << e.what();
921 }
922 catch(NoSuchGroup& e)
923 {
925 QString errorString;
926 QTextStream qts(&errorString);
927 qts << "missing group in entity types configuration:" << e.what();
928 LERROR << errorString;
929 throw InvalidConfiguration(errorString.toStdString());
930 }
931 catch(NoSuchList& e)
932 {
934 QString errorString;
935 QTextStream qts(&errorString);
936 qts << "missing list 'entityList' in entity types configuration:" << e.what();
937 LERROR << errorString;
938 throw InvalidConfiguration(errorString.toStdString());
939 }
940}
941
943{
944 QWriteLocker lock(&m_d->m_lock);
945 return m_d->initEntityTypes(configParser);
946}
947
948EntityGroupId MediaticDataPrivate::addEntityGroup(const LimaString& groupName)
949{
950 EntityGroupId groupId= m_entityGroups.insert(groupName);
951 // insert may have created new element or not
952 if (static_cast<std::size_t>(groupId) >= m_entityTypes.size())
953 {
954 m_entityTypes.push_back( std::make_shared<MediaticDataPrivate::EntityTypeMap>());
955 }
956 return groupId;
957}
958
959EntityGroupId MediaticData::addEntityGroup(const LimaString& groupName)
960{
961 QWriteLocker lock(&m_d->m_lock);
962 return m_d->addEntityGroup(groupName);
963}
964
965EntityType MediaticDataPrivate::addEntity(EntityGroupId groupId, const LimaString& entityName)
966{
967 if (static_cast<std::size_t>(groupId)>=m_entityTypes.size())
968 {
970 LIMA_EXCEPTION("MediaticData::addEntity unknown entity group id " << groupId
971 << "adding" << entityName);
972 }
973 EntityTypeId typeId= m_entityTypes[groupId]->insert(entityName);
974 return EntityType(typeId,groupId);
975}
976
978{
979 auto groupId = getEntityGroupId(groupName);
980 return addEntity(groupId, entityName);
981}
982
983EntityType MediaticData::addEntity(const LimaString& groupName, const LimaString& entityName)
984{
985 QWriteLocker lock(&m_d->m_lock);
986 return m_d->addEntity(groupName, entityName);
987}
988
990{
991 m_entityHierarchy.addParentLink(child,parent);
992}
993
995{
996 QWriteLocker lock(&m_d->m_lock);
997 m_d->addEntityParentLink(child, parent);
998}
999
1001 const EntityType& parent) const
1002{
1003 QReadLocker lock(&m_d->m_lock);
1004 return m_d->m_entityHierarchy.isAncestor(child,parent);
1005}
1006
1008{
1009 QReadLocker lock(&m_d->m_lock);
1010 return m_d->m_entityHierarchy.getAncestor(child);
1011}
1012
1014{
1015 QReadLocker lock(&m_d->m_lock);
1016 return m_d->m_entityHierarchy.getParent(child);
1017}
1018
1020 std::map<EntityType,EntityType>& childList) const
1021{
1022 QReadLocker lock(&m_d->m_lock);
1023 return m_d->m_entityHierarchy.getChildren(parent, childList);
1024}
1025
1026std::vector<EntityType> MediaticData::getGroupAncestors(EntityGroupId groupId) const
1027{
1028 QReadLocker lock(&m_d->m_lock);
1029 std::vector<EntityType> ancestors;
1030 const auto& accessMap = m_d->m_entityTypes[groupId]->getAccessMap();
1031 for(auto iter = accessMap.begin(), iter_end=accessMap.end(); iter != iter_end; iter++){
1032 const LimaString entityName = *(iter->first);
1033 int i=entityName.indexOf(m_d->s_entityTypeNameSeparator);
1034 if (i>0) continue;
1035 EntityType entityType;
1036 try {
1037 entityType = m_d->getEntityType( groupId, entityName );
1038 } catch (const LimaException& e) {
1040 LIMA_EXCEPTION("MediaticData::getEntityType unknown entity" << groupId
1041 << entityName << e.what());
1042 }
1043 if ( entityType == this->getEntityAncestor(entityType) ) {
1044 ancestors.push_back( entityType );
1045 }
1046 }
1047 return ancestors;
1048}
1049
1050
1051// entity types accessors
1053{
1054 QReadLocker lock(&m_d->m_lock);
1055 int i=entityName.indexOf(m_d->s_entityTypeNameSeparator);
1056 if (i==-1)
1057 {
1059 LIMA_EXCEPTION( "MediaticData::getEntityType missing group name in entity name '" << entityName << "'" );
1060 }
1061 LimaString groupName = entityName.left(i);
1062 LimaString name = entityName.mid(i+m_d->s_entityTypeNameSeparator.length());
1063 EntityType result;
1064 try {
1065 result = getEntityType(groupName, name);
1066 } catch (const LimaException& e) {
1068 QString errorString;
1069 QTextStream qts(&errorString);
1070 qts << __FILE__ << ":" << __LINE__ << ": "
1071 << "MediaticData::getEntityType unknown entity " << groupName
1072 << m_d->s_entityTypeNameSeparator << name << " : " << e.what() ;
1073 LDEBUG << errorString;
1074 throw LimaException(errorString);
1075 }
1076 return result;
1077}
1078
1079EntityType MediaticDataPrivate::getEntityType(const LimaString& groupName, const LimaString& entityName) const
1080{
1081 auto groupId = getEntityGroupId(groupName);
1082 return getEntityType(groupId, entityName);
1083}
1084
1085EntityType MediaticData::getEntityType(const LimaString& groupName, const LimaString& entityName) const
1086{
1087 QReadLocker lock(&m_d->m_lock);
1088 return m_d->getEntityType(groupName, entityName);
1089}
1090
1091EntityType MediaticDataPrivate::getEntityType(const EntityGroupId groupId, const LimaString& entityName) const
1092{
1093 if (static_cast<size_t>(groupId) >= m_entityTypes.size())
1094 {
1096 QString errorString;
1097 QTextStream qts(&errorString);
1098 qts << "MediaticData::getEntityType unknown entity group id " << groupId
1099 << " accessing '" << entityName << "'";
1100 LERROR << errorString;
1101 throw LimaException(errorString.toStdString());
1102 }
1103
1104 if (! m_entityTypes[groupId]->hasValue(entityName))
1105 {
1107 //LIMA_EXCEPTION( "MediaticData::getEntityType Unknown entity type '" << entityName << "' in group id "<<groupId);
1108 QString errorString;
1109 QTextStream qts(&errorString);
1110 qts << "MediaticData::getEntityType no entity type '" << entityName
1111 << "' in group id "<<groupId;
1112 LDEBUG << errorString;
1113 throw LimaException(errorString.toStdString());
1114 }
1115
1116 EntityTypeId typeId;
1117 try {
1118 typeId = m_entityTypes[groupId]->get(entityName);
1119 } catch (const LimaException& e) {
1121 LIMA_EXCEPTION("Exception while getting entity " << groupId << "."
1122 << entityName << ": " << e.what())
1123 }
1124 return EntityType(typeId,groupId);
1125}
1126
1127EntityType MediaticData::getEntityType(const EntityGroupId groupId, const LimaString& entityName) const
1128{
1129 QReadLocker lock(&m_d->m_lock);
1130 return m_d->getEntityType(groupId, entityName);
1131}
1132
1133EntityGroupId MediaticDataPrivate::getEntityGroupId(const LimaString& groupName) const
1134{
1135 try
1136 {
1137 return m_entityGroups.get(groupName);
1138 }
1139 catch(LimaException& e)
1140 {
1142 QString errorString;
1143 QTextStream qts(&errorString);
1144 qts << "MediaticData::getEntityGroupId Unknown entity group '" << groupName << "'; exception: "<< e.what();
1145 LWARN << errorString;
1146 throw;
1147 }
1148}
1149
1150EntityGroupId MediaticData::getEntityGroupId(const LimaString& groupName) const
1151{
1152 QReadLocker lock(&m_d->m_lock);
1153 return m_d->getEntityGroupId(groupName);
1154}
1155
1157{
1158 QReadLocker lock(&m_d->m_lock);
1159#ifdef DEBUG_CD
1161 LDEBUG << "MediaticData::getEntityName(" << type << ")";
1162#endif
1163 if (type.getGroupId()==static_cast<EntityGroupId>(0))
1164 {
1166 QString errorString;
1167 QTextStream qts(&errorString);
1168 qts << "MediaticData::getEntityName invalid entity group id "
1169 << type.getGroupId() << " in entity " << type;
1170 LERROR << errorString;
1171 throw LimaException(errorString.toStdString());
1172 }
1173 if (static_cast<size_t>(type.getGroupId())>=m_d->m_entityTypes.size())
1174 {
1176 LIMA_EXCEPTION( "MediaticData::getEntityName type.getGroupId()="
1177 << type.getGroupId()<<" > m_entityTypes.size()="
1178 << m_d->m_entityTypes.size() << " for entity type " << type );
1179 }
1180 try
1181 {
1182 // return m_entityTypes[type.getGroupId()]->get(type.getTypeId());
1183 return
1184 m_d->m_entityGroups.get(
1185 type.getGroupId())
1186 + m_d->s_entityTypeNameSeparator
1187 + m_d->m_entityTypes[type.getGroupId()]->get(type.getTypeId());
1188 }
1189 catch(LimaException& e)
1190 {
1192 QString errorString;
1193 QTextStream qts(&errorString);
1194 qts << "MediaticData::getEntityName Cannot find name of entity type " << type << "'; exception: "<< e.what();
1195 LWARN << errorString;
1196 throw;
1197 }
1198}
1199
1200const LimaString& MediaticData::getEntityGroupName(EntityGroupId id) const
1201{
1202 QReadLocker lock(&m_d->m_lock);
1203 try
1204 {
1205 return m_d->m_entityGroups.get(id);
1206 }
1207 catch(LimaException& e)
1208 {
1210 QString errorString;
1211 QTextStream qts(&errorString);
1212 qts << "MediaticData::getEntityGroupName Cannot find name of entity group "
1213 << id << "; exception: " << e.what();
1214 LWARN << errorString;
1215 throw;
1216 }
1217}
1218
1219void MediaticData::writeEntityTypes(std::ostream& file) const
1220{
1221 QReadLocker lock(&m_d->m_lock);
1222#ifdef DEBUG_CD
1224#endif
1225
1226 const auto& groups = m_d->m_entityGroups.getAccessMap();
1227 Misc::writeCodedInt(file,groups.size());
1228 for (auto it = groups.cbegin(); it != groups.cend(); it++)
1229 {
1230#ifdef DEBUG_CD
1231 LDEBUG << "writeEntityTypes: write group id " << (*it).second;
1232#endif
1233 Misc::writeCodedInt(file,(*it).second);
1234#ifdef DEBUG_CD
1235 LDEBUG << "writeEntityTypes: write group name " << *((*it).first);
1236#endif
1237 Misc::writeUTF8StringField(file,*((*it).first));
1238#ifdef DEBUG_CD
1239 LDEBUG << "writeEntityTypes: after group name file at " << file.tellp();
1240#endif
1241 // write entities for this group
1242 const auto& entities = m_d->m_entityTypes[(*it).second]->getAccessMap();
1243#ifdef DEBUG_CD
1244 LDEBUG << "writeEntityTypes: write nb entities: " << entities.size();
1245#endif
1246 Misc::writeCodedInt(file,entities.size());
1247#ifdef DEBUG_CD
1248 LDEBUG << "writeEntityTypes: after write nb entities, file at " << file.tellp();
1249#endif
1250 for (auto it2 = entities.cbegin(); it2 != entities.end(); it2++)
1251 {
1252#ifdef DEBUG_CD
1253 LDEBUG << "writeEntityTypes: write entity id " << (*it2).second;
1254#endif
1255 Misc::writeCodedInt(file,(*it2).second);
1256#ifdef DEBUG_CD
1257 LDEBUG << "writeEntityTypes: after write entity id file at " << file.tellp();
1258 LDEBUG << "writeEntityTypes: write entity name " << *((*it2).first);
1259#endif
1260 Misc::writeUTF8StringField(file,*((*it2).first));
1261 #ifdef DEBUG_CD
1262 LDEBUG << "writeEntityTypes: after write entity name file at " << file.tellp();
1263#endif
1264 }
1265 }
1266#ifdef DEBUG_CD
1267 /*if (logger.loggingLevel()<=QsLogging::TraceLevel) {
1268 printEntities(logger,m_d->m_entityGroups,m_d->m_entityTypes);
1269 }*/
1270#endif
1271}
1272
1273void MediaticData::readEntityTypes(std::istream& file,
1274 std::map<EntityGroupId,EntityGroupId>& entityGroupIdMapping,
1275 std::map<EntityType,EntityType>& entityTypeMapping)
1276{
1277 QWriteLocker lock(&m_d->m_lock);
1278#ifdef DEBUG_CD
1280 LDEBUG << "MediaticData::readEntityTypes from binary file with its mapping";
1281#endif
1282 uint64_t size=Misc::readCodedInt(file);
1283 // read group names
1284 for (uint64_t i(0); i<size; i++)
1285 {
1286 EntityGroupId groupId= static_cast<EntityGroupId>(Misc::readCodedInt(file));
1287#ifdef DEBUG_CD
1288 LDEBUG << "readEntityTypes: read group id " << groupId;
1289#endif
1290 LimaString groupName;
1291 Misc::readUTF8StringField(file,groupName);
1292#ifdef DEBUG_CD
1293 LDEBUG << "readEntityTypes: read group name " << groupName;
1294#endif
1295 EntityGroupId newGroupId=m_d->addEntityGroup(groupName);
1296 entityGroupIdMapping[groupId]=newGroupId;
1297#ifdef DEBUG_CD
1298 LDEBUG << "readEntityTypes: added group id mapping " << groupId
1299 << "->" << newGroupId;
1300#endif
1301 // read entities for this group
1302 uint64_t nbEntities=Misc::readCodedInt(file);
1303
1304 for (uint64_t j(0);j<nbEntities; j++)
1305 {
1306 auto typeId = static_cast<EntityTypeId>(Misc::readCodedInt(file));
1307#ifdef DEBUG_CD
1308 LDEBUG << "readEntityTypes: read entity id " << typeId;
1309#endif
1310 LimaString entityName;
1311 Misc::readUTF8StringField(file,entityName);
1312#ifdef DEBUG_CD
1313 LDEBUG << "readEntityTypes: read entity name " << entityName;
1314 /*if (logger.loggingLevel()<=QsLogging::TraceLevel) {
1315 printEntities(logger,m_d->m_entityGroups,m_d->m_entityTypes);
1316 }*/
1317#endif
1318 EntityType oldTypeId(typeId,groupId);
1319 EntityType newTypeId = addEntity(groupName, entityName);
1320#ifdef DEBUG_CD
1321 LDEBUG << "readEntityTypes: added entity type mapping " << oldTypeId << "->" << newTypeId;
1322 LDEBUG << "before insert " << entityTypeMapping.size();
1323#endif
1324 entityTypeMapping.insert(make_pair(oldTypeId,newTypeId));
1325#ifdef DEBUG_CD
1326 LDEBUG << "after insert " << entityTypeMapping.size();
1327 if (logger.loggingLevel()<=QsLogging::TraceLevel) {
1328 LDEBUG << "readEntityTypes: type mapping is";
1329 std::ostringstream oss;
1330 for (auto it = entityTypeMapping.begin();
1331 it != entityTypeMapping.end(); it++)
1332 {
1333 oss << (*it).first << " -> " << (*it).second << std::endl;
1334 }
1335 LDEBUG << oss.str();
1336 }
1337#endif
1338 }
1339 }
1340#ifdef DEBUG_CD
1341 /*if (logger.loggingLevel()<=QsLogging::TraceLevel) {
1342 printEntities(logger,m_d->m_entityGroups,m_d->m_entityTypes);
1343 }*/
1344#endif
1345}
1346
1347bool MediaticData::getOptionValue(const std::string& name, std::string& value) const
1348{
1349 QReadLocker lock(&m_d->m_lock);
1350 std::map< std::string, std::string >::const_iterator it = m_d->m_options.find(name);
1351 if (it == m_d->m_options.end())
1352 return false;
1353
1354 value = it->second;
1355 return true;
1356}
1357
1359{
1360 QReadLocker lock(&m_d->m_lock);
1361 auto it = m_d->m_stringsPool.find(med);
1362 if (it == m_d->m_stringsPool.end())
1363 {
1365 LERROR << "no available string pool for media " << (int)med;
1366 throw MediaNotInitialized(med);
1367 }
1368 return *(it->second);
1369}
1370
1372{
1373 QReadLocker lock(&m_d->m_lock);
1374 auto it = m_d->m_stringsPool.find(med);
1375 if (it == m_d->m_stringsPool.end())
1376 {
1378 LERROR << "no available string pool for media " << (int)med;
1379 throw MediaNotInitialized(med);
1380 }
1381 return *(it->second);
1382}
1383
1385{
1386 QReadLocker lock(&m_d->m_lock);
1387 return m_d->s_entityTypeNameSeparator;
1388}
1389
1390} // closing namespace MediaticData
1391} // closing namespace Common
1392} // closing namespace Lima
#define LIMA_PATH_SEPARATOR
Definition FileUtils.h:25
#define LWARN
Definition LimaCommon.h:160
#define LIMA_EXCEPTION(X)
This macro writes the message X to a previously configured error stream before throwing a LimaExcepti...
Definition LimaCommon.h:293
#define MDATALOGINIT
Definition LimaCommon.h:209
#define LDEBUG
Definition LimaCommon.h:157
#define LINFO
Definition LimaCommon.h:158
#define LERROR
Definition LimaCommon.h:161
#define LNOTICE
Definition LimaCommon.h:159
void addParentLink(const EntityType &child, const EntityType &parent)
bool getChildren(const EntityType &ancestor, std::map< EntityType, EntityType > &childList) const
EntityType getAncestor(const EntityType &child) const
bool isAncestor(const EntityType &child, const EntityType &parent) const
EntityType getParent(const EntityType &child) const
Holds mediatic data for one media.
Definition mediaData.h:50
const std::string & getMediaId(MediaId idNum)
void initRelations(XMLConfigurationFiles::XMLConfigurationFileParser &configParser)
void initEntityTypes(XMLConfigurationFiles::XMLConfigurationFileParser &configParser)
EntityGroupId getEntityGroupId(const LimaString &groupName) const
virtual void initMedias(XMLConfigurationFiles::XMLConfigurationFileParser &configParser, const std::deque< std::string > &meds)
void initConceptTypes(XMLConfigurationFiles::XMLConfigurationFileParser &configParser)
void initReleaseStringsPool(XMLConfigurationFiles::XMLConfigurationFileParser &configParser)
void addEntityParentLink(const EntityType &child, const EntityType &parent)
EntityGroupId addEntityGroup(const LimaString &groupName)
EntityType addEntity(const LimaString &groupName, const LimaString &entityName)
const MediaData & mediaData(MediaId media) const
EntityType getEntityType(const LimaString &groupName, const LimaString &entityName) const
bool isValidMedia(const std::string &media)
holds data about codes and names for grammatical categories, etc.
const LimaString & getEntityGroupName(EntityGroupId id) const
std::vector< EntityType > getGroupAncestors(EntityGroupId id) const
const LimaString & getEntityTypeNameSeparator() const
const FsaStringsPool & stringsPool(MediaId med) const
const std::string & getResourcesPath() const
void initMedia(const std::string &media)
const std::string & getMediaId(MediaId idNum) const
const MediaData & mediaData(MediaId media) const
const std::string & getConfigPath() const
void init(const std::string &resourcesPath, const std::string &configPath, const std::string &configFile, const std::deque< std::string > &meds, const std::map< std::string, std::string > &opts={})
initializes the system with the configuration file.
void writeEntityTypes(std::ostream &os) const
const std::string & getConceptName(const ConceptType &typeName) const
void readEntityTypes(std::istream &os, std::map< EntityGroupId, EntityGroupId > &EntityGroupIdMapping, std::map< EntityType, EntityType > &EntityTypeMapping)
EntityType getEntityParent(const EntityType &child) const
const std::deque< std::string > & getMedias() const
EntityGroupId addEntityGroup(const LimaString &groupName)
bool getEntityChildList(const EntityType &parent, std::map< EntityType, EntityType > &EntityTypeMapping) const
bool getOptionValue(const std::string &name, std::string &value) const
LimaString getEntityName(const EntityType &type) const
EntityType getEntityType(const LimaString &entityName) const
entity types manager
ConceptType getConceptType(const std::string &typeName) const
EntityGroupId getEntityGroupId(const LimaString &groupName) const
const std::map< std::string, MediaId > & getMediasIds() const
bool isEntityAncestor(const EntityType &child, const EntityType &parent) const
EntityType getEntityAncestor(const EntityType &child) const
EntityType addEntity(const LimaString &groupName, const LimaString &entityName)
uint8_t getRelation(const std::string &relation) const
virtual void initEntityTypes(XMLConfigurationFiles::XMLConfigurationFileParser &configParser)
void addEntityParentLink(const EntityType &child, const EntityType &parent)
const std::string & media(MediaId media) const
storage for double access: from object to id and from id to object : id must be integer.
Id insert(const Object &)
insert an object if not already inserted
const Object & get(const Id &) const
std::map< std::string, std::string > & getMapAtKey(const std::string &key)
GroupConfigurationStructure & getGroupNamed(const std::string &name)
return a message when a 'group' was not found
return a message when a 'module' is not found
return a message when a 'param' was not found
Parser class for the lima's xml configuration files.
std::string & getModuleGroupParamValue(const std::string &moduleName, const std::string &groupName, const std::string &key)
ModuleConfigurationStructure & getModuleConfiguration(const std::string &moduleName)
Use this exception to signal an error in one of the configuration files.
Definition LimaCommon.h:345
The main LIMA exception class.
Definition LimaCommon.h:262
virtual const char * what() const override
Definition LimaCommon.h:280
Use this exception to signal that a media is used which has not been initialized.
Definition LimaCommon.h:369
Defines access method for the singleton pattern.
Definition Singleton.h:22
static MediaticData & changeable()
singleton accessor
Definition Singleton.h:71
#define SYMBOLIC_NONE
void printEntities(QsLogging::Logger &logger, const DoubleAccessObjectToIdMap< LimaString, EntityGroupId > &groups, const std::vector< DoubleAccessObjectToIdMap< LimaString, EntityTypeId > * > &types)
void writeUTF8StringField(std::ostream &file, const Lima::LimaString &s)
Binary write a a LimaString in a file as an utf8 string.
uint64_t readCodedInt(std::istream &file)
read a integer coded in variable-byte format in a file
void readUTF8StringField(std::istream &file, Lima::LimaString &s)
Binary read an utf8 string from a file and store it in a LimaString.
QString findFileInPaths(const QString &paths, const QString &fileName, const QChar &separator)
Find the given file in the given paths.
void writeCodedInt(std::ostream &file, const uint64_t number)
write a integer coded in variable-byte format in a file
LimaString utf8stdstring2limastring(const std::string &src)
NAUTITIA.
QString LimaString
Definition LimaString.h:33
@ TraceLevel
Definition QsLog.h:48
STL namespace.
static const struct TextHtmlEntity entities[]
launch exception related to the configuration file parsing