LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
XmlReaderClientFactory.cpp
Go to the documentation of this file.
1// Copyright 2004-2021 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
7// #include "linguisticProcessing/XmlReaderCommon.h"
11#include "XmlReaderException.h"
12
13using namespace Lima;
14using namespace Lima::Common;
15
16namespace Lima
17{
18namespace XmlReader
19{
20
22 const std::string& id,
24 const std::string& defaultMedia,
25 const std::deque<std::string>& medias_to_load,
26 const std::deque<std::string>& pipelines)
27{
28#ifdef DEBUG_LP
30 LDEBUG << "XmlReaderClientFactory::configureClientFactory" << id << medias_to_load.size() << pipelines.size();
31#endif
32
33 //-------------------------------------------
34 // configure le lecteur XML
35 //-------------------------------------------
36 m_configuration = std::unique_ptr< Lima::Common::XMLConfigurationFiles::XMLConfigurationFileParser >(new Lima::Common::XMLConfigurationFiles::XMLConfigurationFileParser(configuration));
37
39 if(factory == 0) {
41 LERROR << "No factory defined for client '" << id << "' !";
42 throw XmlReaderException();
43 }
44 factory->configure(
45 configuration,
46 defaultMedia,
47 medias_to_load,
48 pipelines);
49
50 //-------------------------------------------
51 // Configure les clients d'analyse
52 //-------------------------------------------
53
54 //chercher les id des Factory à trouver
55
56 std::string id2 = "lima-coreclient";
57
58 std::map<std::string, std::string> MapTagMedia = m_configuration->getModuleGroupConfiguration(id, "documentXMLParser").getMapAtKey("indexingNodesCorrespondance");
59 for (auto mapTagMediaIt = MapTagMedia.begin();
60 mapTagMediaIt != MapTagMedia.end();
61 mapTagMediaIt++)
62 {
63 if ((*mapTagMediaIt).second.empty())
64 {
65#ifdef DEBUG_LP
66 LDEBUG << "XmlReaderClientFactory::configureClientFactory setting MapTagMedia[" << (*mapTagMediaIt).first << "] to" << defaultMedia;
67#endif
68 (*mapTagMediaIt).second = defaultMedia;
69 }
70 }
71 auto indexingNodes = m_configuration->getModuleGroupConfiguration(id, "documentXMLParser").getListsValueAtKey("indexingNodes");
72 for (auto indexingNodesIt = indexingNodes.begin();
73 indexingNodesIt != indexingNodes.end();
74 indexingNodesIt++)
75 {
76 if (MapTagMedia.find(*indexingNodesIt) == MapTagMedia.end())
77 {
78#ifdef DEBUG_LP
79 LDEBUG << "XmlReaderClientFactory::configureClientFactory setting MapTagMedia[" << *indexingNodesIt << "] to" << defaultMedia;
80#endif
81 MapTagMedia.insert(std::make_pair(*indexingNodesIt, defaultMedia));
82 }
83 }
84
85 factory->setMapTagMedia(MapTagMedia);
86 std::map<std::string, std::string> MapMediaFactory = m_configuration->getModuleGroupConfiguration(id, "documentXMLParser").getMapAtKey("availableMediaAndFactories");
87 factory->setMapMediaFactory(MapMediaFactory);
88
89 // Correspondance factories -> media name
90 // A factory such as lpFactory is used for several media (all languages)
91 std::multimap<std::string, std::string> MapFactoryMedia;
92 std::map<std::string, std::string>::iterator ItrIds;
93 for(ItrIds = MapMediaFactory.begin(); ItrIds != MapMediaFactory.end(); ItrIds++) {
94 MapFactoryMedia.insert(std::make_pair(ItrIds->second, ItrIds->first));
95 }
96
97 // On parcourt la liste des media
98 // * toutes les factories dans availableMediaAndFactories sont crees
99 // * seuls celles indiquée dans medias_to_load sont configurés (resources chargées)
100 std::multimap<std::string, std::string>::iterator ItrFact;
101 std::pair<std::multimap<std::string, std::string>::iterator, std::multimap<std::string, std::string>::iterator> ItrFacts;
102
103 for(ItrIds = MapMediaFactory.begin(); ItrIds != MapMediaFactory.end(); ItrIds++) {
104
105 // on ne cree une factory que si elle n'est pas encore dans la liste
106 if(factory->getFactoryFromId(ItrIds->second) == nullptr) {
107
108 // Create the processor factory
109 auto factoryfactory = Lima::AbstractProcessingClientFactoryFactory::getFactory(ItrIds->second);
110
111 if(factoryfactory == 0) {
113 LERROR << "No factoryfactory defined for factory '" << ItrIds->second << "' !";
114 throw XmlReaderException();
115 }
116 std::shared_ptr< Lima::ProcessingClientFactory > factory_processor(factoryfactory->createProcessingClientFactory());
117
118 // On ne configure que si le media est indiqué dans medias_to_load
119 //TODO: fabriquer medias en fonction de la factory
120 std::deque<std::string> medias;
121 ItrFacts = MapFactoryMedia.equal_range(ItrIds->second);
122
123 for(ItrFact = ItrFacts.first; ItrFact != ItrFacts.second; ItrFact++) {
124 bool found = 0;
125 for(auto it_media = medias_to_load.begin();
126 it_media != medias_to_load.end(); it_media++) {
127 if(it_media->compare(ItrFact->second) == 0) {
128 found = 1;
129 }
130 }
131
132 if(found == 1)
133 {
134 medias.push_back(ItrFact->second);
135#ifdef DEBUG_LP
136 LDEBUG << "XmlReaderClientFactory::configureClientFactory adding media [" << ItrFact->second << "] for the client [" << id2 << "]";
137#endif
138 }
139 }
140
141 if(medias.size() > 0) {
142
143 std::stringstream tmp_list_media("");
144 for(std::deque<std::string>::iterator Itrmedia = medias.begin();
145 Itrmedia != medias.end(); Itrmedia++)
146 tmp_list_media << *Itrmedia << " ";
147#ifdef DEBUG_LP
148 LDEBUG << "XmlReaderClientFactory::configureClientFactory configure clients factory [" << ItrIds->second << "] factory [" << id2 << "] for media: " << tmp_list_media.str();
149#endif
150
151 factory_processor->configureClientFactory(
152 id2 ,
153 configuration,
154 medias,
155 pipelines);
156 }
157
158 // Ajout à la liste des media passés en revue
159 factory->setFactoryFromId(ItrIds->second, factory_processor);
160 }
161 }
162}
163
164std::shared_ptr< AbstractXmlReaderClient > XmlReaderClientFactory::createClient(
165 const std::string &id) const
166{
167#ifdef DEBUG_LP
169 LDEBUG << "XmlReaderClientFactory: Create client '" << id << "'";
170#endif
171
172 const auto factory = AbstractXmlReaderClientFactory::getFactory(id);
173 if(factory == 0) {
175 LERROR << "No factory defined for client '" << id << "' !";
176 throw XmlReaderException();
177 }
178 return factory->createClient(m_configuration.get());
179}
180
181
186
187
188
189
190} // XmlReader
191
192} // Lima
193
194
#define LDEBUG
Definition LimaCommon.h:157
#define LERROR
Definition LimaCommon.h:161
#define XMLCLIENTFACTORYLOGINIT
Parser class for the lima's xml configuration files.
static std::shared_ptr< AbstractXmlReaderClientFactory > getFactory(const std::string &id)
get the factory corresponding to the given id
static std::deque< std::string > getRegisteredFactories()
get the list of factories registered
std::deque< std::string > getRegisteredFactories() const
show registered clientId
void configureClientFactory(const std::string &id, Lima::Common::XMLConfigurationFiles::XMLConfigurationFileParser &configuration, const std::string &defaultMedia, const std::deque< std::string > &medias_to_load=std::deque< std::string >(), const std::deque< std::string > &pipelines=std::deque< std::string >())
configure the corresponding clientFactory so that it can create clients.
std::shared_ptr< AbstractXmlReaderClient > createClient(const std::string &id) const
create an Client using the appropriate registered factory.
NAUTITIA.