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(
" ")
82 sb.collapseWhiteSpace();
85 if (ns!=m_space_string)
87 String::format(
"Invalid text node between elements (value='{0}')",
110 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
150 typedef std::pair<CaseOptionBase*,XmlNode> CaseOptionBasePair;
151 typedef std::vector<CaseOptionBasePair> CaseOptionBasePairList;
156 m_is_optional(
false), m_internal_api(this) {}
157 CaseOptionList(ICaseOptionList* parent,ICaseOptions* ref_opt,XmlNode parent_element)
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 )
186 info(5) <<
" ADD_CHILD " <<
c->rootTagName() <<
" instance=" <<
c
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; }
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;
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()
321 String::format(
"Only one token of the element is allowed (nb_occur={0})",
325 _setRootElement(
false,
XmlNode());
350 mesh_name =
" mesh=\"" + m_ref_opt->meshHandle().meshName() +
"\"";
354 _printOption(
lang,indent,i->first,
info().file());
357 co->printChildren(
lang,indent+1);
371 visitor->beginVisit(m_ref_opt);
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;
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()
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();
620 co_value->_internalApi()->setRootElement(m_root_element_list[i]);
642 opt->_internalApi()->addInvalidChildren(
nlist);
653 co->printChildren(
lang,indent);
655 opt->printChildren(
lang,indent);
665 co->deepGetChildren(
col);
667 opt->deepGetChildren(
col);
685void CaseOptionListMulti::
691 String::format(
"Bad number of occurences (less than min)"
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.
Liste d'options du jeu de données contenant plusieurs fils identiques.
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.
void setRootElement(const XmlNode &root_element) override
Positionne l'élément racine de la liste. Si déjà positionné, lance une exception.
void addInvalidChildren(XmlNodeList &nlist) override
Ajoute les éléments fils ne correspondants par à de options dans nlist.
void setRootElementWithParent(const XmlNode &parent_element) override
Positionne l'élément racine de la liste, avec parent_element comme parent. Si déjà positionné,...
Liste d'options de configuration d'un service ou module.
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.
Interface d'une partie d'un jeu de données.
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.
API Interne de l'interface d'une liste d'options du jeu de données.
Interface d'une liste d'options du jeu de données.
virtual XmlNode rootElement() const =0
Retourne l'élément lié à cette liste d'option.
Interface d'une liste d'options présente plusieurs fois.
Interface d'une liste d'options du jeu de données.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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.
interval d'itérateurs constant
Interface du gestionnaire de traces.
Implémentation thread-safe d'un compteur de référence.
Constructeur de chaîne de caractère unicode.
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.