blob: 9dc9d557af333721b0e7dab605143d0ad70453c3 [file] [log] [blame]
/******************************************************************************
* 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.test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.eclipse.gemini.blueprint.test.platform.EquinoxPlatform;
import org.eclipse.gemini.blueprint.test.platform.OsgiPlatform;
import org.eclipse.gemini.blueprint.test.platform.Platforms;
import org.osgi.framework.Constants;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
/**
* Abstract JUnit super class which configures an {@link OsgiPlatform}. <p/>
* This class offers more hooks for programmatic and declarative configuration
* of the underlying OSGi platform used when running the test suite.
*
* @author Costin Leau
*
*/
public abstract class AbstractConfigurableOsgiTests extends AbstractOsgiTests {
/**
*
* Default constructor. Constructs a new
* <code>AbstractConfigurableOsgiTests</code> instance.
*/
public AbstractConfigurableOsgiTests() {
super();
}
/**
* Constructs a new <code>AbstractConfigurableOsgiTests</code> instance.
*
* @param name test name
*/
public AbstractConfigurableOsgiTests(String name) {
super(name);
}
/**
* System property for selecting the appropriate OSGi implementation.
*/
public static final String OSGI_FRAMEWORK_SELECTOR = "org.eclipse.gemini.blueprint.test.framework";
/**
* {@inheritDoc}
*
* <p/>This implementation determines and creates the OSGi platform used by
* the test suite (Equinox by default). It will try to create a Platform
* instance based on the <code>getPlatformName</code>, falling back to
* Equinox in case of a failure.
*
* @see #getPlatformName() for an easier alternative.
*/
protected OsgiPlatform createPlatform() {
boolean trace = logger.isTraceEnabled();
String platformClassName = getPlatformName();
OsgiPlatform platform = null;
ClassLoader currentCL = getClass().getClassLoader();
if (StringUtils.hasText(platformClassName)) {
if (ClassUtils.isPresent(platformClassName, currentCL)) {
Class<?> platformClass = ClassUtils.resolveClassName(platformClassName, currentCL);
if (OsgiPlatform.class.isAssignableFrom(platformClass)) {
if (trace)
logger.trace("Instantiating platform wrapper...");
try {
platform = (OsgiPlatform) platformClass.newInstance();
}
catch (Exception ex) {
logger.warn("cannot instantiate class [" + platformClass + "]; using default");
}
}
else
logger.warn("Class [" + platformClass + "] does not implement " + OsgiPlatform.class.getName()
+ " interface; falling back to defaults");
}
else {
logger.warn("OSGi platform starter [" + platformClassName + "] not found; using default");
}
}
else
logger.trace("No platform specified; using default");
// fall back
if (platform == null)
platform = new EquinoxPlatform();
Properties config = platform.getConfigurationProperties();
// add boot delegation
config.setProperty(Constants.FRAMEWORK_BOOTDELEGATION,
getBootDelegationPackageString());
return platform;
}
/**
* Indicates what OSGi platform should be used by the test suite. By
* default, {@link #OSGI_FRAMEWORK_SELECTOR} system property is used.
* Subclasses can override this and provide directly the OSGi platform name.
* By default, the platform name holds the fully qualified name of the OSGi
* platform class.
*
* @return platform platform name
* @see Platforms
*/
protected String getPlatformName() {
String systemProperty = System.getProperty(OSGI_FRAMEWORK_SELECTOR);
if (logger.isTraceEnabled())
logger.trace("System property [" + OSGI_FRAMEWORK_SELECTOR + "] has value=" + systemProperty);
return (!StringUtils.hasText(systemProperty) ? Platforms.EQUINOX : systemProperty);
}
/**
* Returns a String representation of the boot delegation packages list.
*
* @return boot delegation path
*/
private String getBootDelegationPackageString() {
StringBuilder buf = new StringBuilder();
for (Iterator iter = getBootDelegationPackages().iterator(); iter.hasNext();) {
buf.append(((String) iter.next()).trim());
if (iter.hasNext()) {
buf.append(",");
}
}
return buf.toString();
}
/**
* Returns the list of OSGi packages that are delegated to the boot
* classpath. See the OSGi specification regarding the format of the package
* string representation.
*
* @return the list of strings representing the packages that the OSGi
* platform will delegate to the boot class path.
*/
protected List getBootDelegationPackages() {
List defaults = new ArrayList();
// javax packages
defaults.add("javax.*");
// sql + transaction + activation?
defaults.add("javax.sql.*");
defaults.add("javax.transaction.*");
defaults.add("javax.activation.*");
// XML API available in JDK 1.4
defaults.add("org.w3c.*");
defaults.add("org.xml.*");
// sun packages
defaults.add("sun.*");
defaults.add("com.sun.*");
// FIXME: the JAXP package (for 1.4 VMs) should be discovered in an OSGi
// manner
defaults.add("org.apache.xerces.jaxp.*");
return defaults;
}
}