Author: marrs
Date: Wed Mar  9 10:03:35 2011
New Revision: 1079720

URL: http://svn.apache.org/viewvc?rev=1079720&view=rev
Log:
Aligned the aspect and adapter features. Added support for callback methods. 
Updated the documentation.

Modified:
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
    
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/AdapterServiceImpl.java
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java

Modified: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java?rev=1079720&r1=1079719&r2=1079720&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
 (original)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
 Wed Mar  9 10:03:35 2011
@@ -189,19 +189,61 @@ public abstract class DependencyActivato
      * Creates a new aspect service.
      * 
      * @return the aspect service
+     * @see DependencyManager#createAspectService(Class, String, int, String)
      */
     public Component createAspectService(Class serviceInterface, String 
serviceFilter, int ranking, String attributeName) {
         return m_manager.createAspectService(serviceInterface, serviceFilter, 
ranking, attributeName);
     }
+    
+    /**
+     * Creates a new aspect service.
+     * 
+     * @return the aspect service
+     * @see DependencyManager#createAspectService(Class, String, int)
+     */
+    public Component createAspectService(Class serviceInterface, String 
serviceFilter, int ranking) {
+        return m_manager.createAspectService(serviceInterface, serviceFilter, 
ranking);
+    }
+    
+    /**
+     * Creates a new aspect service.
+     * 
+     * @return the aspect service
+     * @see DependencyManager#createAspectService(Class, String, int, String, 
String, String)
+     */
+    public Component createAspectService(Class serviceInterface, String 
serviceFilter, int ranking, String add, String change, String remove) {
+        return m_manager.createAspectService(serviceInterface, serviceFilter, 
ranking, add, change, remove);
+    }
 
     /**
      * Creates a new adapter service.
      * 
      * @return the adapter service
+     * @see DependencyManager#createAdapterService(Class, String)
      */
     public Component createAdapterService(Class serviceInterface, String 
serviceFilter) {
         return m_manager.createAdapterService(serviceInterface, serviceFilter);
     }
+    
+    /**
+     * Creates a new adapter service.
+     * 
+     * @return the adapter service
+     * @see DependencyManager#createAdapterService(Class, String, String)
+     */
+    public Component createAdapterService(Class serviceInterface, String 
serviceFilter, String autoConfig) {
+        return m_manager.createAdapterService(serviceInterface, serviceFilter, 
autoConfig);
+    }
+    
+    /**
+     * Creates a new adapter service.
+     * 
+     * @return the adapter service
+     * @see DependencyManager#createAdapterService(Class, String, String, 
String, String)
+     */
+    public Component createAdapterService(Class serviceInterface, String 
serviceFilter, String add, String change, String remove) {
+        return m_manager.createAdapterService(serviceInterface, serviceFilter, 
add, change, remove);
+    }
 
     /**
      * Creates a new resource adapter service.

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=1079720&r1=1079719&r2=1079720&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 Mar  9 10:03:35 2011
@@ -167,20 +167,73 @@ public class DependencyManager {
      * <h3>Usage Example</h3>
      * 
      * <blockquote><pre>
-     *  manager.createAspectService(ExistingService.class, "(foo=bar)", 10, 
"m_aspect")
-     *         .setImplementation(ExistingServiceAspect.class)
-     *         .setServiceProperties(new Hashtable() {{ put("additional", 
"properties"); }});
+     * manager.createAspectService(ExistingService.class, "(foo=bar)", 10, 
"m_service")
+     *     .setImplementation(ExistingServiceAspect.class)
+     * );
      * </pre></blockquote>
      * 
      * @param serviceInterface the service interface to apply the aspect to
      * @param serviceFilter the filter condition to use with the service 
interface
      * @param ranking the level used to organize the aspect chain ordering
-     * @param attributeName the aspect implementation field name where to 
inject original service. 
+     * @param autoConfig the aspect implementation field name where to inject 
original service. 
      *     If null, any field matching the original service will be injected.
      * @return a service that acts as a factory for generating aspects
      */
