Author: pderop
Date: Fri Dec 18 23:01:19 2015
New Revision: 1720852

URL: http://svn.apache.org/viewvc?rev=1720852&view=rev
Log:
Refactored ServiceCallbacksBuilderImpl.

Modified:
    felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/index.xml
    felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/index.xml.sha
    
felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/org.apache.felix.dependencymanager/org.apache.felix.dependencymanager-4.2.0.jar
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/AdapterBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AspectBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
    
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java

Modified: felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/index.xml
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/index.xml?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
Binary files - no diff available.

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/index.xml.sha
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/index.xml.sha?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/index.xml.sha 
(original)
+++ felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/index.xml.sha 
Fri Dec 18 23:01:19 2015
@@ -1 +1 @@
-da2de91945175981f9ea267ec3103b5c37c64dd43cdd4201fb9f8cb5f0e4477d
\ No newline at end of file
+32c13ed9948f7e16d70860f5335063cef506408c7684c9460b25a7265a23095d
\ No newline at end of file

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/org.apache.felix.dependencymanager/org.apache.felix.dependencymanager-4.2.0.jar
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/cnf/localrepo/org.apache.felix.dependencymanager/org.apache.felix.dependencymanager-4.2.0.jar?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
Binary files - no diff available.

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/AdapterBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/AdapterBuilder.java?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/AdapterBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/AdapterBuilder.java
 Fri Dec 18 23:01:19 2015
@@ -20,5 +20,4 @@ public interface AdapterBuilder<T> exten
     AdapterBuilder<T> filter(String adapteeFilter);
     AdapterBuilder<T> propagate();
     AdapterBuilder<T> propagate(boolean propagate);
-    AdapterBuilder<T> inject(String field);        
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/BundleDependencyBuilder.java
 Fri Dec 18 23:01:19 2015
@@ -76,7 +76,7 @@ public interface BundleDependencyBuilder
     public BundleDependencyBuilder onRemove(String callback);
 
     /**
-     * Sets the callbacks for this dependency. These callbacks can be used as 
hooks whenever a dependency is added, changed or
+     * Sets the callbacks for this dependency. These callbacks can be used as 
hooks whenever a dependency is added or
      * removed. When you specify callbacks, the auto configuration feature is 
automatically turned off, because we're assuming
      * you don't need it in this case.
      * 

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceCallbacksBuilder.java
 Fri Dec 18 23:01:19 2015
@@ -268,6 +268,97 @@ public interface ServiceCallbacksBuilder
        void call(I instance, Dictionary<String, Object> oldProps, T old, 
Dictionary<String, Object> replaceProps, T replace); 
     }
 
+       /**
+        * Injects this dependency in all fields matching the dependency type.
+        * @return this builder
+        */
+       B autoConfig();
+       
+       /**
+        * Configures whether or not the dependency can be injected in all 
fields matching the dependency type. 
+        * @param autoConfig true if the dependency can be injected in all 
fields matching the dependency type
+        * @return this builder
+        */
+    B autoConfig(boolean autoConfig);
+    
+    /**
+     * Injects this dependency on the field with the given name
+     * @param field the field name where the dependency must be injected
+        * @return this builder
+     */
+    B autoConfig(String field);
+    
+    /**
+     * Configures the dependency callback instance.
+     * @param instance the dependency callback instance
+        * @return this builder
+     */
+    B callbackInstance(Object instance);
+    
+    /**
+     * Sets the callbacks for this dependency. These callbacks can be used as 
hooks whenever a dependency is added or
+     * removed. When you specify callbacks, the auto configuration feature is 
automatically turned off, because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param added the method to call when a service was added
+     * @param removed the method to call when a service was removed
+     * @return the bundle dependency
+     */
+    public B callbacks(String added, String removed);
+
+    /**
+     * Sets the callbacks for this dependency. These callbacks can be used as 
hooks whenever a dependency is added, changed or
+     * removed. When you specify callbacks, the auto configuration feature is 
automatically turned off, because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param added the method to call when a service was added
+     * @param changed the method to call when a service was changed
+     * @param removed the method to call when a service was removed
+     * @return the bundle dependency
+     */
+    public B callbacks(String added, String changed, String removed);
+
+    /**
+     * Sets the callbacks for this dependency. These callbacks can be used as 
hooks whenever a dependency is added, changed or
+     * removed, or swapped. When you specify callbacks, the auto configuration 
feature is automatically turned off, because we're assuming
+     * you don't need it in this case.
+     * 
+     * @param added the method to call when a service was added
+     * @param changed the method to call when a service was changed
+     * @param removed the method to call when a service was removed
+     * @param swap the method to call when a service was swapped
+     * @return the bundle dependency
+     */
+    public B callbacks(String added, String changed, String removed, String 
swap);
+
+    /**
+     * Configures the callback to invoke when the dependency becomes available
+     * @param added the method name to call when the dependency is available
+        * @return this builder
+     */
+    B onAdd(String added);
+    
+    /**
+     * Configures the callback to invoke when the dependency is changed.
+     * @param changed the method name to call when the dependency is changed
+        * @return this builder
+     */
+    B onChange(String changed);
+    
+    /**
+     * Configures the callback to invoke when the dependency is removed.
+     * @param changed the method name to call when the dependency is lost
+        * @return this builder
+     */
+    B onRemove(String removed);
+    
+    /**
+     * Configures the callback to call when the service is swapped by another 
one
+     * @param swapped the method name to call on swap service event
+        * @return this builder
+     */
+    B onSwap(String swapped);
+    
     <I> B onAdd(InstanceService<I, T> add);
     B onAdd(Service<T> add);
     <I> B onAdd(InstanceServiceMap<I, T> add);

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/ServiceDependencyBuilder.java
 Fri Dec 18 23:01:19 2015
