/**
* Copyright (c) 2005-2006 Aptana, Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html. If redistributing this code,
* this entire header must remain intact.
*/
package org.eclipse.eclipsemonkey.utils;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import org.osgi.framework.Bundle;
/**
* @author Kevin Lindsey based on code by Patrick Mueller
*/
public class BundleClassLoader extends ClassLoader
{
private ArrayList _bundles;
/**
* ScriptClassLoader
*/
public BundleClassLoader()
{
super(BundleClassLoader.class.getClassLoader());
this._bundles = new ArrayList();
}
/**
* addBundle
*
* @param bundle
*/
public void addBundle(Bundle bundle)
{
if (bundle == null)
{
throw new IllegalArgumentException(Messages.BundleClassLoader_BundleMustNotBeNull);
}
if (this._bundles.contains(bundle) == false)
{
this._bundles.add(bundle);
}
}
/**
* findClass
*
* @param name
* @return Class
* @throws ClassNotFoundException
*/
protected Class findClass(String name) throws ClassNotFoundException
{
Class result = this.loadClassFromBundles(name);
if (result == null)
{
throw new ClassNotFoundException(StringUtils.format(Messages.BundleClassLoader_UnableToFindClass, name));
}
return result;
}
/**
* findResource
*
* @param name
* @return URL
*/
protected URL findResource(String name)
{
URL result = super.findResource(name);
if (result == null)
{
Iterator iterator = this._bundles.iterator();
while (iterator.hasNext())
{
Bundle bundle = (Bundle) iterator.next();
result = bundle.getResource(name);
if (result != null)
{
break;
}
}
}
return result;
}
/**
* findResources
*
* @param name
* @return Enumeration
* @throws IOException
*/
protected Enumeration findResources(String name) throws IOException
{
Enumeration result = super.findResources(name);
if (result == null)
{
Iterator iterator = this._bundles.iterator();
while (iterator.hasNext())
{
Bundle bundle = (Bundle) iterator.next();
result = bundle.getResources(name);
if (result != null)
{
break;
}
}
}
if (result == null)
{
throw new IOException(StringUtils.format(Messages.BundleClassLoader_UnableToFindResources, name));
}
return result;
}
/**
* loadClass
*
* @param name
* @return Class
* @throws ClassNotFoundException
*/
public Class loadClass(String name) throws ClassNotFoundException
{
Class result = super.loadClass(name);
if (result == null)
{
result = this.loadClassFromBundles(name);
}
if (result == null)
{
throw new ClassNotFoundException(StringUtils.format(Messages.BundleClassLoader_UnableToLoadClass, name));
}
return result;
}
/**
* loadClass
*
* @param name
* @param resolve
* @return Class
* @throws ClassNotFoundException
*/
protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException
{
Class result = super.loadClass(name, resolve);
if (result == null)
{
result = this.loadClassFromBundles(name);
}
if (result == null)
{
throw new ClassNotFoundException(StringUtils.format(Messages.BundleClassLoader_UnableToLoadClass, name));
}
return result;
}
/**
* loadClassFromBundles
*
* @param name
* @return Class
* @throws ClassNotFoundException
*/
private Class loadClassFromBundles(String name) throws ClassNotFoundException
{
Class result = null;
Iterator iterator = this._bundles.iterator();
while (iterator.hasNext())
{
Bundle bundle = (Bundle) iterator.next();
result = bundle.loadClass(name);
if (result != null)
{
break;
}
}
return result;
}
}