-    public Component createAspectService(Class serviceInterface, String 
serviceFilter, int ranking, String attributeName) {
-        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, attributeName);
+    public Component createAspectService(Class serviceInterface, String 
serviceFilter, int ranking, String autoConfig) {
+        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, autoConfig, null, null, null);
+    }
+    /**
+     * Creates a new aspect. The aspect will be applied to any service that
+     * matches the specified interface and filter. For each matching service
+     * an aspect will be created based on the aspect implementation class.
+     * The aspect will be registered with the same interface and properties
+     * as the original service, plus any extra properties you supply here.
+     * It will also inherit all dependencies, and if you declare the original
+     * service as a member it will be injected.
+     * 
+     * <h3>Usage Example</h3>
+     * 
+     * <blockquote><pre>
+     * manager.createAspectService(ExistingService.class, "(foo=bar)", 10)
+     *     .setImplementation(ExistingServiceAspect.class)
+     * );
+     * </pre></blockquote>
+     * 
+     * @param serviceInterface the service interface to apply the aspect to
+     * @param serviceFilter the filter condition to use with the service 
interface
+     * @param ranking the level used to organize the aspect chain ordering
+     * @return a service that acts as a factory for generating aspects
+     */
+    public Component createAspectService(Class serviceInterface, String 
serviceFilter, int ranking) {
+        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, null, null, null, null);
+    }
+    /**
+     * Creates a new aspect. The aspect will be applied to any service that
+     * matches the specified interface and filter. For each matching service
+     * an aspect will be created based on the aspect implementation class.
+     * The aspect will be registered with the same interface and properties
+     * as the original service, plus any extra properties you supply here.
+     * It will also inherit all dependencies, and if you declare the original
+     * service as a member it will be injected.
+     * 
+     * <h3>Usage Example</h3>
+     * 
+     * <blockquote><pre>
+     * manager.createAspectService(ExistingService.class, "(foo=bar)", 10, 
"add", "change", "remove")
+     *     .setImplementation(ExistingServiceAspect.class)
+     * );
+     * </pre></blockquote>
+     * 
+     * @param serviceInterface the service interface to apply the aspect to
+     * @param serviceFilter the filter condition to use with the service 
interface
+     * @param ranking the level used to organize the aspect chain ordering
+     * @param add name of the callback method to invoke on add
+     * @param change name of the callback method to invoke on change
+     * @param remove name of the callback method to invoke on remove
+     * @return a service that acts as a factory for generating aspects
+     */
+    public Component createAspectService(Class serviceInterface, String 
serviceFilter, int ranking, String add, String change, String remove) {
+        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, null, add, change, remove);
     }
     
     /**
@@ -195,18 +248,69 @@ public class DependencyManager {
      * <h3>Usage Example</h3>
      * 
      * <blockquote><pre>
-     *  manager.createAdapterService(AdapteeService.class, "(foo=bar)")
-     *         // The interface to use when registering adapter
-     *         .setInterface(AdapterService.class, new Hashtable() {{ 
put("additional", "properties"); }})
-     *         // the implementation of the adapter
-     *         .setImplementation(AdapterImpl.class);
+     * manager.createAdapterService(AdapteeService.class, "(foo=bar)")
+     *     .setInterface(AdapterService.class, new Hashtable() {{ put("extra", 
"property"); }})
+     *     .setImplementation(AdapterImpl.class);
      * </pre></blockquote>
+     * 
      * @param serviceInterface the service interface to apply the adapter to
      * @param serviceFilter the filter condition to use with the service 
interface
      * @return a service that acts as a factory for generating adapters
      */
     public Component createAdapterService(Class serviceInterface, String 
serviceFilter) {
-        return new AdapterServiceImpl(this, serviceInterface, serviceFilter);
+        return new AdapterServiceImpl(this, serviceInterface, serviceFilter, 
null, null, null, null);
+    }
+    /**
+     * Creates a new adapter. The adapter will be applied to any service that
+     * matches the specified interface and filter. For each matching service
+     * an adapter will be created based on the adapter implementation class.
+     * The adapter will be registered with the specified interface and 
existing properties
+     * from the original service plus any extra properties you supply here.
+     * It will also inherit all dependencies, and if you declare the original
+     * service as a member it will be injected.
+     * 
+     * <h3>Usage Example</h3>
+     * 
+     * <blockquote><pre>
+     * manager.createAdapterService(AdapteeService.class, "(foo=bar)", 
"m_service")
+     *     .setInterface(AdapterService.class, new Hashtable() {{ put("extra", 
"property"); }})
+     *     .setImplementation(AdapterImpl.class);
+     * </pre></blockquote>
+     * 
+     * @param serviceInterface the service interface to apply the adapter to
+     * @param serviceFilter the filter condition to use with the service 
interface
+     * @param autoConfig the name of the member to inject the service into
+     * @return a service that acts as a factory for generating adapters
+     */
+    public Component createAdapterService(Class serviceInterface, String 
serviceFilter, String autoConfig) {
+        return new AdapterServiceImpl(this, serviceInterface, serviceFilter, 
autoConfig, null, null, null);
+    }
+    /**
+     * Creates a new adapter. The adapter will be applied to any service that
+     * matches the specified interface and filter. For each matching service
+     * an adapter will be created based on the adapter implementation class.
+     * The adapter will be registered with the specified interface and 
existing properties
+     * from the original service plus any extra properties you supply here.
+     * It will also inherit all dependencies, and if you declare the original
+     * service as a member it will be injected.
+     * 
+     * <h3>Usage Example</h3>
+     * 
+     * <blockquote><pre>
+     * manager.createAdapterService(AdapteeService.class, "(foo=bar)", "add", 
"change", "remove")
+     *     .setInterface(AdapterService.class, new Hashtable() {{ put("extra", 
"property"); }})
+     *     .setImplementation(AdapterImpl.class);
+     * </pre></blockquote>
+     * 
+     * @param serviceInterface the service interface to apply the adapter to
+     * @param serviceFilter the filter condition to use with the service 
interface
+     * @param add name of the callback method to invoke on add
+     * @param change name of the callback method to invoke on change
+     * @param remove name of the callback method to invoke on remove
+     * @return a service that acts as a factory for generating adapters
+     */
+    public Component createAdapterService(Class serviceInterface, String 
serviceFilter, String add, String change, String remove) {
+        return new AdapterServiceImpl(this, serviceInterface, serviceFilter, 
null, add, change, remove);
     }
         
     /**

Modified: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java?rev=1079720&r1=1079719&r2=1079720&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
 (original)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
 Wed Mar  9 10:03:35 2011
@@ -25,6 +25,7 @@ import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ComponentStateListener;
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.ServiceDependency;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
@@ -36,14 +37,18 @@ public class AdapterServiceImpl extends 
 {
     /**
      * Creates a new Adapter Service implementation.
+     * 
      * @param dm the dependency manager used to create our internal adapter 
service
      * @param adapteeInterface the service interface to apply the adapter to
      * @param adapteeFilter the filter condition to use with the service 
interface
+     * @param add
+     * @param change
+     * @param remove
      */
