You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2014/01/19 16:31:49 UTC
svn commit: r1559506 - in
/felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src:
main/java/org/apache/felix/ipojo/runtime/core/test/components/
main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/
test/java/o...
Author: clement
Date: Sun Jan 19 15:31:49 2014
New Revision: 1559506
URL: http://svn.apache.org/r1559506
Log:
Test interceptor combination
Added:
felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/AdvancedFooConsumer.java
- copied, changed from r1532285, felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/FooConsumer.java
felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/AdvancedTrackerAndRankerInterceptor.java
- copied, changed from r1549051, felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/TrackerAndRankerInterceptor.java
Modified:
felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/dependencies/TestCombinationOfInterceptors.java
Copied: felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/AdvancedFooConsumer.java (from r1532285, felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/FooConsumer.java)
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/AdvancedFooConsumer.java?p2=felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/AdvancedFooConsumer.java&p1=felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/FooConsumer.java&r1=1532285&r2=1559506&rev=1559506&view=diff
==============================================================================
--- felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/FooConsumer.java (original)
+++ felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/components/AdvancedFooConsumer.java Sun Jan 19 15:31:49 2014
@@ -23,23 +23,29 @@ import org.apache.felix.ipojo.annotation
import org.apache.felix.ipojo.runtime.core.test.services.CheckService;
import org.apache.felix.ipojo.runtime.core.test.services.Enhanced;
import org.apache.felix.ipojo.runtime.core.test.services.FooService;
+import org.apache.felix.ipojo.runtime.core.test.services.Setter;
import java.util.Dictionary;
import java.util.Map;
import java.util.Properties;
/**
- * A component consuming FooService
+ * A component consuming FooService with a filter requiring interception, and impacting the ranking.
*/
@Component(immediate = true)
@Provides
-public class FooConsumer implements CheckService {
+public class AdvancedFooConsumer implements CheckService, Setter {
- @Requires(id= "foo", policy = BindingPolicy.DYNAMIC_PRIORITY, proxy = false)
+ @Requires(id= "foo", policy = BindingPolicy.DYNAMIC_PRIORITY, proxy = false, filter= "(intercepted=true)",
+ optional = true, nullable = false)
private FooService foo;
private Map<String, Object> props;
+ // Will be read by the interceptor to inject only matching provider.
+ @Property(value = "0")
+ private int grade = 0;
+
@Override
public boolean check() {
return foo.foo();
@@ -49,9 +55,11 @@ public class FooConsumer implements Chec
public Dictionary getProps() {
Properties properties = new Properties();
properties.put("props", props);
- properties.put("grade", foo.getGrade());
- if (foo instanceof Enhanced) {
- properties.put("enhanced", ((Enhanced) foo).enhance());
+ if (foo != null) {
+ properties.put("grade", foo.getGrade());
+ if (foo instanceof Enhanced) {
+ properties.put("enhanced", ((Enhanced) foo).enhance());
+ }
}
return properties;
}
@@ -65,4 +73,10 @@ public class FooConsumer implements Chec
public void modified(FooService foo, Map<String, Object> properties) {
props = properties;
}
+
+ @Override
+ public void set(String newValue) {
+ System.out.println("Setting grade to " + newValue);
+ grade = Integer.parseInt(newValue);
+ }
}
Copied: felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/AdvancedTrackerAndRankerInterceptor.java (from r1549051, felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/TrackerAndRankerInterceptor.java)
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/AdvancedTrackerAndRankerInterceptor.java?p2=felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/AdvancedTrackerAndRankerInterceptor.java&p1=felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/TrackerAndRankerInterceptor.java&r1=1549051&r2=1559506&rev=1559506&view=diff
==============================================================================
--- felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/TrackerAndRankerInterceptor.java (original)
+++ felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/AdvancedTrackerAndRankerInterceptor.java Sun Jan 19 15:31:49 2014
@@ -18,6 +18,7 @@
*/
package org.apache.felix.ipojo.runtime.core.test.interceptors;
+import org.apache.felix.ipojo.ComponentInstance;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.ServiceProperty;
@@ -25,47 +26,62 @@ import org.apache.felix.ipojo.dependency
import org.apache.felix.ipojo.dependency.interceptors.ServiceRankingInterceptor;
import org.apache.felix.ipojo.dependency.interceptors.ServiceTrackingInterceptor;
import org.apache.felix.ipojo.dependency.interceptors.TransformedServiceReference;
+import org.apache.felix.ipojo.handlers.configuration.ConfigurationHandlerDescription;
+import org.apache.felix.ipojo.handlers.configuration.ConfigurationListener;
import org.apache.felix.ipojo.runtime.core.test.services.Setter;
import org.apache.felix.ipojo.util.DependencyModel;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
+import java.util.Map;
/**
* An interceptor implements both ranking and tracking interfaces.
+ * It first adds the 'intercepted' property to the services, and then select only the provider having a grade
+ * matching the instance's 'grade' property.
*/
@Component(immediate = true)
@Provides
-public class TrackerAndRankerInterceptor extends DefaultDependencyInterceptor implements Setter,
- ServiceTrackingInterceptor, ServiceRankingInterceptor {
-
- private static final int HIGH = 1;
- private static final int LOW = 0;
+public class AdvancedTrackerAndRankerInterceptor extends DefaultDependencyInterceptor implements
+ ServiceTrackingInterceptor, ServiceRankingInterceptor, ConfigurationListener {
@ServiceProperty
private String target;
- GradeComparator comparator = new GradeComparator();
- private int mode = HIGH;
- private boolean reverse = false;
+ @Override
+ public void close(DependencyModel dependency) {
+ super.close(dependency);
+ ConfigurationHandlerDescription handler = (ConfigurationHandlerDescription) dependency.getComponentInstance().getInstanceDescription()
+ .getHandlerDescription("org.apache.felix.ipojo:properties");
+ handler.removeListener(this);
+ }
+
+ @Override
+ public void open(DependencyModel dependency) {
+ super.open(dependency);
+ ConfigurationHandlerDescription handler = (ConfigurationHandlerDescription) dependency.getComponentInstance().getInstanceDescription()
+ .getHandlerDescription("org.apache.felix.ipojo:properties");
+ handler.addListener(this);
+ }
@Override
public List<ServiceReference> getServiceReferences(DependencyModel dependency, List<ServiceReference> matching) {
- List<ServiceReference> references = new ArrayList<ServiceReference>();
- for (ServiceReference ref : matching) {
- if (ref.getProperty("grade") != null) {
- references.add(ref);
- }
- }
+ List<ServiceReference> list = new ArrayList<ServiceReference>();
+ Integer grade = getInstanceGrade(dependency);
+ for (ServiceReference ref : matching) {
+ if (grade.equals(ref.getProperty("grade"))) {
+ list.add(ref);
+ }
+ }
+ return list;
+ }
- Collections.sort(references, comparator);
- if (reverse) {
- Collections.reverse(references);
- }
- return references;
+ private Integer getInstanceGrade(DependencyModel dependency) {
+ ConfigurationHandlerDescription handler = (ConfigurationHandlerDescription) dependency.getComponentInstance().getInstanceDescription()
+ .getHandlerDescription("org.apache.felix.ipojo:properties");
+ return (Integer) handler.getPropertyByName("grade").getCurrentValue();
}
@Override
@@ -85,33 +101,7 @@ public class TrackerAndRankerInterceptor
@Override
public <S> TransformedServiceReference<S> accept(DependencyModel dependency, BundleContext context, TransformedServiceReference<S> ref) {
- // Only accept services having a grade in LOW or HIGH according to the mode.
- if (mode == HIGH) {
- if (((Integer) ref.get("grade")) > 3) {
- return ref;
- }
- } else {
- if (((Integer) ref.get("grade")) <= 3) {
- return ref;
- }
- }
- return null;
- }
-
- @Override
- public void set(String newValue) {
- if (newValue.contains("HIGH")) {
- mode = HIGH;
- invalidateMatchingServices();
- }
- if (newValue.contains("LOW")) {
- mode = LOW;
- invalidateMatchingServices();
- }
- if (newValue.contains("REVERSE")) {
- reverse = true;
- invalidateSelectedServices();
- }
+ return ref.addProperty("intercepted", true);
}
/**
@@ -129,18 +119,8 @@ public class TrackerAndRankerInterceptor
}
}
- /**
- * Notifies the managed dependencies of a change in the set of services accepted by this interceptor.
- * The dependency will call the accept method to recompute the set of matching services.
- */
- public void invalidateMatchingServices() {
- List<DependencyModel> list = new ArrayList<DependencyModel>();
- synchronized (this) {
- list.addAll(dependencies);
- }
-
- for (DependencyModel dep : list) {
- dep.invalidateMatchingServices();
- }
+ @Override
+ public void configurationChanged(ComponentInstance instance, Map<String, Object> configuration) {
+ invalidateSelectedServices();
}
}
Modified: felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/dependencies/TestCombinationOfInterceptors.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/dependencies/TestCombinationOfInterceptors.java?rev=1559506&r1=1559505&r2=1559506&view=diff
==============================================================================
--- felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/dependencies/TestCombinationOfInterceptors.java (original)
+++ felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/dependencies/TestCombinationOfInterceptors.java Sun Jan 19 15:31:49 2014
@@ -46,7 +46,7 @@ public class TestCombinationOfIntercepto
private ComponentInstance provider6;
@Test
- public void test() {
+ public void testCombination() {
provider1 = provider(0);
provider2 = provider(1);
@@ -76,13 +76,47 @@ public class TestCombinationOfIntercepto
// Change range
Setter setter = osgiHelper.getServiceObject(Setter.class);
setter.set("LOW REVERSE");
+ assertThat(check.getProps().get("grade")).isEqualTo(0);
+ }
+
+ @Test
+ public void testAdvanced() {
+
+ provider1 = provider(0);
+ provider2 = provider(0);
+ provider3 = provider(1);
+ provider4 = provider(1);
+ provider5 = provider(2);
+ provider6 = provider(2);
+
+ // Create the interceptor
+ Properties configuration = new Properties();
+ configuration.put("target", "(dependency.id=foo)");
+ ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test.interceptors" +
+ ".AdvancedTrackerAndRankerInterceptor", configuration);
+
+ // Create the FooConsumer
+ ComponentInstance instance = ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test" +
+ ".components.AdvancedFooConsumer");
-// check = osgiHelper.getServiceObject(CheckService.class);
-// assertThat(check.getProps().get("grade")).isEqualTo(3);
-//
-// setter.set("REVERSE");
-// check = osgiHelper.getServiceObject(CheckService.class);
+ // Check we are using provider 0
+ osgiHelper.waitForService(CheckService.class.getName(), null, 1000, true);
+ CheckService check = osgiHelper.getServiceObject(CheckService.class);
assertThat(check.getProps().get("grade")).isEqualTo(0);
+
+ Dictionary conf = new Hashtable();
+ conf.put("grade", "1");
+ instance.reconfigure(conf);
+
+ assertThat(check.getProps().get("grade")).isEqualTo(1);
+
+ conf.put("grade", "2");
+ instance.reconfigure(conf);
+ assertThat(check.getProps().get("grade")).isEqualTo(2);
+
+ conf.put("grade", "3");
+ instance.reconfigure(conf);
+ assertThat(check.getProps().get("grade")).isNull();
}