blob: ae494a42ba1ef228802a4960bbae382b6661a62f [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;
Marcel Offermans80eeafe2009-12-01 22:12:26 +000023import java.util.Dictionary;
Marcel Offermansa962bc92009-11-21 17:59:33 +000024import java.util.List;
25
Pierre De Ropae4a5db2009-12-04 22:08:05 +000026import org.apache.felix.dm.dependencies.BundleDependency;
27import org.apache.felix.dm.dependencies.ConfigurationDependency;
28import org.apache.felix.dm.dependencies.ResourceDependency;
29import org.apache.felix.dm.dependencies.ServiceDependency;
30import org.apache.felix.dm.dependencies.TemporalServiceDependency;
Marcel Offermans001db052009-12-08 08:58:40 +000031import org.apache.felix.dm.impl.AdapterImpl;
Pierre De Ropae4a5db2009-12-04 22:08:05 +000032import org.apache.felix.dm.impl.AspectImpl;
Marcel Offermans001db052009-12-08 08:58:40 +000033import org.apache.felix.dm.impl.BundleAdapterImpl;
Pierre De Ropae4a5db2009-12-04 22:08:05 +000034import org.apache.felix.dm.impl.Logger;
Marcel Offermans001db052009-12-08 08:58:40 +000035import org.apache.felix.dm.impl.ResourceAdapterImpl;
Pierre De Ropae4a5db2009-12-04 22:08:05 +000036import org.apache.felix.dm.impl.ServiceImpl;
37import org.apache.felix.dm.impl.dependencies.BundleDependencyImpl;
38import org.apache.felix.dm.impl.dependencies.ConfigurationDependencyImpl;
39import org.apache.felix.dm.impl.dependencies.ResourceDependencyImpl;
40import org.apache.felix.dm.impl.dependencies.ServiceDependencyImpl;
41import org.apache.felix.dm.impl.dependencies.TemporalServiceDependencyImpl;
42import org.apache.felix.dm.service.Service;
Marcel Offermansa962bc92009-11-21 17:59:33 +000043import org.osgi.framework.BundleContext;
44
45/**
46 * The dependency manager. Manages all services and their dependencies.
47 *
48 * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
49 */
50public class DependencyManager {
51 private final BundleContext m_context;
52 private final Logger m_logger;
53 private List m_services = Collections.synchronizedList(new ArrayList());
54
55 /**
56 * Creates a new dependency manager.
57 *
58 * @param context the bundle context
59 * @param logger
60 */
Pierre De Ropae4a5db2009-12-04 22:08:05 +000061 public DependencyManager(BundleContext context) {
62 this(context, new Logger(context));
63 }
64
65 /**
66 * Creates a new dependency manager.
67 *
68 * @param context the bundle context
69 * @param logger
70 */
Marcel Offermansa962bc92009-11-21 17:59:33 +000071 public DependencyManager(BundleContext context, Logger logger) {
72 m_context = context;
73 m_logger = logger;
74 }
Pierre De Ropae4a5db2009-12-04 22:08:05 +000075
Marcel Offermansa962bc92009-11-21 17:59:33 +000076 /**
77 * Adds a new service to the dependency manager. After the service was added
78 * it will be started immediately.
79 *
80 * @param service the service to add
81 */
82 public void add(Service service) {
83 m_services.add(service);
84 service.start();
85 }
86
87 /**
88 * Removes a service from the dependency manager. Before the service is removed
89 * it is stopped first.
90 *
91 * @param service the service to remove
92 */
93 public void remove(Service service) {
94 service.stop();
95 m_services.remove(service);
96 }
97
98 /**
99 * Creates a new service.
100 *
101 * @return the new service
102 */
103 public Service createService() {
104 return new ServiceImpl(m_context, this, m_logger);
105 }
106
107 /**
108 * Creates a new service dependency.
109 *
110 * @return the service dependency
111 */
112 public ServiceDependency createServiceDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000113 return new ServiceDependencyImpl(m_context, m_logger);
Marcel Offermansa962bc92009-11-21 17:59:33 +0000114 }
115
Marcel Offermans74363c32009-11-23 19:56:08 +0000116 /**
117 * Creates a new temporal service dependency.
118 *
119 * @param timeout the max number of milliseconds to wait for a service availability.
120 * @return the service dependency
121 */
122 public TemporalServiceDependency createTemporalServiceDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000123 return new TemporalServiceDependencyImpl(m_context, m_logger);
Marcel Offermans74363c32009-11-23 19:56:08 +0000124 }
Marcel Offermans2925f172009-12-02 13:03:39 +0000125
126 /**
127 * Creates a new configuration dependency.
128 *
129 * @return
130 */
Marcel Offermansa962bc92009-11-21 17:59:33 +0000131 public ConfigurationDependency createConfigurationDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000132 return new ConfigurationDependencyImpl(m_context, m_logger);
Marcel Offermansa962bc92009-11-21 17:59:33 +0000133 }
134
Marcel Offermans2925f172009-12-02 13:03:39 +0000135 /**
136 * Creates a new bundle dependency.
137 *
138 * @return
139 */
Marcel Offermansd66c5ce2009-11-26 09:58:44 +0000140 public BundleDependency createBundleDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000141 return new BundleDependencyImpl(m_context, m_logger);
Marcel Offermansd66c5ce2009-11-26 09:58:44 +0000142 }
Marcel Offermans2925f172009-12-02 13:03:39 +0000143
144 /**
145 * Creates a new resource dependency.
146 *
147 * @return
148 */
149 public ResourceDependency createResourceDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000150 return new ResourceDependencyImpl(m_context, m_logger);
Marcel Offermans2925f172009-12-02 13:03:39 +0000151 }
Marcel Offermans80eeafe2009-12-01 22:12:26 +0000152
Marcel Offermans2925f172009-12-02 13:03:39 +0000153 /**
154 * Creates a new aspect.
155 *
156 * @param serviceInterface
157 * @param serviceFilter
158 * @param aspectImplementation
159 * @param properties
160 * @return
161 */
Marcel Offermans80eeafe2009-12-01 22:12:26 +0000162 public Service createAspectService(Class serviceInterface, String serviceFilter, Object aspectImplementation, Dictionary properties) {
163 return createService()
164 .setImplementation(new AspectImpl(serviceInterface, serviceFilter, aspectImplementation, properties))
165 .add(createServiceDependency()
166 .setService(serviceInterface, serviceFilter)
167 .setAutoConfig(false)
168 .setCallbacks("added", "removed")
169 );
170 }
Marcel Offermans001db052009-12-08 08:58:40 +0000171
172 //TODO rename iface en iface2 to adaptor en adaptee o.i.d.
173 public Service createAdapterService(Class iface, Class iface2, Class impl) {
174 return createService()
175 .setImplementation(new AdapterImpl(iface, iface2, impl))
176 .add(createServiceDependency()
177 .setService(iface)
178 .setAutoConfig(false)
179 .setCallbacks("added", "removed")
180 );
181 }
182
183 // TODO note to self, there are Dependency's and DependencyCollections
184 // (being a dependency on more than one, fi ServiceDendency, ResourceDependency
Marcel Offermansd403a1d2009-12-10 09:57:06 +0000185 public Service createResourceAdapterService(String resourceFilter, Class iface2, Object impl, boolean propagate) {
Marcel Offermans001db052009-12-08 08:58:40 +0000186 return createService()
Marcel Offermansd403a1d2009-12-10 09:57:06 +0000187 .setImplementation(new ResourceAdapterImpl(impl, iface2, propagate))
Marcel Offermans001db052009-12-08 08:58:40 +0000188 .add(createResourceDependency()
189 .setFilter(resourceFilter)
190 .setAutoConfig(false)
191 .setCallbacks("added", "removed")
192 )
193 ;
194 }
195
196 public Service createBundleAdapterService(int stateMask, String filter, Object impl, Class iface) {
197 return createService()
198 .setImplementation(new BundleAdapterImpl(stateMask, filter, impl, iface))
199 .add(createBundleDependency()
200 .setFilter(filter)
201 .setStateMask(stateMask)
202 .setCallbacks("added", "removed")
203 )
204 ;
205 }
Marcel Offermans80eeafe2009-12-01 22:12:26 +0000206
Marcel Offermansa962bc92009-11-21 17:59:33 +0000207 /**
208 * Returns a list of services.
209 *
210 * @return a list of services
211 */
212 public List getServices() {
213 return Collections.unmodifiableList(m_services);
214 }
Marcel Offermansa962bc92009-11-21 17:59:33 +0000215}