-    public AdapterServiceImpl(DependencyManager dm, Class adapteeInterface, 
String adapteeFilter)
+    public AdapterServiceImpl(DependencyManager dm, Class adapteeInterface, 
String adapteeFilter, String autoConfig, String add, String change, String 
remove)
     {
         super(dm.createComponent()); // This service will be filtered by our 
super class, allowing us to take control.
-        m_service.setImplementation(new AdapterImpl(adapteeInterface, 
adapteeFilter))
+        m_service.setImplementation(new AdapterImpl(adapteeInterface, 
adapteeFilter, autoConfig, add, change, remove))
                  .add(dm.createServiceDependency()
                       .setService(adapteeInterface, adapteeFilter)
                       .setAutoConfig(false)
@@ -53,10 +58,18 @@ public class AdapterServiceImpl extends 
     public class AdapterImpl extends AbstractDecorator {
         private final Class m_adapteeInterface;
         private final String m_adapteeFilter;
+        private final String m_add;
+        private final String m_change;
+        private final String m_remove;
+        private final String m_autoConfig;
         
-        public AdapterImpl(Class adapteeInterface, String adapteeFilter) {
+        public AdapterImpl(Class adapteeInterface, String adapteeFilter, 
String autoConfig, String add, String change, String remove) {
             m_adapteeInterface = adapteeInterface;
             m_adapteeFilter = adapteeFilter;
+            m_autoConfig = autoConfig;
+            m_add = add;
+            m_change = change;
+            m_remove = remove;
         }
         
         public Component createService(Object[] properties) {
@@ -81,15 +94,23 @@ public class AdapterServiceImpl extends 
             }
             List dependencies = m_service.getDependencies();
             dependencies.remove(0);
+            ServiceDependency dependency = m_manager.createServiceDependency()
+                 .setService(m_adapteeInterface, ref)
+                 .setRequired(true);
+            if (m_autoConfig != null) {
+                dependency.setAutoConfig(m_autoConfig);
+            }
+            if (m_add != null || m_change != null || m_remove != null) {
+                dependency.setCallbacks(m_add, m_change, m_remove);
+            }
+            
             Component service = m_manager.createComponent()
                 .setInterface(m_serviceInterfaces, props)
                 .setImplementation(m_serviceImpl)
                 .setFactory(m_factory, m_factoryCreateMethod) // if not set, 
no effect
                 .setComposition(m_compositionInstance, m_compositionMethod) // 
if not set, no effect
                 .setCallbacks(m_callbackObject, m_init, m_start, m_stop, 
m_destroy) // if not set, no effect
-                .add(m_manager.createServiceDependency()
-                     .setService(m_adapteeInterface, ref)
-                     .setRequired(true));
+                .add(dependency);
             
             configureAutoConfigState(service, m_service);
             

Modified: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java?rev=1079720&r1=1079719&r2=1079720&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
 (original)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
 Wed Mar  9 10:03:35 2011
@@ -23,11 +23,11 @@ import java.util.Enumeration;
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.ComponentStateListener;
 import org.apache.felix.dm.Dependency;
 import org.apache.felix.dm.DependencyManager;
-import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ServiceDependency;
-import org.apache.felix.dm.ComponentStateListener;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
@@ -36,10 +36,10 @@ import org.osgi.framework.ServiceReferen
  * some Service methods for configuring actual aspect service implementation.
  */
 public class AspectServiceImpl extends FilterService {
-    public AspectServiceImpl(DependencyManager dm, Class aspectInterface, 
String aspectFilter, int ranking, String autoConfig)
+    public AspectServiceImpl(DependencyManager dm, Class aspectInterface, 
String aspectFilter, int ranking, String autoConfig, String add, String change, 
String remove)
     { 
         super(dm.createComponent()); // This service will be filtered by our 
super class, allowing us to take control.
-        m_service.setImplementation(new AspectImpl(aspectInterface, 
aspectFilter, ranking, autoConfig))
+        m_service.setImplementation(new AspectImpl(aspectInterface, 
aspectFilter, ranking, autoConfig, add, change, remove))
              .add(dm.createServiceDependency()
                   .setService(aspectInterface, 
createDependencyFilterForAspect(aspectFilter))
                   .setAutoConfig(false)
@@ -64,13 +64,19 @@ public class AspectServiceImpl extends F
         private final Class m_aspectInterface; // the service decorated by 
this aspect
         private final String m_aspectFilter; // the service filter decorated 
by this aspect
         private final int m_ranking; // the aspect ranking
-        private final String m_field; // the aspect impl field name where to 
inject decorated service
+        private final String m_autoConfig; // the aspect impl field name where 
to inject decorated service
+        private final String m_add;
+        private final String m_change;
+        private final String m_remove;
       
-        public AspectImpl(Class aspectInterface, String aspectFilter, int 
ranking, String field) {
+        public AspectImpl(Class aspectInterface, String aspectFilter, int 
ranking, String autoConfig, String add, String change, String remove) {
             m_aspectInterface = aspectInterface;
             m_aspectFilter = aspectFilter;
             m_ranking = ranking;
-            m_field = field;
+            m_autoConfig = autoConfig;
+            m_add = add;
+            m_change = change;
+            m_remove = remove;
         }
         
         public Component createService(Object[] params) {
@@ -80,13 +86,21 @@ public class AspectServiceImpl extends F
             // replace it with one that points to the specific service that 
just was passed in
             Properties serviceProperties = getServiceProperties(params);
             String[] serviceInterfaces = getServiceInterfaces();
+            ServiceReference ref = (ServiceReference) params[0];
+            ServiceDependency dependency = 
m_manager.createServiceDependency().setService(m_aspectInterface, 
createAspectFilter(ref)).setRequired(true);
+            if (m_autoConfig != null) {
+                dependency.setAutoConfig(m_autoConfig);
+            }
+            if (m_add != null || m_change != null || m_remove != null) {
+                dependency.setCallbacks(m_add, m_change, m_remove);
+            }
             Component service = m_manager.createComponent()
                 .setInterface(serviceInterfaces, serviceProperties)
                 .setImplementation(m_serviceImpl)
                 .setFactory(m_factory, m_factoryCreateMethod) // if not set, 
no effect
                 .setComposition(m_compositionInstance, m_compositionMethod) // 
if not set, no effect
                 .setCallbacks(m_callbackObject, m_init, m_start, m_stop, 
m_destroy) // if not set, no effect
-                .add(getAspectDependency(params));
+                .add(dependency);
             
             configureAutoConfigState(service, m_service);
             
@@ -142,15 +156,6 @@ public class AspectServiceImpl extends F
             return (String[]) serviceNames.toArray(new 
String[serviceNames.size()]);
         }
 
-        private Dependency getAspectDependency(Object[] params) {
-            ServiceReference ref = (ServiceReference) params[0];
-            ServiceDependency sd = 
m_manager.createServiceDependency().setService(m_aspectInterface, 
createAspectFilter(ref)).setRequired(true);
-            if (m_field != null) {
-                sd.setAutoConfig(m_field);
-            }
-            return sd;
-        }
-
         private String createAspectFilter(ServiceReference ref) {
             Long sid = (Long) ref.getProperty(Constants.SERVICE_ID);
             return "(&(|(!(" + Constants.SERVICE_RANKING + "=*))(" + 
Constants.SERVICE_RANKING + "<=" + (m_ranking - 1) + "))(|(" + 
Constants.SERVICE_ID + "=" + sid + ")(" + DependencyManager.ASPECT + "=" + sid 
+ ")))";


Reply via email to