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);
}
if (sls.size() > 0 && container == null) {
throw new IllegalStateException("Can not reference shared libraries if the component is not deployed in ServiceMix");
}
// 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);
}
if (components.size() > 0 && container == null) {
throw new IllegalStateException("Can not reference other components if the component is not deployed in ServiceMix");
}
// convert the paths to URLS
URL[] urls;
if (classpath.size() != 0) {
urls = new URL[classpath.size()];
for (ListIterator<String> iterator = classpath.listIterator(); iterator.hasNext();) {
String location = iterator.next();
URL url = repository.getResource(location);
if (url == null) {
throw new FatalBeanException("Unable to resolve classpath location " + location);
}
urls[iterator.previousIndex()] = url;
}
} else {
urls = getDefaultLocations();