14#include "arcane/core/CaseOptionService.h"
16#include "arcane/utils/Collection.h"
17#include "arcane/utils/Enumerator.h"
18#include "arcane/utils/NotImplementedException.h"
19#include "arcane/utils/FatalErrorException.h"
21#include "arcane/core/IApplication.h"
22#include "arcane/core/IServiceFactory.h"
23#include "arcane/core/CaseOptionBuildInfo.h"
24#include "arcane/core/CaseOptionException.h"
25#include "arcane/core/CaseOptionError.h"
26#include "arcane/core/XmlNodeList.h"
27#include "arcane/core/ICaseDocumentVisitor.h"
28#include "arcane/core/ICaseDocument.h"
29#include "arcane/core/ICaseMng.h"
30#include "arcane/core/internal/ICaseOptionListInternal.h"
43_getAvailableServiceNames(ICaseOptionServiceContainer* container,IApplication* app,
46 for( ServiceFactory2Collection::Enumerator i(app->serviceFactories2()); ++i; ){
47 Internal::IServiceFactory2* sf2 = *i;
48 IServiceInfo* si = sf2->serviceInfo();
52 if (container->hasInterfaceImplemented(sf2)){
53 names.add(sf2->serviceInfo()->localName());
59_tryCreateService(ICaseOptionServiceContainer* container,IApplication* app,
60 const String& service_name,Integer index,ICaseOptions* opt)
64 bool is_found =
false;
65 ServiceBuildInfoBase sbi(_arcaneDeprecatedGetSubDomain(opt),opt);
66 for( ServiceFactory2Collection::Enumerator i(app->serviceFactories2()); ++i; ){
67 Internal::IServiceFactory2* sf2 = *i;
68 IServiceInfo* si = sf2->serviceInfo();
69 if (si->localName()==service_name && container->tryCreateService(index,sf2,sbi)){
70 opt->setCaseServiceInfo(si);
86 m_impl->setMeshName(mesh_name);
95 return m_impl->meshName();
104 m_impl->setMeshName(mesh_name);
113 return m_impl->meshName();
122CaseOptionServiceImpl::
126, m_default_value(cob.defaultValue())
127, m_element(cob.element())
128, m_allow_null(allow_null)
129, m_is_optional(is_optional)
130, m_is_override_default(false)
131, m_container(nullptr)
138void CaseOptionServiceImpl::
139print(
const String& lang,std::ostream& o)
const
151 visitor->beginVisit(
this);
153 visitor->endVisit(
this);
162 m_container = container;
168void CaseOptionServiceImpl::
172 ARCANE_FATAL(
"null 'm_container'. did you called setContainer() method ?");
176 _setTranslatedName();
182 col->
_internalApi()->setRootElementWithParent(m_element);
190 String mesh_name = meshName();
194 <<
" is_optional=" << isOptional()
195 <<
" allow_null=" << m_allow_null
196 <<
" mesh-name=" << mesh_name
203 ICaseDocumentFragment* doc = caseDocumentFragment();
205 String str_val = element.attrValue(
"name");
213 if (!m_is_override_default){
214 String category = doc->defaultCategory();
215 if (!category.null()){
216 String v = m_default_values.
find(category);
222 str_val = m_default_value;
224 if (str_val.null() && !isOptional()){
228 m_service_name = str_val;
232 bool need_create = col->
isPresent() || !isOptional();
236 bool is_found = _tryCreateService(m_container,caseMng()->application(),str_val,0,
this);
238 if (!is_found && !m_allow_null){
245 String::format(
"Unable to find a service named '{0}' (valid values:{1})",
246 str_val,valid_names),
true);
257 if (read_phase==eCaseOptionReadPhase::Phase1)
259 CaseOptions::read(read_phase);
265void CaseOptionServiceImpl::
266setDefaultValue(
const String& def_value)
268 if (!m_service_name.
null()){
270 ARCANE_FATAL(
"Can not set default service name because service is already allocated (option='{0}')",
273 m_default_value = def_value;
274 m_is_override_default =
true;
280void CaseOptionServiceImpl::
281addDefaultValue(
const String& category,
const String& value)
283 m_default_values.
add(category,value);
292 _getAvailableServiceNames(m_container,caseMng()->application(),names);
301CaseOptionMultiServiceImpl::
303:
CaseOptionsMulti(cob.caseOptionList(),cob.name(),cob.element(),cob.minOccurs(),cob.maxOccurs())
304, m_allow_null(allow_null)
305, m_default_value(cob.defaultValue())
306, m_notify_functor(nullptr)
307, m_container(nullptr)
314CaseOptionMultiServiceImpl::
315~CaseOptionMultiServiceImpl()
325 m_container = container;
336 visitor->beginVisit(
this,index);
338 visitor->endVisit(
this,index);
346void CaseOptionMultiServiceImpl::
350 ARCANE_FATAL(
"null 'm_container'. did you called setContainer() method ?");
352 Integer size = elem_list.size();
367 String mesh_name = meshName();
371 for( Integer index=0; index<size; ++index ){
372 XmlNode element = elem_list[index];
376 tm->
info(5) <<
"CaseOptionMultiServiceImpl name=" <<
name()
377 <<
" index=" << index
379 <<
" default_value='" << _defaultValue() <<
"'"
380 <<
" mesh=" << meshHandle().meshName();
383 str_val = _defaultValue();
388 coptions->configList()->
_internalApi()->setRootElement(element);
389 bool is_found = _tryCreateService(m_container,app,str_val,index,coptions);
392 tm->
info(5) <<
"CaseOptionMultiServiceImpl name=" <<
name()
393 <<
" index=" << index
394 <<
" service not found";
401 String::format(
"Unable to find a service named '{0}' (valid values:{1})",
402 str_val,valid_names),
true);
406 if (m_notify_functor)
416 _getAvailableServiceNames(m_container,caseMng()->application(),names);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
static void addError(ICaseDocumentFragment *document, const TraceInfo &where, const String &node_name, const String &message, bool is_collective=false)
Erreur générique.
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.
Exception en rapport avec le jeu de données.
UniqueArray< String > m_services_name
Noms du service pour chaque occurence.
void setContainer(ICaseOptionServiceContainer *container)
Positionne le conteneur d'instances.
UniqueArray< ReferenceCounter< ICaseOptions > > m_allocated_options
Liste des options allouées qu'il faudra supprimer.
void visit(ICaseDocumentVisitor *visitor) const override
Applique le visiteur sur cette option.
void getAvailableNames(StringArray &names) const
Retourne dans names les noms d'implémentations valides pour ce service.
String meshName() const
Nom du maillage auquel le service est associé.
void setMeshName(const String &mesh_name)
Positionne le nom du maillage auquel le service sera associé.
void setContainer(ICaseOptionServiceContainer *container)
Positionne le conteneur d'instances.
void read(eCaseOptionReadPhase phase) override
Effectue la lecture de la phase read_phase des options.
void visit(ICaseDocumentVisitor *visitor) const override
Applique le visiteur sur cette option.
virtual void getAvailableNames(StringArray &names) const
Retourne dans names les noms d'implémentations valides pour ce service.
void setMeshName(const String &mesh_name)
Positionne le nom du maillage auquel le service sera associé.
String meshName() const
Nom du maillage auquel le service est associé.
bool _setMeshHandleAndCheckDisabled(const String &mesh_name)
Positionne le maillage associé à cette option.
void visit(ICaseDocumentVisitor *visitor) const override
Applique le visiteur sur cette option.
String rootTagName() const override
Retourne le nom de l'élément dans le langage du jeu de données.
virtual String name() const
Retourne le nom de l'élément dans le langage du jeu de données.
Interface de l'application.
Interface du visiteur pour une option du jeu de données.
virtual IApplication * application()=0
Application associée.
virtual XmlNode rootElement() const =0
Retourne l'élément lié à cette liste d'option.
virtual XmlNode parentElement() const =0
Retourne l'élément parent.
virtual bool isPresent() const =0
Indique si l'option est présente dans le jeu de données.
virtual ICaseOptionListInternal * _internalApi()=0
API interne à Arcane.
Interface d'un conteneur d'instances de service.
virtual void allocate(Integer size)=0
Alloue un tableau pour size éléments.
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.
Liste de noeuds d'un arbre DOM.
String xpathFullName() const
Nom XPath du noeud avec ces ancêtres.
String attrValue(const String &name, bool throw_exception=false) const
Valeur de l'attribut name.
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
bool null() const
Vrai si le noeud est nul.
String name() const
Nom du noeud.
Classe de base des vecteurs 1D de données.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
virtual void executeFunctor()=0
Exécute la méthode associé
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.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< String > StringArray
Tableau dynamique à une dimension de chaînes de caractères.
eCaseOptionReadPhase
Phases de la lecture.
@ ST_CaseOption
Le service s'utilise au niveau du jeu de données.
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.