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);
95 return m_impl->meshName();
113 return m_impl->meshName();
122CaseOptionServiceImpl::
126, m_default_value(
cob.defaultValue())
127, m_element(
cob.element())
130, m_is_override_default(
false)
138void CaseOptionServiceImpl::
139print(
const String& lang,std::ostream& o)
const
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()){
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);
265void CaseOptionServiceImpl::
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)
301CaseOptionMultiServiceImpl::
305, m_default_value(
cob.defaultValue())
314CaseOptionMultiServiceImpl::
315~CaseOptionMultiServiceImpl()
325 m_container = container;
336 visitor->beginVisit(
this,index);
346void CaseOptionMultiServiceImpl::
350 ARCANE_FATAL(
"null 'm_container'. did you called setContainer() method ?");
371 for( Integer index=0; index<size; ++index ){
376 tm->
info(5) <<
"CaseOptionMultiServiceImpl name=" <<
name()
377 <<
" index=" << index
379 <<
" default_value='" << _defaultValue() <<
"'"
380 <<
" mesh=" << meshHandle().meshName();
388 coptions->configList()->_internalApi()->setRootElement(element);
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})",
406 if (m_notify_functor)
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Tableau d'items de types quelconques.
Informations pour construire une option de jeu de données.
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.
XmlNode m_element
Element de l'option.
StringDictionary m_default_values
Liste des valeurs par défaut par catégorie.
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é.
Classe de base d'un tableau d'options complexes du jeu de données.
Classe de base d'une liste d'options du jeu de données.
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 d'une partie d'un jeu de données.
Interface du visiteur pour une option du jeu de données.
virtual IApplication * application()=0
Application associée.
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.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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.
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.
TraceMessage info() const
Flot pour un message d'information.
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.