felix-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From clem...@apache.org
Subject svn commit: r996284 - in /felix/trunk/ipojo: handler/whiteboard/ handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/ tests/handler/whiteboard/ tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/
Date Sun, 12 Sep 2010 10:14:53 GMT
Author: clement
Date: Sun Sep 12 10:14:52 2010
New Revision: 996284

URL: http://svn.apache.org/viewvc?rev=996284&view=rev
Log:
Fix FELIX-2581 White Board Pattern onActivate called before @Validate
The handler must wait until the instance is started before opening the tracker.

Modified:
    felix/trunk/ipojo/handler/whiteboard/pom.xml
    felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java
    felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java
    felix/trunk/ipojo/tests/handler/whiteboard/pom.xml
    felix/trunk/ipojo/tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/FooWhiteBoardPattern.java
    felix/trunk/ipojo/tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/WbpTests.java

Modified: felix/trunk/ipojo/handler/whiteboard/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/pom.xml?rev=996284&r1=996283&r2=996284&view=diff
==============================================================================
--- felix/trunk/ipojo/handler/whiteboard/pom.xml (original)
+++ felix/trunk/ipojo/handler/whiteboard/pom.xml Sun Sep 12 10:14:52 2010
@@ -29,19 +29,19 @@
   <artifactId> org.apache.felix.ipojo.handler.whiteboard </artifactId>
   <groupId>org.apache.felix</groupId>
   <version>1.5.0-SNAPSHOT</version>
-  
+
   <description>
   iPOJO extension to easily implement a white-board pattern (host).
   </description>
   <url>
   http://felix.apache.org/site/white-board-pattern-handler.html
   </url>
-  
+
   <dependencies>
     <dependency>
       <groupId>org.apache.felix</groupId>
       <artifactId>org.apache.felix.ipojo</artifactId>
-      <version>${project.version}</version>
+      <version>1.6.4</version>
     </dependency>
     <dependency>
       <groupId>org.osgi</groupId>
@@ -68,7 +68,7 @@
             <Private-Package> org.apache.felix.ipojo.handler.wbp
             </Private-Package>
             <Bundle-Name>${project.name}</Bundle-Name>
-            <Include-Resource> 
+            <Include-Resource>
               META-INF/LICENSE=LICENSE,
               META-INF/NOTICE=NOTICE,
               META-INF/DEPENDENCIES=DEPENDENCIES

Modified: felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java?rev=996284&r1=996283&r2=996284&view=diff
==============================================================================
--- felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java
(original)
+++ felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java
Sun Sep 12 10:14:52 2010
@@ -1,4 +1,4 @@
-/* 
+/*
  * 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
@@ -32,37 +32,37 @@ import org.osgi.framework.ServiceReferen
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class WhiteBoardManager implements TrackerCustomizer {
-    
+
     /**
-     * The monitored filter. 
+     * The monitored filter.
      */
     private Filter m_filter;
-    
+
     /**
-     * The onArrival method. 
+     * The onArrival method.
      */
     private Callback m_onArrival;
-    
+
     /**
-     * The onDeparture method. 
+     * The onDeparture method.
      */
     private Callback m_onDeparture;
-    
+
     /**
-     * The onModify method. 
+     * The onModify method.
      */
     private Callback m_onModification;
-    
+
     /**
-     * The service tracker. 
+     * The service tracker.
      */
     private Tracker m_tracker;
-    
+
     /**
-     * The attached handler. 
+     * The attached handler.
      */
     private PrimitiveHandler m_handler;
-    
+
     /**
      * Constructor.
      * @param handler the attached handler
@@ -81,14 +81,17 @@ public class WhiteBoardManager implement
         m_filter = filter;
         m_tracker = new Tracker(handler.getInstanceManager().getContext(), m_filter, this);
     }
-    
+
+
+
     /**
      * Opens the tracker.
      */
     public void start() {
+    	// Calling several times open is no-effect.
         m_tracker.open();
     }
-    
+
     /**
      * Closes the tracker.
      */

