Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CaseOptionBase.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/* CaseOptionBase.cc (C) 2000-2023 */
9/* */
10/* Gestion des options du jeu de données. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/CaseOptionBase.h"
15
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/StringBuilder.h"
18
19#include "arcane/core/CaseOptionBuildInfo.h"
20#include "arcane/core/StringDictionary.h"
21#include "arcane/core/CaseOptions.h"
22#include "arcane/core/ICaseMng.h"
23#include "arcane/core/ICaseDocument.h"
24#include "arcane/core/CaseOptionException.h"
25#include "arcane/core/internal/ICaseOptionListInternal.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35/*!
36 * \internal
37 *\brief Implémentation de la classe de base d'une option du jeu de données.
38 */
40{
41 public:
42
43 explicit CaseOptionBasePrivate(const CaseOptionBuildInfo& cob);
44
45 public:
46
47 ICaseMng* m_case_mng = nullptr; //!< Gestionnaire du sous-domaine
48 ICaseOptionList* m_parent_option_list = nullptr; //!< Parent
49 ICaseDocumentFragment* m_case_document_fragment = nullptr; //!< Document associé
50 XmlNode m_root_element; //!< Elément du DOM de l'option
51 String m_true_name; //!< Nom de l'option
52 String m_name; //!< Nom traduit de l'option
53 const String m_axl_default_value; //!< Valeur par défaut initiale
54 String m_default_value; //!< Valeur par défaut
55 Integer m_min_occurs; //!< Nombre minimum d'occurences
56 Integer m_max_occurs; //!< Nombre maximum d'occurences (-1 == unbounded)
57 bool m_is_initialized; //!< \a true si initialisé
58 bool m_is_override_default; //!< \a true si la valeur par défaut est surchargée
59 //! Liste des noms d'options par langue.
61 //! Liste des valeurs par défaut par catégorie.
63};
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
68CaseOptionBasePrivate::
69CaseOptionBasePrivate(const CaseOptionBuildInfo& cob)
70: m_case_mng(cob.caseMng())
71, m_parent_option_list(cob.caseOptionList())
72, m_case_document_fragment(m_parent_option_list->caseDocumentFragment())
73, m_root_element()
74, m_true_name(cob.name())
75, m_name(m_true_name)
76, m_axl_default_value(cob.defaultValue())
77, m_default_value(m_axl_default_value)
78, m_min_occurs(cob.minOccurs())
79, m_max_occurs(cob.maxOccurs())
80, m_is_initialized(false)
81, m_is_override_default(false)
82{
83}
84
85/*---------------------------------------------------------------------------*/
86/*---------------------------------------------------------------------------*/
87
88/*---------------------------------------------------------------------------*/
89/*---------------------------------------------------------------------------*/
90
91CaseOptionBase::
92CaseOptionBase(const CaseOptionBuildInfo& cob)
93: m_p(new CaseOptionBasePrivate(cob))
94{
95 cob.caseOptionList()->_internalApi()->addConfig(this,cob.element());
96}
97
98/*---------------------------------------------------------------------------*/
99/*---------------------------------------------------------------------------*/
100
101CaseOptionBase::
102~CaseOptionBase()
103{
104 delete m_p;
105}
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109
111caseMng() const
112{
113 return m_p->m_case_mng;
114}
115
116/*---------------------------------------------------------------------------*/
117/*---------------------------------------------------------------------------*/
118
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
129traceMng() const
130{
131 return m_p->m_case_mng->traceMng();
132}
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
136
138subDomain() const
139{
140 return m_p->m_case_mng->subDomain();
141}
142
143/*---------------------------------------------------------------------------*/
144/*---------------------------------------------------------------------------*/
145
147caseDocument() const
148{
149 return caseMng()->caseDocument();
150}
151
152/*---------------------------------------------------------------------------*/
153/*---------------------------------------------------------------------------*/
154
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
165_defaultValue() const
166{
167 return m_p->m_default_value;
168}
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
172
173void CaseOptionBase::
174_setDefaultValue(const String& def_value)
175{
176 m_p->m_default_value = def_value;
177 m_p->m_is_override_default = true;
178}
179
180/*---------------------------------------------------------------------------*/
181/*---------------------------------------------------------------------------*/
182
184search(bool is_phase1)
185{
186 _setCategoryDefaultValue();
187 _setTranslatedName();
188 _search(is_phase1);
189}
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
193
195trueName() const
196{
197 return m_p->m_true_name;
198}
199
200/*---------------------------------------------------------------------------*/
201/*---------------------------------------------------------------------------*/
202
204name() const
205{
206 return m_p->m_name;
207}
208
209/*---------------------------------------------------------------------------*/
210/*---------------------------------------------------------------------------*/
211
213minOccurs() const
214{
215 return m_p->m_min_occurs;
216}
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
220
222maxOccurs() const
223{
224 return m_p->m_max_occurs;
225}
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229
230void CaseOptionBase::
231_setTranslatedName()
232{
234 if (lang.null())
235 m_p->m_name = m_p->m_true_name;
236 else{
237 String tr = m_p->m_name_translations.find(lang);
238 if (!tr.null()){
239 //cerr << "** TRANSLATION FOR " << m_p->m_true_name << " is " << tr << " in " << lang << '\n';
240 m_p->m_name = tr;
241 }
242 }
243}
244
245/*---------------------------------------------------------------------------*/
246/*---------------------------------------------------------------------------*/
247
248void CaseOptionBase::
249_setCategoryDefaultValue()
250{
251 // Si le développeur a surchargé l'option, ne fait rien
252 if (m_p->m_is_override_default)
253 return;
254 String category = caseDocumentFragment()->defaultCategory();
255 if (category.null())
257 else{
258 String v = m_p->m_default_values.find(category);
259 if (!v.null()){
260 m_p->m_default_value = v;
261 }
262 }
263}
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
267
269translatedName(const String& lang) const
270{
271 if (!lang.null()){
272 String tr = m_p->m_name_translations.find(lang);
273 if (!tr.null())
274 return tr;
275 }
276 return m_p->m_name;
277}
278
279/*---------------------------------------------------------------------------*/
280/*---------------------------------------------------------------------------*/
281
283setRootElement(const XmlNode& root_element)
284{
285 m_p->m_root_element = root_element;
286}
287
288/*---------------------------------------------------------------------------*/
289/*---------------------------------------------------------------------------*/
290
292rootElement() const
293{
294 return m_p->m_root_element;
295}
296
297/*---------------------------------------------------------------------------*/
298/*---------------------------------------------------------------------------*/
299
301addAlternativeNodeName(const String& lang,const String& name)
302{
303 m_p->m_name_translations.add(lang,name);
304}
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308
310addDefaultValue(const String& category,const String& value)
311{
312 m_p->m_default_values.add(category,value);
313}
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318void CaseOptionBase::
319_setIsInitialized()
320{
321 m_p->m_is_initialized = true;
322}
323
324/*---------------------------------------------------------------------------*/
325/*---------------------------------------------------------------------------*/
326
327bool CaseOptionBase::
328_isInitialized() const
329{
330 return m_p->m_is_initialized;
331}
332
333/*---------------------------------------------------------------------------*/
334/*---------------------------------------------------------------------------*/
335
336void CaseOptionBase::
337_checkIsInitialized() const
338{
339 if (!_isInitialized()){
340 ARCANE_THROW(CaseOptionException,"option non initialisée '{0}'",name());
341 }
342}
343
344/*---------------------------------------------------------------------------*/
345/*---------------------------------------------------------------------------*/
346
347void CaseOptionBase::
348_checkMinMaxOccurs(Integer nb_occur)
349{
350 Integer min_occurs = m_p->m_min_occurs;
351 Integer max_occurs = m_p->m_max_occurs;
352
353 if (nb_occur<min_occurs){
354 StringBuilder msg = "Bad number of occurences (less than min)";
355 msg += " nb_occur=";
356 msg += nb_occur;
357 msg += " min_occur=";
358 msg += min_occurs;
359 msg += " option=";
360 msg += m_p->m_root_element.xpathFullName();
361 msg += "/";
362 msg += name();
363 throw CaseOptionException(A_FUNCINFO,msg.toString(),true);
364 }
365 if (max_occurs>=0)
366 if (nb_occur>max_occurs){
367 StringBuilder msg = "Bad number of occurences (greater than max)";
368 msg += " nb_occur=";
369 msg += nb_occur;
370 msg += " max_occur=";
371 msg += max_occurs;
372 msg += " option=";
373 msg += m_p->m_root_element.xpathFullName();
374 msg += "/";
375 msg += name();
376 throw CaseOptionException(A_FUNCINFO,msg.toString(),true);
377 }
378}
379
380/*---------------------------------------------------------------------------*/
381/*---------------------------------------------------------------------------*/
382
383String CaseOptionBase::
384_xpathFullName() const
385{
386 return m_p->m_root_element.xpathFullName();
387}
388
389/*---------------------------------------------------------------------------*/
390/*---------------------------------------------------------------------------*/
391
392}
393
394/*---------------------------------------------------------------------------*/
395/*---------------------------------------------------------------------------*/
396
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
const String m_axl_default_value
Valeur par défaut initiale.
Integer m_min_occurs
Nombre minimum d'occurences.
String m_name
Nom traduit de l'option.
ICaseMng * m_case_mng
Gestionnaire du sous-domaine.
XmlNode m_root_element
Elément du DOM de l'option.
Integer m_max_occurs
Nombre maximum d'occurences (-1 == unbounded)
StringDictionary m_default_values
Liste des valeurs par défaut par catégorie.
bool m_is_initialized
true si initialisé
ICaseDocumentFragment * m_case_document_fragment
Document associé
String m_default_value
Valeur par défaut.
StringDictionary m_name_translations
Liste des noms d'options par langue.
ICaseOptionList * m_parent_option_list
Parent.
String m_true_name
Nom de l'option.
String name() const
Retourne le nom de l'option correspondant au langage du jeu de données.
String translatedName(const String &lang) const
Nom dans la langue lang de l'option. Retourne name() si pas de traduction.
void addDefaultValue(const String &category, const String &value)
Ajoute la valeur par défaut value à la catégorie category.
String _defaultValue() const
Retourne la valeur par défaut de l'option ou 0 s'il n'y en a pas.
ICaseDocument * caseDocument() const
Retourne le gestionnaire de document.
void search(bool is_phase1)
Récupère la valeur du fichier de configuration pour la variable.
ICaseMng * caseMng() const
Gestionnaire de cas.
ICaseDocumentFragment * caseDocumentFragment() const
Retourne le document associé à cette option.
void addAlternativeNodeName(const String &lang, const String &name)
Ajoute une traduction pour le nom de l'option.
void setRootElement(const XmlNode &root_element)
Positionne l'élément racine à root_element.
Integer maxOccurs() const
Nombre maximum d'occurences (pour une option multiple) (-1 == unbounded)
XmlNode rootElement() const
Retourne l'élément racine du DOM.
ITraceMng * traceMng() const
Gestionnaire de traces.
ISubDomain * subDomain() const
Gestionnaire de sous-domaine.
String trueName() const
Retourne le vrai nom (non traduit) de l'option.
ICaseOptionList * parentOptionList() const
OptionList parent.
Integer minOccurs() const
Nombre minimum d'occurences (pour une option multiple)
virtual String defaultCategory() const =0
Catégorie utilisée pour les valeurs par défaut.
virtual String language() const =0
Langage utilisé dans le jeu de données.
Interface du gestionnaire de cas.
Definition ICaseMng.h:56
virtual ITraceMng * traceMng()=0
Gestionnaire de traces.
virtual ISubDomain * subDomain()=0
Gestionnaire de sous-domaine.
virtual ICaseDocument * caseDocument()=0
Document XML du jeu de données (peut être nul si pas de jeu de donneés)
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
void add(const String &key, const String &value)
Ajoute le couple (key,value) au dictionnaire.
String find(const String &key, bool throw_exception=false) const
Retourne la valeur associée à key.
Noeud d'un arbre DOM.
Definition XmlNode.h:51
String xpathFullName() const
Nom XPath du noeud avec ces ancêtres.
Definition XmlNode.cc:143
Interface du gestionnaire de traces.
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 -*-
Int32 Integer
Type représentant un entier.