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"
20#include "arcane/utils/StringBuilder.h"
21#include "arcane/utils/internal/ParameterCaseOption.h"
23#include "arcane/core/IApplication.h"
24#include "arcane/core/IServiceFactory.h"
25#include "arcane/core/CaseOptionBuildInfo.h"
26#include "arcane/core/CaseOptionException.h"
27#include "arcane/core/CaseOptionError.h"
28#include "arcane/core/XmlNodeList.h"
29#include "arcane/core/ICaseDocumentVisitor.h"
30#include "arcane/core/ICaseDocument.h"
31#include "arcane/core/ICaseMng.h"
32#include "arcane/core/internal/ICaseOptionListInternal.h"
33#include "arcane/core/internal/StringVariableReplace.h"
34#include "arcane/core/internal/ICaseMngInternal.h"
56 if (container->hasInterfaceImplemented(sf2)){
57 names.add(sf2->serviceInfo()->localName());
68 bool is_found =
false;
73 if (si->localName()==service_name && container->tryCreateService(index,sf2,sbi)){
74 opt->setCaseServiceInfo(si);
90 m_impl->setMeshName(mesh_name);
99 return m_impl->meshName();
108 m_impl->setMeshName(mesh_name);
117 return m_impl->meshName();
126CaseOptionServiceImpl::
130, m_default_value(cob.defaultValue())
131, m_element(cob.element())
132, m_allow_null(allow_null)
133, m_is_optional(is_optional)
134, m_is_override_default(false)
135, m_container(nullptr)
142void CaseOptionServiceImpl::
143print(
const String& lang,std::ostream& o)
const
155 visitor->beginVisit(
this);
157 visitor->endVisit(
this);
166 m_container = container;
172void CaseOptionServiceImpl::
176 ARCANE_FATAL(
"null 'm_container'. did you called setContainer() method ?");
180 _setTranslatedName();
194 const ParameterListWithCaseOption& params = caseMng()->_internalImpl()->parameters();
195 ICaseDocumentFragment* doc = caseDocumentFragment();
197 const ParameterCaseOption pco{ params.getParameterCaseOption(doc->language()) };
201 String reference_input = pco.getParameterOrNull(element.xpathFullName(),
"@mesh-name", 1);
202 if (!reference_input.null())
203 mesh_name = reference_input;
205 mesh_name = element.attrValue(
"mesh-name");
208 if (mesh_name.null()) {
209 mesh_name = meshName();
213 mesh_name = StringVariableReplace::replaceWithCmdLineArgs(params, mesh_name,
true);
219 <<
" is_optional=" << isOptional()
220 <<
" allow_null=" << m_allow_null
221 <<
" mesh-name=" << mesh_name
230 String reference_input = pco.getParameterOrNull(element.xpathFullName(),
"@name", 1);
231 if (!reference_input.null())
232 str_val = reference_input;
234 str_val = element.attrValue(
"name");
244 if (!m_is_override_default){
245 String category = doc->defaultCategory();
246 if (!category.null()){
253 str_val = m_default_value;
257 str_val = StringVariableReplace::replaceWithCmdLineArgs(params, str_val,
true);
259 if (str_val.null() && !isOptional()){
263 m_service_name = str_val;
267 bool need_create = col->
isPresent() || !isOptional();
270 m_container->allocate(1);
271 bool is_found = _tryCreateService(m_container,caseMng()->application(),str_val,0,
this);
273 if (!is_found && !m_allow_null){
280 String::format(
"Unable to find a service named '{0}' (valid values:{1})",
281 str_val,valid_names),
true);
292 if (read_phase==eCaseOptionReadPhase::Phase1)
294 CaseOptions::read(read_phase);
300void CaseOptionServiceImpl::
301setDefaultValue(
const String& def_value)
303 if (!m_service_name.
null()){
305 ARCANE_FATAL(
"Can not set default service name because service is already allocated (option='{0}')",
308 m_default_value = def_value;
309 m_is_override_default =
true;
315void CaseOptionServiceImpl::
316addDefaultValue(
const String& category,
const String& value)
327 _getAvailableServiceNames(m_container,caseMng()->application(),names);
336CaseOptionMultiServiceImpl::
338:
CaseOptionsMulti(cob.caseOptionList(),cob.name(),cob.element(),cob.minOccurs(),cob.maxOccurs())
339, m_allow_null(allow_null)
340, m_default_value(cob.defaultValue())
341, m_notify_functor(nullptr)
342, m_container(nullptr)
349CaseOptionMultiServiceImpl::
350~CaseOptionMultiServiceImpl()
360 m_container = container;
371 visitor->beginVisit(
this,index);
373 visitor->endVisit(
this,index);
381void CaseOptionMultiServiceImpl::
385 ARCANE_FATAL(
"null 'm_container'. did you called setContainer() method ?");
392 String full_xpath = String::format(
"{0}/{1}", parent_element.xpathFullName(),
name());
394 UniqueArray<Integer> option_in_param;
395 pco.indexesInParam(full_xpath, option_in_param,
true);
397 Integer size = elem_list.size();
399 bool is_optional = configList()->
isOptional();
401 if (size == 0 && option_in_param.empty() && is_optional) {
405 Integer min_occurs = configList()->minOccurs();
406 Integer max_occurs = configList()->maxOccurs();
411 if (!option_in_param.empty()) {
412 max_in_param = option_in_param[0];
413 for (
Integer index : option_in_param) {
414 if (index > max_in_param)
415 max_in_param = index;
417 if (max_occurs >= 0) {
418 if (max_in_param > max_occurs) {
419 StringBuilder msg =
"Bad number of occurences in command line (greater than max)";
420 msg +=
" index_max_in_param=";
422 msg +=
" max_occur=";
426 throw CaseOptionException(A_FUNCINFO, msg.toString(),
true);
431 if (max_occurs >= 0) {
432 if (size > max_occurs) {
433 StringBuilder msg =
"Bad number of occurences (greater than max)";
436 msg +=
" max_occur=";
440 throw CaseOptionException(A_FUNCINFO, msg.toString(),
true);
447 Integer final_size = std::max(size, std::max(min_occurs, max_in_param));
449 ITraceMng* tm = traceMng();
451 IApplication* app = caseMng()->application();
452 ICaseDocumentFragment* doc = caseDocumentFragment();
454 m_container->allocate(final_size);
466 for (
Integer index = 0; index < final_size; ++index) {
473 if (option_in_param.contains(index + 1)) {
474 mesh_name = pco.getParameterOrNull(full_xpath,
"@mesh-name", index + 1);
475 str_val = pco.getParameterOrNull(full_xpath,
"@name", index + 1);
478 if (index < size && (mesh_name.null() || str_val.null())) {
479 element = elem_list[index];
480 if (!element.null()) {
481 if (mesh_name.null())
482 mesh_name = element.attrValue(
"mesh-name");
484 str_val = element.attrValue(
"name");
489 if (mesh_name.null()) {
490 mesh_name = meshName();
494 mesh_name = StringVariableReplace::replaceWithCmdLineArgs(params, mesh_name,
true);
498 if (str_val.null()) {
499 str_val = _defaultValue();
503 str_val = StringVariableReplace::replaceWithCmdLineArgs(params, str_val,
true);
507 if (element.null()) {
508 element = parent_element.createElement(
name());
510 element.setAttrValue(
"mesh-name", mesh_name);
511 element.setAttrValue(
"name", str_val);
514 tm->info(5) <<
"CaseOptionMultiServiceImpl name=" <<
name()
515 <<
" index=" << index
517 <<
" default_value='" << _defaultValue() <<
"'"
518 <<
" mesh=" << meshHandle().meshName();
523 throw CaseOptionException(
"get_value",
"@name");
526 auto* coptions =
new CaseOptions(configList(),
name(), parent_element,
false,
true);
527 if (coptions->_setMeshHandleAndCheckDisabled(mesh_name)) {
531 coptions->configList()->_internalApi()->setRootElement(element);
532 bool is_found = _tryCreateService(m_container, app, str_val, index, coptions);
535 tm->info(5) <<
"CaseOptionMultiServiceImpl name=" <<
name()
536 <<
" index=" << index
537 <<
" service not found";
544 String::format(
"Unable to find a service named '{0}' (valid values:{1})",
545 str_val, valid_names),
552 if (m_notify_functor)
553 m_notify_functor->executeFunctor();
562 _getAvailableServiceNames(m_container,caseMng()->application(),names);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
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.
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.
CaseOptions(ICaseMng *cm, const String &name)
Construit un jeu d'options.
EnumeratorT< Internal::IServiceFactory2 * > Enumerator
Interface de l'application.
Interface du visiteur pour une option du jeu de données.
virtual const ParameterListWithCaseOption & parameters() const =0
Liste des paramètres pouvant surcharger le jeu de données.
virtual ICaseMngInternal * _internalImpl()=0
Implémentation interne.
virtual void setRootElementWithParent(const XmlNode &parent_element)=0
Positionne l'élément racine de la liste, avec parent_element comme parent. Si déjà positionné,...
virtual void setRootElement(const XmlNode &root_element)=0
Positionne l'élément racine de la liste. Si déjà positionné, lance une exception.
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 bool isOptional() const =0
Indique si l'option est optionnelle.
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.
Interface d'une liste d'options du jeu de données.
Interface des informations d'un service ou d'un module.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Classe représentant l'ensemble des paramètres pouvant modifier les options du jeu de données.
Liste de paramètres avec informations pour surcharger les options du jeu de données.
ParameterCaseOption getParameterCaseOption(const String &language) const
Méthode permettant de récupérer un objet de type ParameterCaseOption.
Informations pour créer un service.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Liste de noeuds d'un arbre DOM.
String xpathFullName() const
Nom XPath du noeud avec ces ancêtres.
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.
-*- 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.
Int32 Integer
Type représentant un entier.
@ 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.