/****************************************************************************** * 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.context.support.internal.classloader; import org.eclipse.gemini.blueprint.util.BundleDelegatingClassLoader; import org.osgi.framework.Bundle; import org.springframework.util.Assert; /** * Simple factory for generating Bundle/AOP-suitable class loaders used * internally by Spring-DM for generating proxies. The factory acts as a generic * facade for framework components hiding the implementation details (or the * changes in strategy). * * <p/> Internally the factory will try to use a cache to avoid creating * unneeded class loader (even if lightweight) to avoid polluting the JDK/CGLIB * class loader maps. * * @author Costin Leau */ public abstract class ClassLoaderFactory { /** plug-able, private, class loader factory */ private static InternalAopClassLoaderFactory aopClassLoaderFactory = new CachingAopClassLoaderFactory(); /** plug-able, private, bundle loader factory */ private static BundleClassLoaderFactory bundleClassLoaderFactory = new CachingBundleClassLoaderFactory(); /** * Returns the standard, extended AOP class loader based on the given class * loader. * * @param classLoader base class loader * @return AOP class loader created using the given argument */ public static ChainedClassLoader getAopClassLoaderFor(ClassLoader classLoader) { Assert.notNull(classLoader); return aopClassLoaderFactory.createClassLoader(classLoader); } /** * Returns the wrapped class loader for the given bundle. * * <p/> This method is similar to {@link #getAopClassLoaderFor(ClassLoader)} * but considers the {@link BundleDelegatingClassLoader} associated with a * bundle. Namely, the implementation will check if there is a wrapping * class loader associated with the given bundle, creating one if none if * found. * * <p/> Useful when creating importers/exporters programmatically. * * @param bundle OSGi bundle * @return associated wrapping class loader */ public static ClassLoader getBundleClassLoaderFor(Bundle bundle) { Assert.notNull(bundle); return bundleClassLoaderFactory.createClassLoader(bundle); } }