/****************************************************************************** * Copyright (c) 2006, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0 * is available at http://www.opensource.org/licenses/apache2.0.php. * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. *****************************************************************************/ package org.eclipse.gemini.blueprint.iandt.event; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.osgi.framework.Bundle; import org.springframework.core.io.Resource; import org.eclipse.gemini.blueprint.context.event.OsgiBundleApplicationContextEvent; import org.eclipse.gemini.blueprint.context.event.OsgiBundleApplicationContextListener; import org.eclipse.gemini.blueprint.extender.event.BootstrappingDependenciesEvent; import org.eclipse.gemini.blueprint.extender.event.BootstrappingDependencyEvent; import org.eclipse.gemini.blueprint.service.importer.OsgiServiceDependency; import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyEvent; import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitEndedEvent; import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitStartingEvent; /** * @author Costin Leau * */ public abstract class DepedencyEventTest extends AbstractEventTest { private List refreshEvents = Collections.synchronizedList(new ArrayList(10)); private List<BootstrappingDependenciesEvent> graceEvents = Collections.synchronizedList(new ArrayList<BootstrappingDependenciesEvent>(10)); protected void onSetUp() throws Exception { refreshEvents.clear(); // override the listener with another implementation that waits until the appCtx are fully started listener = new OsgiBundleApplicationContextListener() { public void onOsgiApplicationEvent(OsgiBundleApplicationContextEvent event) { System.out.println("receiving event " + event.getClass()); if (event instanceof BootstrappingDependencyEvent) { eventList.add(event); } if (event instanceof BootstrappingDependenciesEvent) { graceEvents.add((BootstrappingDependenciesEvent) event); } else { refreshEvents.add(event); } synchronized (lock) { lock.notify(); } } }; } public void testEventsForCtxThatWork() throws Exception { // publish listener registerEventListener(); assertTrue("should start with an empty list", eventList.isEmpty()); // install the dependency bundle Resource bundle = getLocator().locateArtifact("org.eclipse.gemini.blueprint.iandt", "dependencies", getSpringDMVersion()); Resource dependency1 = getLocator().locateArtifact("org.eclipse.gemini.blueprint.iandt", "simple.service", getSpringDMVersion()); Resource dependency2 = getLocator().locateArtifact("org.eclipse.gemini.blueprint.iandt", "simple.service2", getSpringDMVersion()); Resource dependency3 = getLocator().locateArtifact("org.eclipse.gemini.blueprint.iandt", "simple.service3", getSpringDMVersion()); Bundle bnd = bundleContext.installBundle(bundle.getURL().toExternalForm()); // install the bundles but don't start them Bundle bnd1 = bundleContext.installBundle(dependency1.getURL().toExternalForm()); Bundle bnd2 = bundleContext.installBundle(dependency2.getURL().toExternalForm()); Bundle bnd3 = bundleContext.installBundle(dependency3.getURL().toExternalForm()); try { bnd.start(); // expect at least 3 events while (eventList.size() < 3) { if (!waitForEvent(TIME_OUT)) { fail("not enough events received after " + TIME_OUT + " ms"); } } // check the event type and their name (plus the order) // simple service 3 assertEquals("&simpleService3", getDependencyAt(0).getBeanName()); assertEquals(OsgiServiceDependencyWaitStartingEvent.class, getNestedEventAt(0).getClass()); // simple service 2 assertEquals("&simpleService2", getDependencyAt(1).getBeanName()); assertEquals(OsgiServiceDependencyWaitStartingEvent.class, getNestedEventAt(0).getClass()); // simple service 1 assertEquals("&nested", getDependencyAt(2).getBeanName()); assertEquals(OsgiServiceDependencyWaitStartingEvent.class, getNestedEventAt(0).getClass()); waitForContextStartEvent(bnd1); assertEquals("&nested", getDependencyAt(3).getBeanName()); assertEquals(OsgiServiceDependencyWaitEndedEvent.class, getNestedEventAt(3).getClass()); waitForContextStartEvent(bnd3); assertEquals("&simpleService3", getDependencyAt(4).getBeanName()); assertEquals(OsgiServiceDependencyWaitEndedEvent.class, getNestedEventAt(4).getClass()); // bnd3 context started event waitForContextStartEvent(bnd2); assertEquals("&simpleService2", getDependencyAt(5).getBeanName()); assertEquals(OsgiServiceDependencyWaitEndedEvent.class, getNestedEventAt(5).getClass()); // bnd2 context started event // wait until the bundle fully starts waitOnContextCreation("org.eclipse.gemini.blueprint.iandt.dependencies"); // double check context started event // bnd1 context started event System.out.println("Refresh events received are " + refreshEvents); while (eventList.size() < 3) { if (!waitForEvent(TIME_OUT)) { fail("not enough events received after " + TIME_OUT + " ms"); } } // at least 3 events have to be received assertTrue(refreshEvents.size() >= 3); for (BootstrappingDependenciesEvent event : graceEvents) { System.out.println(event.getDependenciesAsFilter()); } } finally { bnd.uninstall(); bnd1.uninstall(); bnd2.uninstall(); bnd3.uninstall(); } } private OsgiServiceDependency getDependencyAt(int index) { return getNestedEventAt(index).getServiceDependency(); } private OsgiServiceDependencyEvent getNestedEventAt(int index) { Object obj = eventList.get(index); System.out.println("received object " + obj.getClass() + "|" + obj); BootstrappingDependencyEvent event = (BootstrappingDependencyEvent) obj; return event.getDependencyEvent(); } private void waitForContextStartEvent(Bundle bundle) throws Exception { int eventNumber = eventList.size(); bundle.start(); waitOnContextCreation(bundle.getSymbolicName()); while (eventList.size() < eventNumber + 1) waitForEvent(TIME_OUT); } }