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();
     }