/******************************************************************************
 * 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<String> iter = getBootDelegationPackages().iterator(); iter.hasNext();) {
			buf.append(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<String> getBootDelegationPackages() {
		List<String> defaults = new ArrayList<String>();

		// 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;
	}
}