blob: e5a969e4baff4aad990f8660940b28c72645cb44 [file] [log] [blame]
Marcel Offermans80eeafe2009-12-01 22:12:26 +00001package org.apache.felix.dependencymanager.impl;
2
3import java.util.Dictionary;
4import java.util.Enumeration;
5import java.util.HashMap;
6import java.util.Iterator;
7import java.util.Map;
8import java.util.Properties;
9
10import org.apache.felix.dependencymanager.DependencyManager;
11import org.apache.felix.dependencymanager.Service;
12import org.osgi.framework.ServiceReference;
13
14public class AspectImpl {
15 private volatile DependencyManager m_manager;
16 private volatile Service m_service;
17 private final Class m_serviceInterface;
18 private final String m_serviceFilter;
19 private final Object m_aspectImplementation;
20 private final Map m_services = new HashMap();
21 private final Dictionary m_aspectProperties;
22
23 public AspectImpl(Class serviceInterface, String serviceFilter, Object aspectImplementation, Dictionary properties) {
24 m_serviceInterface = serviceInterface;
25 m_serviceFilter = serviceFilter;
26 m_aspectImplementation = aspectImplementation;
27 m_aspectProperties = properties;
28 }
29
30 public void added(ServiceReference ref, Object service) {
31 Properties props = new Properties();
32 String[] keys = ref.getPropertyKeys();
33 for (int i = 0; i < keys.length; i++) {
34 props.put(keys[i], ref.getProperty(keys[i]));
35 }
36 Enumeration e = m_aspectProperties.keys();
37 while (e.hasMoreElements()) {
38 Object key = e.nextElement();
39 props.put(key, m_aspectProperties.get(key));
40 }
41
42 Service newService = m_manager.createService()
43 .setInterface(m_serviceInterface.getName(), props)
44 .setImplementation(m_aspectImplementation)
45 .add(m_service.getDependencies())
46 .add(m_manager.createServiceDependency()
47 .setService(m_serviceInterface, ref)
48 .setRequired(true)
49 );
50 m_services.put(ref, newService);
51 m_manager.add(newService);
52 }
53
54 public void removed(ServiceReference ref, Object service) {
55 Service newService = (Service) m_services.remove(ref);
56 if (newService == null) {
57 System.out.println("Service should not be null here, dumping stack.");
58 Thread.dumpStack();
59 }
60 else {
61 m_manager.remove(newService);
62 }
63 }
64
65 public void stop() {
66 Iterator i = m_services.values().iterator();
67 while (i.hasNext()) {
68 m_manager.remove((Service) i.next());
69 }
70 m_services.clear();
71 }
72}