use of org.osgi.framework.BundleEvent in project felix by apache.
the class ConcurrentBundleUpdateTest method testConcurrentBundleUpdate.
public void testConcurrentBundleUpdate() throws Exception {
Map params = new HashMap();
params.put(Constants.FRAMEWORK_SYSTEMPACKAGES, "org.osgi.framework; version=1.4.0," + "org.osgi.service.packageadmin; version=1.2.0," + "org.osgi.service.startlevel; version=1.1.0," + "org.osgi.util.tracker; version=1.3.3," + "org.osgi.service.url; version=1.0.0");
File cacheDir = File.createTempFile("felix-cache", ".dir");
cacheDir.delete();
cacheDir.mkdirs();
String cache = cacheDir.getPath();
params.put("felix.cache.profiledir", cache);
params.put("felix.cache.dir", cache);
params.put(Constants.FRAMEWORK_STORAGE, cache);
try {
Felix felix = new Felix(params);
try {
felix.init();
felix.start();
String mf = "Bundle-SymbolicName: test.concurrent.bundleupdate\n" + "Bundle-Version: 1.0.0\n" + "Bundle-ManifestVersion: 2\n" + "Import-Package: org.osgi.framework\n" + "Manifest-Version: 1.0\n" + "Bundle-Activator: " + ConcurrentBundleUpdaterActivator.class.getName() + "\n\n";
final BundleImpl updater = (BundleImpl) felix.getBundleContext().installBundle(createBundle(mf, ConcurrentBundleUpdaterActivator.class).toURI().toURL().toString());
final Semaphore step = new Semaphore(0);
SynchronousBundleListener listenerStarting = new SynchronousBundleListener() {
@Override
public void bundleChanged(BundleEvent event) {
if (event.getBundle().equals(updater) && event.getType() == BundleEvent.STARTING) {
step.release();
}
}
};
felix.getBundleContext().addBundleListener(listenerStarting);
new Thread() {
public void run() {
try {
updater.start();
} catch (Exception ex) {
}
}
}.start();
assertTrue(step.tryAcquire(1, TimeUnit.SECONDS));
felix.getBundleContext().removeBundleListener(listenerStarting);
assertEquals(Bundle.STARTING, updater.getState());
assertEquals(0, step.availablePermits());
new Thread() {
public void run() {
try {
step.release();
updater.update();
step.release();
} catch (Exception ex) {
}
}
}.start();
assertTrue(step.tryAcquire(1, TimeUnit.SECONDS));
SynchronousBundleListener listenerStarted = new SynchronousBundleListener() {
@Override
public void bundleChanged(BundleEvent event) {
if (event.getBundle().equals(updater) && event.getType() == BundleEvent.STARTED) {
step.release();
}
if (event.getBundle().equals(updater) && event.getType() == BundleEvent.STOPPING) {
step.release();
}
}
};
felix.getBundleContext().addBundleListener(listenerStarted);
((Runnable) updater.getActivator()).run();
assertTrue(step.tryAcquire(2, 1, TimeUnit.SECONDS));
felix.getBundleContext().removeBundleListener(listenerStarted);
assertEquals(0, step.availablePermits());
assertEquals(Bundle.STOPPING, updater.getState());
felix.getBundleContext().addBundleListener(listenerStarting);
((Runnable) updater.getActivator()).run();
assertTrue(step.tryAcquire(1, TimeUnit.SECONDS));
felix.getBundleContext().removeBundleListener(listenerStarting);
assertEquals(Bundle.STARTING, updater.getState());
((Runnable) updater.getActivator()).run();
assertTrue(step.tryAcquire(1, TimeUnit.SECONDS));
assertEquals(Bundle.ACTIVE, updater.getState());
((Runnable) updater.getActivator()).run();
updater.uninstall();
assertEquals(Bundle.UNINSTALLED, updater.getState());
try {
updater.update();
fail("Expected exception on update of uninstalled bundle");
} catch (IllegalStateException expected) {
}
} finally {
felix.stop();
felix.waitForStop(1000);
}
} finally {
delete(cacheDir);
}
}
use of org.osgi.framework.BundleEvent in project felix by apache.
the class BundleTrackerTest method testTracking.
@Test
public void testTracking() {
Bundle bundle = mock(Bundle.class);
when(bundle.getState()).thenReturn(Bundle.ACTIVE);
BundleContext context = Mockito.mock(BundleContext.class);
@SuppressWarnings("unchecked") BundleTrackerCustomizer<Bundle> customizer = mock(BundleTrackerCustomizer.class);
when(customizer.addingBundle(Mockito.eq(bundle), Mockito.any(BundleEvent.class))).thenReturn(bundle);
BundleTracker<Bundle> tracker = new BundleTracker<Bundle>(context, Bundle.ACTIVE | Bundle.STARTING, customizer);
tracker.open();
ArgumentCaptor<BundleListener> listenerCaptor = ArgumentCaptor.forClass(BundleListener.class);
verify(context).addBundleListener(listenerCaptor.capture());
BundleListener listener = listenerCaptor.getValue();
BundleEvent startedEvent = new BundleEvent(BundleEvent.STARTED, bundle);
listener.bundleChanged(startedEvent);
verify(customizer).addingBundle(bundle, startedEvent);
when(bundle.getState()).thenReturn(Bundle.INSTALLED);
BundleEvent stoppedEvent = new BundleEvent(BundleEvent.STOPPED, bundle);
listener.bundleChanged(stoppedEvent);
verify(customizer).removedBundle(bundle, stoppedEvent, bundle);
}
use of org.osgi.framework.BundleEvent in project felix by apache.
the class PojoSRBundle method stop.
@Override
public synchronized void stop() throws BundleException {
if (m_state != Bundle.ACTIVE) {
if (m_state == Bundle.RESOLVED) {
return;
}
throw new BundleException("Bundle is in wrong state for stop");
}
try {
m_state = Bundle.STOPPING;
m_dispatcher.fireBundleEvent(new BundleEvent(BundleEvent.STOPPING, this));
if (m_activator != null) {
m_activator.stop(m_context);
}
} catch (Throwable ex) {
throw new BundleException("Error while stopping bundle", ex);
} finally {
m_registry.unregisterServices(this);
m_dispatcher.removeListeners(m_context);
m_activator = null;
m_context = null;
m_state = Bundle.RESOLVED;
m_dispatcher.fireBundleEvent(new BundleEvent(BundleEvent.STOPPED, this));
}
}
use of org.osgi.framework.BundleEvent in project rt.equinox.framework by eclipse.
the class SystemBundleTests method testBug414070.
public void testBug414070() throws BundleException, InstantiationException, IllegalAccessException, ClassNotFoundException {
// $NON-NLS-1$
File config = OSGiTestsActivator.getContext().getDataFile(getName());
Map<String, Object> configuration = new HashMap<String, Object>();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
Equinox equinox = new Equinox(configuration);
equinox.init();
BundleContext systemContext = equinox.getBundleContext();
Bundle systemBundle = systemContext.getBundle();
// $NON-NLS-1$
Bundle chainTest = systemContext.installBundle(installer.getBundleLocation("chain.test"));
// $NON-NLS-1$
final Bundle chainTestD = systemContext.installBundle(installer.getBundleLocation("chain.test.d"));
// $NON-NLS-1$
Bundle chainTestA = systemContext.installBundle(installer.getBundleLocation("chain.test.a"));
// $NON-NLS-1$
Bundle chainTestB = systemContext.installBundle(installer.getBundleLocation("chain.test.b"));
// $NON-NLS-1$
Bundle chainTestC = systemContext.installBundle(installer.getBundleLocation("chain.test.c"));
systemContext.registerService(WeavingHook.class, new WeavingHook() {
public void weave(WovenClass wovenClass) {
if (!chainTestD.equals(wovenClass.getBundleWiring().getBundle()))
return;
if (!"chain.test.d.DMultipleChain1".equals(wovenClass.getClassName()))
return;
List dynamicImports = wovenClass.getDynamicImports();
dynamicImports.add("*");
}
}, null);
equinox.start();
// $NON-NLS-1$
chainTest.loadClass("chain.test.TestMultiChain").newInstance();
// force a dynamic wire to cause a cycle
chainTestD.loadClass("chain.test.a.AMultiChain1");
// make sure all bundles are active now
assertEquals("A is not active.", Bundle.ACTIVE, chainTestA.getState());
assertEquals("B is not active.", Bundle.ACTIVE, chainTestB.getState());
assertEquals("C is not active.", Bundle.ACTIVE, chainTestC.getState());
assertEquals("D is not active.", Bundle.ACTIVE, chainTestD.getState());
// record STOPPING order
final List<Bundle> stoppingOrder = new ArrayList<Bundle>();
systemContext.addBundleListener(new SynchronousBundleListener() {
@Override
public void bundleChanged(BundleEvent event) {
if (event.getType() == BundleEvent.STOPPING) {
stoppingOrder.add(event.getBundle());
}
}
});
equinox.stop();
try {
equinox.waitForStop(10000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
fail("Unexpected interruption.", e);
}
List<Bundle> expectedOrder = Arrays.asList(systemBundle, chainTest, chainTestA, chainTestB, chainTestC, chainTestD);
assertEquals("Wrong stopping order", expectedOrder.toArray(), stoppingOrder.toArray());
}
use of org.osgi.framework.BundleEvent in project rt.equinox.framework by eclipse.
the class SystemBundleTests method testStartLevelSorting.
public void testStartLevelSorting() throws IOException, InterruptedException {
// $NON-NLS-1$
File config = OSGiTestsActivator.getContext().getDataFile(getName());
Map configuration = new HashMap();
configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
Equinox equinox = null;
final int numBundles = 200;
final File[] testBundleFiles = createBundles(new File(config, "testBundles"), numBundles);
try {
equinox = new Equinox(configuration);
equinox.start();
final List<Bundle> testBundles = Collections.synchronizedList(new ArrayList<Bundle>());
final List<Bundle> startedBundles = Collections.synchronizedList(new ArrayList<Bundle>());
for (int i = 0; i < numBundles / 2; i++) {
Bundle b = equinox.getBundleContext().installBundle("reference:file:///" + testBundleFiles[i].getAbsolutePath());
b.adapt(BundleStartLevel.class).setStartLevel(i + 2);
testBundles.add(b);
b.start();
}
final Equinox finalEquinox = equinox;
BundleListener initialListener = new SynchronousBundleListener() {
AtomicBoolean reverseStartLevel = new AtomicBoolean();
AtomicBoolean installBundles = new AtomicBoolean();
@Override
public void bundleChanged(BundleEvent event) {
Bundle eBundle = event.getBundle();
String bsn = eBundle.getSymbolicName();
if (!bsn.startsWith("bundle-b") || event.getType() != BundleEvent.STARTED) {
return;
}
startedBundles.add(eBundle);
if (reverseStartLevel.compareAndSet(false, true)) {
for (int i = numBundles / 4, j = numBundles; i < numBundles / 2; i++, j--) {
BundleStartLevel tbsl = testBundles.get(i).adapt(BundleStartLevel.class);
tbsl.setStartLevel(j + 2 + numBundles);
}
} else if (installBundles.compareAndSet(false, true)) {
for (int i = numBundles / 2; i < numBundles; i++) {
try {
Bundle b = finalEquinox.getBundleContext().installBundle("reference:file:///" + testBundleFiles[i].getAbsolutePath());
b.adapt(BundleStartLevel.class).setStartLevel(i + 2);
testBundles.add(b);
b.start();
} catch (BundleException e) {
// do nothing
}
}
}
}
};
equinox.getBundleContext().addBundleListener(initialListener);
long startTime = System.currentTimeMillis();
final CountDownLatch waitForStartLevel = new CountDownLatch(1);
equinox.adapt(FrameworkStartLevel.class).setStartLevel(numBundles * 3, new FrameworkListener() {
@Override
public void frameworkEvent(FrameworkEvent event) {
waitForStartLevel.countDown();
}
});
waitForStartLevel.await(20, TimeUnit.SECONDS);
System.out.println("Start time: " + (System.currentTimeMillis() - startTime));
assertEquals("Did not finish start level setting.", 0, waitForStartLevel.getCount());
assertEquals("Did not install all the expected bundles.", numBundles, testBundles.size());
List<Bundle> expectedStartOrder = new ArrayList<Bundle>();
for (int i = 0; i < numBundles / 4; i++) {
expectedStartOrder.add(testBundles.get(i));
}
for (int i = numBundles / 2; i < numBundles; i++) {
expectedStartOrder.add(testBundles.get(i));
}
for (int i = (numBundles / 2) - 1; i >= numBundles / 4; i--) {
expectedStartOrder.add(testBundles.get(i));
}
assertEquals("Size on expected order is wrong.", numBundles, expectedStartOrder.size());
for (int i = 0; i < numBundles; i++) {
assertEquals("Wrong bundle at: " + i, expectedStartOrder.get(i), startedBundles.get(i));
}
equinox.getBundleContext().removeBundleListener(initialListener);
final List<Bundle> stoppedBundles = Collections.synchronizedList(new ArrayList<Bundle>());
BundleListener shutdownListener = new SynchronousBundleListener() {
AtomicBoolean reverseStartLevel = new AtomicBoolean();
AtomicBoolean uninstallBundles = new AtomicBoolean();
AtomicBoolean inUninstall = new AtomicBoolean();
@Override
public void bundleChanged(BundleEvent event) {
if (inUninstall.get()) {
return;
}
Bundle eBundle = event.getBundle();
String bsn = eBundle.getSymbolicName();
if (!bsn.startsWith("bundle-b") || event.getType() != BundleEvent.STOPPED) {
return;
}
stoppedBundles.add(eBundle);
if (reverseStartLevel.compareAndSet(false, true)) {
for (int i = numBundles / 2, j = numBundles - 1; i < numBundles; i++, j--) {
BundleStartLevel tbsl = testBundles.get(i).adapt(BundleStartLevel.class);
tbsl.setStartLevel(j + 2);
}
} else if (uninstallBundles.compareAndSet(false, true)) {
for (int i = 0; i < numBundles / 4; i++) {
try {
inUninstall.set(true);
testBundles.get(i).uninstall();
} catch (BundleException e) {
// do nothing
} finally {
inUninstall.set(false);
}
}
}
}
};
equinox.getBundleContext().addBundleListener(shutdownListener);
List<Bundle> expectedStopOrder = new ArrayList<Bundle>(expectedStartOrder);
Collections.reverse(expectedStopOrder);
Collections.reverse(expectedStopOrder.subList(numBundles / 4, 3 * (numBundles / 4)));
expectedStopOrder = new ArrayList(expectedStopOrder.subList(0, 3 * (numBundles / 4)));
long stopTime = System.currentTimeMillis();
equinox.stop();
equinox.waitForStop(20000);
System.out.println("Stop time: " + (System.currentTimeMillis() - stopTime));
assertEquals("Size on expected order is wrong.", expectedStopOrder.size(), stoppedBundles.size());
for (int i = 0; i < expectedStopOrder.size(); i++) {
assertEquals("Wrong bundle at: " + i, expectedStopOrder.get(i), stoppedBundles.get(i));
}
} catch (BundleException e) {
fail("Failed init", e);
} finally {
try {
if (equinox != null) {
equinox.stop();
equinox.waitForStop(1000);
}
} catch (BundleException e) {
fail("Failed to stop framework.", e);
} catch (InterruptedException e) {
fail("Failed to stop framework.", e);
}
}
}
Aggregations