Author: pderop
Date: Mon Jan 11 21:52:47 2016
New Revision: 1724135

URL: http://svn.apache.org/viewvc?rev=1724135&view=rev
Log:
FELIX-5164: Add support for callback instance in Aspects.

Modified:
    
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyActivatorBase.java
    
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyManager.java
    
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/AspectServiceImpl.java

Modified: 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyActivatorBase.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyActivatorBase.java?rev=1724135&r1=1724134&r2=1724135&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyActivatorBase.java
 (original)
+++ 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyActivatorBase.java
 Mon Jan 11 21:52:47 2016
@@ -222,6 +222,16 @@ public abstract class DependencyActivato
     }
        
     /**
+     * Creates a new aspect service.
+     * 
+     * @return the aspect service
+     * @see DependencyManager#createAspectService(Class, String, int, Object, 
String, String, String, String)
+     */
+    public Component createAspectService(Class<?> serviceInterface, String 
serviceFilter, int ranking, Object callbackInstance, String add, String change, 
String remove, String swap) {    
+        return m_manager.createAspectService(serviceInterface, serviceFilter, 
ranking, callbackInstance, add, change, remove, swap);
+    }
+        
+    /**
      * Creates a new adapter service.
      * 
      * @return the adapter service

Modified: 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyManager.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyManager.java?rev=1724135&r1=1724134&r2=1724135&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyManager.java
 (original)
+++ 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/DependencyManager.java
 Mon Jan 11 21:52:47 2016
@@ -638,7 +638,7 @@ public class DependencyManager {
      * @return a service that acts as a factory for generating aspects
      */
     public Component createAspectService(Class<?> serviceInterface, String 
serviceFilter, int ranking, String autoConfig) {
-        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, autoConfig, null, null, null, null);
+        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, autoConfig, null, null, null, null, null);
     }
 
     /**
@@ -664,7 +664,7 @@ public class DependencyManager {
      * @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, null);
+        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, null, null, null, null, null, null);
     }
 
     /**
@@ -695,7 +695,7 @@ public class DependencyManager {
     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, null);
+        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, null, null, add, change, remove, null);
     }
 
     /**
@@ -727,7 +727,40 @@ public class DependencyManager {
     public Component createAspectService(Class<?> serviceInterface, String 
serviceFilter, int ranking, String add,
         String change, String remove, String swap)
     {
-        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, null, add, change, remove, swap);
+        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, null, null, add, change, remove, swap);
+    }
+
+    /**
+     * 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 callbackInstance the instance to invoke the callbacks on, or 
null if the callbacks have to be invoked on the aspect itself
+     * @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
+     * @param swap name of the callback method to invoke on swap
+     * @return a service that acts as a factory for generating aspects
+     */
+    public Component createAspectService(Class<?> serviceInterface, String 
serviceFilter, int ranking, Object callbackInstance, 
+        String add, String change, String remove, String swap)        
+    {
+        return new AspectServiceImpl(this, serviceInterface, serviceFilter, 
ranking, null, callbackInstance, add, change, remove, swap);
     }
 
     /**

Modified: 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/AspectServiceImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/AspectServiceImpl.java?rev=1724135&r1=1724134&r2=1724135&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/AspectServiceImpl.java
 (original)
+++ 
felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/AspectServiceImpl.java
 Mon Jan 11 21:52:47 2016
@@ -43,15 +43,17 @@ public class AspectServiceImpl extends F
        private final String m_change;
        private final String m_remove;
        private final String m_swap;
-       private int m_ranking;
+       private final int m_ranking;
+    private final Object m_dependencyCallbackInstance;
 
-       public AspectServiceImpl(DependencyManager dm, Class<?> 
aspectInterface, String aspectFilter, int ranking, String autoConfig, String 
add, String change, String remove, String swap) {
+       public AspectServiceImpl(DependencyManager dm, Class<?> 
aspectInterface, String aspectFilter, int ranking, String autoConfig, Object 
callbackInstance, String add, String change, String remove, String swap) {
                super(dm.createComponent());
-               this.m_ranking = ranking;
-               this.m_add = add;
-               this.m_change = change;
-               this.m_remove = remove;
-               this.m_swap = swap;
+               m_ranking = ranking;
+               m_add = add;
+               m_change = change;
+               m_remove = remove;
+               m_swap = swap;
+               m_dependencyCallbackInstance = callbackInstance;
                
                m_component.setImplementation(new AspectImpl(aspectInterface, 
autoConfig))
                        .add(dm.createServiceDependency()
@@ -208,6 +210,10 @@ public class AspectServiceImpl extends F
             m_aspectDependency = (ServiceDependencyImpl) aspectDependency;
             m_originalServiceRef = originalServiceRef;
         }
+        
+        private Object[] getDependencyCallbackInstance() {
+            return m_dependencyCallbackInstance == null ? 
m_aspectDependency.getComponentContext().getInstances() : new Object[] { 
m_dependencyCallbackInstance };
+        }
 
         @SuppressWarnings("unused")
                private void addAspect(Component c, ServiceReference ref, 
Object service) {
@@ -215,7 +221,7 @@ public class AspectServiceImpl extends F
                
                // Invoke is done on dependency.getInstances() which 
unfortunately returns this callback instance...
                ServiceEventImpl event = new ServiceEventImpl(ref, service);
-               m_aspectDependency.invoke(m_add, event, 
m_aspectDependency.getComponentContext().getInstances());
+               m_aspectDependency.invoke(m_add, event, 
getDependencyCallbackInstance());
         }
 
         @SuppressWarnings("unused")
@@ -223,7 +229,7 @@ public class AspectServiceImpl extends F
             // Invoke "change" service dependency callback
             if (m_change != null) {
                ServiceEventImpl event = new ServiceEventImpl(ref, service);
-                m_aspectDependency.invoke(m_change, event, 
m_aspectDependency.getComponentContext().getInstances());
+                m_aspectDependency.invoke(m_change, event, 
getDependencyCallbackInstance());
             }
             // Propagate change to immediate higher aspect, or to client using 
our aspect.
             // We always propagate our own properties, and the ones from the 
original service, but we don't inherit
@@ -236,7 +242,7 @@ public class AspectServiceImpl extends F
                private void removeAspect(Component c, ServiceReference ref, 
Object service) {
             // Just forward "remove" service dependency callback.
                ServiceEventImpl event = new ServiceEventImpl(ref, service);
-               m_aspectDependency.invoke(m_remove, event, 
m_aspectDependency.getComponentContext().getInstances());
+               m_aspectDependency.invoke(m_remove, event, 
getDependencyCallbackInstance());
         }
 
         @SuppressWarnings("unused")
@@ -244,7 +250,7 @@ public class AspectServiceImpl extends F
                                 Object curr) {
                Object[] instances = 
m_aspectDependency.getComponentContext().getInstances();                        
   
             // Just forward "swap" service dependency callback.
-               m_aspectDependency.invokeSwap(m_swap, prevRef, prev, currRef, 
curr, m_aspectDependency.getComponentContext().getInstances());
+               m_aspectDependency.invokeSwap(m_swap, prevRef, prev, currRef, 
curr, getDependencyCallbackInstance());
         }
         
         @Override


Reply via email to