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"
59class XmlElementContentChecker
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
119 InternalApi(CaseOptionList* opt_list)
120 : m_opt_list(opt_list)
128 m_opt_list->addConfig(o,parent);
130 void setRootElementWithParent(
const XmlNode& parent_element)
override
132 m_opt_list->setRootElementWithParent(parent_element);
134 void setRootElement(
const XmlNode& root_element)
override
136 m_opt_list->setRootElement(root_element);
138 void addInvalidChildren(
XmlNodeList& nlist)
override
140 m_opt_list->addInvalidChildren(nlist);
145 CaseOptionList* m_opt_list;
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; }
224 _setRootElement(
false,parent_element);
230 throw CaseOptionException(
"CaseOptionsList::setRootElement()",
"root_element already set",
true);
232 _setRootElement(
true,
XmlNode());
261 return m_ref_opt->caseDocumentFragment();
268 info(5) <<
"INTERNAL REMOVE CHILDREN root=" <<
m_root_element.xpathFullName() <<
" this=" <<
this;
270 m_case_options.clear();
271 m_is_disabled =
true;
276 virtual ICaseOptionListInternal*
_internalApi()
override {
return &m_internal_api; }
281 void _searchChildren(
bool is_phase1);
282 void _setRootElement(
bool force_init,
XmlNode parent_element);
283 void _strIndent(
char* buf,
int indent,
int max_indent);
285 bool _isValidChildTagName(
const String& name);
294 std::vector<ICaseOptions*> m_case_options;
299 bool m_is_disabled =
false;
314 <<
" id=" <<
typeid(*this).name()
315 <<
" phase1?=" << is_phase1
321 if (all_children.size()>1){
324 String::format(
"Only one token of the element is allowed (nb_occur={0})",
325 all_children.size()),
true);
328 _setRootElement(
false,
XmlNode());
331 _searchChildren(is_phase1);
343 char str_indent[128];
344 _strIndent(str_indent,indent,127);
350 service_name =
" name=\""+ service->
localName() +
"\"";
351 String mesh_handle_name = m_ref_opt->meshHandle().meshName();
352 if (mesh_handle_name!=
"Mesh0")
353 mesh_name =
" mesh=\"" + m_ref_opt->meshHandle().meshName() +
"\"";
355 info() << str_indent <<
"<" <<
rootTagName() << service_name << mesh_name <<
">";
357 _printOption(lang,indent,i->first,
info().file());
360 co->printChildren(lang,indent+1);
374 visitor->beginVisit(m_ref_opt);
376 i->first->visit(visitor);
381 visitor->endVisit(m_ref_opt);
401 co->addInvalidChildren(nlist);
408_searchChildren(
bool is_phase1)
414 i->first->search(is_phase1);
417 co->read(read_phase);
424_setRootElement(
bool force_init,XmlNode parent_element)
431 throw CaseOptionException(
"CaseOptionsList::_setRootElement()",
"root_element not set",
true);
435 if (!parent_element.null())
450 m_is_present =
false;
468_strIndent(
char* buf,
int indent,
int max_indent)
472 if (indent>max_indent)
475 for(
int i=0; i<indent; ++i )
486 std::ios_base::fmtflags f = o.flags(std::ios::left);
488 for(
int i=0; i<indent; ++i )
493 ICaseFunction* func = co->function();
495 o <<
" (fonction: " << func->name() <<
")";
504_isValidChildTagName(
const String& name)
506 for( ConstIterT<CaseOptionBasePairList> i(
m_config_list); i(); ++i ){
507 CaseOptionBase* co = i->first;
508 if (co->name()==name)
511 for( ICaseOptions* co : m_case_options ){
512 info(5) <<
" CHECK CHILDREN this=" <<
this <<
" instance=" << co <<
" tag=" << co->rootTagName();
513 if (co->rootTagName()==name)
525 for(
auto i = parent.begin(), end = parent.end(); i != end; ++i ){
528 const String& name = i->name();
529 bool is_valid = _isValidChildTagName(name);
530 info(5) <<
" CHECK Valid tag_name=" << name <<
" is_valid=" << is_valid;
547class CaseOptionListMulti
548:
public CaseOptionList
552 typedef std::pair<CaseOptionBase*,XmlNode> CaseOptionBasePair;
553 typedef std::vector<CaseOptionBasePair> CaseOptionBasePairList;
559 : CaseOptionList(m,co,element), m_case_option_multi(com),
560 m_min_occurs(min_occurs), m_max_occurs(max_occurs) {}
564 : CaseOptionList(parent,co,element), m_case_option_multi(com),
565 m_min_occurs(min_occurs), m_max_occurs(max_occurs) {}
577 void _checkMinMaxOccurs(
Integer nb_occur);
583 return m_root_element_list[position];
588 ICaseOptionsMulti* m_case_option_multi;
589 UniqueArray<ICaseOptionList*> m_case_config_list;
590 XmlNodeList m_root_element_list;
604 _setRootElement(
false,
XmlNode());
608 <<
" id=" <<
typeid(*this).name()
609 <<
" phase1?=" << is_phase1
615 m_case_config_list.clear();
620 m_case_option_multi->multiAllocate(m_root_element_list);
623 Integer nb_children = m_case_option_multi->nbChildren();
624 for(
Integer i=0; i<nb_children; ++i ){
626 co_value->
_internalApi()->setRootElement(m_root_element_list[i]);
627 m_case_config_list.add(co_value);
631 opt->readChildren(is_phase1);
633 _searchChildren(is_phase1);
646 co->addInvalidChildren(nlist);
648 opt->_internalApi()->addInvalidChildren(nlist);
659 co->printChildren(lang,indent);
661 opt->printChildren(lang,indent);
671 co->deepGetChildren(col);
673 opt->deepGetChildren(col);
685 opt_list->visit(visitor);
691void CaseOptionListMulti::
692_checkMinMaxOccurs(
Integer nb_occur)
694 if (nb_occur<m_min_occurs){
697 String::format(
"Bad number of occurences (less than min)"
700 nb_occur,m_min_occurs),
true);
703 if (nb_occur>m_max_occurs){
706 String::format(
"Bad number of occurences (greater than max)"
709 nb_occur,m_max_occurs),
true);
733 bool is_optional,
bool is_multi)
737 x->setOptional(
true);
#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 des vecteurs 1D de données.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
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.
Integer minOccurs() const override
Nombre minimum d'occurences.
void visit(ICaseDocumentVisitor *visitor) override
Applique le visiteur visitor.
Integer maxOccurs() const override
Nombre maximum d'occurences.
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.
Integer minOccurs() const override
Nombre minimum d'occurences.
Integer maxOccurs() const override
Nombre maximum d'occurences.
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 ICaseOptionListInternal * _internalApi()=0
API interne à Arcane.
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.
Interface du gestionnaire de traces.
Implémentation thread-safe d'un compteur de référence.
Constructeur de chaîne de caractère unicode.
StringBuilder & collapseWhiteSpace()
Effectue une normalisation des caractères espaces. Le comportement est identique à replaceWhiteSpace(...
String toString() const
Retourne la chaîne de caractères construite.
Chaîne de caractères unicode.
Classe d'accès aux traces.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
ITraceMng * traceMng() const
Gestionnaire de trace.
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.
XmlNodeConstIterator const_iterator
Type de l'itérateur constant sur un élément du tableau.
String value() const
Valeur du noeud.
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.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eCaseOptionReadPhase
Phases de la lecture.
Int32 Integer
Type représentant un entier.
Espace de nom de Arccore.