]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-1861: Don't create ResourcesClassLoader if no resources
authorGodin <mandrikov@gmail.com>
Sat, 23 Oct 2010 15:29:12 +0000 (15:29 +0000)
committerGodin <mandrikov@gmail.com>
Sat, 23 Oct 2010 15:29:12 +0000 (15:29 +0000)
sonar-core/src/main/java/org/sonar/core/classloaders/ClassLoadersCollection.java
sonar-core/src/main/java/org/sonar/core/classloaders/ResourcesClassLoader.java

index 852649a49c6913ebf748afd07a5f010b4b610f2f..c9d3afa25b02ce5be02d5d32479c530c06a2f201 100644 (file)
@@ -8,7 +8,10 @@ import org.codehaus.classworlds.NoSuchRealmException;
 import org.sonar.api.utils.Logs;
 import org.sonar.api.utils.SonarException;
 
+import com.google.common.collect.Lists;
+
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 
@@ -54,16 +57,30 @@ public class ClassLoadersCollection {
    */
   public ClassLoader createClassLoader(String key, Collection<URL> urls, boolean childFirst) {
     try {
-      ClassLoader resourcesClassLoader = new ResourcesClassLoader(urls, baseClassLoader);
+      ArrayList<URL> resources = Lists.newArrayList();
+      ArrayList<URL> others = Lists.newArrayList();
+      for (URL url : urls) {
+        if (isResource(url)) {
+          resources.add(url);
+        } else {
+          others.add(url);
+        }
+      }
+      ClassLoader parent;
+      if (resources.isEmpty()) {
+        parent = baseClassLoader;
+      } else {
+        parent = new ResourcesClassLoader(resources, baseClassLoader);
+      }
       final ClassRealm realm;
       if (childFirst) {
-        ClassRealm parentRealm = world.newRealm(key + "-parent", resourcesClassLoader);
+        ClassRealm parentRealm = world.newRealm(key + "-parent", parent);
         realm = parentRealm.createChildRealm(key);
       } else {
-        realm = world.newRealm(key, resourcesClassLoader);
+        realm = world.newRealm(key, parent);
       }
-      for (URL constituent : urls) {
-        realm.addConstituent(constituent);
+      for (URL url : others) {
+        realm.addConstituent(url);
       }
       return realm.getClassLoader();
     } catch (DuplicateRealmException e) {
@@ -119,4 +136,9 @@ public class ClassLoadersCollection {
     }
   }
 
+  private boolean isResource(URL url) {
+    String path = url.getPath();
+    return !StringUtils.endsWith(path, ".jar") && !StringUtils.endsWith(path, "/");
+  }
+
 }
index e2298f42602e3f57ae5d42cdc337a412c462ac47..dcf243808d5d1d07302fa1b7854fc7f060420020 100644 (file)
@@ -7,7 +7,6 @@ import com.google.common.collect.Lists;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.Collection;
-import java.util.List;
 
 /**
  * This class loader is used to load resources from a list of URLs - see SONAR-1861.
@@ -17,14 +16,7 @@ public class ResourcesClassLoader extends URLClassLoader {
 
   public ResourcesClassLoader(Collection<URL> urls, ClassLoader parent) {
     super(new URL[] {}, parent);
-    List<URL> filtered = Lists.newArrayList();
-    for (URL url : urls) {
-      String path = url.getPath();
-      if ( !StringUtils.endsWith(path, ".jar") && !StringUtils.endsWith(path, "/")) {
-        filtered.add(url);
-      }
-    }
-    this.urls = filtered;
+    this.urls = Lists.newArrayList(urls);
   }
 
   @Override