Author: mahrwald
Date: Thu Feb 10 18:26:17 2011
New Revision: 1069511

URL: http://svn.apache.org/viewvc?rev=1069511&view=rev
Log:
ARIES-568: Fix some lifecycle issues with the trackers

Modified:
    
aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java
    
aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java
    
aries/trunk/util/src/test/java/org/apache/aries/util/RecursiveBundleTrackerTest.java

Modified: 
aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java?rev=1069511&r1=1069510&r2=1069511&view=diff
==============================================================================
--- 
aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java
 (original)
+++ 
aries/trunk/util/src/main/java/org/apache/aries/util/tracker/InternalRecursiveBundleTracker.java
 Thu Feb 10 18:26:17 2011
@@ -123,7 +123,7 @@ public class InternalRecursiveBundleTrac
           openTracker(btc, cb, bundleScope, mask);
         }
       } else {
-        if (event.getType() == BundleEvent.STOPPED) {
+        if (event.getType() == BundleEvent.STOPPED || event.getType() == 
BundleEvent.UNRESOLVED || event.getType() == BundleEvent.UNINSTALLED) {
           // if CompositeBundle is being stopped, let's remove the bundle
           // tracker(s) associated with the composite bundle
           String bundleId = b.getSymbolicName()+"/"+b.getVersion();
@@ -134,8 +134,7 @@ public class InternalRecursiveBundleTrac
             // bundle trackers
             BundleTrackerFactory.unregisterAndCloseBundleTracker(bundleScope);
           }
-        } else if (event.getType() == BundleEvent.INSTALLED
-            || event.getType() == BundleEvent.STARTING) {
+        } else if (event.getType() == BundleEvent.INSTALLED || event.getType() 
== BundleEvent.RESOLVED || event.getType() == BundleEvent.STARTING) {
           openTracker(btc, cb, bundleScope, mask);
         }
       }

Modified: 
aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java?rev=1069511&r1=1069510&r2=1069511&view=diff
==============================================================================
--- 
aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java
 (original)
+++ 
aries/trunk/util/src/main/java/org/apache/aries/util/tracker/RecursiveBundleTracker.java
 Thu Feb 10 18:26:17 2011
