in shared-libraries/servicemix-common/src/main/java/org/apache/servicemix/common/xbean/ClassLoaderXmlPreprocessor.java [331:438]
protected ClassLoader getClassLoader(SpringApplicationContext applicationContext, XmlBeanDefinitionReader reader, Document document) {
// determine the classLoader
ClassLoader classLoader;
NodeList classpathElements = document.getDocumentElement().getElementsByTagName("classpath");
if (classpathElements.getLength() < 1) {
classLoader = getParentClassLoader(applicationContext);
} else if (classpathElements.getLength() > 1) {
throw new FatalBeanException("Expected only classpath element but found " + classpathElements.getLength());
} else {
Element classpathElement = (Element) classpathElements.item(0);
// Delegation mode
boolean inverse = false;
String inverseAttr = classpathElement.getAttribute("inverse");
if (inverseAttr != null && "true".equalsIgnoreCase(inverseAttr)) {
inverse = true;
}
// build hidden classes
List<String> hidden = new ArrayList<String>();
NodeList hiddenElems = classpathElement.getElementsByTagName("hidden");
for (int i = 0; i < hiddenElems.getLength(); i++) {
Element hiddenElement = (Element) hiddenElems.item(i);
String pattern = ((Text) hiddenElement.getFirstChild()).getData().trim();
hidden.add(pattern);
}
// build non overridable classes
List<String> nonOverridable = new ArrayList<String>();
NodeList nonOverridableElems = classpathElement.getElementsByTagName("nonOverridable");
for (int i = 0; i < nonOverridableElems.getLength(); i++) {
Element nonOverridableElement = (Element) nonOverridableElems.item(i);
String pattern = ((Text) nonOverridableElement.getFirstChild()).getData().trim();
nonOverridable.add(pattern);
}
// build the classpath
List<String> classpath = new ArrayList<String>();
NodeList locations = classpathElement.getElementsByTagName("location");
for (int i = 0; i < locations.getLength(); i++) {
Element locationElement = (Element) locations.item(i);
String location = ((Text) locationElement.getFirstChild()).getData().trim();
classpath.add(location);
}
// Add shared libraries
List<String> sls = new ArrayList<String>();
NodeList libraries = classpathElement.getElementsByTagName("library");
for (int i = 0; i < libraries.getLength(); i++) {
Element locationElement = (Element) libraries.item(i);
String library = ((Text) locationElement.getFirstChild()).getData().trim();
sls.add(library);
}
// Add components
List<String> components = new ArrayList<String>();
NodeList componentList = classpathElement.getElementsByTagName("component");
for (int i = 0; i < componentList.getLength(); i++) {
Element locationElement = (Element) componentList.item(i);
String component = ((Text) locationElement.getFirstChild()).getData().trim();
components.add(component);
}
// convert the paths to URLS
URL[] urls;
if (classpath.size() != 0) {
List<URL> urlsList = new LinkedList<URL>();
for (ListIterator<String> iterator = classpath.listIterator(); iterator.hasNext();) {
String location = iterator.next();
List<URL> locationUrls = getResources(location);
for (URL url : locationUrls) {
urlsList.add(url);
}
}
urls = urlsList.toArray(new URL[urlsList.size()]);
} else {
urls = getDefaultLocations();
}
// create the classloader
List<ClassLoader> parents = new ArrayList<ClassLoader>();
parents.add(getParentClassLoader(applicationContext));
for (String library : sls) {
ClassLoader cl = this.component.getContainer().getSharedLibraryClassLoader(library);
if (cl == null) {
throw new IllegalStateException("No such shared library: " + library);
}
parents.add(cl);
}
for (String component : components) {
ClassLoader cl = this.component.getContainer().getComponentClassLoader(component);
if (cl == null) {
throw new IllegalStateException("No such component: " + component);
}
parents.add(cl);
}
classLoader = new JarFileClassLoader(applicationContext.getDisplayName(),
urls,
parents.toArray(new ClassLoader[parents.size()]),
inverse,
hidden.toArray(new String[hidden.size()]),
nonOverridable.toArray(new String[nonOverridable.size()]));
// remove the classpath element so Spring doesn't get confused
document.getDocumentElement().removeChild(classpathElement);
}
return classLoader;
}