blob: 6522a9c03405c6e3b1d32c6185c2d38ba7d0e7c2 [file] [log] [blame]
Marcel Offermansa962bc92009-11-21 17:59:33 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
Pierre De Ropae4a5db2009-12-04 22:08:05 +000019package org.apache.felix.dm;
Marcel Offermansa962bc92009-11-21 17:59:33 +000020
21import java.util.ArrayList;
22import java.util.Collections;
23import java.util.List;
24
Pierre De Rop34231582010-05-23 20:05:16 +000025import org.apache.felix.dm.impl.AdapterServiceImpl;
Pierre De Rop19476fe2010-05-23 08:13:58 +000026import org.apache.felix.dm.impl.AspectServiceImpl;
Pierre De Rop13dd63d2010-05-23 21:58:28 +000027import org.apache.felix.dm.impl.BundleAdapterServiceImpl;
Marcel Offermansfaaed472010-09-08 10:07:32 +000028import org.apache.felix.dm.impl.ComponentImpl;
Pierre De Rop3e100372010-05-24 12:43:44 +000029import org.apache.felix.dm.impl.FactoryConfigurationAdapterServiceImpl;
Pierre De Ropae4a5db2009-12-04 22:08:05 +000030import org.apache.felix.dm.impl.Logger;
Pierre De Rop445ddec2010-05-23 21:05:27 +000031import org.apache.felix.dm.impl.ResourceAdapterServiceImpl;
Pierre De Ropae4a5db2009-12-04 22:08:05 +000032import org.apache.felix.dm.impl.dependencies.BundleDependencyImpl;
33import org.apache.felix.dm.impl.dependencies.ConfigurationDependencyImpl;
34import org.apache.felix.dm.impl.dependencies.ResourceDependencyImpl;
35import org.apache.felix.dm.impl.dependencies.ServiceDependencyImpl;
36import org.apache.felix.dm.impl.dependencies.TemporalServiceDependencyImpl;
Pierre De Ropa0204f52010-03-06 22:23:57 +000037import org.apache.felix.dm.impl.metatype.PropertyMetaDataImpl;
Marcel Offermansb8405a52009-12-22 19:01:31 +000038import org.osgi.framework.BundleContext;
Marcel Offermansa962bc92009-11-21 17:59:33 +000039
40/**
Marcel Offermansfaaed472010-09-08 10:07:32 +000041 * The dependency manager manages all components and their dependencies. Using
42 * this API you can declare all components and their dependencies. Under normal
Marcel Offermans4fd903f2009-12-29 09:18:05 +000043 * circumstances, you get passed an instance of this class through the
44 * <code>DependencyActivatorBase</code> subclass you use as your
45 * <code>BundleActivator</code>, but it is also possible to create your
46 * own instance.
Marcel Offermansa962bc92009-11-21 17:59:33 +000047 *
48 * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
49 */
50public class DependencyManager {
Marcel Offermansad760672010-03-03 15:30:01 +000051 public static final String ASPECT = "org.apache.felix.dependencymanager.aspect";
Marcel Offermansa962bc92009-11-21 17:59:33 +000052 private final BundleContext m_context;
53 private final Logger m_logger;
54 private List m_services = Collections.synchronizedList(new ArrayList());
55
56 /**
Marcel Offermans4fd903f2009-12-29 09:18:05 +000057 * Creates a new dependency manager. You need to supply the
58 * <code>BundleContext</code> to be used by the dependency
59 * manager to register services and communicate with the
60 * framework.
Marcel Offermansa962bc92009-11-21 17:59:33 +000061 *
62 * @param context the bundle context
Marcel Offermansa962bc92009-11-21 17:59:33 +000063 */
Pierre De Ropae4a5db2009-12-04 22:08:05 +000064 public DependencyManager(BundleContext context) {
65 this(context, new Logger(context));
66 }
67
Marcel Offermans4fd903f2009-12-29 09:18:05 +000068 DependencyManager(BundleContext context, Logger logger) {
Marcel Offermansa962bc92009-11-21 17:59:33 +000069 m_context = context;
70 m_logger = logger;
71 }
Pierre De Ropae4a5db2009-12-04 22:08:05 +000072
Marcel Offermansa962bc92009-11-21 17:59:33 +000073 /**
74 * Adds a new service to the dependency manager. After the service was added
75 * it will be started immediately.
76 *
77 * @param service the service to add
78 */
Marcel Offermansfaaed472010-09-08 10:07:32 +000079 public void add(Component service) {
Marcel Offermansa962bc92009-11-21 17:59:33 +000080 m_services.add(service);
81 service.start();
82 }
83
84 /**
85 * Removes a service from the dependency manager. Before the service is removed
86 * it is stopped first.
87 *
88 * @param service the service to remove
89 */
Marcel Offermansfaaed472010-09-08 10:07:32 +000090 public void remove(Component service) {
Marcel Offermansa962bc92009-11-21 17:59:33 +000091 service.stop();
92 m_services.remove(service);
93 }
94
95 /**
96 * Creates a new service.
97 *
98 * @return the new service
99 */
Marcel Offermansfaaed472010-09-08 10:07:32 +0000100 public Component createComponent() {
101 return new ComponentImpl(m_context, this, m_logger);
Marcel Offermansa962bc92009-11-21 17:59:33 +0000102 }
103
104 /**
105 * Creates a new service dependency.
106 *
107 * @return the service dependency
108 */
109 public ServiceDependency createServiceDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000110 return new ServiceDependencyImpl(m_context, m_logger);
Marcel Offermansa962bc92009-11-21 17:59:33 +0000111 }
112
Marcel Offermans74363c32009-11-23 19:56:08 +0000113 /**
114 * Creates a new temporal service dependency.
115 *
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000116 * @return a new temporal service dependency
Marcel Offermans74363c32009-11-23 19:56:08 +0000117 */
118 public TemporalServiceDependency createTemporalServiceDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000119 return new TemporalServiceDependencyImpl(m_context, m_logger);
Marcel Offermans74363c32009-11-23 19:56:08 +0000120 }
Marcel Offermans2925f172009-12-02 13:03:39 +0000121
122 /**
123 * Creates a new configuration dependency.
124 *
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000125 * @return the configuration dependency
Marcel Offermans2925f172009-12-02 13:03:39 +0000126 */
Marcel Offermansa962bc92009-11-21 17:59:33 +0000127 public ConfigurationDependency createConfigurationDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000128 return new ConfigurationDependencyImpl(m_context, m_logger);
Marcel Offermansa962bc92009-11-21 17:59:33 +0000129 }
130
Marcel Offermans2925f172009-12-02 13:03:39 +0000131 /**
Marcel Offermansfaaed472010-09-08 10:07:32 +0000132 * Creates a new configuration property metadata.
133 *
134 * @return the configuration property metadata.
Pierre De Ropa0204f52010-03-06 22:23:57 +0000135 */
136 public PropertyMetaData createPropertyMetaData() {
137 return new PropertyMetaDataImpl();
138 }
139
140 /**
Marcel Offermans2925f172009-12-02 13:03:39 +0000141 * Creates a new bundle dependency.
142 *
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000143 * @return a new BundleDependency instance.
Marcel Offermans2925f172009-12-02 13:03:39 +0000144 */
Marcel Offermansd66c5ce2009-11-26 09:58:44 +0000145 public BundleDependency createBundleDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000146 return new BundleDependencyImpl(m_context, m_logger);
Marcel Offermansd66c5ce2009-11-26 09:58:44 +0000147 }
Marcel Offermans2925f172009-12-02 13:03:39 +0000148
149 /**
150 * Creates a new resource dependency.
151 *
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000152 * @return the resource dependency
Marcel Offermans2925f172009-12-02 13:03:39 +0000153 */
154 public ResourceDependency createResourceDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000155 return new ResourceDependencyImpl(m_context, m_logger);
Marcel Offermans2925f172009-12-02 13:03:39 +0000156 }
Marcel Offermans80eeafe2009-12-01 22:12:26 +0000157
Marcel Offermans2925f172009-12-02 13:03:39 +0000158 /**
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000159 * Creates a new aspect. The aspect will be applied to any service that
160 * matches the specified interface and filter. For each matching service
161 * an aspect will be created based on the aspect implementation class.
162 * The aspect will be registered with the same interface and properties
163 * as the original service, plus any extra properties you supply here.
164 * It will also inherit all dependencies, and if you declare the original
165 * service as a member it will be injected.
Marcel Offermans2925f172009-12-02 13:03:39 +0000166 *
Pierre De Rop19476fe2010-05-23 08:13:58 +0000167 * <h3>Usage Example</h3>
168 *
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000169 * <blockquote><pre>
Pierre De Rop19476fe2010-05-23 08:13:58 +0000170 * manager.createAspectService(ExistingService.class, "(foo=bar)", 10, "m_aspect")
171 * .setImplementation(ExistingServiceAspect.class)
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000172 * .setServiceProperties(new Hashtable() {{ put("additional", "properties"); }});
173 * </pre></blockquote>
Pierre De Rop19476fe2010-05-23 08:13:58 +0000174 *
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000175 * @param serviceInterface the service interface to apply the aspect to
176 * @param serviceFilter the filter condition to use with the service interface
Pierre De Rop19476fe2010-05-23 08:13:58 +0000177 * @param ranking the level used to organize the aspect chain ordering
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000178 * @param attributeName the aspect implementation field name where to inject original service.
Marcel Offermansfaaed472010-09-08 10:07:32 +0000179 * If null, any field matching the original service will be injected.
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000180 * @return a service that acts as a factory for generating aspects
Marcel Offermans2925f172009-12-02 13:03:39 +0000181 */
Marcel Offermansfaaed472010-09-08 10:07:32 +0000182 public Component createAspectService(Class serviceInterface, String serviceFilter, int ranking, String attributeName) {
Pierre De Rop19476fe2010-05-23 08:13:58 +0000183 return new AspectServiceImpl(this, serviceInterface, serviceFilter, ranking, attributeName);
Marcel Offermans80eeafe2009-12-01 22:12:26 +0000184 }
Marcel Offermanse9c13d92010-07-01 14:01:02 +0000185
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000186 /**
187 * Creates a new adapter. The adapter will be applied to any service that
188 * matches the specified interface and filter. For each matching service
189 * an adapter will be created based on the adapter implementation class.
190 * The adapter will be registered with the specified interface and existing properties
191 * from the original service plus any extra properties you supply here.
192 * It will also inherit all dependencies, and if you declare the original
193 * service as a member it will be injected.
194 *
Pierre De Rop34231582010-05-23 20:05:16 +0000195 * <h3>Usage Example</h3>
196 *
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000197 * <blockquote><pre>
Pierre De Rop34231582010-05-23 20:05:16 +0000198 * manager.createAdapterService(AdapteeService.class, "(foo=bar)")
Pierre De Rop445ddec2010-05-23 21:05:27 +0000199 * // The interface to use when registering adapter
Pierre De Rop34231582010-05-23 20:05:16 +0000200 * .setInterface(AdapterService.class, new Hashtable() {{ put("additional", "properties"); }})
201 * // the implementation of the adapter
202 * .setImplementation(AdapterImpl.class);
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000203 * </pre></blockquote>
Marcel Offermansd665eaf2010-02-16 15:56:35 +0000204 * @param serviceInterface the service interface to apply the adapter to
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000205 * @param serviceFilter the filter condition to use with the service interface
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000206 * @return a service that acts as a factory for generating adapters
207 */
Marcel Offermansfaaed472010-09-08 10:07:32 +0000208 public Component createAdapterService(Class serviceInterface, String serviceFilter) {
Pierre De Rop34231582010-05-23 20:05:16 +0000209 return new AdapterServiceImpl(this, serviceInterface, serviceFilter);
Marcel Offermans61a81142010-04-02 15:16:50 +0000210 }
Pierre De Rop34231582010-05-23 20:05:16 +0000211
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000212 /**
213 * Creates a new resource adapter. The adapter will be applied to any resource that
214 * matches the specified filter condition. For each matching resource
215 * an adapter will be created based on the adapter implementation class.
216 * The adapter will be registered with the specified interface and existing properties
217 * from the original resource plus any extra properties you supply here.
218 * It will also inherit all dependencies, and if you declare the original
219 * service as a member it will be injected.
220 *
Pierre De Rop445ddec2010-05-23 21:05:27 +0000221 * <h3>Usage Example</h3>
222 *
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000223 * <blockquote><pre>
Pierre De Rop445ddec2010-05-23 21:05:27 +0000224 * manager.createResourceAdapterService("(&(path=/test)(repository=TestRepository))", true)
225 * // The interface to use when registering adapter
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000226 * .setInterface(AdapterService.class.getName(), new Hashtable() {{ put("foo", "bar"); }})
Pierre De Rop445ddec2010-05-23 21:05:27 +0000227 * // the implementation of the adapter
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000228 * .setImplementation(AdapterServiceImpl.class);
229 * </pre></blockquote>
Pierre De Rop445ddec2010-05-23 21:05:27 +0000230 *
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000231 * @param resourceFilter the filter condition to use with the resource
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000232 * @param propagate <code>true</code> if properties from the resource should be propagated to the service
Marcel Offermanse9c13d92010-07-01 14:01:02 +0000233 * @param callbackInstance
234 * @param callbackChanged
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000235 * @return a service that acts as a factory for generating resource adapters
236 * @see Resource
237 */
Marcel Offermansfaaed472010-09-08 10:07:32 +0000238 public Component createResourceAdapterService(String resourceFilter, boolean propagate, Object callbackInstance, String callbackChanged) {
Marcel Offermanse9c13d92010-07-01 14:01:02 +0000239 return new ResourceAdapterServiceImpl(this, resourceFilter, propagate, callbackInstance, callbackChanged);
Marcel Offermans61a81142010-04-02 15:16:50 +0000240 }
Pierre De Rop445ddec2010-05-23 21:05:27 +0000241
Marcel Offermansfaaed472010-09-08 10:07:32 +0000242 public Component createResourceAdapterService(String resourceFilter, Object propagateCallbackInstance, String propagateCallbackMethod, Object callbackInstance, String callbackChanged) {
Marcel Offermans26081d32010-07-12 12:43:42 +0000243 return new ResourceAdapterServiceImpl(this, resourceFilter, propagateCallbackInstance, propagateCallbackMethod, callbackInstance, callbackChanged);
244 }
245
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000246 /**
247 * Creates a new bundle adapter. The adapter will be applied to any bundle that
248 * matches the specified bundle state mask and filter condition. For each matching
249 * bundle an adapter will be created based on the adapter implementation class.
250 * The adapter will be registered with the specified interface
251 *
252 * TODO and existing properties from the original resource plus any extra properties you supply here.
253 * It will also inherit all dependencies, and if you declare the original
254 * service as a member it will be injected.
255 *
Pierre De Rop13dd63d2010-05-23 21:58:28 +0000256 * <h3>Usage Example</h3>
257 *
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000258 * <blockquote><pre>
Pierre De Rop13dd63d2010-05-23 21:58:28 +0000259 * manager.createBundleAdapterService(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE,
260 * "(Bundle-SymbolicName=org.apache.felix.dependencymanager)",
261 * true)
262 * // The interface to use when registering adapter
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000263 * .setInterface(AdapterService.class.getName(), new Hashtable() {{ put("foo", "bar"); }})
Pierre De Rop13dd63d2010-05-23 21:58:28 +0000264 * // the implementation of the adapter
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000265 * .setImplementation(AdapterServiceImpl.class);
266 * </pre></blockquote>
Pierre De Rop13dd63d2010-05-23 21:58:28 +0000267 *
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000268 * @param bundleStateMask the bundle state mask to apply
269 * @param bundleFilter the filter to apply to the bundle manifest
Marcel Offermansd665eaf2010-02-16 15:56:35 +0000270 * @param propagate <code>true</code> if properties from the bundle should be propagated to the service
Marcel Offermans4fd903f2009-12-29 09:18:05 +0000271 * @return a service that acts as a factory for generating bundle adapters
272 */
Marcel Offermansfaaed472010-09-08 10:07:32 +0000273 public Component createBundleAdapterService(int bundleStateMask, String bundleFilter, boolean propagate) {
Pierre De Rop13dd63d2010-05-23 21:58:28 +0000274 return new BundleAdapterServiceImpl(this, bundleStateMask, bundleFilter, propagate);
Marcel Offermans61a81142010-04-02 15:16:50 +0000275 }
Marcel Offermans80eeafe2009-12-01 22:12:26 +0000276
Marcel Offermansa962bc92009-11-21 17:59:33 +0000277 /**
Pierre De Ropef94c882010-04-17 18:23:35 +0000278 * Creates a new Managed Service Factory Configuration Adapter. For each new Config Admin factory configuration matching
279 * the factoryPid, an adapter will be created based on the adapter implementation class.
280 * The adapter will be registered with the specified interface, and with the specified adapter service properties.
281 * Depending on the <code>propagate</code> parameter, every public factory configuration properties
282 * (which don't start with ".") will be propagated along with the adapter service properties.
283 * It will also inherit all dependencies.
284 *
Pierre De Rop3e100372010-05-24 12:43:44 +0000285 * <h3>Usage Example</h3>
286 *
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000287 * <blockquote><pre>
Pierre De Rop3e100372010-05-24 12:43:44 +0000288 * manager.createFactoryConfigurationAdapterService("MyFactoryPid", "update", true)
289 * // The interface to use when registering adapter
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000290 * .setInterface(AdapterService.class.getName(), new Hashtable() {{ put("foo", "bar"); }})
Pierre De Rop3e100372010-05-24 12:43:44 +0000291 * // the implementation of the adapter
292 * .setImplementation(AdapterServiceImpl.class);
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000293 * </pre></blockquote>
294 *
Pierre De Ropef94c882010-04-17 18:23:35 +0000295 * @param factoryPid the pid matching the factory configuration
296 * @param update the adapter method name that will be notified when the factory configuration is created/updated.
Pierre De Ropef94c882010-04-17 18:23:35 +0000297 * @param propagate true if public factory configuration should be propagated to the adapter service properties
298 * @return a service that acts as a factory for generating the managed service factory configuration adapter
299 */
Marcel Offermansfaaed472010-09-08 10:07:32 +0000300 public Component createFactoryConfigurationAdapterService(String factoryPid, String update, boolean propagate) {
Pierre De Rop3e100372010-05-24 12:43:44 +0000301 return new FactoryConfigurationAdapterServiceImpl(this, factoryPid, update, propagate);
Pierre De Ropef94c882010-04-17 18:23:35 +0000302 }
303
304 /**
Pierre De Rop3e100372010-05-24 12:43:44 +0000305 * Creates a new Managed Service Factory Configuration Adapter with meta type support. For each new Config Admin
306 * factory configuration matching the factoryPid, an adapter will be created based on the adapter implementation
307 * class. The adapter will be registered with the specified interface, and with the specified adapter service
308 * properties. Depending on the <code>propagate</code> parameter, every public factory configuration properties
Pierre De Ropef94c882010-04-17 18:23:35 +0000309 * (which don't start with ".") will be propagated along with the adapter service properties.
310 * It will also inherit all dependencies.
311 *
Pierre De Ropc3dfbb72010-05-24 13:16:35 +0000312 * <h3>Usage Example</h3>
313 *
314 * <blockquote><pre>
315 * PropertyMetaData[] propertiesMetaData = new PropertyMetaData[] {
316 * manager.createPropertyMetaData()
317 * .setCardinality(Integer.MAX_VALUE)
318 * .setType(String.class)
319 * .setHeading("English words")
320 * .setDescription("Declare here some valid english words")
321 * .setDefaults(new String[] {"hello", "world"})
322 * .setId("words")
323 * };
324 *
325 * manager.add(createFactoryConfigurationAdapterService("FactoryPid",
326 * "updated",
327 * true, // propagate CM settings
328 * "EnglishDictionary",
329 * "English dictionary configuration properties",
330 * null,
331 * propertiesMetaData)
332 * .setImplementation(Adapter.class));
333 * </pre></blockquote>
334 *
Pierre De Ropef94c882010-04-17 18:23:35 +0000335 * @param factoryPid the pid matching the factory configuration
336 * @param update the adapter method name that will be notified when the factory configuration is created/updated.
Pierre De Ropef94c882010-04-17 18:23:35 +0000337 * @param propagate true if public factory configuration should be propagated to the adapter service properties
Pierre De Rop3e100372010-05-24 12:43:44 +0000338 * @param heading The label used to display the tab name (or section) where the properties are displayed.
339 * Example: "Printer Service"
340 * @param desc A human readable description of the factory PID this configuration is associated with.
341 * Example: "Configuration for the PrinterService bundle"
Pierre De Rop9a8ebfd2010-04-25 22:25:34 +0000342 * @param localization Points to the basename of the Properties file that can localize the Meta Type informations.
343 * The default localization base name for the properties is OSGI-INF/l10n/bundle, but can
Pierre De Rop3e100372010-05-24 12:43:44 +0000344 * be overridden by the manifest Bundle-Localization header (see core specification, in section Localization
345 * on page 68). You can specify a specific localization basename file using this parameter
346 * (e.g. <code>"person"</code> will match person_du_NL.properties in the root bundle directory).
Pierre De Rop9a8ebfd2010-04-25 22:25:34 +0000347 * @param propertiesMetaData Array of MetaData regarding configuration properties
348 * @return a service that acts as a factory for generating the managed service factory configuration adapter
349 */
Marcel Offermansfaaed472010-09-08 10:07:32 +0000350 public Component createFactoryConfigurationAdapterService(String factoryPid, String update, boolean propagate,
Pierre De Rop3e100372010-05-24 12:43:44 +0000351 String heading, String desc, String localization,
352 PropertyMetaData[] propertiesMetaData)
Pierre De Rop9a8ebfd2010-04-25 22:25:34 +0000353 {
Pierre De Rop3e100372010-05-24 12:43:44 +0000354 return new FactoryConfigurationAdapterServiceImpl(this, factoryPid, update, propagate, m_context, m_logger,
355 heading, desc, localization, propertiesMetaData);
Pierre De Rop9a8ebfd2010-04-25 22:25:34 +0000356 }
357
358 /**
Marcel Offermansa962bc92009-11-21 17:59:33 +0000359 * Returns a list of services.
360 *
361 * @return a list of services
362 */
363 public List getServices() {
364 return Collections.unmodifiableList(m_services);
365 }
Marcel Offermansa962bc92009-11-21 17:59:33 +0000366}