blob: 345e7f25248e895373781e596355e19aacf383a5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.felix.mosgi.jmx.agent.mx4j.server;
import java.util.ArrayList;
import javax.management.loading.MLet;
/**
* Default implementation of a ClassLoaderRepository
*
* @author <a href="mailto:biorn_steedom@users.sourceforge.net">Simone Bordet</a>
* @version $Revision: 1.2 $
*/
public class DefaultClassLoaderRepository extends ModifiableClassLoaderRepository implements java.io.Serializable
{
private static final int WITHOUT = 1;
private static final int BEFORE = 2;
private ArrayList classLoaders = new ArrayList();
public Class loadClass(String className) throws ClassNotFoundException
{
return loadClassWithout(null, className);
}
public Class loadClassWithout(ClassLoader loader, String className) throws ClassNotFoundException
{
return loadClassFromRepository(loader, className, WITHOUT);
}
public Class loadClassBefore(ClassLoader loader, String className) throws ClassNotFoundException
{
return loadClassFromRepository(loader, className, BEFORE);
}
protected void addClassLoader(ClassLoader cl)
{
if (cl == null) return;
ArrayList loaders = getClassLoaders();
synchronized (loaders)
{
if (!loaders.contains(cl)) loaders.add(cl);
}
}
protected void removeClassLoader(ClassLoader cl)
{
if (cl == null) return;
ArrayList loaders = getClassLoaders();
synchronized (loaders)
{
loaders.remove(cl);
}
}
protected ArrayList cloneClassLoaders()
{
ArrayList loaders = getClassLoaders();
synchronized (loaders)
{
return (ArrayList)loaders.clone();
}
}
protected ArrayList getClassLoaders()
{
return classLoaders;
}
private Class loadClassFromRepository(ClassLoader loader, String className, int algorithm) throws ClassNotFoundException
{
ArrayList copy = cloneClassLoaders();
for (int i = 0; i < copy.size(); ++i)
{
try
{
ClassLoader cl = (ClassLoader)copy.get(i);
if (cl.equals(loader))
{
if (algorithm == BEFORE) break;
else continue;
}
return loadClass(cl, className);
}
catch (ClassNotFoundException ignored)
{
}
}
throw new ClassNotFoundException(className);
}
private Class loadClass(ClassLoader loader, String className) throws ClassNotFoundException
{
// This is an optimization: if the classloader is an MLet (and not a subclass)
// then the method MLet.loadClass(String, ClassLoaderRepository) is used.
if (loader.getClass() == MLet.class) return ((MLet)loader).loadClass(className, null);
return loader.loadClass(className);
}
private int getSize()
{
ArrayList loaders = getClassLoaders();
synchronized (loaders)
{
return loaders.size();
}
}
}