@@ -9,26 +9,6 @@ import org.osgi.framework.ServiceReferen
  * @param <T> the type of the service dependency
  */
 public interface ServiceDependencyBuilder<T> extends 
DependencyBuilder<ServiceDependency>, ServiceCallbacksBuilder<T, 
ServiceDependencyBuilder<T>> {
-       /**
-        * Injects this dependency in all fields matching the dependency type.
-        * @return this builder
-        */
-       ServiceDependencyBuilder<T> autoConfig();
-       
-       /**
-        * Configures whether or not the dependency can be injected in all 
fields matching the dependency type. 
-        * @param autoConfig true if the dependency can be injected in all 
fields matching the dependency type
-        * @return this builder
-        */
-    ServiceDependencyBuilder<T> autoConfig(boolean autoConfig);
-    
-    /**
-     * Injects this dependency on the field with the given name
-     * @param field the field name where the dependency must be injected
-        * @return this builder
-     */
-    ServiceDependencyBuilder<T> autoConfig(String field);
-    
     /**
      * Configures the service dependency filter
      * @param filter the service filter
@@ -56,41 +36,6 @@ public interface ServiceDependencyBuilde
     ServiceDependencyBuilder<T> required(boolean required);
     
     /**
-     * Configures the dependency callback instance.
-     * @param instance the dependency callback instance
-        * @return this builder
-     */
-    ServiceDependencyBuilder<T> callbackInstance(Object instance);
-    
-    /**
-     * Configures the callback to invoke when the dependency becomes available
-     * @param added the method name to call when the dependency is available
-        * @return this builder
-     */
-    ServiceDependencyBuilder<T> onAdd(String added);
-    
-    /**
-     * Configures the callback to invoke when the dependency is changed.
-     * @param changed the method name to call when the dependency is changed
-        * @return this builder
-     */
-    ServiceDependencyBuilder<T> onChange(String changed);
-    
-    /**
-     * Configures the callback to invoke when the dependency is removed.
-     * @param changed the method name to call when the dependency is lost
-        * @return this builder
-     */
-    ServiceDependencyBuilder<T> onRemove(String removed);
-    
-    /**
-     * Configures the callback to call when the service is swapped by another 
one
-     * @param swapped the method name to call on swap service event
-        * @return this builder
-     */
-    ServiceDependencyBuilder<T> onSwap(String swapped);
-    
-    /**
      * Configures debug mode
      * @param label the label used by debug messages
         * @return this builder

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBuilderImpl.java?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AdapterBuilderImpl.java
 Fri Dec 18 23:01:19 2015
@@ -49,25 +49,36 @@ public class AdapterBuilderImpl<T> exten
     }
 
     @Override
-    public AdapterBuilder<T> inject(String field) {
-        m_injectField = field;
-        return this;
-    }
-
-    @Override
     public Component build() {
-        Objects.nonNull(m_adapteeFilter);
+        Objects.nonNull(m_adapteeFilter);        
+        String add = m_added, change = m_changed, remove = m_removed, swap = 
m_swapped;
+        Object cbInstance = m_callbackInstance;
         
-        String add = null, change = null, remove = null, swap = null;
-        Object cbInstance = hasCallbacks() ? createCallbackInstance() : null;
-        if (cbInstance != null) {
+        Component c = null;
+        // if some method references have been set, use our own callback proxy 
to redispatch events to method refs.        
+
+        if (hasRefs()) {
+               cbInstance = createCallbackInstance();
             add = "add";
             change = "change";
             remove = "remove";
             swap = "swap";
+                     
+            if (m_autoConfigField == null) {
+                // no autoConfig field specified: auto-config (class fields) 
is enabled if m_autoConfig is true
+               c = m_dm.createAdapterService
+                               (m_adapteeType, m_adapteeFilter, m_autoConfig, 
cbInstance, add, change, remove, swap, m_propagate);
+            } else {
+               // autoConfig is set to the field specified in the 
m_autoConfigField attribute.
+               c = m_dm.createAdapterService
+                               (m_adapteeType, m_adapteeFilter, 
m_autoConfigField, cbInstance, add, change, remove, swap, m_propagate);
+            }
+        } else {
+               // We are not using any method references, normal case as with 
DM with callback string names.
+               c = m_dm.createAdapterService
+                               (m_adapteeType, m_adapteeFilter, 
m_autoConfigField, cbInstance, add, change, remove, swap, m_propagate);
         }
-        Component c = m_dm.createAdapterService(m_adapteeType, 
m_adapteeFilter, m_injectField, cbInstance, add, change, remove, swap,
-            m_propagate);
+                                       
         ComponentBuilderImpl cb = new ComponentBuilderImpl(c, false);
         // m_compBuilder is a composed consumer that calls in sequence all 
necessary component builder methods. 
         m_compBuilder.accept (cb);

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AspectBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AspectBuilderImpl.java?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AspectBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/AspectBuilderImpl.java
 Fri Dec 18 23:01:19 2015
@@ -43,7 +43,7 @@ public class AspectBuilderImpl<T> extend
     @Override
     public Component build() {
         Objects.nonNull(m_aspectType);
-        Object cbInstance = hasCallbacks() ? createCallbackInstance() : null;
+        Object cbInstance = hasRefs() ? createCallbackInstance() : null;
         String add = null, change = null, remove = null, swap = null;
         if (cbInstance != null) {
             add = "add";

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/BundleDependencyBuilderImpl.java
 Fri Dec 18 23:01:19 2015
@@ -23,6 +23,7 @@ public class BundleDependencyBuilderImpl
        private String m_removed;
        private Object m_instance;
        private boolean m_autoConfig = true;
+       private boolean m_autoConfigInvoked = false;
        private boolean m_required = true;
        private Bundle m_bundle;
        private String m_filter;
@@ -87,11 +88,11 @@ public class BundleDependencyBuilderImpl
 
     @Override
        public BundleDependencyBuilder callbacks(String added, String changed, 
String removed) {
-               if (m_refs.size() != 0) throw new 
IllegalArgumentException("some method references have already been set.");
-               m_added = added != null ? added : m_added;
+       requiresNoMethodRefs();
+       m_added = added != null ? added : m_added;
                m_changed = changed != null ? changed : m_changed;
                m_removed = removed != null ? removed : m_removed;
-               m_autoConfig = false;
+               if (! m_autoConfigInvoked) m_autoConfig = false;
                return this;
        }
 
@@ -182,7 +183,8 @@ public class BundleDependencyBuilderImpl
        
        @Override
        public BundleDependencyBuilder autoConfig(boolean autoConfig) {
-               m_autoConfig = true;
+               m_autoConfig = autoConfig;
+        m_autoConfigInvoked = true;
                return this;
        }
 
@@ -285,14 +287,13 @@ public class BundleDependencyBuilderImpl
             dep.setCallbacks(cb, "add", "change", "remove");
         } 
         
-        if (m_autoConfig) {
-               dep.setAutoConfig(true);
-        }        
+        dep.setAutoConfig(m_autoConfig);
         return dep;
        }
 
        private <I> BundleDependencyBuilder setCallbackRef(String cb, 
MethodRef<I> ref) {
                requiresNoStringCallbacks();
+               if (! m_autoConfigInvoked) m_autoConfig = false;
                List<MethodRef<Object>> list = m_refs.computeIfAbsent(cb, l -> 
new ArrayList<>());
                list.add((instance, component, bundle) -> ref.accept(null, 
component, bundle));
                return this;
@@ -301,6 +302,7 @@ public class BundleDependencyBuilderImpl
        @SuppressWarnings("unchecked")
        private <I> BundleDependencyBuilder 
setComponentInstanceCallbackRef(String cb, String type, MethodRef<I> ref) {
                requiresNoStringCallbacks();
+               if (! m_autoConfigInvoked) m_autoConfig = false;
                List<MethodRef<Object>> list = m_refs.computeIfAbsent(cb, l -> 
new ArrayList<>());
                list.add((instance, component, bundle) -> {
                        Stream.of(component.getInstances()).forEach(inst -> {
@@ -346,4 +348,9 @@ public class BundleDependencyBuilderImpl
                }
        }
        
+       private void requiresNoMethodRefs() {
+               if (m_refs.size() > 0) {
+                       throw new IllegalStateException("can't mix method 
references and string callbacks.");
+               }
+       }
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceCallbacksBuilderImpl.java
 Fri Dec 18 23:01:19 2015
@@ -7,6 +7,9 @@ import java.util.Map;
 import java.util.stream.Stream;
 
 import org.apache.felix.dm.Component;
+import org.apache.felix.dm.builder.lambda.BundleDependencyBuilder;
+import org.apache.felix.dm.builder.lambda.ServiceCallbacksBuilder;
+import org.apache.felix.dm.builder.lambda.ServiceDependencyBuilder;
 import 
org.apache.felix.dm.builder.lambda.ServiceCallbacksBuilder.DictServiceDictService;
 import 
org.apache.felix.dm.builder.lambda.ServiceCallbacksBuilder.InstanceDictServiceDictService;
 import 
org.apache.felix.dm.builder.lambda.ServiceCallbacksBuilder.InstanceMapServiceMapService;
@@ -32,7 +35,32 @@ import org.osgi.framework.ServiceReferen
  * @param <B> the type of the sub-classes which may extend this class
  */
 @SuppressWarnings({"unchecked", "unused"})
-public abstract class ServiceCallbacksBuilderImpl<T, B extends 
ServiceCallbacksBuilderImpl<T, B>> {
+public abstract class ServiceCallbacksBuilderImpl<T, B extends 
ServiceCallbacksBuilderImpl<T, B>>
+{
+    protected boolean m_autoConfig = true;
+    protected boolean m_autoConfigInvoked = false;
+    protected String m_autoConfigField;
+    protected Object m_callbackInstance;
+    protected String m_added;
+    protected String m_changed;
+    protected String m_removed;
+    protected String m_swapped;
+    
+       /**
+        * List of service (add/change/remove) callbacks.
+        */
+       private final Map<String, List<MethodRef<Object, T>>> m_refs = new 
HashMap<>();
+       
+       /**
+        * List of swap callbacks
+        */
+       private final List<SwapMethodRef<?, T>> m_swapRefs = new ArrayList<>();
+       
+       /**
+        * Tells if there is some component instance method reference callbacks.
+        */
+       private boolean m_hasComponentInstanceRefs;
+
        /**
         * This interface (lambda) is called when we want to invoke a method 
reference. the lambda is called with all necessary service dependency 
         * informations.
@@ -58,22 +86,67 @@ public abstract class ServiceCallbacksBu
        interface SwapMethodRef<I, T> {
        public void accept(I instance, Component c, ServiceReference<T> oldRef, 
T oldService, ServiceReference<T> newRef, T newService);
     }
+           
+    public B autoConfig() {
+        autoConfig(true);
+        return (B) this;
+    }
+
+    public  B autoConfig(String field) {
+        m_autoConfigField = field;
+        return (B) this;
+    }
+
+    public B autoConfig(boolean autoConfig) {
+        m_autoConfig = autoConfig;
+        m_autoConfigInvoked = true;
+        return (B) this;
+    }
        
-       /**
-        * List of service (add/change/remove) callbacks.
-        */
-       private final Map<String, List<MethodRef<Object, T>>> m_refs = new 
HashMap<>();
-       
-       /**
-        * List of swap callbacks
-        */
-       private final List<SwapMethodRef<?, T>> m_swapRefs = new ArrayList<>();
+    public B callbackInstance(Object instance) {
+       requiresNoMethodRefs();
+        m_callbackInstance = instance;
+        return (B) this;
+    }
+
+       public B callbacks(String added, String removed) {
+       return callbacks(added, null, removed);
+       }
     
-       /**
-        * TODO
-        */
-       private boolean m_hasComponentInstanceCallbacks;
-       
+       public B callbacks(String added, String changed, String removed) {
+       return callbacks(added, changed, removed, null);
+       }
+
+       public B callbacks(String added, String changed, String removed, String 
swapped) {
+               requiresNoMethodRefs();
+               m_added = added != null ? added : m_added;
+               m_changed = changed != null ? changed : m_changed;
+               m_removed = removed != null ? removed : m_removed;
+               m_swapped = swapped != null ? swapped : m_swapped;
+               if (! m_autoConfigInvoked) m_autoConfig = false;
+               return (B) this;
+       }
+
+    public B onAdd(String added) {
+       callbacks(added, null, null, null);
+               return (B) this;
+    }
+
+    public B onChange(String changed) {
+       callbacks(null, changed, null, null);
+               return (B) this;
+    }
+
+    public B onRemove(String removed) {
+       callbacks(null, null, removed, null);
+               return (B) this;
+    }
+
+    public B onSwap(String swapped) {
+       callbacks(null, null, null, swapped);
+               return (B) this;
+    }
+
     public <I> B onAdd(InstanceService<I, T> callback) {
        String type = Helpers.getLambdaGenericType(callback);
         return setComponentInstanceCallbackRef("add", type, 
@@ -280,6 +353,8 @@ public abstract class ServiceCallbacksBu
    }
 
    public <I> B setComponentInstanceCallbackRef(String cb, String type, 
MethodRef<I, T> ref) {
+          requiresNoCallbacks();
+          if (! m_autoConfigInvoked) m_autoConfig = false;
           List<MethodRef<Object, T>> list = m_refs.computeIfAbsent(cb, l -> 
new ArrayList<>());
           list.add((instance, component, sref, service) -> {
                   Stream.of(component.getInstances()).forEach(inst -> {
@@ -288,11 +363,12 @@ public abstract class ServiceCallbacksBu
                           }
                   });
           });
-          m_hasComponentInstanceCallbacks = true;
           return (B) this;
    }
 
    public <I> B setComponentInstanceSwapCallbackRef(String type, 
SwapMethodRef<I, T> ref) {
+          requiresNoCallbacks();
+          if (! m_autoConfigInvoked) m_autoConfig = false;
           m_swapRefs.add((instance, component, oref, oservice, nref, nservice) 
-> {
                   
Stream.of(component.getInstances()).forEach(componentInstance -> {
                           if 
(Helpers.getClassName(componentInstance).equals(type)) { // Todo detect dynamic 
proxy !
@@ -327,14 +403,6 @@ public abstract class ServiceCallbacksBu
        return cb;
    }
 
-   protected boolean hasCallbacks() {
-          return m_refs.size() > 0 || m_swapRefs.size() > 0;
-   }
-       
-   protected boolean hasComponentInstanceCallbacks() {
-          return m_hasComponentInstanceCallbacks;
-   }
-   
    private void invokeMethodRefs(String method, Component comp, 
ServiceReference<T> ref, T service) {
           m_refs.computeIfPresent(method, (k, mrefs) -> {
                   mrefs.forEach(mref -> mref.accept(null, comp, ref, service));
@@ -344,5 +412,29 @@ public abstract class ServiceCallbacksBu
    
    protected void invokeSwapMethodRefs(Component c, ServiceReference<T> oref, 
T osrv, ServiceReference<T> nref, T nsrv) {
           m_swapRefs.forEach(ref -> ref.accept(null, c, oref, osrv, nref, 
nsrv));
+   }   
+   
+   protected boolean hasRefs() {
+          return m_refs.size() > 0 || m_swapRefs.size() > 0;
+   }
+       
+   protected boolean hasCallbacks() {
+          return m_callbackInstance != null || m_added != null || m_changed != 
null || m_removed != null || m_swapped != null;
+   }
+   
+   protected boolean hasComponentInstanceRefs() {
+          return m_hasComponentInstanceRefs;
+   }
+   
+   protected void requiresNoCallbacks() {
+          if (hasCallbacks()) { 
+                  throw new IllegalStateException("can't mix method references 
and string callbacks.");
+          }
+   }
+   
+   protected void requiresNoMethodRefs() {
+          if (hasRefs()) {
+                  throw new IllegalStateException("can't mix method references 
and string callbacks.");
+          }
    }
 }

Modified: 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java?rev=1720852&r1=1720851&r2=1720852&view=diff
==============================================================================
--- 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java
 (original)
+++ 
felix/sandbox/pderop/dependencymanager-lambda/org.apache.felix.dependencymanager.lambda/src/org/apache/felix/dm/builder/lambda/impl/ServiceDependencyBuilderImpl.java
 Fri Dec 18 23:01:19 2015
@@ -7,52 +7,29 @@ import org.apache.felix.dm.builder.lambd
 import org.osgi.framework.ServiceReference;
 
 public class ServiceDependencyBuilderImpl<T> extends 
ServiceCallbacksBuilderImpl<T, ServiceDependencyBuilderImpl<T>> implements 
ServiceDependencyBuilder<T> {
-    private Class<T> m_serviceIface;
+    private final Class<T> m_serviceIface;
+    private final Component m_component;
     private String m_filter;
     private ServiceReference<T> m_ref;
-    private Object m_callbackInstance;
-    private String m_added;
-    private String m_changed;
-    private String m_removed;
-    private String m_swapped;
-    private boolean m_callbacksSet;
-    private Boolean m_autoConfig; // null means setAutoConfig has not been 
called.
-    private String m_autoConfigField;
     private boolean m_required = true;
     private String m_debug;
     private boolean m_propagate;
     private Object m_propagateInstance;
     private String m_propagateMethod;
     private Object m_defaultImpl;
-    private final Component m_component;
 
     public ServiceDependencyBuilderImpl(Component component, Class<T> service) 
{
         m_serviceIface = service;
         m_component = component;
     }
 
-    public ServiceDependencyBuilder<T> autoConfig() {
-        m_autoConfig = true;
-        return this;
-    }
-
-    public ServiceDependencyBuilder<T> autoConfig(boolean autoConfig) {
-        m_autoConfig = autoConfig;
-        return this;
-    }
-
-    public ServiceDependencyBuilder<T> autoConfig(String field) {
-        m_autoConfigField = field;
-        return this;
-    }
-
     public ServiceDependencyBuilder<T> filter(String filter) {
-        this.m_filter = filter;
+        m_filter = filter;
         return this;
     }
 
     public ServiceDependencyBuilder<T> ref(ServiceReference<T> ref) {
-        this.m_ref = ref;
+        m_ref = ref;
         return this;
     }
 
@@ -65,36 +42,6 @@ public class ServiceDependencyBuilderImp
         return this;
     }
 
-    public ServiceDependencyBuilder<T> callbackInstance(Object instance) {
-        m_callbackInstance = instance;
-        m_callbacksSet = true;
-        return this;
-    }
-
-    public ServiceDependencyBuilder<T> onAdd(String added) {
-        this.m_added = added;
-        m_callbacksSet = true;
-        return this;
-    }
-
-    public ServiceDependencyBuilder<T> onChange(String changed) {
-        this.m_changed = changed;
-        m_callbacksSet = true;
-        return this;
-    }
-
-    public ServiceDependencyBuilder<T> onRemove(String removed) {
-        this.m_removed = removed;
-        m_callbacksSet = true;
-        return this;
-    }
-
-    public ServiceDependencyBuilder<T> onSwap(String swapped) {
-        this.m_swapped = swapped;
-        m_callbacksSet = true;
-        return this;
-    }
-
     public ServiceDependencyBuilder<T> debug(String label) {
         m_debug = label;
         return this;
@@ -146,22 +93,19 @@ public class ServiceDependencyBuilderImp
             }
             sd.setPropagate(m_propagateInstance, m_propagateMethod);
         }
-        if (m_callbacksSet) {
+        if (hasCallbacks()) {
             sd.setCallbacks(m_callbackInstance, m_added, m_changed, m_removed, 
m_swapped);
-        } else if (hasComponentInstanceCallbacks() || hasCallbacks()) {
+        } else if (hasRefs()) {
             Object cb = createCallbackInstance();
             sd.setCallbacks(cb, "add", "change", "remove", "swap");
-
-            if (! hasComponentInstanceCallbacks()) {
-               sd.setAutoConfig(true);
-            }
         }
         
         if (m_autoConfigField != null) {
             sd.setAutoConfig(m_autoConfigField);
-        } else if (m_autoConfig != null) {
+        } else {
             sd.setAutoConfig(m_autoConfig);
         }
         return sd;
     }
+    
 }


Reply via email to