Modified: felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java?rev=996284&r1=996283&r2=996284&view=diff
==============================================================================
--- felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java
(original)
+++ felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java
Sun Sep 12 10:14:52 2010
@@ -1,4 +1,4 @@
-/* 
+/*
  * 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
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.List;
 
+import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.ConfigurationException;
 import org.apache.felix.ipojo.PrimitiveHandler;
 import org.apache.felix.ipojo.metadata.Element;
@@ -33,19 +34,19 @@ import org.osgi.framework.InvalidSyntaxE
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class WhiteBoardPatternHandler extends PrimitiveHandler {
-    
+
     /**
      * The handler namespace.
      */
     public static final String NAMESPACE = "org.apache.felix.ipojo.whiteboard";
-    
+
     /**
-     * The white board pattern to manage. By default just one. 
+     * The white board pattern to manage. By default just one.
      */
     private List m_managers = new ArrayList(1);
 
     /**
-     * Configure method. Parses the metadata to analyze white-board-pattern elements. 
+     * Configure method. Parses the metadata to analyze white-board-pattern elements.
      * @param elem the component type description
      * @param dict the instance description
      * @throws ConfigurationException if the description is not valid.
@@ -58,14 +59,14 @@ public class WhiteBoardPatternHandler ex
             String onArrival = elems[i].getAttribute("onArrival");
             String onDeparture = elems[i].getAttribute("onDeparture");
             String onModification = elems[i].getAttribute("onModification");
-            
+
             if (filter == null) {
                 throw new ConfigurationException("The white board pattern element requires
a filter attribute");
             }
             if (onArrival == null || onDeparture == null) {
                 throw new ConfigurationException("The white board pattern element requires
the onArrival and onDeparture attributes");
             }
-            
+
             try {
                 WhiteBoardManager wbm = new WhiteBoardManager(this, getInstanceManager().getContext().createFilter(filter),
onArrival, onDeparture, onModification);
                 m_managers.add(wbm);
@@ -73,27 +74,38 @@ public class WhiteBoardPatternHandler ex
                 throw new ConfigurationException("The filter " + filter + " is invalid :
" + e);
             }
         }
-        
+
     }
 
     /**
-     * Start method. Starts managers.
+     * Start method.
      * @see org.apache.felix.ipojo.Handler#start()
      */
     public void start() {
-        for (int i = 0; i < m_managers.size(); i++) {
-            ((WhiteBoardManager) m_managers.get(i)).start();
-        }
     }
 
+
+
     /**
+     * Start managers if we're valid.
+     * @see org.apache.felix.ipojo.Handler#stateChanged(int)
+     */
+    public void stateChanged(int state) {
+		if (state == ComponentInstance.VALID) {
+			for (int i = 0; i < m_managers.size(); i++) {
+	            ((WhiteBoardManager) m_managers.get(i)).start();
+	        }
+		}
+	}
+
+	/**
      * Stop method. Stops managers.
      * @see org.apache.felix.ipojo.Handler#stop()
      */
     public void stop() {
         for (int i = 0; i < m_managers.size(); i++) {
             ((WhiteBoardManager) m_managers.get(i)).stop();
-        } 
+        }
     }
 
 }

Modified: felix/trunk/ipojo/tests/handler/whiteboard/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/handler/whiteboard/pom.xml?rev=996284&r1=996283&r2=996284&view=diff
==============================================================================
--- felix/trunk/ipojo/tests/handler/whiteboard/pom.xml (original)
+++ felix/trunk/ipojo/tests/handler/whiteboard/pom.xml Sun Sep 12 10:14:52 2010
@@ -34,6 +34,11 @@
       <artifactId>org.apache.felix.ipojo</artifactId>
       <version>1.7.0-SNAPSHOT</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.ipojo.handler.whiteboard</artifactId>
+      <version>1.5.0-SNAPSHOT</version>
+    </dependency>
 	<dependency>
 		<groupId>org.osgi</groupId>
 		<artifactId>org.osgi.core</artifactId>
@@ -105,6 +110,16 @@
 								/>
 								<provides/>
 						</component>
