org.eclipse.gemini.blueprint.test.internal.holder.HolderLoader.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.gemini.blueprint.test.internal.holder.HolderLoader.java

Source

/******************************************************************************
 * 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.internal.holder;

import java.lang.reflect.Field;

import org.osgi.framework.Bundle;
import org.springframework.util.ReflectionUtils;

/**
 * Specific OSGi loader for OsgiTestHolder. It's main usage is to load the
 * holder using a class-loader outside the OSGi world and to store results
 * there.
 * 
 * <p/> Boot delegation should work here but each platform has its own approach.
 * Notably, Equinox uses by default the boot (not the app) classloader which
 * means the classpath used for starting OSGi is not seen. To not interfere with
 * the default configuration which might change in the future (it has been
 * changed between 3.2 and 3.3) and to not impose restrictions on the test
 * usage, the loader manually discovers the proper classloader and uses it to
 * load the holder class. Inside OSGi, special care must be taken to make sure
 * no CCE are generated.
 * 
 * @author Costin Leau
 * 
 */
public class HolderLoader {

    private static final String INSTANCE_FIELD = "INSTANCE";

    private static final String HOLDER_CLASS_NAME = "org.eclipse.gemini.blueprint.test.internal.holder.OsgiTestInfoHolder";

    public static final HolderLoader INSTANCE = new HolderLoader();

    private final OsgiTestInfoHolder holder;

    public HolderLoader() {
        // try to load the holder using the app ClassLoader
        ClassLoader appCL = Bundle.class.getClassLoader();
        Class<?> clazz;
        try {
            clazz = appCL.loadClass(HOLDER_CLASS_NAME);
        } catch (Exception ex) {
            // if it's not found, then the class path is incorrectly constructed
            throw (RuntimeException) new IllegalStateException(
                    "spring-osgi-test.jar is not available on the boot class path; are you deploying the test framework"
                            + "as a bundle by any chance? ").initCause(ex);
        }
        // get the static instance
        Field field = ReflectionUtils.findField(clazz, INSTANCE_FIELD, clazz);
        Object instance;
        try {
            instance = field.get(null);
        } catch (Exception ex) {
            throw (RuntimeException) new IllegalStateException("Cannot read property " + INSTANCE_FIELD)
                    .initCause(ex);
        }
        // once the class is loaded return it wrapped through it's OSGi instance
        holder = new ReflectionOsgiHolder(instance);
    }

    public OsgiTestInfoHolder getHolder() {
        return holder;
    }

}