Author: marrs
Date: Wed Dec 16 20:47:25 2009
New Revision: 891421
URL: http://svn.apache.org/viewvc?rev=891421&view=rev
Log:
refactored some common features into an abstract superclass for all decorator
patterns
Added:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
Modified:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterImpl.java
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectImpl.java
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterImpl.java
Modified:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java?rev=891421&r1=891420&r2=891421&view=diff
==============================================================================
---
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
(original)
+++
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
Wed Dec 16 20:47:25 2009
@@ -170,11 +170,11 @@
}
//TODO rename iface en iface2 to adaptor en adaptee o.i.d.
- public Service createAdapterService(Class iface, Class iface2, Class impl)
{
+ public Service createAdapterService(Class serviceInterface, String
serviceFilter, Class adapterInterface, Class impl, Dictionary
adapterProperties) {
return createService()
- .setImplementation(new AdapterImpl(iface, iface2, impl))
+ .setImplementation(new AdapterImpl(serviceInterface,
serviceFilter, impl, adapterInterface.getName(), adapterProperties))
.add(createServiceDependency()
- .setService(iface)
+ .setService(serviceInterface)
.setAutoConfig(false)
.setCallbacks("added", "removed")
);
@@ -184,7 +184,7 @@
// (being a dependency on more than one, fi ServiceDendency,
ResourceDependency
public Service createResourceAdapterService(String resourceFilter, Class
iface2, Object impl, boolean propagate) {
return createService()
- .setImplementation(new ResourceAdapterImpl(impl, iface2,
propagate))
+ .setImplementation(new ResourceAdapterImpl(resourceFilter, impl,
iface2.getName(), null, propagate))
.add(createResourceDependency()
.setFilter(resourceFilter)
.setAutoConfig(false)
Added:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java?rev=891421&view=auto
==============================================================================
---
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
(added)
+++
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
Wed Dec 16 20:47:25 2009
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.impl;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.resources.Resource;
+import org.apache.felix.dm.service.Service;
+import org.osgi.framework.ServiceReference;
+
+public abstract class AbstractDecorator {
+ protected volatile DependencyManager m_manager;
+ private final Map m_services = new HashMap();
+
+ public abstract Service createService(Object[] properties);
+
+ // callbacks for resources
+ public void added(Resource resource) {
+ Service newService = createService(new Object[] { resource });
+ m_services.put(resource, newService);
+ m_manager.add(newService);
+ }
+
+ public void removed(Resource resource) {
+ Service newService = (Service) m_services.remove(resource);
+ if (newService == null) {
+ System.out.println("Service should not be null here, dumping
stack.");
+ Thread.dumpStack();
+ }
+ else {
+ m_manager.remove(newService);
+ }
+ }
+
+ // callbacks for services
+ public void added(ServiceReference ref, Object service) {
+ Service newService = createService(new Object[] { ref, service });
+ m_services.put(ref, newService);
+ m_manager.add(newService);
+ }
+
+ public void removed(ServiceReference ref, Object service) {
+ Service newService = (Service) m_services.remove(ref);
+ if (newService == null) {
+ System.out.println("Service should not be null here, dumping
stack.");
+ Thread.dumpStack();
+ }
+ else {
+ m_manager.remove(newService);
+ }
+ }
+
+ public void stop() {
+ Iterator i = m_services.values().iterator();
+ while (i.hasNext()) {
+ m_manager.remove((Service) i.next());
+ }
+ m_services.clear();
+ }
+}
Modified:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterImpl.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterImpl.java?rev=891421&r1=891420&r2=891421&view=diff
==============================================================================
---
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterImpl.java
(original)
+++
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterImpl.java
Wed Dec 16 20:47:25 2009
@@ -18,43 +18,71 @@
*/
package org.apache.felix.dm.impl;
-import java.util.List;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Properties;
-import org.apache.felix.dm.DependencyManager;
import org.apache.felix.dm.service.Service;
import org.osgi.framework.ServiceReference;
-public class AdapterImpl {
- private volatile DependencyManager m_manager;
+public class AdapterImpl extends AbstractDecorator {
private volatile Service m_service;
- private final Class m_iface;
- private final Class m_iface2;
- private final Class m_impl;
+ private final Class m_serviceInterface;
+ private final String m_serviceFilter;
+ private final Object m_adapterImplementation;
+ private final Object m_adapterInterface;
+ private final Dictionary m_adapterProperties;
- // TODO adapts a "dependency" ... making it sort of a decorator factory
- public AdapterImpl(Class iface, Class iface2, Class impl) {
- m_iface = iface;
- m_iface2 = iface2;
- m_impl = impl;
- }
-
- public void added(ServiceReference ref, Object service) {
- // TODO decorator be smarter:
-
- // get any "global" dependencies
- List dependencies = m_service.getDependencies();
+ public AdapterImpl(Class serviceInterface, String serviceFilter, Object
adapterImplementation, String adapterInterface, Dictionary adapterProperties) {
+ m_serviceInterface = serviceInterface;
+ m_serviceFilter = serviceFilter;
+ m_adapterImplementation = adapterImplementation;
+ m_adapterInterface = adapterInterface;
+ m_adapterProperties = adapterProperties;
+ }
- m_manager.add(m_manager.createService()
- .setInterface(m_iface2.getName(), null)
- .setImplementation(m_impl)
- .add(dependencies)
- .add(m_manager.createServiceDependency()
- .setService(m_iface, ref)
- .setRequired(true)
- )
- );
- }
-
- public void removed(ServiceReference ref, Object service) {
+ public AdapterImpl(Class serviceInterface, String serviceFilter, Object
adapterImplementation, String[] adapterInterfaces, Dictionary
adapterProperties) {
+ m_serviceInterface = serviceInterface;
+ m_serviceFilter = serviceFilter;
+ m_adapterImplementation = adapterImplementation;
+ m_adapterInterface = adapterInterfaces;
+ m_adapterProperties = adapterProperties;
+ }
+
+ public Service createService(Object[] properties) {
+ ServiceReference ref = (ServiceReference) properties[0];
+ Object service = properties[1];
+ Properties props = new Properties();
+ String[] keys = ref.getPropertyKeys();
+ for (int i = 0; i < keys.length; i++) {
+ props.put(keys[i], ref.getProperty(keys[i]));
+ }
+ if (m_adapterProperties != null) {
+ Enumeration e = m_adapterProperties.keys();
+ while (e.hasMoreElements()) {
+ Object key = e.nextElement();
+ props.put(key, m_adapterProperties.get(key));
+ }
+ }
+ if (m_adapterInterface instanceof String) {
+ return m_manager.createService()
+ .setInterface((String) m_adapterInterface, props)
+ .setImplementation(m_adapterImplementation)
+ .add(m_service.getDependencies())
+ .add(m_manager.createServiceDependency()
+ .setService(m_serviceInterface, ref)
+ .setRequired(true)
+ );
+ }
+ else {
+ return m_manager.createService()
+ .setInterface((String[]) m_adapterInterface, props)
+ .setImplementation(m_adapterImplementation)
+ .add(m_service.getDependencies())
+ .add(m_manager.createServiceDependency()
+ .setService(m_serviceInterface, ref)
+ .setRequired(true)
+ );
+ }
}
}
Modified:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectImpl.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectImpl.java?rev=891421&r1=891420&r2=891421&view=diff
==============================================================================
---
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectImpl.java
(original)
+++
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectImpl.java
Wed Dec 16 20:47:25 2009
@@ -1,23 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
package org.apache.felix.dm.impl;
import java.util.Dictionary;
import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
import java.util.Properties;
-import org.apache.felix.dm.DependencyManager;
import org.apache.felix.dm.service.Service;
import org.osgi.framework.ServiceReference;
-public class AspectImpl {
- private volatile DependencyManager m_manager;
+public class AspectImpl extends AbstractDecorator {
private volatile Service m_service;
private final Class m_serviceInterface;
private final String m_serviceFilter;
private final Object m_aspectImplementation;
- private final Map m_services = new HashMap();
private final Dictionary m_aspectProperties;
public AspectImpl(Class serviceInterface, String serviceFilter, Object
aspectImplementation, Dictionary properties) {
@@ -27,46 +39,27 @@
m_aspectProperties = properties;
}
- public void added(ServiceReference ref, Object service) {
- Properties props = new Properties();
- String[] keys = ref.getPropertyKeys();
- for (int i = 0; i < keys.length; i++) {
- props.put(keys[i], ref.getProperty(keys[i]));
- }
- Enumeration e = m_aspectProperties.keys();
- while (e.hasMoreElements()) {
- Object key = e.nextElement();
- props.put(key, m_aspectProperties.get(key));
+ public Service createService(Object[] properties) {
+ ServiceReference ref = (ServiceReference) properties[0];
+ Object service = properties[1];
+ Properties props = new Properties();
+ String[] keys = ref.getPropertyKeys();
+ for (int i = 0; i < keys.length; i++) {
+ props.put(keys[i], ref.getProperty(keys[i]));
}
-
- Service newService = m_manager.createService()
- .setInterface(m_serviceInterface.getName(), props)
- .setImplementation(m_aspectImplementation)
- .add(m_service.getDependencies())
- .add(m_manager.createServiceDependency()
- .setService(m_serviceInterface, ref)
- .setRequired(true)
- );
- m_services.put(ref, newService);
- m_manager.add(newService);
- }
-
- public void removed(ServiceReference ref, Object service) {
- Service newService = (Service) m_services.remove(ref);
- if (newService == null) {
- System.out.println("Service should not be null here,
dumping stack.");
- Thread.dumpStack();
- }
- else {
- m_manager.remove(newService);
- }
- }
-
- public void stop() {
- Iterator i = m_services.values().iterator();
- while (i.hasNext()) {
- m_manager.remove((Service) i.next());
+ if (m_aspectProperties != null) {
+ Enumeration e = m_aspectProperties.keys();
+ while (e.hasMoreElements()) {
+ Object key = e.nextElement();
+ props.put(key, m_aspectProperties.get(key));
+ }
}
- m_services.clear();
+ return m_manager.createService()
+ .setInterface(m_serviceInterface.getName(), props)
+ .setImplementation(m_aspectImplementation)
+ .add(m_service.getDependencies())
+ .add(m_manager.createServiceDependency()
+ .setService(m_serviceInterface, ref)
+ .setRequired(true));
}
}
Modified:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterImpl.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterImpl.java?rev=891421&r1=891420&r2=891421&view=diff
==============================================================================
---
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterImpl.java
(original)
+++
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ResourceAdapterImpl.java
Wed Dec 16 20:47:25 2009
@@ -18,33 +18,68 @@
*/
package org.apache.felix.dm.impl;
-import org.apache.felix.dm.DependencyManager;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Properties;
+
import org.apache.felix.dm.resources.Resource;
+import org.apache.felix.dm.service.Service;
-public class ResourceAdapterImpl {
- private volatile DependencyManager m_manager;
- private final Object m_impl;
- private final Class m_iface;
+public class ResourceAdapterImpl extends AbstractDecorator {
+ private volatile Service m_service;
+ private final String m_resourceFilter;
+ private final Object m_adapterImplementation;
+ private final Object m_adapterInterface;
+ private final Dictionary m_adapterProperties;
private final boolean m_propagate;
- public ResourceAdapterImpl(Object impl, Class iface, boolean propagate)
{
- m_impl = impl;
- m_iface = iface;
- m_propagate = propagate;
- }
-
- public void added(Resource resource) {
- m_manager.add(m_manager.createService()
- .setInterface(m_iface.getName(), null)
- .setImplementation(m_impl)
- .add(m_manager.createResourceDependency()
- .setResource(resource)
- .setRequired(true)
- .setPropagate(m_propagate)
- )
- );
- }
+ public ResourceAdapterImpl(String resourceFilter, Object
adapterImplementation, String adapterInterface, Dictionary adapterProperties,
boolean propagate) {
+ m_resourceFilter = resourceFilter;
+ m_adapterImplementation = adapterImplementation;
+ m_adapterInterface = adapterInterface;
+ m_adapterProperties = adapterProperties;
+ m_propagate = propagate;
+ }
+
+ public ResourceAdapterImpl(String resourceFilter, Object
adapterImplementation, String[] adapterInterfaces, Dictionary
adapterProperties, boolean propagate) {
+ m_resourceFilter = resourceFilter;
+ m_adapterImplementation = adapterImplementation;
+ m_adapterInterface = adapterInterfaces;
+ m_adapterProperties = adapterProperties;
+ m_propagate = propagate;
+ }
- public void removed(Resource resource) {
- }
+ public Service createService(Object[] properties) {
+ Resource resource = (Resource) properties[0];
+ Properties props = new Properties();
+ if (m_adapterProperties != null) {
+ Enumeration e = m_adapterProperties.keys();
+ while (e.hasMoreElements()) {
+ Object key = e.nextElement();
+ props.put(key, m_adapterProperties.get(key));
+ }
+ }
+ if (m_adapterInterface instanceof String) {
+ return m_manager.createService()
+ .setInterface((String) m_adapterInterface, props)
+ .setImplementation(m_adapterImplementation)
+ .add(m_service.getDependencies())
+ .add(m_manager.createResourceDependency()
+ .setResource(resource)
+ .setPropagate(m_propagate)
+ .setRequired(true)
+ );
+ }
+ else {
+ return m_manager.createService()
+ .setInterface((String[]) m_adapterInterface, props)
+ .setImplementation(m_adapterImplementation)
+ .add(m_service.getDependencies())
+ .add(m_manager.createResourceDependency()
+ .setResource(resource)
+ .setPropagate(m_propagate)
+ .setRequired(true)
+ );
+ }
+ }
}