Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CaseOptionExtended.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/* CaseOptionExtended.cc (C) 2000-2023 */
9/* */
10/* Option du jeu de données de type 'Extended'. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/CaseOptionExtended.h"
15
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/FatalErrorException.h"
18
19#include "arcane/core/CaseOptionError.h"
20#include "arcane/core/ICaseDocumentVisitor.h"
21#include "arcane/core/XmlNodeList.h"
22#include "arcane/core/ICaseOptionList.h"
23#include "arcane/core/MeshHandle.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33/*!
34 * \brief Cherche la valeur de l'option dans le jeu de données.
35 *
36 * La valeur trouvée est stockée dans \a m_value.
37 *
38 * Si la valeur n'est pas présente dans le jeu de données, regarde s'il
39 * existe une valeur par défaut et utilise cette dernière.
40 */
42_search(bool is_phase1)
43{
44 XmlNodeList elem_list = rootElement().children(name());
45 ITraceMng* tm = traceMng();
46
47 Integer size = elem_list.size();
48 _checkMinMaxOccurs(size);
49 if (size==0)
50 return;
51
52 if (is_phase1){
53 _allocate(size);
54 m_values.resize(size);
55 }
56 else{
57 //cerr << "** MULTI SEARCH " << size << endl;
58 for( Integer i=0; i<size; ++i ){
59 XmlNode velem = elem_list[i];
60 // Si l'option n'est pas présente dans le jeu de donnée, on prend
61 // l'option par défaut.
62 String str_val = (velem.null()) ? _defaultValue() : velem.value();
63 if (str_val.null()) {
65 name(),rootElement());
66 continue;
67 }
68 tm->info(5) << "TryConvert opt=" << _xpathFullName() << " i=" << i
69 << " mesh_name=" << parentOptionList()->meshHandle().meshName()
70 << " value=" << str_val;
71 bool is_bad = _tryToConvert(str_val,i);
72 if (is_bad){
73 m_values[i] = String();
75 name(),rootElement(),str_val,_typeName());
76 continue;
77 }
78 m_values[i] = str_val;
79 //ptr_value[i] = val;
80 //cerr << "** FOUND " << val << endl;
81 }
82 }
83}
84
85/*---------------------------------------------------------------------------*/
86/*---------------------------------------------------------------------------*/
87
89print(const String& lang,std::ostream& o) const
90{
91 ARCANE_UNUSED(lang);
92 for( Integer i=0, s=_nbElem(); i<s; ++i )
93 o << m_values[i] << " ";
94}
95
96/*---------------------------------------------------------------------------*/
97/*---------------------------------------------------------------------------*/
98
100visit(ICaseDocumentVisitor* visitor) const
101{
102 visitor->applyVisitor(this);
103}
104
105/*---------------------------------------------------------------------------*/
106/*---------------------------------------------------------------------------*/
107
109setDefaultValue(const String& def_value)
110{
111 // Si on a une valeur donnée par l'utilisateur, on ne fait rien.
112 if (isPresent())
113 return;
114
115 // Valeur déjà initialisée. Dans ce cas on remplace aussi la valeur
116 // actuelle.
117 if (_isInitialized()){
118 bool is_bad = _tryToConvert(def_value);
119 if (is_bad){
120 m_value = String();
121 ARCANE_FATAL("Can not convert '{0}' to type '{1}' (option='{2}')",
122 def_value,_typeName(),xpathFullName());
123 }
124 m_value = def_value;
125 }
126
127 // La valeur par défaut n'a pas de langue associée.
128 _setDefaultValue(def_value);
129}
130
131/*---------------------------------------------------------------------------*/
132/*---------------------------------------------------------------------------*/
133/*!
134 * \brief Cherche la valeur de l'option dans le jeu de donnée.
135 *
136 * La valeur trouvée est stockée dans \a m_value.
137 *
138 * Si la valeur n'est pas présente dans le jeu de donnée, regarde s'il
139 * existe une valeur par défaut et utilise cette dernière.
140 */
142_search(bool is_phase1)
143{
144 CaseOptionSimple::_search(is_phase1);
145 if (is_phase1)
146 return;
147 ITraceMng* tm = traceMng();
148 // Si l'option n'est pas présente dans le jeu de donnée, on prend
149 // l'option par défaut.
150 String str_val = (_element().null()) ? _defaultValue() : _element().value();
151 bool has_valid_value = true;
152 if (str_val.null()) {
153 m_value = String();
154 if (!isOptional()){
156 name(),rootElement());
157 return;
158 }
159 else
160 has_valid_value = false;
161 }
162 _setHasValidValue(has_valid_value);
163 if (has_valid_value){
164 tm->info(5) << "TryConvert opt=" << xpathFullName()
165 << " mesh_name=" << parentOptionList()->meshHandle().meshName()
166 << " value=" << str_val;
167 bool is_bad = _tryToConvert(str_val);
168 if (is_bad){
169 m_value = String();
171 name(),rootElement(),str_val,_typeName());
172 return;
173 }
174 m_value = str_val;
175 }
176 _setIsInitialized();
177}
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
181
183print(const String& lang,std::ostream& o) const
184{
185 ARCANE_UNUSED(lang);
186 _checkIsInitialized();
187 if (hasValidValue())
188 o << m_value;
189 else
190 o << "undefined";
191}
192
193/*---------------------------------------------------------------------------*/
194/*---------------------------------------------------------------------------*/
195
197visit(ICaseDocumentVisitor* visitor) const
198{
199 visitor->applyVisitor(this);
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
205} // End namespace Arcane
206
207/*---------------------------------------------------------------------------*/
208/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
String name() const
Retourne le nom de l'option correspondant au langage du jeu de données.
String _defaultValue() const
Retourne la valeur par défaut de l'option ou 0 s'il n'y en a pas.
ICaseDocumentFragment * caseDocumentFragment() const
Retourne le document associé à cette option.
XmlNode rootElement() const
Retourne l'élément racine du DOM.
ITraceMng * traceMng() const
Gestionnaire de traces.
ICaseOptionList * parentOptionList() const
OptionList parent.
static void addInvalidTypeError(ICaseDocumentFragment *document, const TraceInfo &where, const String &node_name, const XmlNode &parent, const String &value, const String &expected_type)
Erreur lorsqu'une valeur d'une jeu de données n'est pas du bon type. Cette erreur est collective.
static void addOptionNotFoundError(ICaseDocumentFragment *document, const TraceInfo &where, const String &node_name, const XmlNode &parent)
Erreur lorsqu'une option du jeu de données n'est pas trouvée. Cette erreur est collective.
void _search(bool is_phase1) override
Cherche la valeur de l'option dans le jeu de donnée.
void setDefaultValue(const String &def_value)
Positionne la valeur par défaut de l'option.
void print(const String &lang, std::ostream &o) const override
Imprime la valeur de l'option dans le langage lang,sur le flot o.
void visit(ICaseDocumentVisitor *visitor) const override
Applique le visiteur sur cette option.
void print(const String &lang, std::ostream &o) const override
Imprime la valeur de l'option dans le langage lang,sur le flot o.
void _search(bool is_phase1) override
Cherche la valeur de l'option dans le jeu de données.
void visit(ICaseDocumentVisitor *visitor) const override
Applique le visiteur sur cette option.
String xpathFullName() const
Nom complet au format donné par la norme XPath.
bool hasValidValue() const
Indique si l'option a une valeur invalide.
bool isOptional() const
Indique si l'option est facultative.
bool isPresent() const
Retourne true si l'option est présente.
Interface du visiteur pour une option du jeu de données.
virtual MeshHandle meshHandle() const =0
Handle du maillage associé
Liste de noeuds d'un arbre DOM.
Definition XmlNodeList.h:33
Noeud d'un arbre DOM.
Definition XmlNode.h:51
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
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-