Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master 6fe9fc762 -> 918c162b3


Sanitizes the classpath in CatalogClasspathDo to prevent issue when launching 
brooklyn with jsvc


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/bc44abf3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/bc44abf3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/bc44abf3

Branch: refs/heads/master
Commit: bc44abf3e95c077d3fb38dee32a5180a308852dc
Parents: 6fe9fc7
Author: Martin Harris <[email protected]>
Authored: Tue Aug 25 16:50:43 2015 +0100
Committer: Martin Harris <[email protected]>
Committed: Tue Aug 25 16:50:43 2015 +0100

----------------------------------------------------------------------
 .../catalog/internal/CatalogClasspathDo.java    | 21 +++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/bc44abf3/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogClasspathDo.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogClasspathDo.java
 
b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogClasspathDo.java
index ffb7874..a8b7bbe 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogClasspathDo.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogClasspathDo.java
@@ -179,7 +179,7 @@ public class CatalogClasspathDo {
                 try {
                     
((ManagementContextInternal)catalog.mgmt).setBaseClassPathForScanning(ClasspathHelper.forJavaClassPath());
                     log.debug("Catalog scan of default classloader returned 
nothing; reverting to java.class.path");
-                    baseCP = 
((ManagementContextInternal)catalog.mgmt).getBaseClassPathForScanning();
+                    baseCP = sanitizeCP(((ManagementContextInternal) 
catalog.mgmt).getBaseClassPathForScanning());
                     scanner = new ReflectionScanner(baseCP, prefix, baseCL, 
catalog.getRootClassLoader());
                 } catch (Exception e) {
                     log.info("Catalog scan is empty, and unable to use 
java.class.path (base classpath is "+baseCP+"): "+e);
@@ -242,6 +242,25 @@ public class CatalogClasspathDo {
         isLoaded = true;
     }
 
+    private Iterable<URL> sanitizeCP(Iterable<URL> baseClassPathForScanning) {
+        /*
+        If Brooklyn is being run via apache daemon[1], and the classpath 
contains the contents of an empty folder,
+        (e.g. xxx:lib/patch/*:xxx) the classpath will be incorrectly expanded 
to include a zero-length string
+        (e.g. xxx::xxx), which is then interpreted by {@link 
org.reflections.Reflections#scan} as the root of the
+        file system. See [2], line 90+. This needs to be removed, lest we 
attempt to scan the entire filesystem
+
+        [1]: http://commons.apache.org/proper/commons-daemon/
+        [2]: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/unix/native/arguments.c?view=markup&pathrev=1196468
+         */
+        Iterables.removeIf(baseClassPathForScanning, new Predicate<URL>() {
+            @Override
+            public boolean apply(@Nullable URL url) {
+                return Strings.isEmpty(url.getFile()) || 
"/".equals(url.getFile());
+            }
+        });
+        return baseClassPathForScanning;
+    }
+
     /** removes inner classes (non-static nesteds) and others; 
      * bear in mind named ones will be hard to instantiate without the outer 
class instance) */
     private <T> Iterable<Class<? extends T>> 
excludeInvalidClasses(Iterable<Class<? extends T>> input) {

Reply via email to