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;
}
+
}