blob: 1c7a126e763997ccf720c9082f843565a212ef0a [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 +000043
44/**
45 * The dependency manager. Manages all services and their dependencies.
46 *
47 * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
48 */
49public class DependencyManager {
50 private final BundleContext m_context;
51 private final Logger m_logger;
52 private List m_services = Collections.synchronizedList(new ArrayList());
53
54 /**
55 * Creates a new dependency manager.
56 *
57 * @param context the bundle context
58 * @param logger
59 */
Pierre De Ropae4a5db2009-12-04 22:08:05 +000060 public DependencyManager(BundleContext context) {
61 this(context, new Logger(context));
62 }
63
64 /**
65 * Creates a new dependency manager.
66 *
67 * @param context the bundle context
68 * @param logger
69 */
Marcel Offermansa962bc92009-11-21 17:59:33 +000070 public DependencyManager(BundleContext context, Logger logger) {
71 m_context = context;
72 m_logger = logger;
73 }
Pierre De Ropae4a5db2009-12-04 22:08:05 +000074
Marcel Offermansa962bc92009-11-21 17:59:33 +000075 /**
76 * Adds a new service to the dependency manager. After the service was added
77 * it will be started immediately.
78 *
79 * @param service the service to add
80 */
81 public void add(Service service) {
82 m_services.add(service);
83 service.start();
84 }
85
86 /**
87 * Removes a service from the dependency manager. Before the service is removed
88 * it is stopped first.
89 *
90 * @param service the service to remove
91 */
92 public void remove(Service service) {
93 service.stop();
94 m_services.remove(service);
95 }
96
97 /**
98 * Creates a new service.
99 *
100 * @return the new service
101 */
102 public Service createService() {
103 return new ServiceImpl(m_context, this, m_logger);
104 }
105
106 /**
107 * Creates a new service dependency.
108 *
109 * @return the service dependency
110 */
111 public ServiceDependency createServiceDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000112 return new ServiceDependencyImpl(m_context, m_logger);
Marcel Offermansa962bc92009-11-21 17:59:33 +0000113 }
114
Marcel Offermans74363c32009-11-23 19:56:08 +0000115 /**
116 * Creates a new temporal service dependency.
117 *
118 * @param timeout the max number of milliseconds to wait for a service availability.
119 * @return the service dependency
120 */
121 public TemporalServiceDependency createTemporalServiceDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000122 return new TemporalServiceDependencyImpl(m_context, m_logger);
Marcel Offermans74363c32009-11-23 19:56:08 +0000123 }
Marcel Offermans2925f172009-12-02 13:03:39 +0000124
125 /**
126 * Creates a new configuration dependency.
127 *
128 * @return
129 */
Marcel Offermansa962bc92009-11-21 17:59:33 +0000130 public ConfigurationDependency createConfigurationDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000131 return new ConfigurationDependencyImpl(m_context, m_logger);
Marcel Offermansa962bc92009-11-21 17:59:33 +0000132 }
133
Marcel Offermans2925f172009-12-02 13:03:39 +0000134 /**
135 * Creates a new bundle dependency.
136 *
137 * @return
138 */
Marcel Offermansd66c5ce2009-11-26 09:58:44 +0000139 public BundleDependency createBundleDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000140 return new BundleDependencyImpl(m_context, m_logger);
Marcel Offermansd66c5ce2009-11-26 09:58:44 +0000141 }
Marcel Offermans2925f172009-12-02 13:03:39 +0000142
143 /**
144 * Creates a new resource dependency.
145 *
146 * @return
147 */
148 public ResourceDependency createResourceDependency() {
Pierre De Ropae4a5db2009-12-04 22:08:05 +0000149 return new ResourceDependencyImpl(m_context, m_logger);
Marcel Offermans2925f172009-12-02 13:03:39 +0000150 }
Marcel Offermans80eeafe2009-12-01 22:12:26 +0000151
Marcel Offermans2925f172009-12-02 13:03:39 +0000152 /**
153 * Creates a new aspect.
154 *
155 * @param serviceInterface
156 * @param serviceFilter
157 * @param aspectImplementation
158 * @param properties
159 * @return
160 */
Marcel Offermans80eeafe2009-12-01 22:12:26 +0000161 public Service createAspectService(Class serviceInterface, String serviceFilter, Object aspectImplementation, Dictionary properties) {
162 return createService()
163 .setImplementation(new AspectImpl(serviceInterface, serviceFilter, aspectImplementation, properties))
164 .add(createServiceDependency()
165 .setService(serviceInterface, serviceFilter)
166 .setAutoConfig(false)
167 .setCallbacks("added", "removed")
168 );
169 }
Marcel Offermans001db052009-12-08 08:58:40 +0000170
171 //TODO rename iface en iface2 to adaptor en adaptee o.i.d.
Marcel Offermans306c2522009-12-17 13:57:58 +0000172 public Service createAdapterService(Class serviceInterface, String serviceFilter, Class adapterInterface, Object impl, Dictionary adapterProperties) {
Marcel Offermans001db052009-12-08 08:58:40 +0000173 return createService()
Marcel Offermans3e1998c2009-12-16 20:47:25 +0000174 .setImplementation(new AdapterImpl(serviceInterface, serviceFilter, impl, adapterInterface.getName(), adapterProperties))
Marcel Offermans001db052009-12-08 08:58:40 +0000175 .add(createServiceDependency()
Marcel Offermans3e1998c2009-12-16 20:47:25 +0000176 .setService(serviceInterface)
Marcel Offermans001db052009-12-08 08:58:40 +0000177 .setAutoConfig(false)
178 .setCallbacks("added", "removed")
Marcel Offermans626260c2009-12-22 17:06:46 +0000179 );
Marcel Offermans001db052009-12-08 08:58:40 +0000180 }
181
182 // TODO note to self, there are Dependency's and DependencyCollections
183 // (being a dependency on more than one, fi ServiceDendency, ResourceDependency
Marcel Offermans626260c2009-12-22 17:06:46 +0000184 public Service createResourceAdapterService(String resourceFilter, Class adapterInterface, Dictionary adapterProperties, Object impl, boolean propagate) {
Marcel Offermans001db052009-12-08 08:58:40 +0000185 return createService()
Marcel Offermans626260c2009-12-22 17:06:46 +0000186 .setImplementation(new ResourceAdapterImpl(resourceFilter, impl, adapterInterface.getName(), adapterProperties, propagate))
Marcel Offermans001db052009-12-08 08:58:40 +0000187 .add(createResourceDependency()
188 .setFilter(resourceFilter)
189 .setAutoConfig(false)
190 .setCallbacks("added", "removed")
Marcel Offermans626260c2009-12-22 17:06:46 +0000191 );
Marcel Offermans001db052009-12-08 08:58:40 +0000192 }
193
194 public Service createBundleAdapterService(int stateMask, String filter, Object impl, Class iface) {
195 return createService()
196 .setImplementation(new BundleAdapterImpl(stateMask, filter, impl, iface))
197 .add(createBundleDependency()
198 .setFilter(filter)
199 .setStateMask(stateMask)
200 .setCallbacks("added", "removed")
Marcel Offermans626260c2009-12-22 17:06:46 +0000201 );
Marcel Offermans001db052009-12-08 08:58:40 +0000202 }
Marcel Offermans80eeafe2009-12-01 22:12:26 +0000203
Marcel Offermansa962bc92009-11-21 17:59:33 +0000204 /**
205 * Returns a list of services.
206 *
207 * @return a list of services
208 */
209 public List getServices() {
210 return Collections.unmodifiableList(m_services);
211 }
Marcel Offermansa962bc92009-11-21 17:59:33 +0000212}