FELIX-4713 - Change how interface are loaded when checking the provided services (interfaces).
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1642973 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
index 93628eb..8e3a88f 100644
--- a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
+++ b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
@@ -289,12 +289,14 @@
* @throws ConfigurationException : the checked provided service is not correct.
*/
private boolean checkProvidedService(ProvidedService svc) throws ConfigurationException {
+ Set<ClassLoader> classloaders = new LinkedHashSet<ClassLoader>();
for (int i = 0; i < svc.getServiceSpecifications().length; i++) {
String specName = svc.getServiceSpecifications()[i];
// Check service level dependencies
try {
- Class spec = getInstanceManager().getFactory().loadClass(specName);
+ Class spec = load(specName, classloaders);
+ classloaders.add(spec.getClassLoader());
Field specField = spec.getField("specification");
Object specif = specField.get(null);
if (specif instanceof String) {
@@ -327,6 +329,22 @@
return true;
}
+ private Class load(String specName, Set<ClassLoader> classloaders) throws ClassNotFoundException {
+ try {
+ return getInstanceManager().getFactory().loadClass(specName);
+ } catch (ClassNotFoundException e) {
+ // Try collected classloaders.
+ }
+ for (ClassLoader cl : classloaders) {
+ try {
+ return cl.loadClass(specName);
+ } catch (ClassNotFoundException e) {
+ // Try next one.
+ }
+ }
+ throw new ClassNotFoundException(specName);
+ }
+
/**
* Look for the implementation (i.e. component) dependency for the given service-level requirement metadata.
* @param element : the service-level requirement metadata