Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ServiceFinder2.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* ServiceFinder2.h (C) 2000-2019 */
9/* */
10/* Classe pour trouver un service donné. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_SERVICEFINDER2_H
13#define ARCANE_SERVICEFINDER2_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/String.h"
18#include "arcane/utils/Array.h"
19#include "arcane/utils/Collection.h"
20#include "arcane/utils/Enumerator.h"
21
22#include "arcane/IServiceInfo.h"
23#include "arcane/IFactoryService.h"
24#include "arcane/IApplication.h"
25#include "arcane/IServiceFactory.h"
26#include "arcane/IServiceMng.h"
27#include "arcane/ServiceBuildInfo.h"
28#include "arcane/ServiceInstance.h"
29
30#include <set>
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35namespace Arcane
36{
37namespace Internal
38{
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42/*!
43 * \internal
44 * \brief Classe utilitaire pour retrouver un ou plusieurs services
45 * implémentant l'interface \a InterfaceType.
46 */
47template<typename InterfaceType>
49{
50 public:
51 typedef IServiceFactory2T<InterfaceType> FactoryType;
52 public:
54 : m_application(app), m_service_build_info_base(sbi)
55 {
56 }
57
58 virtual ~ServiceFinderBase2T(){}
59
60 public:
61 /*!
62 * \brief Créé une instance du service \a name.
63 *
64 * Retourne nul si aucun service de ce nom n'existe.
65 *
66 * \deprecated Utiliser createReference() à la place.
67 */
68 ARCCORE_DEPRECATED_2019("Use createReference() instead")
69 virtual InterfaceType* create(const String& name)
70 {
71 return _create(name,m_service_build_info_base);
72 }
73
74 /*!
75 * \brief Créé une instance du service \a name.
76 *
77 * Retourne une référence nulle si aucun service de ce nom n'existe.
78 */
79 virtual Ref<InterfaceType> createReference(const String& name)
80 {
81 return _createReference(name,m_service_build_info_base);
82 }
83
84 /*!
85 * \brief Créé une instance du service \a name pour le maillage \a mesh.
86 *
87 * Cela n'est valide que pour les services de sous-domaine. Pour les autres,
88 * cela est sans effet.
89 * L'appelant doit détruire ces services.
90 * Retourne nul si aucun service de ce nom n'existe.
91 *
92 * \deprecated Utiliser createReference() à la place.
93 */
94 ARCCORE_DEPRECATED_2019("Use createReference() instead")
95 virtual InterfaceType* create(const String& name,IMesh* mesh)
96 {
97 ISubDomain* sd = m_service_build_info_base.subDomain();
98 if (!sd)
99 return {};
100 if (mesh)
101 return _create(name,ServiceBuildInfoBase(sd,mesh));
102 return _create(name,ServiceBuildInfoBase(sd));
103 }
104
105 /*!
106 * \brief Créé une instance du service \a name pour le maillage \a mesh.
107 *
108 * Cela n'est valide que pour les services de sous-domaine. Pour les autres,
109 * cela est sans effet.
110 * L'appelant doit détruire ces services.
111 * Retourne nul si aucun service de ce nom n'existe.
112 */
113 virtual Ref<InterfaceType> createReference(const String& name,IMesh* mesh)
114 {
115 ISubDomain* sd = m_service_build_info_base.subDomain();
116 if (!sd)
117 return {};
118 if (mesh)
119 return _createReference(name,ServiceBuildInfoBase(sd,mesh));
120 return _createReference(name,ServiceBuildInfoBase(sd));
121 }
122
123 /*!
124 * \brief Instance singleton du service ayant pour interface \a InterfaceType.
125 *
126 * Retourne nul si aucun service n'est trouvé
127 */
128 virtual InterfaceType* getSingleton()
129 {
130 IServiceMng* sm = m_service_build_info_base.serviceParent()->serviceMng();
131 SingletonServiceInstanceCollection singleton_services = sm->singletonServices();
132 for( typename SingletonServiceInstanceCollection::Enumerator i(singleton_services); ++i; ){
133 ISingletonServiceInstance* ssi = (*i).get();
134 if (ssi){
135 for( typename ServiceInstanceCollection::Enumerator k(ssi->interfaceInstances()); ++k; ){
136 IServiceInstance* sub_isi = (*k).get();
137 auto m = dynamic_cast< IServiceInstanceT<InterfaceType>* >(sub_isi);
138 if (m)
139 return m->instance().get();
140 }
141 }
142 }
143 return nullptr;
144 }
145
146 /*!
147 * \brief Créé une instance de chaque service qui implémente \a InterfaceType.
148 *
149 * L'appelant doit détruire ces services via l'appel à 'operator delete'.
150 *
151 * \deprecated Utilise ls surcharge prenant en argument un tableau de références.
152 */
153 ARCCORE_DEPRECATED_2019("Use createAll(Array<ServiceRef<InterfaceType>>&) instead")
154 virtual void createAll(Array<InterfaceType*>& instances)
155 {
156 _createAll(instances,m_service_build_info_base);
157 }
158
159 /*!
160 * \brief Créé une instance de chaque service qui implémente \a InterfaceType.
161 */
163 {
164 return _createAll(m_service_build_info_base);
165 }
166
167 public:
168
169 SharedArray<FactoryType*> factories()
170 {
171 SharedArray<FactoryType*> m_factories;
172 for( typename ServiceFactory2Collection::Enumerator j(this->m_application->serviceFactories2()); ++j; ){
173 IServiceFactory2* sf2 = *j;
175 //m_application->traceMng()->info() << " FOUND sf2=" << sf2 << " M=" << m;
176 if (m){
177 m_factories.add(m);
178 }
179 }
180 return m_factories.constView();
181 }
182
183 void getServicesNames(Array<String>& names) const
184 {
185 for( typename ServiceFactory2Collection::Enumerator j(this->m_application->serviceFactories2()); ++j; ){
186 IServiceFactory2* sf2 = *j;
187 IServiceFactory2T<InterfaceType>* true_factory = dynamic_cast< IServiceFactory2T<InterfaceType>* >(sf2);
188 if (true_factory){
189 IServiceInfo* si = sf2->serviceInfo();
190 names.add(si->localName());
191 }
192 }
193 }
194
195 protected:
196
197 InterfaceType* _create(const String& name,const ServiceBuildInfoBase& sbib)
198 {
199 return _createReference(name,sbib)._release();
200 }
201
202 Ref<InterfaceType> _createReference(const String& name,const ServiceBuildInfoBase& sbib)
203 {
204 for( typename ServiceFactory2Collection::Enumerator j(this->m_application->serviceFactories2()); ++j; ){
205 Internal::IServiceFactory2* sf2 = *j;
206 IServiceInfo* s = sf2->serviceInfo();
207 if (s->localName()!=name)
208 continue;
209 IServiceFactory2T<InterfaceType>* m = dynamic_cast< IServiceFactory2T<InterfaceType>* >(sf2);
210 //m_application->traceMng()->info() << " FOUND sf2=" << sf2 << " M=" << m;
211 if (m){
212 Ref<InterfaceType> tt = m->createServiceReference(sbib);
213 if (!tt.isNull())
214 return tt;
215 }
216 }
217 return {};
218 }
219
220 void _createAll(Array<InterfaceType*>& instances,const ServiceBuildInfoBase& sbib)
221 {
222 UniqueArray<Ref<InterfaceType>> ref_instances = _createAll(sbib);
223 for( auto& x : ref_instances )
224 instances.add(x._release());
225 }
226
227 UniqueArray<Ref<InterfaceType>> _createAll(const ServiceBuildInfoBase& sbib)
228 {
229 UniqueArray<Ref<InterfaceType>> instances;
230 for( typename ServiceFactory2Collection::Enumerator j(this->m_application->serviceFactories2()); ++j; ){
231 Internal::IServiceFactory2* sf2 = *j;
232 IServiceFactory2T<InterfaceType>* m = dynamic_cast< IServiceFactory2T<InterfaceType>* >(sf2);
233 if (m){
234 Ref<InterfaceType> tt = m->createServiceReference(sbib);
235 if (tt.get()){
236 instances.add(tt);
237 }
238 }
239 }
240 return instances;
241 }
242
243 protected:
244
245 IApplication* m_application;
246 ServiceBuildInfoBase m_service_build_info_base;
247};
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
252} // End namespace Internal
253
254/*---------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
256/*!
257 * \brief Classe utilitaire pour retrouver un ou plusieurs services
258 * implémentant l'interface \a InterfaceType.
259 * \deprecated Cette classe ne doit plus être utilisée directement.
260 * Il faut utiliser à la place ServiceBuilder.
261 */
262template<typename InterfaceType,typename ParentType>
264: public Internal::ServiceFinderBase2T<InterfaceType>
265{
266 public:
267 ServiceFinder2T(IApplication* app,ParentType* parent)
269 {
270 }
271
273
274 public:
275};
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
279
280} // End namespace Arcane
281
282/*---------------------------------------------------------------------------*/
283/*---------------------------------------------------------------------------*/
284
285#endif
Interface de l'application.
virtual ServiceFactory2Collection serviceFactories2()=0
Liste des fabriques de service.
virtual IServiceMng * serviceMng() const =0
Gestionnaire de services.
Interface d'une instance d'un service.
Definition IService.h:73
Interface du gestionnaire de services.
Definition IServiceMng.h:31
virtual SingletonServiceInstanceCollection singletonServices() const =0
Retourne la liste des services singleton.
virtual ServiceInstanceCollection interfaceInstances()=0
Liste des instances des interfaces implémentées par le singleton.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual IServiceInfo * serviceInfo() const =0
Retourne le IServiceInfo associé à cette fabrique.
virtual InterfaceType * create(const String &name)
Créé une instance du service name.
virtual UniqueArray< Ref< InterfaceType > > createAll()
Créé une instance de chaque service qui implémente InterfaceType.
virtual InterfaceType * getSingleton()
Instance singleton du service ayant pour interface InterfaceType.
virtual Ref< InterfaceType > createReference(const String &name, IMesh *mesh)
Créé une instance du service name pour le maillage mesh.
virtual Ref< InterfaceType > createReference(const String &name)
Créé une instance du service name.
Informations pour créer un service.
IBase * serviceParent() const
Accès à l'instance parente qui a créée cette instance.
ISubDomain * subDomain() const
Accès au ISubDomain associé.
Classe utilitaire pour retrouver un ou plusieurs services implémentant l'interface InterfaceType.
Classe de base des vecteurs 1D de données.
ConstArrayView< T > constView() const
Vue constante sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vecteur 1D de données avec sémantique par référence.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
void add(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Ajoute le tableau copy_array dans l'instance.
Definition MathUtils.h:885
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Collection< SingletonServiceInstanceRef > SingletonServiceInstanceCollection
Collection d'instances de services singletons.