+
+						<component classname="org.apache.felix.ipojo.test.FooWhiteBoardPattern" name="under-providers-lifecycle">
+								<wbp:wbp
+									filter="(objectclass=org.apache.felix.ipojo.test.FooService)"
+									onArrival="onArrival" onDeparture="onDeparture" onModification="onModification"
+								/>
+								<provides/>
+								<callback transition="validate" method="start"/>
+								<callback transition="invalidate" method="stop"/>
+						</component>
 					</ipojo>
 					]]>
 					</metadata>
@@ -112,6 +127,23 @@
 			</execution>
 		</executions>
 	</plugin>
+	<plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-junit4osgi-plugin</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>test</goal>
+            </goals>
+            <configuration>
+              <configuration>
+              <org.osgi.http.port>8083</org.osgi.http.port>
+              </configuration>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
     </plugins>
   </build>
 </project>

Modified: felix/trunk/ipojo/tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/FooWhiteBoardPattern.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/FooWhiteBoardPattern.java?rev=996284&r1=996283&r2=996284&view=diff
==============================================================================
--- felix/trunk/ipojo/tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/FooWhiteBoardPattern.java
(original)
+++ felix/trunk/ipojo/tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/FooWhiteBoardPattern.java
Sun Sep 12 10:14:52 2010
@@ -8,18 +8,35 @@ import java.util.Map;
 import org.osgi.framework.ServiceReference;
 
 public class FooWhiteBoardPattern implements Observable {
-    
+
     List list = new ArrayList();
     int modifications = 0;
-    
+
+    long validate_time = 0;
+    long first_arrival_time = 0;
+    long first_departure_time = 0;
+    long invalidate_time = 0;
+
     public void onArrival(ServiceReference ref) {
+    	if (first_arrival_time == 0) {
+    		first_arrival_time = System.currentTimeMillis();
+    		try {
+				Thread.sleep(10);
+			} catch (InterruptedException e) {	}
+    	}
         list.add(ref);
     }
-    
+
     public void onDeparture(ServiceReference ref) {
         list.remove(ref);
+        if (first_departure_time == 0) {
+        	first_departure_time = System.currentTimeMillis();
+    		try {
+				Thread.sleep(10);
+			} catch (InterruptedException e) {	}
+    	}
     }
-    
+
     public void onModification(ServiceReference ref) {
         modifications = modifications + 1;
     }
@@ -28,9 +45,30 @@ public class FooWhiteBoardPattern implem
         Map map = new HashMap();
         map.put("list", list);
         map.put("modifications", new Integer(modifications));
+        map.put("validate", new Long(validate_time));
+        map.put("invalidate", new Long(invalidate_time));
+        map.put("arrival", new Long(first_arrival_time));
+        map.put("departure", new Long(first_departure_time));
         return map;
     }
-    
-    
+
+    public void start() {
+    	if (validate_time == 0) {
+    		validate_time = System.currentTimeMillis();
+    		try {
+				Thread.sleep(10);
+			} catch (InterruptedException e) {	}
+    	}
+    }
+
+    public void stop() {
+    	if (invalidate_time == 0) {
+    		invalidate_time = System.currentTimeMillis();
+    		try {
+				Thread.sleep(10);
+			} catch (InterruptedException e) {	}
+    	}
+    }
+
 
 }

