14#include "arcane/utils/TraceAccessor.h"
15#include "arcane/utils/FatalErrorException.h"
16#include "arcane/utils/Iterator.h"
17#include "arcane/utils/StringBuilder.h"
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"
31#include "arcane/IServiceInfo.h"
32#include "arcane/ICaseFunction.h"
63 : m_case_document(cd), m_space_string(
" ")
85 if (ns!=m_space_string)
87 String::format(
"Invalid text node between elements (value='{0}')",
110 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
115 :
public ICaseOptionListInternal
120 : m_opt_list(opt_list)
130 void setRootElementWithParent(
const XmlNode& parent_element)
override
134 void setRootElement(
const XmlNode& root_element)
override
138 void addInvalidChildren(
XmlNodeList& nlist)
override
150 typedef std::pair<CaseOptionBase*,XmlNode> CaseOptionBasePair;
151 typedef std::vector<CaseOptionBasePair> CaseOptionBasePairList;
156 m_is_optional(false), m_internal_api(this) {}
161 m_is_multi(false), m_is_optional(false), m_internal_api(this)
169 std::vector<ICaseOptions*> copy_list(m_case_options);
170 for( ICaseOptions* co : copy_list )
187 <<
" this=" <<
this <<
" n=" << m_case_options.size();
188 m_case_options.push_back(c);
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())
196 m_case_options.erase(i);
211 co->deepGetChildren(col);
217 void setOptional(
bool v) { m_is_optional = v; }
221 _setRootElement(
false,parent_element);
227 throw CaseOptionException(
"CaseOptionsList::setRootElement()",
"root_element already set",
true);
229 _setRootElement(
true,
XmlNode());
258 return m_ref_opt->caseDocumentFragment();
267 m_case_options.clear();
268 m_is_disabled =
true;
273 virtual ICaseOptionListInternal*
_internalApi()
override {
return &m_internal_api; }
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);
282 bool _isValidChildTagName(
const String& name);
291 std::vector<ICaseOptions*> m_case_options;
296 bool m_is_disabled =
false;
311 <<
" id=" <<
typeid(*this).name()
312 <<
" phase1?=" << is_phase1
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);
325 _setRootElement(
false,
XmlNode());
328 _searchChildren(is_phase1);
340 char str_indent[128];
341 _strIndent(str_indent,indent,127);
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() +
"\"";
352 info() << str_indent <<
"<" <<
rootTagName() << service_name << mesh_name <<
">";
354 _printOption(lang,indent,i->first,
info().file());
357 co->printChildren(lang,indent+1);
371 visitor->beginVisit(m_ref_opt);
373 i->first->visit(visitor);
378 visitor->endVisit(m_ref_opt);
398 co->addInvalidChildren(nlist);
405_searchChildren(
bool is_phase1)
411 i->first->search(is_phase1);
414 co->read(read_phase);
421_setRootElement(
bool force_init,XmlNode parent_element)
428 throw CaseOptionException(
"CaseOptionsList::_setRootElement()",
"root_element not set",
true);
432 if (!parent_element.null())
447 m_is_present =
false;
465_strIndent(
char* buf,
int indent,
int max_indent)
469 if (indent>max_indent)
472 for(
int i=0; i<indent; ++i )
481_printOption(
const String& lang,
int indent,CaseOptionBase* co,std::ostream& o)
483 std::ios_base::fmtflags f = o.flags(std::ios::left);
485 for(
int i=0; i<indent; ++i )
490 ICaseFunction* func = co->function();
492 o <<
" (fonction: " << func->name() <<
")";
501_isValidChildTagName(
const String& name)
503 for( ConstIterT<CaseOptionBasePairList> i(
m_config_list); i(); ++i ){
504 CaseOptionBase* co = i->first;
505 if (co->name()==name)
508 for( ICaseOptions* co : m_case_options ){
509 info(5) <<
" CHECK CHILDREN this=" <<
this <<
" instance=" << co <<
" tag=" << co->rootTagName();
510 if (co->rootTagName()==name)
520_addInvalidChildren(XmlNode parent,XmlNodeList& nlist)
522 for(
auto i = parent.begin(), end = parent.end(); i != end; ++i ){
525 const String& name = i->name();
526 bool is_valid = _isValidChildTagName(name);
527 info(5) <<
" CHECK Valid tag_name=" << name <<
" is_valid=" << is_valid;
549 typedef std::pair<CaseOptionBase*,XmlNode> CaseOptionBasePair;
550 typedef std::vector<CaseOptionBasePair> CaseOptionBasePairList;
555 const XmlNode& element,Integer min_occurs,Integer max_occurs)
557 m_min_occurs(min_occurs), m_max_occurs(max_occurs) {}
560 Integer min_occurs,Integer max_occurs)
562 m_min_occurs(min_occurs), m_max_occurs(max_occurs) {}
572 void _checkMinMaxOccurs(Integer nb_occur);
576 XmlNode _rootElement(Integer position)
const
578 return m_root_element_list[position];
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;
599 _setRootElement(
false,
XmlNode());
603 <<
" id=" <<
typeid(*this).name()
604 <<
" phase1?=" << is_phase1
610 m_case_config_list.clear();
611 Integer s = m_root_element_list.size();
612 _checkMinMaxOccurs(s);
614 m_case_option_multi->multiAllocate(m_root_element_list);
617 Integer nb_children = m_case_option_multi->nbChildren();
618 for( Integer i=0; i<nb_children; ++i ){
620 co_value->
_internalApi()->setRootElement(m_root_element_list[i]);
621 m_case_config_list.add(co_value);
625 opt->readChildren(is_phase1);
627 _searchChildren(is_phase1);
640 co->addInvalidChildren(nlist);
642 opt->_internalApi()->addInvalidChildren(nlist);
653 co->printChildren(lang,indent);
655 opt->printChildren(lang,indent);
665 co->deepGetChildren(col);
667 opt->deepGetChildren(col);
679 opt_list->visit(visitor);
685void CaseOptionListMulti::
686_checkMinMaxOccurs(Integer nb_occur)
688 if (nb_occur<m_min_occurs){
691 String::format(
"Bad number of occurences (less than min)"
694 nb_occur,m_min_occurs),
true);
697 if (nb_occur>m_max_occurs){
700 String::format(
"Bad number of occurences (greater than max)"
703 nb_occur,m_max_occurs),
true);
713ICaseOptionList* ICaseOptionListInternal::
714create(ICaseMng* m,ICaseOptions* ref_opt,
const XmlNode& parent_element)
716 return new CaseOptionList(m,ref_opt,parent_element);
719ICaseOptionList* ICaseOptionListInternal::
720create(ICaseOptionList* parent,ICaseOptions* ref_opt,
const XmlNode& parent_element)
722 return new CaseOptionList(parent,ref_opt,parent_element);
725ICaseOptionList* ICaseOptionListInternal::
726create(ICaseOptionList* parent,ICaseOptions* ref_opt,
const XmlNode& parent_element,
727 bool is_optional,
bool is_multi)
729 auto x =
new CaseOptionList(parent,ref_opt,parent_element);
731 x->setOptional(
true);
737ICaseOptionList* ICaseOptionListInternal::
738create(ICaseOptionsMulti* com,ICaseOptions* co,ICaseMng* m,
739 const XmlNode& element,Integer min_occurs,Integer max_occurs)
741 return new CaseOptionListMulti(com,co,m,element,min_occurs,max_occurs);
744ICaseOptionList* ICaseOptionListInternal::
745create(ICaseOptionsMulti* com,ICaseOptions* co,
746 ICaseOptionList* parent,
const XmlNode& element,
747 Integer min_occurs,Integer max_occurs)
749 return new CaseOptionListMulti(com,co,parent,element,min_occurs,max_occurs);
#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.
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.
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.
String xpathFullName() const
Nom XPath du noeud avec ces ancêtres.
eType type() const
Type du noeud.
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.
String value() const
Valeur du noeud.
XmlNodeList children(const String &name) const
Ensemble des noeuds fils de ce noeud ayant pour nom name.
bool null() const
Vrai si le noeud est nul.
@ TEXT
The node is a Text node.
@ ELEMENT
The node is an Element.
XmlNode parent() const
Parent de ce noeud (null si aucun)
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.
Classe d'accès aux traces.
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.