Search in sources :

Example 16 with SynchronousBundleListener

use of org.osgi.framework.SynchronousBundleListener 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 17 with SynchronousBundleListener

use of org.osgi.framework.SynchronousBundleListener 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)

Example 18 with SynchronousBundleListener

use of org.osgi.framework.SynchronousBundleListener in project rt.equinox.framework by eclipse.

the class ClassLoadingBundleTests method testBug258659_01.

public void testBug258659_01() throws Exception {
    // install a bundle
    // $NON-NLS-1$
    Bundle osgiA = installer.installBundle("osgi.lazystart.a");
    SynchronousBundleListener testLoadClassListener = new SynchronousBundleListener() {

        public void bundleChanged(BundleEvent event) {
            if (event.getType() == BundleEvent.LAZY_ACTIVATION)
                try {
                    // $NON-NLS-1$
                    event.getBundle().loadClass("osgi.lazystart.a.ATest");
                } catch (ClassNotFoundException e) {
                    simpleResults.addEvent(e);
                }
        }
    };
    OSGiTestsActivator.getContext().addBundleListener(testLoadClassListener);
    try {
        osgiA.start(Bundle.START_ACTIVATION_POLICY);
        Object[] expectedEvents = new Object[1];
        expectedEvents[0] = new BundleEvent(BundleEvent.STARTED, osgiA);
        Object[] actualEvents = simpleResults.getResults(1);
        compareResults(expectedEvents, actualEvents);
    } finally {
        OSGiTestsActivator.getContext().removeBundleListener(testLoadClassListener);
    }
}
Also used : Bundle(org.osgi.framework.Bundle) BundleEvent(org.osgi.framework.BundleEvent) SynchronousBundleListener(org.osgi.framework.SynchronousBundleListener)

Example 19 with SynchronousBundleListener

use of org.osgi.framework.SynchronousBundleListener in project rt.equinox.framework by eclipse.

the class ClassLoadingBundleTests method testBug258659_02.

public void testBug258659_02() throws Exception {
    // install a bundle
    // $NON-NLS-1$
    Bundle osgiA = installer.installBundle("osgi.lazystart.a");
    osgiA.start(Bundle.START_ACTIVATION_POLICY);
    SynchronousBundleListener testLoadClassListener = new SynchronousBundleListener() {

        public void bundleChanged(BundleEvent event) {
            if (event.getType() == BundleEvent.LAZY_ACTIVATION)
                try {
                    // $NON-NLS-1$
                    event.getBundle().loadClass("osgi.lazystart.a.ATest");
                } catch (ClassNotFoundException e) {
                    simpleResults.addEvent(e);
                }
        }
    };
    OSGiTestsActivator.getContext().addBundleListener(testLoadClassListener);
    try {
        installer.refreshPackages(new Bundle[] { osgiA });
        Object[] expectedEvents = new Object[1];
        expectedEvents[0] = new BundleEvent(BundleEvent.STARTED, osgiA);
        Object[] actualEvents = simpleResults.getResults(1);
        compareResults(expectedEvents, actualEvents);
    } finally {
        OSGiTestsActivator.getContext().removeBundleListener(testLoadClassListener);
    }
}
Also used : Bundle(org.osgi.framework.Bundle) BundleEvent(org.osgi.framework.BundleEvent) SynchronousBundleListener(org.osgi.framework.SynchronousBundleListener)

Example 20 with SynchronousBundleListener

use of org.osgi.framework.SynchronousBundleListener in project rt.equinox.framework by eclipse.

the class ClassLoadingBundleTests method testBug490902.

public void testBug490902() throws BundleException, InterruptedException, ClassNotFoundException, InstantiationException, IllegalAccessException {
    final Bundle a1 = installer.installBundle("test.bug490902.a");
    final Bundle b1 = installer.installBundle("test.bug490902.b");
    installer.resolveBundles(new Bundle[] { a1, b1 });
    final CountDownLatch startingB = new CountDownLatch(1);
    final CountDownLatch endedSecondThread = new CountDownLatch(1);
    BundleListener delayB1 = new SynchronousBundleListener() {

        @Override
        public void bundleChanged(BundleEvent event) {
            if (event.getBundle() == b1 && BundleEvent.STARTING == event.getType()) {
                try {
                    startingB.countDown();
                    System.out.println(getName() + ": Delaying now ...");
                    Thread.sleep(15000);
                    System.out.println(getName() + ": Done delaying.");
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        }
    };
    getContext().addBundleListener(delayB1);
    try {
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    System.out.println(getName() + ": Initial load test.");
                    a1.loadClass("test.bug490902.a.TestLoadA1").newInstance();
                } catch (Throwable e) {
                    e.printStackTrace();
                }
            }
        }, "Initial load test thread.").start();
        startingB.await();
        Thread secondThread = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    System.out.println(getName() + ": Second load test.");
                    a1.loadClass("test.bug490902.a.TestLoadA1").newInstance();
                } catch (Throwable e) {
                    e.printStackTrace();
                } finally {
                    endedSecondThread.countDown();
                }
            }
        }, "Second load test thread.");
        secondThread.start();
        // hack to make sure secondThread is in the middle of Class.forName
        Thread.sleep(10000);
        System.out.println(getName() + ": About to interrupt:" + secondThread.getName());
        secondThread.interrupt();
        endedSecondThread.await();
        a1.loadClass("test.bug490902.a.TestLoadA1").newInstance();
    } finally {
        getContext().removeBundleListener(delayB1);
    }
}
Also used : Bundle(org.osgi.framework.Bundle) BundleEvent(org.osgi.framework.BundleEvent) BundleListener(org.osgi.framework.BundleListener) SynchronousBundleListener(org.osgi.framework.SynchronousBundleListener) CountDownLatch(java.util.concurrent.CountDownLatch) SynchronousBundleListener(org.osgi.framework.SynchronousBundleListener)

Aggregations

SynchronousBundleListener (org.osgi.framework.SynchronousBundleListener)21 BundleEvent (org.osgi.framework.BundleEvent)17 Bundle (org.osgi.framework.Bundle)13 File (java.io.File)8 BundleException (org.osgi.framework.BundleException)8 BundleListener (org.osgi.framework.BundleListener)6 IOException (java.io.IOException)5 HashMap (java.util.HashMap)5 Test (org.junit.Test)4 LinkedHashMap (java.util.LinkedHashMap)3 Map (java.util.Map)3 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)3 CountDownLatch (java.util.concurrent.CountDownLatch)3 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)3 Equinox (org.eclipse.osgi.launch.Equinox)3 BundleContext (org.osgi.framework.BundleContext)3 FileInputStream (java.io.FileInputStream)2 ArrayList (java.util.ArrayList)2 Properties (java.util.Properties)2 CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)2