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 2013/12/08 17:07:38 UTC

svn commit: r1549051 - in /felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src: main/java/org/apache/felix/ipojo/runtime/core/test/interceptors/ test/java/org/apache/felix/ipojo/runtime/core/test/dependencies/

Author: clement
Date: Sun Dec  8 16:07:37 2013
New Revision: 1549051

URL: http://svn.apache.org/r1549051
Log:
Add a test checking an interceptor implementing both tracking and ranking.

Added:
    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
    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, changed from r1532285, felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/dependencies/TestRankingServices.java

Added: 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/TrackerAndRankerInterceptor.java?rev=1549051&view=auto
==============================================================================
--- 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 (added)
+++ 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 Sun Dec  8 16:07:37 2013
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.runtime.core.test.interceptors;
+
+import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.annotations.Provides;
+import org.apache.felix.ipojo.annotations.ServiceProperty;
+import org.apache.felix.ipojo.dependency.interceptors.DefaultDependencyInterceptor;
+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.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;
+
+/**
+ * An interceptor implements both ranking and tracking interfaces.
+ */
+@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;
+
+    @ServiceProperty
+    private String target;
+
+    GradeComparator comparator = new GradeComparator();
+    private int mode = HIGH;
+    private boolean reverse = false;
+
+    @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);
+            }
+        }
+
+        Collections.sort(references, comparator);
+        if (reverse) {
+            Collections.reverse(references);
+        }
+        return references;
+    }
+
+    @Override
+    public List<ServiceReference> onServiceArrival(DependencyModel dependency, List<ServiceReference> matching, ServiceReference<?> reference) {
+        return getServiceReferences(dependency, matching);
+    }
+
+    @Override
+    public List<ServiceReference> onServiceDeparture(DependencyModel dependency, List<ServiceReference> matching, ServiceReference<?> reference) {
+        return getServiceReferences(dependency, matching);
+    }
+
+    @Override
+    public List<ServiceReference> onServiceModified(DependencyModel dependency, List<ServiceReference> matching, ServiceReference<?> reference) {
+        return getServiceReferences(dependency, matching);
+    }
+
+    @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();
+        }
+    }
+
+    /**
+     * Notifies the managed dependencies of a change in the set of services selected by this interceptor.
+     * The dependency will call the getServiceReferences method to recompute the set of selected services.
+     */
+    public void invalidateSelectedServices() {
+        List<DependencyModel> list = new ArrayList<DependencyModel>();
+        synchronized (this) {
+            list.addAll(dependencies);
+        }
+
+        for (DependencyModel dep : list) {
+            dep.invalidateSelectedServices();
+        }
+    }
+
+    /**
+     * 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();
+        }
+    }
+}

Copied: 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 (from r1532285, felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/dependencies/TestRankingServices.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?p2=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&p1=felix/trunk/ipojo/runtime/core-it/ipojo-core-service-dependency-interceptor-test/src/test/java/org/apache/felix/ipojo/runtime/core/test/dependencies/TestRankingServices.java&r1=1532285&r2=1549051&rev=1549051&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/TestRankingServices.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 Dec  8 16:07:37 2013
@@ -31,25 +31,35 @@ import java.util.Properties;
 import static org.fest.assertions.Assertions.assertThat;
 
 /**
- * Checks Tracking interceptor transforming services
+ * Checks the combination of tracking and ranking interceptors.
+ *
+ * First, the tracking interceptor selects the references, it also transforms them.
+ * Then, the ranking interceptor sorts the remaining references.
  */
-public class TestRankingServices extends Common {
+public class TestCombinationOfInterceptors extends Common {
 
     private ComponentInstance provider1;
     private ComponentInstance provider2;
+    private ComponentInstance provider3;
+    private ComponentInstance provider4;
+    private ComponentInstance provider5;
+    private ComponentInstance provider6;
 
     @Test
-    public void testRanking() {
+    public void test() {
 
-        // Provider with grade 0 first
         provider1 = provider(0);
         provider2 = provider(1);
+        provider3 = provider(2);
+        provider4 = provider(3);
+        provider5 = provider(4);
+        provider6 = provider(5);
 
         // Create the interceptor
         Properties configuration = new Properties();
         configuration.put("target", "(dependency.id=foo)");
         ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test.interceptors" +
-                ".FilterRankingInterceptor", configuration);
+                ".TrackerAndRankerInterceptor", configuration);
 
         // Create the FooConsumer
         ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test.components.FooConsumer");
@@ -57,160 +67,24 @@ public class TestRankingServices extends
         // Check we are using provider 2
         osgiHelper.waitForService(CheckService.class.getName(), null, 1000, true);
         CheckService check = osgiHelper.getServiceObject(CheckService.class);
-        assertThat(check.getProps().get("grade")).isEqualTo(1);
+        assertThat(check.getProps().get("grade")).isEqualTo(5);
 
-        provider2.dispose();
+        provider6.dispose();
 
-        assertThat(check.getProps().get("grade")).isEqualTo(0);
-    }
-
-    @Test
-    public void testRankingWhenInterceptorIsComingAfterTheBattle() {
-
-        // Provider with grade 0 first
-        provider1 = provider(0);
-        provider2 = provider(1);
-
-        // Create the FooConsumer
-        ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test.components.FooConsumer");
-
-        osgiHelper.waitForService(CheckService.class.getName(), null, 1000, true);
-        CheckService check = osgiHelper.getServiceObject(CheckService.class);
-        assertThat(check.getProps().get("grade")).isEqualTo(0);
-
-        // Create the interceptor
-        Properties configuration = new Properties();
-        configuration.put("target", "(dependency.id=foo)");
-        ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test.interceptors" +
-                ".FilterRankingInterceptor", configuration);
-
-        // Check we are using provider 2
-        assertThat(check.getProps().get("grade")).isEqualTo(1);
-
-        provider2.dispose();
-
-        assertThat(check.getProps().get("grade")).isEqualTo(0);
-    }
-
-    @Test
-    public void testRankingChanges() {
-
-        // Provider with grade 0 first
-        provider1 = provider(0);
-        provider2 = provider(1);
-
-        // Create the interceptor
-        Properties configuration = new Properties();
-        configuration.put("target", "(dependency.id=foo)");
-        ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test.interceptors" +
-                ".FilterRankingInterceptor", configuration);
-
-        // Create the FooConsumer
-        ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test.components.FooConsumer");
-
-        // Check we are using provider 2
-        osgiHelper.waitForService(CheckService.class.getName(), null, 1000, true);
-        CheckService check = osgiHelper.getServiceObject(CheckService.class);
-        assertThat(check.getProps().get("grade")).isEqualTo(1);
+        assertThat(check.getProps().get("grade")).isEqualTo(4);
 