Modified: felix/trunk/ipojo/tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/WbpTests.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/WbpTests.java?rev=996284&r1=996283&r2=996284&view=diff
==============================================================================
--- felix/trunk/ipojo/tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/WbpTests.java
(original)
+++ felix/trunk/ipojo/tests/handler/whiteboard/src/main/java/org/apache/felix/ipojo/test/WbpTests.java
Sun Sep 12 10:14:52 2010
@@ -14,183 +14,209 @@ import org.apache.felix.ipojo.test.scena
 import org.osgi.framework.ServiceReference;
 
 public class WbpTests extends OSGiTestCase {
-    
+
     Factory provFactory;
-    Factory factory, factory2;
+    Factory factory, factory2, factory3;
 
     public void setUp() {
         provFactory = Utils.getFactoryByName(context, "fooprovider");
         factory = Utils.getFactoryByName(context, "under-providers");
         factory2 = Utils.getFactoryByName(context, "under-properties");
+        factory3 = Utils.getFactoryByName(context, "under-providers-lifecycle");
     }
-    
+
     public void tearDown() {
-        
+
     }
-    
+
     public void testServiceProviders() throws UnacceptableConfiguration, MissingHandlerException,
ConfigurationException {
         ComponentInstance ci = factory.createComponentInstance(new Properties());
-        
+
         ServiceReference ref = Utils.getServiceReferenceByName(context, Observable.class.getName(),
ci.getInstanceName());
         assertNotNull("Check Observable availability", ref);
         Observable obs = (Observable) context.getService(ref);
-        
+
         Map map = obs.getObservations();
         assertEquals("Check empty list" , ((List) map.get("list")).size(), 0);
-        
+
         Properties p1 = new Properties();
         p1.put("foo", "foo");
         ComponentInstance prov1 = provFactory.createComponentInstance(p1);
-        
+
         map = obs.getObservations();
         assertEquals("Check list #1" , ((List) map.get("list")).size(), 1);
-       
+
         Properties p2 = new Properties();
         p2.put("foo", "foo");
         ComponentInstance prov2 = provFactory.createComponentInstance(p2);
-        
+
         map = obs.getObservations();
         assertEquals("Check list #2" , ((List) map.get("list")).size(), 2);
-        
+
         prov1.stop();
-        
+
         map = obs.getObservations();
         assertEquals("(1) Check list #1" , ((List) map.get("list")).size(), 1);
-        
+
         prov2.stop();
-        
+
         map = obs.getObservations();
         assertEquals("(2) Check list #0" , ((List) map.get("list")).size(), 0);
-        
+
         prov2.start();
-        
+
         map = obs.getObservations();
         assertEquals("(3) Check list #1" , ((List) map.get("list")).size(), 1);
-        
+
         prov1.start();
-        
+
         map = obs.getObservations();
         assertEquals("(4) Check list #2" , ((List) map.get("list")).size(), 2);
-        
+
         prov1.dispose();
-        
+
         map = obs.getObservations();
         assertEquals("(5) Check list #1" , ((List) map.get("list")).size(), 1);
-        
+
         prov2.dispose();
-        
+
         map = obs.getObservations();
         assertEquals("(6) Check list #0" , ((List) map.get("list")).size(), 0);
-        
+
         context.ungetService(ref);
         ci.dispose();
     }
-    
+
     public void testPropertiesProviders() throws UnacceptableConfiguration, MissingHandlerException,
ConfigurationException {
         ComponentInstance ci = factory2.createComponentInstance(new Properties());
-        
+
         ServiceReference ref = Utils.getServiceReferenceByName(context, Observable.class.getName(),
ci.getInstanceName());
         assertNotNull("Check Observable availability", ref);
         Observable obs = (Observable) context.getService(ref);
-        
+
         Map map = obs.getObservations();
         assertEquals("Check empty list" , ((List) map.get("list")).size(), 0);
-        
+
         Properties p1 = new Properties();
         p1.put("foo", "foo");
         ComponentInstance prov1 = provFactory.createComponentInstance(p1);
         ServiceReference ref1 = Utils.getServiceReferenceByName(context, FooService.class.getName(),
prov1.getInstanceName());
         FooService fs1 = (FooService) context.getService(ref1);
-        
+
         map = obs.getObservations();
         assertEquals("Check list #1" , ((List) map.get("list")).size(), 1);
-       
+
         Properties p2 = new Properties();
         p2.put("foo", "foo");
         ComponentInstance prov2 = provFactory.createComponentInstance(p2);
         ServiceReference ref2 = Utils.getServiceReferenceByName(context, FooService.class.getName(),
prov2.getInstanceName());
         FooService fs2 = (FooService) context.getService(ref2);
-        
+
         map = obs.getObservations();
         assertEquals("Check list #2" , ((List) map.get("list")).size(), 2);
-        
+
         fs1.foo();
-        
+
         map = obs.getObservations();
         assertEquals("(1) Check list #1" , ((List) map.get("list")).size(), 1);
-        
+
         fs2.foo();
-        
+
         map = obs.getObservations();
         assertEquals("(2) Check list #0" , ((List) map.get("list")).size(), 0);
-        
+
         fs2.foo();
-        
+
         map = obs.getObservations();
         assertEquals("(3) Check list #1" , ((List) map.get("list")).size(), 1);
-        
+
         fs1.foo();
-        
+
         map = obs.getObservations();
         assertEquals("(4) Check list #2" , ((List) map.get("list")).size(), 2);
-        
+
         prov1.dispose();
-        
+
         map = obs.getObservations();
         assertEquals("(5) Check list #1" , ((List) map.get("list")).size(), 1);
-        
+
         prov2.dispose();
-        
+
         map = obs.getObservations();
         assertEquals("(6) Check list #0" , ((List) map.get("list")).size(), 0);
-        
+
         context.ungetService(ref1);
         context.ungetService(ref2);
         context.ungetService(ref);
         ci.dispose();
     }
-    
+
     public void testModifications() throws UnacceptableConfiguration, MissingHandlerException,
ConfigurationException {
         ComponentInstance ci = factory.createComponentInstance(new Properties());
-        
+
         ServiceReference ref = Utils.getServiceReferenceByName(context, Observable.class.getName(),
ci.getInstanceName());
         assertNotNull("Check Observable availability", ref);
         Observable obs = (Observable) context.getService(ref);
-        
+
         Map map = obs.getObservations();
         assertEquals("Check empty list" , ((List) map.get("list")).size(), 0);
-        
+
         Properties p1 = new Properties();
         p1.put("foo", "foo");
         ComponentInstance prov1 = provFactory.createComponentInstance(p1);
-        
+
         map = obs.getObservations();
         assertEquals("Check list #1" , ((List) map.get("list")).size(), 1);
         assertEquals("Check modification #0" , ((Integer) map.get("modifications")).intValue(),
0);
-        
+
         ServiceReference ref2 = Utils.getServiceReference(context, FooService.class.getName(),
null);
         assertNotNull("Check FooService availability", ref2);
-        
+
         FooService fs = (FooService) context.getService(ref2);
         fs.foo();
-        
+
         map = obs.getObservations();
         assertEquals("Check list #1" , ((List) map.get("list")).size(), 1);
         assertEquals("Check modification #1 (" + map.get("modifications")+")" , ((Integer)
map.get("modifications")).intValue(), 1);
-        
+
         fs.foo();
-        
+
         map = obs.getObservations();
         assertEquals("Check list #1" , ((List) map.get("list")).size(), 1);
         assertEquals("Check modification #2" , ((Integer) map.get("modifications")).intValue(),
2);
-        
+
         prov1.dispose();
         map = obs.getObservations();
         assertEquals("Check list #0" , ((List) map.get("list")).size(), 0);
         assertEquals("Check modification #2" , ((Integer) map.get("modifications")).intValue(),
2);
-        
+
         context.ungetService(ref);
         context.ungetService(ref2);
         ci.dispose();
     }
+
+    public void testLifecycleCompliance() throws UnacceptableConfiguration, MissingHandlerException,
ConfigurationException {
+    	// First expose a service.
+    	Properties p1 = new Properties();
+        p1.put("foo", "foo");
+        ComponentInstance prov1 = provFactory.createComponentInstance(p1);
+
+        ComponentInstance ci = factory3.createComponentInstance(new Properties());
+
+        ServiceReference ref = Utils.getServiceReferenceByName(context, Observable.class.getName(),
ci.getInstanceName());
+        assertNotNull("Check Observable availability", ref);
+        Observable obs = (Observable) context.getService(ref);
+
+        Map map = obs.getObservations();
+        // Check time
+        Long validate = (Long) map.get("validate");
+        Long arrival = (Long) map.get("arrival");
+
+        // Validate must be call before.
+        assertTrue(validate.longValue() + " <?> " + arrival.longValue(), validate.longValue()
< arrival.longValue());
+
+        prov1.dispose();
+        ci.dispose();
+
+    }
 }



Mime
View raw message