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;
+ }
}