Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
CaseDocument.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* CaseDocument.cc (C) 2000-2023 */
9/* */
10/* Classe gérant un document XML du jeu de données. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ScopedPtr.h"
15#include "arcane/utils/TraceAccessor.h"
16#include "arcane/utils/NotImplementedException.h"
17#include "arcane/utils/FatalErrorException.h"
18#include "arcane/utils/Array.h"
19
20#include "arcane/XmlNode.h"
21#include "arcane/IXmlDocumentHolder.h"
22#include "arcane/ICaseDocument.h"
23#include "arcane/CaseNodeNames.h"
24#include "arcane/CaseOptionError.h"
25#include "arcane/DomUtils.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
37: public TraceAccessor
39{
40 public:
41
43
45 {
46 delete m_case_node_names;
47 }
48
49 public:
50
51 void init();
52
53 public:
54
55 IXmlDocumentHolder* documentHolder() override { return m_doc_holder.get(); }
56 XmlNode documentNode() override { return m_document_node; }
57 XmlNode rootElement() override { return m_root_elem; }
58 String language() const override { return m_language; }
59 String defaultCategory() const override { return m_default_category; }
60 CaseNodeNames* caseNodeNames() override { return m_case_node_names; }
61
62 public:
63
64 void addError(const CaseOptionError& case_error) override;
65 void addWarning(const CaseOptionError& case_error) override;
66 bool hasError() const override;
67 bool hasWarnings() const override;
68 void printErrors(std::ostream& o) override;
69 void printWarnings(std::ostream& o) override;
70 void clearErrorsAndWarnings() override;
71
72 public:
73
74 ICaseDocumentFragment* fragment() { return this; }
75
76 public:
77
78 CaseNodeNames* m_case_node_names = nullptr;
79 ScopedPtrT<IXmlDocumentHolder> m_doc_holder;
80 XmlNode m_document_node;
81 XmlNode m_root_elem;
82 String m_language;
83 String m_default_category;
84 UniqueArray<CaseOptionError> m_errors;
85 UniqueArray<CaseOptionError> m_warnings;
86
87 private:
88
89 void _assignLanguage(const String& langname);
90 void _printErrorsOrWarnings(std::ostream& o,ConstArrayView<CaseOptionError> errors);
91};
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
99: public TraceAccessor
100, public ICaseDocument
101{
102 public:
103
105 ~CaseDocument() override;
106
107 void build() override;
108 ICaseDocument* clone() override;
109
110 public:
111
113 IXmlDocumentHolder* documentHolder() override { return m_fragment.m_doc_holder.get(); }
114 XmlNode documentNode() override { return m_fragment.m_document_node; }
115 XmlNode rootElement() override { return m_fragment.m_root_elem; }
116 String language() const override { return m_fragment.m_language; }
117 String defaultCategory() const override { return m_fragment.m_default_category; }
118 CaseNodeNames* caseNodeNames() override { return m_fragment.m_case_node_names; }
119 void addError(const CaseOptionError& case_error) override { m_fragment.addError(case_error); }
120 void addWarning(const CaseOptionError& case_error) override { m_fragment.addWarning(case_error); }
121 bool hasError() const override { return m_fragment.hasError(); }
122 bool hasWarnings() const override { return m_fragment.hasWarnings(); }
123 void printErrors(std::ostream& o) override { m_fragment.printErrors(o); }
124 void printWarnings(std::ostream& o) override { m_fragment.printWarnings(o); }
125 void clearErrorsAndWarnings() override { m_fragment.clearErrorsAndWarnings(); }
127
128 public:
129
130 XmlNode arcaneElement() override { return m_arcane_elem; }
131 XmlNode configurationElement() override { return m_configuration_elem; }
132
133 XmlNode timeloopElement() override { return m_timeloop_elem; }
134 XmlNode titleElement() override { return m_title_elem; }
135 XmlNode descriptionElement() override { return m_description_elem; }
136 XmlNode modulesElement() override { return m_modules_elem; }
137 XmlNode servicesElement() override { return m_services_elem; }
138
139 const XmlNodeList& meshElements() override { return m_mesh_elems; }
140
141 XmlNode meshesElement() override { return m_meshes_elem; }
142
143 XmlNode functionsElement() override { return m_functions_elem; }
144
145 String userClass() const override { return m_user_class; }
146 void setUserClass(const String& value) override;
147
148 String codeName() const override { return m_code_name; }
149 void setCodeName(const String& value) override;
150
151 String codeVersion() const override { return m_code_version; }
152 void setCodeVersion(const String& value) override;
153
154 String codeUnitSystem() const override { return m_code_unit_system; }
155 void setCodeUnitSystem(const String& value) override;
156
157 void setDefaultCategory(const String& v) override { m_fragment.m_default_category = v; }
158
159 ICaseDocumentFragment* fragment() override { return m_fragment.fragment(); }
160
161 public:
162
163 // Positionne la langue. Doit être fait avant l'appel à build.
164 void setLanguage(const String& language)
165 {
166 if (!m_fragment.m_language.null())
167 ARCANE_FATAL("Language already set");
168 m_fragment.m_language = language;
169 }
170
171 private:
172
173 CaseDocumentFragment m_fragment;
174
175 XmlNode m_arcane_elem;
176 XmlNode m_configuration_elem;
177 XmlNode m_timeloop_elem;
178 XmlNode m_title_elem;
179 XmlNode m_description_elem;
180 XmlNode m_modules_elem;
181 XmlNode m_services_elem;
182 XmlNodeList m_mesh_elems;
183 XmlNode m_functions_elem;
184 XmlNode m_meshes_elem;
185
186 String m_user_class;
187 String m_code_name;
188 String m_code_version;
189 String m_code_unit_system;
190
191 private:
192
193 XmlNode _forceCreateChild(XmlNode& parent,const String& us);
194};
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
198
199extern "C++" ICaseDocumentFragment*
200arcaneCreateCaseDocumentFragment(ITraceMng* tm,IXmlDocumentHolder* document)
201{
202 auto* doc = new CaseDocumentFragment(tm,document);
203 doc->init();
204 return doc;
205}
206
207/*---------------------------------------------------------------------------*/
208/*---------------------------------------------------------------------------*/
209
210extern "C++" ICaseDocument*
211arcaneCreateCaseDocument(ITraceMng* tm,IXmlDocumentHolder* document)
212{
213 ICaseDocument* doc = new CaseDocument(tm,document);
214 doc->build();
215 return doc;
216}
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
220
221extern "C++" ICaseDocument*
222arcaneCreateCaseDocument(ITraceMng* tm,const String& lang)
223{
224 IXmlDocumentHolder* xml_doc = domutils::createXmlDocument();
225 CaseDocument* doc = new CaseDocument(tm,xml_doc);
226 if (!lang.null())
227 doc->setLanguage(lang);
228 doc->build();
229 return doc;
230}
231
232/*---------------------------------------------------------------------------*/
233/*---------------------------------------------------------------------------*/
234
235CaseDocumentFragment::
236CaseDocumentFragment(ITraceMng* tm,IXmlDocumentHolder* document)
237: TraceAccessor(tm)
238, m_case_node_names(new CaseNodeNames(String()))
239, m_doc_holder(document)
240, m_document_node(m_doc_holder->documentNode())
241{
242}
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
246
247CaseDocument::
248CaseDocument(ITraceMng* tm,IXmlDocumentHolder* document)
249: TraceAccessor(tm)
250, m_fragment(tm,document)
251{
252}
253
254/*---------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
256
257CaseDocument::
258~CaseDocument()
259{
260}
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
264
265void CaseDocumentFragment::
266init()
267{
268 CaseNodeNames* cnn = caseNodeNames();
269
270 m_root_elem = m_document_node.documentElement();
271 if (m_root_elem.null()){
272 // Nouveau cas, pour l'instant langue francaise par défaut.
273 if (m_language.null())
274 m_language = String("fr");
275 _assignLanguage(m_language);
276 cnn = caseNodeNames();
277 m_root_elem = m_document_node.createAndAppendElement(cnn->root,String());
278 m_root_elem.setAttrValue(cnn->lang_attribute,m_language);
279 }
280
281 m_language = m_root_elem.attrValue(cnn->lang_attribute);
282
283 if (m_language.null()){
284 ARCANE_FATAL("Attribute '{0}' not specified in the element <{1}>",
285 cnn->lang_attribute,m_root_elem.name());
286 }
287 else
288 _assignLanguage(m_language);
289}
290
291/*---------------------------------------------------------------------------*/
292/*---------------------------------------------------------------------------*/
293
295build()
296{
297 m_fragment.init();
298
299 // Ces noeuds ont un nom indépendant du langage.
300 m_arcane_elem = _forceCreateChild(m_fragment.m_root_elem,"arcane");
301 m_configuration_elem = _forceCreateChild(m_arcane_elem,"configuration");
302
303 // Ne pas faire avant 'm_fragment.init()'
305
306 // NOTE: Si on ajoute ou change des éléments, il faut mettre
307 // à jour la conversion correspondante dans CaseDocumentLangTranslator
308 m_timeloop_elem = _forceCreateChild(m_arcane_elem,cnn->timeloop);
309 m_title_elem = _forceCreateChild(m_arcane_elem,cnn->title);
310 m_description_elem = _forceCreateChild(m_arcane_elem,cnn->description);
311 m_modules_elem = _forceCreateChild(m_arcane_elem, cnn->modules);
312 m_services_elem = _forceCreateChild(m_arcane_elem, cnn->services);
313
314 XmlNode& root_elem = m_fragment.m_root_elem;
315
316 _forceCreateChild(root_elem,cnn->mesh);
317 m_mesh_elems = root_elem.children(cnn->mesh);
318
319 m_functions_elem = _forceCreateChild(root_elem,cnn->functions);
320 m_meshes_elem = root_elem.child(cnn->meshes);
321
322 m_user_class = root_elem.attrValue(cnn->user_class);
323 m_code_name = root_elem.attrValue(cnn->code_name);
324 m_code_version = root_elem.attrValue(cnn->code_version);
325 m_code_unit_system = root_elem.attrValue(cnn->code_unit);
326}
327
328/*---------------------------------------------------------------------------*/
329/*---------------------------------------------------------------------------*/
330
332clone()
333{
334 throw NotImplementedException(A_FUNCINFO);
335}
336
337/*---------------------------------------------------------------------------*/
338/*---------------------------------------------------------------------------*/
339
340void CaseDocumentFragment::
341_assignLanguage(const String& langname)
342{
343 delete m_case_node_names;
344 m_case_node_names = new CaseNodeNames(langname);
345}
346
347/*---------------------------------------------------------------------------*/
348/*---------------------------------------------------------------------------*/
349
350XmlNode CaseDocument::
351_forceCreateChild(XmlNode& parent,const String& name)
352{
353 XmlNode node(parent.child(name));
354 if (node.null())
355 node = parent.createAndAppendElement(name,String());
356 return node;
357}
358
359/*---------------------------------------------------------------------------*/
360/*---------------------------------------------------------------------------*/
361
363setUserClass(const String& value)
364{
365 m_user_class = value;
366 m_fragment.m_root_elem.setAttrValue(caseNodeNames()->user_class,value);
367}
368
369/*---------------------------------------------------------------------------*/
370/*---------------------------------------------------------------------------*/
371
373setCodeName(const String& value)
374{
375 m_code_name = value;
376 m_fragment.m_root_elem.setAttrValue(caseNodeNames()->code_name,value);
377}
378
379/*---------------------------------------------------------------------------*/
380/*---------------------------------------------------------------------------*/
381
383setCodeVersion(const String& value)
384{
385 m_code_version = value;
386 m_fragment.m_root_elem.setAttrValue(caseNodeNames()->code_version,value);
387}
388
389/*---------------------------------------------------------------------------*/
390/*---------------------------------------------------------------------------*/
391
393setCodeUnitSystem(const String& value)
394{
395 m_code_unit_system = value;
396 m_fragment.m_root_elem.setAttrValue(caseNodeNames()->code_unit,value);
397}
398
399/*---------------------------------------------------------------------------*/
400/*---------------------------------------------------------------------------*/
401
402/*---------------------------------------------------------------------------*/
403/*---------------------------------------------------------------------------*/
404
407{
408 m_errors.add(case_error);
409}
410
411/*---------------------------------------------------------------------------*/
412/*---------------------------------------------------------------------------*/
413
416{
417 m_warnings.add(case_error);
418}
419
420/*---------------------------------------------------------------------------*/
421/*---------------------------------------------------------------------------*/
422
423bool CaseDocumentFragment::
424hasError() const
425{
426 return m_errors.size()!=0;
427}
428
429/*---------------------------------------------------------------------------*/
430/*---------------------------------------------------------------------------*/
431
432bool CaseDocumentFragment::
433hasWarnings() const
434{
435 return m_warnings.size()!=0;
436}
437
438/*---------------------------------------------------------------------------*/
439/*---------------------------------------------------------------------------*/
440
442printErrors(std::ostream& o)
443{
444 _printErrorsOrWarnings(o,m_errors);
445}
446
447/*---------------------------------------------------------------------------*/
448/*---------------------------------------------------------------------------*/
449
451printWarnings(std::ostream& o)
452{
453 _printErrorsOrWarnings(o,m_warnings);
454}
455
456/*---------------------------------------------------------------------------*/
457/*---------------------------------------------------------------------------*/
458
461{
462 m_errors.clear();
463 m_warnings.clear();
464}
465
466/*---------------------------------------------------------------------------*/
467/*---------------------------------------------------------------------------*/
468
469void CaseDocumentFragment::
470_printErrorsOrWarnings(std::ostream& o,ConstArrayView<CaseOptionError> errors)
471{
472 for( const CaseOptionError& error : errors ){
473 if (arcaneIsCheck()){
474 o << "TraceFile: " << error.trace().file() << ":" << error.trace().line() << '\n';
475 o << "TraceFunc: " << error.trace().name() << '\n';
476 }
477 o << '<' << error.nodeName() << "> : " << error.message() << '\n';
478 }
479}
480
481/*---------------------------------------------------------------------------*/
482/*---------------------------------------------------------------------------*/
483
484} // End namespace Arcane
485
486/*---------------------------------------------------------------------------*/
487/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
void printWarnings(std::ostream &o) override
Ecrit les avertissements dans le flot o.
CaseNodeNames * caseNodeNames() override
Retourne l'instance contenant les noms des noeuds XML par langage.
String language() const override
Langage utilisé dans le jeu de données.
void printErrors(std::ostream &o) override
Ecrit les erreurs dans le flot o.
String defaultCategory() const override
Catégorie utilisée pour les valeurs par défaut.
IXmlDocumentHolder * documentHolder() override
Retourne le document Xml du jeu de données. Ce pointeur reste la propriété de cette classe et est dét...
void addError(const CaseOptionError &case_error) override
Ajoute une erreur dans le jeu de données.
void clearErrorsAndWarnings() override
Supprime les messages d'erreurs et d'avertissements enregistrés.
XmlNode documentNode() override
Retourne le noeud document.
void addWarning(const CaseOptionError &case_error) override
Ajoute un avertissement dans le jeu de données.
XmlNode rootElement() override
Retourne l'élément racine.
Classe gérant un document XML du jeu de données.
XmlNode rootElement() override
Retourne l'élément racine.
XmlNode meshesElement() override
Elément contenant la liste des maillages (nouveau mécanisme) (peut être nul)
String codeUnitSystem() const override
Nom du système d'unité du document.
XmlNode arcaneElement() override
Retourne l'élément des informations pour Arcane.
String codeName() const override
Nom du code du cas.
ICaseDocument * clone() override
Clone le document.
void setDefaultCategory(const String &v) override
Positionne la catégorie utilisée pour les valeurs par défaut.
const XmlNodeList & meshElements() override
Retourne l'élément racine des informations de maillage.
XmlNode descriptionElement() override
Retourne l'élément contenant la description du cas.
void addWarning(const CaseOptionError &case_error) override
Ajoute un avertissement dans le jeu de données.
void setUserClass(const String &value) override
Positionne le nom de la classe d'utilisation du cas.
XmlNode functionsElement() override
Retourne l'élément racine des fonctions.
String userClass() const override
Nom de la classe d'utilisation du cas.
XmlNode documentNode() override
Retourne le noeud document.
XmlNode modulesElement() override
Retourne l'élément contenant la description des modules.
CaseNodeNames * caseNodeNames() override
Retourne l'instance contenant les noms des noeuds XML par langage.
void setCodeVersion(const String &value) override
Positionne le numéro de version du code.
void setCodeUnitSystem(const String &value) override
Positionne le nom du systmème d'unité du document.
XmlNode timeloopElement() override
Retourne l'élément contenant le choix de la boucle en temps.
String defaultCategory() const override
Catégorie utilisée pour les valeurs par défaut.
XmlNode configurationElement() override
Retourne l'élément des informations de configuration.
XmlNode titleElement() override
Retourne l'élément contenant le titre du cas.
void printWarnings(std::ostream &o) override
Ecrit les avertissements dans le flot o.
IXmlDocumentHolder * documentHolder() override
Retourne le document Xml du jeu de données. Ce pointeur reste la propriété de cette classe et est dét...
void addError(const CaseOptionError &case_error) override
Ajoute une erreur dans le jeu de données.
ICaseDocumentFragment * fragment() override
Fragment correspondant à ce document.
void build() override
Construit l'instance.
void setCodeName(const String &value) override
Positionne le nom du code du cas.
XmlNode servicesElement() override
Retourne l'élément contenant la description des services.
String codeVersion() const override
Numéro de version du code correspondant au cas.
void printErrors(std::ostream &o) override
Ecrit les erreurs dans le flot o.
String language() const override
Langage utilisé dans le jeu de données.
void clearErrorsAndWarnings() override
Supprime les messages d'erreurs et d'avertissements enregistrés.
Noms des noeuds XML d'un jeu de données Arcane.
Erreur dans le jeu de données.
Interface d'une partie d'un jeu de données.
Interface d'une classe gérant un document XML du jeu de données.
Gestionnaire d'un document DOM.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Liste de noeuds d'un arbre DOM.
Definition XmlNodeList.h:33
Noeud d'un arbre DOM.
Definition XmlNode.h:51
XmlNode documentElement() const
Retourne le noeud élément du document.
Definition XmlNode.cc:556
String attrValue(const String &name, bool throw_exception=false) const
Valeur de l'attribut name.
Definition XmlNode.cc:225
bool null() const
Vrai si le noeud est nul.
Definition XmlNode.h:294
void setAttrValue(const String &name, const String &value)
Positionne l'attribut name à la valeur value.
Definition XmlNode.cc:239
String name() const
Nom du noeud.
Definition XmlNode.cc:132
Interface du gestionnaire de traces.
Exception lorsqu'une fonction n'est pas implémentée.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
TraceMessage error() const
Flot pour un message d'erreur.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:151