+        // Change range
         Setter setter = osgiHelper.getServiceObject(Setter.class);
-        setter.set("true");
-
-        assertThat(check.getProps().get("grade")).isEqualTo(0);
-    }
-
-    @Test
-    public void testRestorationOfTheComparatorWhenTheInterceptorLeaves() {
-
-        // Provider with grade 0 first
-        provider1 = provider(0);
-        provider2 = provider(1);
+        setter.set("LOW REVERSE");
 
-        // Create the interceptor
-        Properties configuration = new Properties();
-        configuration.put("target", "(dependency.id=foo)");
-        ComponentInstance interceptor = ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core" +
-                ".test.interceptors.FilterRankingInterceptor", configuration);
-
-        // Create the FooConsumer
-        ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test.components.FooConsumer");
-
-        // Check we are using provider 2
-        osgiHelper.waitForService(CheckService.class.getName(), null, 1000, true);
-        CheckService check = osgiHelper.getServiceObject(CheckService.class);
-        assertThat(check.getProps().get("grade")).isEqualTo(1);
-
-        interceptor.dispose();
-
-        assertThat(check.getProps().get("grade")).isEqualTo(0);
-    }
-
-    @Test
-    public void testDynamicServices() {
-
-        // Create the interceptor
-        Properties configuration = new Properties();
-        configuration.put("target", "(dependency.id=foo)");
-        ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test.interceptors" +
-                ".FilterRankingInterceptor", configuration);
-
-        // Create the FooConsumer
-        ComponentInstance consumer = ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test" +
-                ".components.FooConsumer");
-
-        assertThat(consumer.getState()).isEqualTo(ComponentInstance.INVALID);
-
-        provider1 = provider(0);
-
-        assertThat(consumer.getState()).isEqualTo(ComponentInstance.VALID);
-        CheckService check = osgiHelper.getServiceObject(CheckService.class);
+//        check = osgiHelper.getServiceObject(CheckService.class);
+//        assertThat(check.getProps().get("grade")).isEqualTo(3);
+//
+//        setter.set("REVERSE");
+//        check = osgiHelper.getServiceObject(CheckService.class);
         assertThat(check.getProps().get("grade")).isEqualTo(0);
-
-        provider2 = provider(1);
-
-        assertThat(consumer.getState()).isEqualTo(ComponentInstance.VALID);
-        check = osgiHelper.getServiceObject(CheckService.class);
-        assertThat(check.getProps().get("grade")).isEqualTo(1);
-
-        provider2.dispose();
-
-        assertThat(consumer.getState()).isEqualTo(ComponentInstance.VALID);
-        check = osgiHelper.getServiceObject(CheckService.class);
-        assertThat(check.getProps().get("grade")).isEqualTo(0);
-
-        provider1.dispose();
-
-        assertThat(consumer.getState()).isEqualTo(ComponentInstance.INVALID);
     }
 
-    @Test
-    public void testArchitecture() {
-        // Provider with grade 0 first
-        provider1 = provider(0);
-        provider2 = provider(1);
-
-        // Create the interceptor
-        Properties configuration = new Properties();
-        configuration.put("target", "(dependency.id=foo)");
-        ComponentInstance interceptor = ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core" +
-                ".test.interceptors.FilterRankingInterceptor", configuration);
-
-        // Create the FooConsumer
-        ComponentInstance instance = ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.test" +
-                ".components.FooConsumer");
-
-        // Check we are using provider 2
-        osgiHelper.waitForService(CheckService.class.getName(), null, 1000, true);
-
-        assertThat(instance.getInstanceDescription().getDescription().toString()).contains
-                ("servicerankinginterceptor");
-        assertThat(instance.getInstanceDescription().getDescription().toString()).contains
-                ("target=\"(dependency.id=foo)\"");
-        assertThat(instance.getInstanceDescription().getDescription().toString()).contains
-                ("instance.name=\"" + interceptor.getInstanceName() + "\"");
-        assertThat(instance.getInstanceDescription().getDescription().toString()).contains
-                ("bundle.id=\"" + getTestBundle().getBundleId() + "\"");
-    }
 
     private ComponentInstance provider(int i) {
         Dictionary<String, String> configuration = new Hashtable<String, String>();