Search in sources :

Example 56 with BundleEvent

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);
    }
}
Also used : HashMap(java.util.HashMap) Semaphore(java.util.concurrent.Semaphore) IOException(java.io.IOException) BundleException(org.osgi.framework.BundleException) BundleEvent(org.osgi.framework.BundleEvent) HashMap(java.util.HashMap) Map(java.util.Map) File(java.io.File) SynchronousBundleListener(org.osgi.framework.SynchronousBundleListener)

Example 57 with BundleEvent

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);
}
Also used : Bundle(org.osgi.framework.Bundle) BundleEvent(org.osgi.framework.BundleEvent) BundleListener(org.osgi.framework.BundleListener) BundleContext(org.osgi.framework.BundleContext) Test(org.junit.Test)

Example 58 with BundleEvent

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));
    }
}
Also used : BundleEvent(org.osgi.framework.BundleEvent) BundleException(org.osgi.framework.BundleException)

Example 59 with BundleEvent

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());
}
Also used : LinkedHashMap(java.util.LinkedHashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) Bundle(org.osgi.framework.Bundle) WovenClass(org.osgi.framework.hooks.weaving.WovenClass) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ArrayList(java.util.ArrayList) Equinox(org.eclipse.osgi.launch.Equinox) BundleEvent(org.osgi.framework.BundleEvent) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ArrayList(java.util.ArrayList) List(java.util.List) File(java.io.File) WeavingHook(org.osgi.framework.hooks.weaving.WeavingHook) SynchronousBundleListener(org.osgi.framework.SynchronousBundleListener) BundleContext(org.osgi.framework.BundleContext)

Example 60 with BundleEvent

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);
        }
    }
}
Also used : BundleStartLevel(org.osgi.framework.startlevel.BundleStartLevel) LinkedHashMap(java.util.LinkedHashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) FrameworkEvent(org.osgi.framework.FrameworkEvent) Bundle(org.osgi.framework.Bundle) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ArrayList(java.util.ArrayList) CountDownLatch(java.util.concurrent.CountDownLatch) FrameworkStartLevel(org.osgi.framework.startlevel.FrameworkStartLevel) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Equinox(org.eclipse.osgi.launch.Equinox) BundleEvent(org.osgi.framework.BundleEvent) BundleListener(org.osgi.framework.BundleListener) SynchronousBundleListener(org.osgi.framework.SynchronousBundleListener) BundleException(org.osgi.framework.BundleException) FrameworkListener(org.osgi.framework.FrameworkListener) File(java.io.File) Map(java.util.Map) LinkedHashMap(java.util.LinkedHashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) SynchronousBundleListener(org.osgi.framework.SynchronousBundleListener)

Aggregations

BundleEvent (org.osgi.framework.BundleEvent)83 Bundle (org.osgi.framework.Bundle)49 Test (org.junit.Test)24 SynchronousBundleListener (org.osgi.framework.SynchronousBundleListener)17 BundleListener (org.osgi.framework.BundleListener)15 FeatureDTO (com.amitinside.featureflags.dto.FeatureDTO)11 File (java.io.File)10 IOException (java.io.IOException)10 BundleException (org.osgi.framework.BundleException)10 BundleContext (org.osgi.framework.BundleContext)9 FrameworkEvent (org.osgi.framework.FrameworkEvent)7 StartLevel (org.osgi.service.startlevel.StartLevel)7 ArrayList (java.util.ArrayList)5 HashMap (java.util.HashMap)5 List (java.util.List)5 BundleTracker (org.osgi.util.tracker.BundleTracker)5 Map (java.util.Map)4 ServiceReference (org.osgi.framework.ServiceReference)4 BundleTrackerCustomizer (org.osgi.util.tracker.BundleTrackerCustomizer)4 FileInputStream (java.io.FileInputStream)3