Marcel Offermans | 80eeafe | 2009-12-01 22:12:26 +0000 | [diff] [blame] | 1 | package org.apache.felix.dependencymanager.impl; |
| 2 | |
| 3 | import java.util.Dictionary; |
| 4 | import java.util.Enumeration; |
| 5 | import java.util.HashMap; |
| 6 | import java.util.Iterator; |
| 7 | import java.util.Map; |
| 8 | import java.util.Properties; |
| 9 | |
| 10 | import org.apache.felix.dependencymanager.DependencyManager; |
| 11 | import org.apache.felix.dependencymanager.Service; |
| 12 | import org.osgi.framework.ServiceReference; |
| 13 | |
| 14 | public 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 | } |