/******************************************************************************
* 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.servicedependency;
import java.io.Serializable;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import junit.framework.Assert;
import org.eclipse.gemini.blueprint.iandt.BaseIntegrationTest;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.springframework.core.io.Resource;
import org.eclipse.gemini.blueprint.util.OsgiBundleUtils;
import org.eclipse.gemini.blueprint.util.OsgiFilterUtils;
import org.eclipse.gemini.blueprint.util.OsgiServiceReferenceUtils;
import org.eclipse.gemini.blueprint.util.OsgiServiceUtils;
/**
* @author Costin Leau
*/
public class ExporterWithOptionalAndMandatoryImportersTest extends BaseIntegrationTest {
private static final String DEP_SYN_NAME = "org.eclipse.gemini.blueprint.iandt.dependency.exporter.importer";
private ServiceRegistration optional, mandatory;
protected void postProcessBundleContext(BundleContext context) throws Exception {
super.postProcessBundleContext(context);
installTestBundle(context);
}
protected void onSetUp() throws Exception {
registerOptional();
registerMandatory();
}
protected void onTearDown() throws Exception {
Bundle bnd = getDependencyBundle();
bnd.stop();
OsgiServiceUtils.unregisterService(mandatory);
OsgiServiceUtils.unregisterService(optional);
}
public void testInjectedDependencies() throws Exception {
Bundle bnd = getDependencyBundle();
bnd.start();
logger.info("Waiting for the test bundle to start up...");
waitOnContextCreation(DEP_SYN_NAME);
logger.info("Test bundle context created - starting test...");
assertTrue("exporter not alive on startup", isInjectedExporterAlive());
optional.unregister();
assertTrue("exporter affected by the optional dependency", isInjectedExporterAlive());
mandatory.unregister();
assertFalse("exporter not affected by the optional dependency", isInjectedExporterAlive());
registerOptional();
assertFalse("exporter affected by the optional dependency", isInjectedExporterAlive());
registerMandatory();
assertTrue("exporter not affected by the optional dependency", isInjectedExporterAlive());
optional.unregister();
assertTrue("exporter affected by the optional dependency", isInjectedExporterAlive());
}
public void testDependsOnDependencies() throws Exception {
Bundle bnd = getDependencyBundle();
bnd.start();
logger.info("Waiting for the test bundle to start up...");
waitOnContextCreation(DEP_SYN_NAME);
logger.info("Test bundle context created - starting test...");
assertTrue("exporter not alive on startup", isDependsOnExporterAlive());
optional.unregister();
assertTrue("exporter affected by the optional dependency", isDependsOnExporterAlive());
mandatory.unregister();
assertFalse("exporter not affected by the optional dependency", isDependsOnExporterAlive());
registerOptional();
assertFalse("exporter affected by the optional dependency", isDependsOnExporterAlive());
registerMandatory();
assertTrue("exporter not affected by the optional dependency", isDependsOnExporterAlive());
optional.unregister();
assertTrue("exporter affected by the optional dependency", isInjectedExporterAlive());
}
private boolean isExporterAlive(String name) {
String filter = OsgiFilterUtils.unifyFilter(new Class[] { Serializable.class, Cloneable.class },
"(org.eclipse.gemini.blueprint.bean.name=" + name + ")");
ServiceReference reference = OsgiServiceReferenceUtils.getServiceReference(bundleContext, filter);
if (reference != null) {
Object service = bundleContext.getService(reference);
return service != null;
}
return false;
}
private boolean isInjectedExporterAlive() {
return isExporterAlive("injected-export");
}
private boolean isDependsOnExporterAlive() {
return isExporterAlive("depends-on-export");
}
private void registerOptional() {
optional = bundleContext.registerService(SortedSet.class.getName(), new TreeSet(), null);
}
private void registerMandatory() {
mandatory = bundleContext.registerService(SortedMap.class.getName(), new TreeMap(), null);
}
Bundle installTestBundle(BundleContext context) throws Exception {
Resource res = getLocator().locateArtifact("org.eclipse.gemini.blueprint.iandt", "export-import-dependency-bundle",
getSpringDMVersion());
return context.installBundle("test-bundle", res.getInputStream());
}
protected Bundle getDependencyBundle() {
return OsgiBundleUtils.findBundleBySymbolicName(bundleContext, DEP_SYN_NAME);
}
}