@@ -38,7 +38,7 @@ import org.osgi.util.tracker.BundleTrack
  */
 public final class RecursiveBundleTracker  {
     private static final int COMPOSITE_BUNDLE_MASK =
-      Bundle.INSTALLED | Bundle.STARTING | Bundle.ACTIVE | Bundle.STOPPING;
+      Bundle.INSTALLED | Bundle.RESOLVED | Bundle.STARTING | Bundle.ACTIVE | 
Bundle.STOPPING;
     
     private final BundleTracker tracker;
         

Modified: 
aries/trunk/util/src/test/java/org/apache/aries/util/RecursiveBundleTrackerTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/util/src/test/java/org/apache/aries/util/RecursiveBundleTrackerTest.java?rev=1069511&r1=1069510&r2=1069511&view=diff
==============================================================================
--- 
aries/trunk/util/src/test/java/org/apache/aries/util/RecursiveBundleTrackerTest.java
 (original)
+++ 
aries/trunk/util/src/test/java/org/apache/aries/util/RecursiveBundleTrackerTest.java
 Thu Feb 10 18:26:17 2011
@@ -32,13 +32,13 @@ import org.osgi.framework.BundleEvent;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.Version;
 import org.osgi.service.framework.CompositeBundle;
-import org.osgi.service.framework.CompositeBundleFactory;
 import org.osgi.util.tracker.BundleTrackerCustomizer;
 
 import static org.junit.Assert.*;
 
 public class RecursiveBundleTrackerTest {
     BundleContext context;
+    InternalRecursiveBundleTracker sut;
     
     @Before
     public void setup() {
@@ -55,28 +55,41 @@ public class RecursiveBundleTrackerTest 
     
     @Test
     public void testCompositeLifeCycle() {
-        BundleTrackerCustomizer customizer = 
Skeleton.newMock(BundleTrackerCustomizer.class);
+        makeSUT();
+        CompositeBundle  cb = composite("test.composite", "1.0.0");
+        assertNoTrackers();
+        
+        // full lifecycle
+        
+        sut.addingBundle(cb, new BundleEvent(BundleEvent.INSTALLED, cb));
+        assertTracker(cb);
 
-        InternalRecursiveBundleTracker sut = new 
InternalRecursiveBundleTracker(context, 
-                Bundle.INSTALLED | Bundle.STARTING | Bundle.ACTIVE | 
Bundle.STOPPING, customizer);
+        sut.modifiedBundle(cb, new BundleEvent(BundleEvent.RESOLVED, cb), cb);
+        sut.modifiedBundle(cb, new BundleEvent(BundleEvent.STARTING, cb), cb);
+        sut.modifiedBundle(cb, new BundleEvent(BundleEvent.STARTED, cb), cb);
+        sut.modifiedBundle(cb, new BundleEvent(BundleEvent.STOPPING, cb), cb);
+        sut.removedBundle(cb, new BundleEvent(BundleEvent.STOPPED, cb), cb);
+        assertNoTrackers();
         
-        sut.open();
+        // short lifecycle
         
-        CompositeBundle cb = Skeleton.newMock(CompositeBundle.class);
-        Skeleton cbSkel = Skeleton.getSkeleton(cb);
-        cbSkel.setReturnValue(new MethodCall(CompositeBundle.class, 
"getSymbolicName"), "test.composite");
-        cbSkel.setReturnValue(new MethodCall(CompositeBundle.class, 
"getVersion"), new Version("1.0.0"));
+        sut.addingBundle(cb, new BundleEvent(BundleEvent.INSTALLED, cb));
+        assertTracker(cb);
         
-        assertTrue(BundleTrackerFactory.getAllBundleTracker().isEmpty());
+        sut.modifiedBundle(cb, new BundleEvent(BundleEvent.RESOLVED, cb), cb); 
       
+        sut.removedBundle(cb, new BundleEvent(BundleEvent.UNRESOLVED, cb), cb);
+        assertNoTrackers();
+        
+        // shortest lifecycle
         
         sut.addingBundle(cb, new BundleEvent(BundleEvent.INSTALLED, cb));
-        assertEquals(1, BundleTrackerFactory.getAllBundleTracker().size());
-        assertEquals(1, 
BundleTrackerFactory.getBundleTrackerList("test.composite_1.0.0").size());
+        assertTracker(cb);
         
-        sut.removedBundle(cb, new BundleEvent(BundleEvent.STOPPED, cb), cb);
-        assertTrue(BundleTrackerFactory.getAllBundleTracker().isEmpty());      
  
+        sut.removedBundle(cb, new BundleEvent(BundleEvent.UNINSTALLED, cb), 
cb);
+        assertNoTrackers();
     }
     
+    
     @Test(expected=IllegalArgumentException.class)
     public void testMissingStopping() {
         new RecursiveBundleTracker(null, Bundle.INSTALLED | Bundle.RESOLVED | 
Bundle.STARTING | Bundle.ACTIVE, null);
@@ -91,4 +104,30 @@ public class RecursiveBundleTrackerTest 
     public void testMissingInstalled() {
         new RecursiveBundleTracker(null, Bundle.RESOLVED | Bundle.STARTING | 
Bundle.ACTIVE | Bundle.STOPPING, null);        
     }
+    
+    private void assertNoTrackers() {
+        assertTrue(BundleTrackerFactory.getAllBundleTracker().isEmpty());      
  
+    }
+    
+    private void assertTracker(CompositeBundle cb) {
+        assertEquals(1, BundleTrackerFactory.getAllBundleTracker().size());
+        assertEquals(1, 
BundleTrackerFactory.getBundleTrackerList(cb.getSymbolicName()+"_"+cb.getVersion()).size());
        
+    }
+    
+    private void makeSUT() {
+        BundleTrackerCustomizer customizer = 
Skeleton.newMock(BundleTrackerCustomizer.class);
+
+        sut = new InternalRecursiveBundleTracker(context, 
+                Bundle.INSTALLED | Bundle.STARTING | Bundle.ACTIVE | 
Bundle.STOPPING, customizer);
+        
+        sut.open();
+    }
+    
+    private CompositeBundle composite(String symbolicName, String version) {
+        CompositeBundle cb = Skeleton.newMock(CompositeBundle.class);
+        Skeleton cbSkel = Skeleton.getSkeleton(cb);
+        cbSkel.setReturnValue(new MethodCall(CompositeBundle.class, 
"getSymbolicName"), symbolicName);
+        cbSkel.setReturnValue(new MethodCall(CompositeBundle.class, 
"getVersion"), new Version(version));
+        return cb;
+    }
 }


Reply via email to