Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CaseOptionList.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/* CaseOptionList.cc (C) 2000-2023 */
9/* */
10/* Liste d'options de configuration d'un service ou module. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/TraceAccessor.h"
15#include "arcane/utils/FatalErrorException.h"
16#include "arcane/utils/Iterator.h"
17#include "arcane/utils/StringBuilder.h"
18
19#include "arcane/core/CaseOptions.h"
20#include "arcane/core/ICaseMng.h"
21#include "arcane/core/XmlNodeList.h"
22#include "arcane/core/XmlNodeIterator.h"
23#include "arcane/core/CaseOptionError.h"
24#include "arcane/core/ICaseDocumentVisitor.h"
25#include "arcane/core/CaseOptionException.h"
26#include "arcane/core/ICaseDocument.h"
27#include "arcane/core/MeshHandle.h"
28#include "arcane/core/internal/ICaseOptionListInternal.h"
29
30// TODO: a supprimer
31#include "arcane/IServiceInfo.h"
32#include "arcane/ICaseFunction.h"
33
34#include <vector>
35#include <algorithm>
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40namespace Arcane
41{
42
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
46/*!
47 * \brief Vérifie la validité du contenu entre éléments.
48 *
49 * Cette classe permet de vérifier qu'il n'y a pas de chaînes de caractères
50 * entre les éléments.
51 *
52 * Par exemple, le texte suivant est invalide: pour une option complexe 'toto'
53 * contenant deux options 'x' et 'y', le texte suivant est considéré invalide:
54 * <toto>ABCD<x>A</x><y></y></toto>
55 * car 'ABCD' ne sera pas utilisé ce qui peut être trompeur pour l'utilisateur.
56 * On ne tolére entre les éléments que les noeuds texte contenant des
57 * caractères blancs.
58 */
60{
61 public:
63 : m_case_document(cd), m_space_string(" ")
64 {
65 ARCANE_UNUSED(tm);
66 }
67
68 //! Vérifie la validité des éléments fils de \a element
69 void check(XmlNode element)
70 {
71 //ITraceMng* tm = m_trace_mng;
72 XmlNode last_element = element;
73 for( XmlNode::const_iterator i = element.begin(), end = element.end(); i != end; ++i ){
74 XmlNode n = *i;
75 //tm->info() << "CHECK SUB_ELEMENT: " << n.name();
76 if (n.type()==XmlNode::ELEMENT){
77 last_element = n;
78 }
79 if (n.type()==XmlNode::TEXT){
80 StringBuilder sb = n.value();
81 //tm->info() << "VALUE1: '" << n.value() << "'";
83 String ns = sb.toString();
84 //tm->info() << "VALUE2: '" << ns << "'";
85 if (ns!=m_space_string)
86 CaseOptionError::addWarning(m_case_document,A_FUNCINFO,last_element.xpathFullName(),
87 String::format("Invalid text node between elements (value='{0}')",
88 n.value()),true);
89
90 }
91 }
92 }
93
94 private:
95 ICaseDocumentFragment* m_case_document;
96 String m_space_string;
97};
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101/*!
102 * \internal
103 * \brief Liste d'options de configuration d'un service ou module.
104 */
106: public TraceAccessor
108, public ICaseOptionList
109{
110 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
111
112 public:
113
115 : public ICaseOptionListInternal
116 {
117 public:
118
119 InternalApi(CaseOptionList* opt_list)
120 : m_opt_list(opt_list)
121 {
122 }
123
124 public:
125
126 void addConfig(CaseOptionBase* o, const XmlNode& parent) override
127 {
128 m_opt_list->addConfig(o,parent);
129 }
130 void setRootElementWithParent(const XmlNode& parent_element) override
131 {
132 m_opt_list->setRootElementWithParent(parent_element);
133 }
134 void setRootElement(const XmlNode& root_element) override
135 {
136 m_opt_list->setRootElement(root_element);
137 }
138 void addInvalidChildren(XmlNodeList& nlist) override
139 {
140 m_opt_list->addInvalidChildren(nlist);
141 }
142
143 private:
144
145 CaseOptionList* m_opt_list;
146 };
147
148 public:
149
150 typedef std::pair<CaseOptionBase*,XmlNode> CaseOptionBasePair;
151 typedef std::vector<CaseOptionBasePair> CaseOptionBasePairList;
152
153 CaseOptionList(ICaseMng* m,ICaseOptions* ref_opt,XmlNode parent_element)
154 : TraceAccessor(m->traceMng()), m_case_mng(m), m_root_element(), m_parent(nullptr), m_ref_opt(ref_opt),
155 m_parent_element(parent_element), m_is_present(false), m_is_multi(false),
156 m_is_optional(false), m_internal_api(this) {}
157 CaseOptionList(ICaseOptionList* parent,ICaseOptions* ref_opt,XmlNode parent_element)
158 : TraceAccessor(parent->caseMng()->traceMng()), m_case_mng(parent->caseMng()),
159 m_root_element(), m_parent(parent),
160 m_ref_opt(ref_opt), m_parent_element(parent_element), m_is_present(false),
161 m_is_multi(false), m_is_optional(false), m_internal_api(this)
162 {
163 }
164 ~CaseOptionList()
165 {
166 // Détache les options filles qui existent encore pour ne pas qu'elles le
167 // fassent lors de leur destruction. Il faut utiliser une copie de la liste
168 // car cette dernière sera modifiée lors du detach().
169 std::vector<ICaseOptions*> copy_list(m_case_options);
170 for( ICaseOptions* co : copy_list )
171 co->detach();
172 }
173
174 public:
175
176 XmlNode rootElement() const override { return m_root_element; }
177 XmlNode parentElement() const override { return m_parent_element; }
178 ICaseMng* caseMng() const override { return m_case_mng; }
179 void addConfig(CaseOptionBase* cbi,XmlNode parent) override
180 {
181 //TODO: Vérifier la suppression et pas déjà présent
182 m_config_list.push_back(CaseOptionBasePair(cbi,parent));
183 }
184 void addChild(ICaseOptions* c) override
185 {
186 info(5) << " ADD_CHILD " << c->rootTagName() << " instance=" << c
187 << " this=" << this << " n=" << m_case_options.size();
188 m_case_options.push_back(c);
189 }
190 void removeChild(ICaseOptions* c) override
191 {
192 info(5) << " REMOVE_CHILD " << c->rootTagName() << " instance=" << c << " this=" << this;
193 auto i = std::find(m_case_options.begin(),m_case_options.end(),c);
194 if (i==m_case_options.end())
195 ARCANE_FATAL("Internal: option not in list");
196 m_case_options.erase(i);
197 }
198
199 void readChildren(bool is_phase1) override;
200 void printChildren(const String& lang,int indent) override;
201 void visit(ICaseDocumentVisitor* visitor) override;
202 void addInvalidChildren(XmlNodeList& nlist) override;
203
204 public:
205
207 {
209 col.add(i->first);
210 for( ICaseOptions* co : m_case_options )
211 co->deepGetChildren(col);
212 }
213
214 String rootTagName() const override { return m_ref_opt->rootTagName(); }
215
216 bool isOptional() const override { return m_is_optional; }
217 void setOptional(bool v) { m_is_optional = v; }
218
219 void setRootElementWithParent(XmlNode parent_element) override
220 {
221 _setRootElement(false,parent_element);
222 }
223
224 void setRootElement(XmlNode root_element) override
225 {
226 if (!m_root_element.null())
227 throw CaseOptionException("CaseOptionsList::setRootElement()","root_element already set",true);
228 m_root_element = root_element;
229 _setRootElement(true,XmlNode());
230 }
231
232 bool isPresent() const override
233 {
234 return m_is_present;
235 }
236
237 /*!
238 * \brief Indique si l'option peut-être présente plusieurs fois.
239 *
240 * Cela sert à vérifier que l'élément correspondant de l'option n'est
241 * présent qu'une seule fois si \a v est faux. Si \a v est vrai,
242 * la vérification a lieu ailleurs. Cette fonction doit être appelée
243 * avant readChildren() pour être pris en compte.
244 */
245 void setIsMulti(bool v)
246 {
247 m_is_multi = v;
248 }
249
250 String xpathFullName() const override { return m_root_element.xpathFullName(); }
251
252 MeshHandle meshHandle() const override { return m_ref_opt->meshHandle(); }
253
254 public:
255
257 {
258 return m_ref_opt->caseDocumentFragment();
259 }
260
261 public:
262
263 void disable() override
264 {
265 info(5) << "INTERNAL REMOVE CHILDREN root=" << m_root_element.xpathFullName() << " this=" << this;
266 // TODO regarder éventuelles fuites mémoire
267 m_case_options.clear();
268 m_is_disabled = true;
269 }
270
271 public:
272
273 virtual ICaseOptionListInternal* _internalApi() override { return &m_internal_api; }
274
275 protected:
276
277 void _addInvalidChildren(XmlNode parent,XmlNodeList& nlist);
278 void _searchChildren(bool is_phase1);
279 void _setRootElement(bool force_init,XmlNode parent_element);
280 void _strIndent(char* buf,int indent,int max_indent);
281 void _printOption(const String& lang,int indent,CaseOptionBase* co,std::ostream& o);
282 bool _isValidChildTagName(const String& name);
283
284 protected:
285
286 ICaseMng* m_case_mng;
287 XmlNode m_root_element; //!< Elément racine pour cette liste d'options
288 ICaseOptionList* m_parent;
289 ICaseOptions* m_ref_opt;
290 CaseOptionBasePairList m_config_list; //!< Liste des valeurs de configuration
291 std::vector<ICaseOptions*> m_case_options;
292 XmlNode m_parent_element; //!< Elément parent.
293 bool m_is_present;
294 bool m_is_multi;
295 bool m_is_optional;
296 bool m_is_disabled = false;
297 InternalApi m_internal_api;
298};
299
300/*---------------------------------------------------------------------------*/
301/*---------------------------------------------------------------------------*/
302
303/*---------------------------------------------------------------------------*/
304/*---------------------------------------------------------------------------*/
305
307readChildren(bool is_phase1)
308{
309 info(5) << "READ CHILDREN root=" << m_root_element.xpathFullName()
310 << " parent=" << m_parent_element.xpathFullName()
311 << " id=" << typeid(*this).name()
312 << " phase1?=" << is_phase1
313 << " this=" << this;
314
315 if (!m_is_multi && !m_parent_element.null()){
316 // Vérifie que l'élément n'est présent qu'une fois.
318 if (all_children.size()>1){
321 String::format("Only one token of the element is allowed (nb_occur={0})",
322 all_children.size()),true);
323 }
324 }
325 _setRootElement(false,XmlNode());
326 for( ConstIterT< std::vector<CaseOptionBasePair> > i(m_config_list); i(); ++i )
327 i->first->setRootElement(m_root_element);
328 _searchChildren(is_phase1);
329}
330
331/*---------------------------------------------------------------------------*/
332/*---------------------------------------------------------------------------*/
333
335printChildren(const String& lang,int indent)
336{
337 if (!m_is_present && isOptional())
338 return;
339
340 char str_indent[128];
341 _strIndent(str_indent,indent,127);
342
343 String service_name = "";
344 String mesh_name = "";
345 IServiceInfo* service = m_ref_opt->caseServiceInfo();
346 if (service){
347 service_name = " name=\""+ service->localName() + "\"";
348 String mesh_handle_name = m_ref_opt->meshHandle().meshName();
349 if (mesh_handle_name!="Mesh0")
350 mesh_name = " mesh=\"" + m_ref_opt->meshHandle().meshName() + "\"";
351 }
352 info() << str_indent << "<" << rootTagName() << service_name << mesh_name << ">";
354 _printOption(lang,indent,i->first,info().file());
355 }
356 for( ICaseOptions* co : m_case_options ){
357 co->printChildren(lang,indent+1);
358 }
359 info() << str_indent << "</" << rootTagName() << ">";
360}
361
362/*---------------------------------------------------------------------------*/
363/*---------------------------------------------------------------------------*/
364
367{
368 if (!m_is_present && isOptional())
369 return;
370
371 visitor->beginVisit(m_ref_opt);
373 i->first->visit(visitor);
374 }
375 for( ICaseOptions* co : m_case_options ){
376 co->visit(visitor);
377 }
378 visitor->endVisit(m_ref_opt);
379}
380
381/*---------------------------------------------------------------------------*/
382/*---------------------------------------------------------------------------*/
383
386{
387 info(5) << "CHECK INVALID CHILDREN root=" << m_root_element.xpathFullName()
388 << " parent=" << m_parent_element.xpathFullName()
389 << " this=" << this;
390 if (m_is_disabled)
391 return;
392
393 if (!m_root_element.null())
394 _addInvalidChildren(m_root_element,nlist);
395
396 // Récursion sur les fils
397 for( ICaseOptions* co : m_case_options )
398 co->addInvalidChildren(nlist);
399}
400
401/*---------------------------------------------------------------------------*/
402/*---------------------------------------------------------------------------*/
403
404void CaseOptionList::
405_searchChildren(bool is_phase1)
406{
407 // Si je suis absent et que je suis optionel, ne fait rien.
408 if (!m_is_present && isOptional())
409 return;
411 i->first->search(is_phase1);
412 auto read_phase = (is_phase1) ? eCaseOptionReadPhase::Phase1 : eCaseOptionReadPhase::Phase2;
413 for( ICaseOptions* co : m_case_options )
414 co->read(read_phase);
415}
416
417/*---------------------------------------------------------------------------*/
418/*---------------------------------------------------------------------------*/
419
420void CaseOptionList::
421_setRootElement(bool force_init,XmlNode parent_element)
422{
423 // Ne fait rien si déjà positionné
424 if (!m_root_element.null() && !force_init)
425 return;
426 if (force_init){
427 if (m_root_element.null())
428 throw CaseOptionException("CaseOptionsList::_setRootElement()","root_element not set",true);
430 }
431 else{
432 if (!parent_element.null())
433 m_parent_element = parent_element;
435 m_parent_element = (m_parent) ? m_parent->rootElement() : caseDocumentFragment()->rootElement();
437 }
438 // L'élément recherché n'existe pas. Il y a alors trois possibitités:
439 // 1- Il s'agit d'un bloc d'option (cet élément est directement fils
440 // de l'élément racine du document). Dans ce cas, on créé l'élément
441 // correspondant ce qui permet d'avoir des modules optionnels.
442 // 2- L'option n'est pas obligatoire. Dans ce cas on ne fait rien.
443 // 3- L'option est obligatoire. On créé tout de même l'élément correspondant
444 // car s'il ne comporte que des options par défaut, il n'est pas
445 // nécessaire qu'il soit présent.
446 if (m_root_element.null()){
447 m_is_present = false;
448 if (!m_parent){
449 XmlNode case_root = caseDocumentFragment()->rootElement();
450 m_root_element = case_root.createAndAppendElement(rootTagName());
451 }
452 else if (!isOptional()){
453 m_root_element = m_parent_element.createAndAppendElement(rootTagName());
454 //throw ExConfigNotFound(msgMng(),"_setRootElement",rootTagName(),m_parent_element);
455 }
456 }
457 else
458 m_is_present = true;
459}
460
461/*---------------------------------------------------------------------------*/
462/*---------------------------------------------------------------------------*/
463
464void CaseOptionList::
465_strIndent(char* buf,int indent,int max_indent)
466{
467 ++indent;
468
469 if (indent>max_indent)
470 indent = max_indent;
471
472 for( int i=0; i<indent; ++i )
473 buf[i] = ' ';
474 buf[indent] = '\0';
475}
476
477/*---------------------------------------------------------------------------*/
478/*---------------------------------------------------------------------------*/
479
480void CaseOptionList::
481_printOption(const String& lang,int indent,CaseOptionBase* co,std::ostream& o)
482{
483 std::ios_base::fmtflags f = o.flags(std::ios::left);
484 o << " ";
485 for( int i=0; i<indent; ++i )
486 o << ' ';
487 o.width(40-indent);
488 o << co->name();
489 co->print(lang,o);
490 ICaseFunction* func = co->function();
491 if (func){
492 o << " (fonction: " << func->name() << ")";
493 }
494 o.flags(f);
495}
496
497/*---------------------------------------------------------------------------*/
498/*---------------------------------------------------------------------------*/
499
500bool CaseOptionList::
501_isValidChildTagName(const String& name)
502{
503 for( ConstIterT<CaseOptionBasePairList> i(m_config_list); i(); ++i ){
504 CaseOptionBase* co = i->first;
505 if (co->name()==name)
506 return true;
507 }
508 for( ICaseOptions* co : m_case_options ){
509 info(5) << " CHECK CHILDREN this=" << this << " instance=" << co << " tag=" << co->rootTagName();
510 if (co->rootTagName()==name)
511 return true;
512 }
513 return false;
514}
515
516/*---------------------------------------------------------------------------*/
517/*---------------------------------------------------------------------------*/
518
519void CaseOptionList::
520_addInvalidChildren(XmlNode parent,XmlNodeList& nlist)
521{
522 for( auto i = parent.begin(), end = parent.end(); i != end; ++i ){
523 if (i->type()!=XmlNode::ELEMENT)
524 continue;
525 const String& name = i->name();
526 bool is_valid = _isValidChildTagName(name);
527 info(5) << " CHECK Valid tag_name=" << name << " is_valid=" << is_valid;
528 if (!is_valid)
529 nlist.add(*i);
530 }
531 XmlElementContentChecker xecc(caseDocumentFragment(),traceMng());
532 xecc.check(parent);
533}
534
535/*---------------------------------------------------------------------------*/
536/*---------------------------------------------------------------------------*/
537
538/*---------------------------------------------------------------------------*/
539/*---------------------------------------------------------------------------*/
540/*!
541 * \internal
542 * \brief Liste d'options du jeu de données contenant plusieurs fils identiques.
543 */
545: public CaseOptionList
546{
547 public:
548
549 typedef std::pair<CaseOptionBase*,XmlNode> CaseOptionBasePair;
550 typedef std::vector<CaseOptionBasePair> CaseOptionBasePairList;
551
552 public:
553
555 const XmlNode& element,Integer min_occurs,Integer max_occurs)
556 : CaseOptionList(m,co,element), m_case_option_multi(com),
557 m_min_occurs(min_occurs), m_max_occurs(max_occurs) {}
559 ICaseOptionList* parent,const XmlNode& element,
560 Integer min_occurs,Integer max_occurs)
561 : CaseOptionList(parent,co,element), m_case_option_multi(com),
562 m_min_occurs(min_occurs), m_max_occurs(max_occurs) {}
563
564 public:
565
566 bool isOptional() const override { return true; }
567 void readChildren(bool is_phase1) override;
568 void addInvalidChildren(XmlNodeList& nlist) override;
569 void printChildren(const String& lang,int indent) override;
570 void deepGetChildren(Array<CaseOptionBase*>& col) override;
571 void visit(ICaseDocumentVisitor* visitor) override;
572 void _checkMinMaxOccurs(Integer nb_occur);
573
574 protected:
575
576 XmlNode _rootElement(Integer position) const
577 {
578 return m_root_element_list[position];
579 }
580
581 private:
582
583 ICaseOptionsMulti* m_case_option_multi;
584 UniqueArray<ICaseOptionList*> m_case_config_list;
585 XmlNodeList m_root_element_list;
586 Integer m_min_occurs;
587 Integer m_max_occurs;
588
589 private:
590};
591
592/*---------------------------------------------------------------------------*/
593/*---------------------------------------------------------------------------*/
594
596readChildren(bool is_phase1)
597{
598 if (is_phase1){
599 _setRootElement(false,XmlNode());
600
601 info(5) << "ListMulti: readChildren root=" << m_root_element.xpathFullName()
602 << " parent=" << m_parent_element.xpathFullName()
603 << " id=" << typeid(*this).name()
604 << " phase1?=" << is_phase1
605 << " this=" << this;
606
607 //debug() << "ReadConfig " << rootTagName();
608
609 m_root_element_list = m_parent_element.children(rootTagName());
610 m_case_config_list.clear();
611 Integer s = m_root_element_list.size();
612 _checkMinMaxOccurs(s);
613 if (s!=0)
614 m_case_option_multi->multiAllocate(m_root_element_list);
615 // Récupère les options créées lors de l'appel à 'multiAllocate' et
616 // les ajoute à la liste.
617 Integer nb_children = m_case_option_multi->nbChildren();
618 for( Integer i=0; i<nb_children; ++i ){
619 ICaseOptionList* co_value = m_case_option_multi->child(i);
620 co_value->_internalApi()->setRootElement(m_root_element_list[i]);
621 m_case_config_list.add(co_value);
622 }
623 }
624 for( ICaseOptionList* opt : m_case_config_list ){
625 opt->readChildren(is_phase1);
626 }
627 _searchChildren(is_phase1);
628 // Normalement on ne doit pas avoir d'éléments dans 'm_config_list'.
629 if (m_config_list.size()!=0)
630 ARCANE_FATAL("Invalid 'm_config_list' size ({1}) for option '{0}'",rootTagName(),m_config_list.size());
631}
632
633/*---------------------------------------------------------------------------*/
634/*---------------------------------------------------------------------------*/
635
638{
639 for( ICaseOptions* co : m_case_options )
640 co->addInvalidChildren(nlist);
641 for( ICaseOptionList* opt : m_case_config_list ){
642 opt->_internalApi()->addInvalidChildren(nlist);
643 }
644}
645
646/*---------------------------------------------------------------------------*/
647/*---------------------------------------------------------------------------*/
648
650printChildren(const String& lang,int indent)
651{
652 for( ICaseOptions* co : m_case_options )
653 co->printChildren(lang,indent);
654 for( ICaseOptionList* opt : m_case_config_list )
655 opt->printChildren(lang,indent);
656}
657
658/*---------------------------------------------------------------------------*/
659/*---------------------------------------------------------------------------*/
660
663{
664 for( ICaseOptions* co : m_case_options )
665 co->deepGetChildren(col);
666 for( ICaseOptionList* opt : m_case_config_list )
667 opt->deepGetChildren(col);
668}
669
670/*---------------------------------------------------------------------------*/
671/*---------------------------------------------------------------------------*/
672
675{
676 for( ICaseOptions* co : m_case_options )
677 co->visit(visitor);
678 for( ICaseOptionList* opt_list : m_case_config_list )
679 opt_list->visit(visitor);
680}
681
682/*---------------------------------------------------------------------------*/
683/*---------------------------------------------------------------------------*/
684
685void CaseOptionListMulti::
686_checkMinMaxOccurs(Integer nb_occur)
687{
688 if (nb_occur<m_min_occurs){
690 CaseOptionError::addError(caseDocumentFragment(),A_FUNCINFO,node_name,
691 String::format("Bad number of occurences (less than min)"
692 " nb_occur={0}"
693 " min_occur={1}",
694 nb_occur,m_min_occurs),true);
695 }
696 if (m_max_occurs>=0)
697 if (nb_occur>m_max_occurs){
698 String node_name = m_parent_element.xpathFullName()+"/"+rootTagName();
699 CaseOptionError::addError(caseDocumentFragment(),A_FUNCINFO,node_name,
700 String::format("Bad number of occurences (greater than max)"
701 " nb_occur={0}"
702 " max_occur={1}",
703 nb_occur,m_max_occurs),true);
704 }
705}
706
707/*---------------------------------------------------------------------------*/
708/*---------------------------------------------------------------------------*/
709
710/*---------------------------------------------------------------------------*/
711/*---------------------------------------------------------------------------*/
712
713ICaseOptionList* ICaseOptionListInternal::
714create(ICaseMng* m,ICaseOptions* ref_opt,const XmlNode& parent_element)
715{
716 return new CaseOptionList(m,ref_opt,parent_element);
717}
718
719ICaseOptionList* ICaseOptionListInternal::
720create(ICaseOptionList* parent,ICaseOptions* ref_opt,const XmlNode& parent_element)
721{
722 return new CaseOptionList(parent,ref_opt,parent_element);
723}
724
725ICaseOptionList* ICaseOptionListInternal::
726create(ICaseOptionList* parent,ICaseOptions* ref_opt,const XmlNode& parent_element,
727 bool is_optional,bool is_multi)
728{
729 auto x = new CaseOptionList(parent,ref_opt,parent_element);
730 if (is_optional)
731 x->setOptional(true);
732 if (is_multi)
733 x->setIsMulti(true);
734 return x;
735}
736
737ICaseOptionList* ICaseOptionListInternal::
738create(ICaseOptionsMulti* com,ICaseOptions* co,ICaseMng* m,
739 const XmlNode& element,Integer min_occurs,Integer max_occurs)
740{
741 return new CaseOptionListMulti(com,co,m,element,min_occurs,max_occurs);
742}
743
744ICaseOptionList* ICaseOptionListInternal::
745create(ICaseOptionsMulti* com,ICaseOptions* co,
746 ICaseOptionList* parent,const XmlNode& element,
747 Integer min_occurs,Integer max_occurs)
748{
749 return new CaseOptionListMulti(com,co,parent,element,min_occurs,max_occurs);
750}
751
752/*---------------------------------------------------------------------------*/
753/*---------------------------------------------------------------------------*/
754
755} // End namespace Arcane
756
757namespace Arccore
758{
760}
761
762/*---------------------------------------------------------------------------*/
763/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ARCCORE_DEFINE_REFERENCE_COUNTED_CLASS(class_name)
Macro pour définir les méthodes et types une classe qui utilise un compteur de référence.
Classe de base d'une option du jeu de donnée.
static void addWarning(ICaseDocumentFragment *document, const TraceInfo &where, const String &node_name, const String &message, bool is_collective=false)
Erreur générique.
static void addError(ICaseDocumentFragment *document, const TraceInfo &where, const String &node_name, const String &message, bool is_collective=false)
Erreur générique.
Exception en rapport avec le jeu de données.
void readChildren(bool is_phase1) override
Lis les valeurs des options à partir des éléments du DOM.
void visit(ICaseDocumentVisitor *visitor) override
Applique le visiteur visitor.
void deepGetChildren(Array< CaseOptionBase * > &col) override
Ajoute à la liste col tous les options filles.
void addInvalidChildren(XmlNodeList &nlist) override
Ajoute les éléments fils ne correspondants par à de options dans nlist.
void printChildren(const String &lang, int indent) override
Affiche la liste des options filles dans le langage lang et leur valeur.
bool isOptional() const override
Indique si l'option est optionnelle.
XmlNode parentElement() const override
Retourne l'élément parent.
String xpathFullName() const override
Nom complet au format XPath correspondant à rootElement()
MeshHandle meshHandle() const override
Handle du maillage associé
XmlNode m_root_element
Elément racine pour cette liste d'options.
void removeChild(ICaseOptions *c) override
Supprime co de la liste des fils.
void visit(ICaseDocumentVisitor *visitor) override
Applique le visiteur visitor.
XmlNode m_parent_element
Elément parent.
void setRootElement(XmlNode root_element) override
Positionne l'élément racine de la liste. Si déjà positionné, lance une exception.
bool isOptional() const override
Indique si l'option est optionnelle.
void readChildren(bool is_phase1) override
Lis les valeurs des options à partir des éléments du DOM.
void addInvalidChildren(XmlNodeList &nlist) override
Ajoute les éléments fils ne correspondants par à de options dans nlist.
void deepGetChildren(Array< CaseOptionBase * > &col) override
Ajoute à la liste col tous les options filles.
CaseOptionBasePairList m_config_list
Liste des valeurs de configuration.
void addChild(ICaseOptions *c) override
Ajoute la liste co à la liste des fils.
bool isPresent() const override
Indique si l'option est présente dans le jeu de données.
XmlNode rootElement() const override
Retourne l'élément lié à cette liste d'option.
ICaseDocumentFragment * caseDocumentFragment() const override
Document associé.
virtual ICaseOptionListInternal * _internalApi() override
API interne à Arcane.
void printChildren(const String &lang, int indent) override
Affiche la liste des options filles dans le langage lang et leur valeur.
void setRootElementWithParent(XmlNode parent_element) override
Positionne l'élément racine de la liste, avec parent_element comme parent. Si déjà positionné,...
ICaseMng * caseMng() const override
Retourne le gestionnaire du cas.
void setIsMulti(bool v)
Indique si l'option peut-être présente plusieurs fois.
void addConfig(CaseOptionBase *cbi, XmlNode parent) override
Ajoute l'option o avec le parent parent.
void disable() override
Désactive l'option comme si elle était absente.
String rootTagName() const override
Retourne le nom de l'élément de cette liste.
virtual XmlNode rootElement()=0
Retourne l'élément racine.
Interface du visiteur pour une option du jeu de données.
Interface du gestionnaire de cas.
Definition ICaseMng.h:56
virtual XmlNode rootElement() const =0
Retourne l'élément lié à cette liste d'option.
virtual ICaseOptionListInternal * _internalApi()=0
API interne à Arcane.
virtual IServiceInfo * caseServiceInfo() const =0
Retourne le service associé ou nullptr s'il n'y en a pas.
virtual String rootTagName() const =0
Nom de l'élément dans le langage du jeu de données.
Interface des informations d'un service ou d'un module.
virtual String localName() const =0
Partie locale du nom du service.
Handle sur un maillage.
Definition MeshHandle.h:47
Vérifie la validité du contenu entre éléments.
void check(XmlNode element)
Vérifie la validité des éléments fils de element.
Liste de noeuds d'un arbre DOM.
Definition XmlNodeList.h:33
Noeud d'un arbre DOM.
Definition XmlNode.h:51
String xpathFullName() const
Nom XPath du noeud avec ces ancêtres.
Definition XmlNode.cc:143
eType type() const
Type du noeud.
Definition XmlNode.cc:123
iterator end()
Retourne un iterateur sur le premier élément après la fin du tableau.
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
Definition XmlNode.cc:64
String value() const
Valeur du noeud.
Definition XmlNode.cc:199
XmlNodeList children(const String &name) const
Ensemble des noeuds fils de ce noeud ayant pour nom name.
Definition XmlNode.cc:93
bool null() const
Vrai si le noeud est nul.
Definition XmlNode.h:294
@ TEXT
The node is a Text node.
Definition XmlNode.h:91
@ ELEMENT
The node is an Element.
Definition XmlNode.h:87
XmlNode parent() const
Parent de ce noeud (null si aucun)
Definition XmlNode.h:261
iterator begin()
Retourne un iterateur sur le premier élément du tableau.
Classe de base des vecteurs 1D de données.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Interface du gestionnaire de traces.
Implémentation thread-safe d'un compteur de référence.
Constructeur de chaîne de caractère unicode.
String toString() const
Retourne la chaîne de caractères construite.
StringBuilder & collapseWhiteSpace()
Effectue une normalisation des caractères espaces. Le comportement est identique à replaceWhiteSpace(...
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eCaseOptionReadPhase
Phases de la lecture.
Espace de nom de Arccore.
Definition ArcaneTypes.h:24