You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/02/01 18:50:31 UTC

[15/50] [abbrv] brooklyn-server git commit: Sanitizes the classpath in CatalogClasspathDo to prevent issue when launching brooklyn with jsvc

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


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

Branch: refs/heads/0.8.0-incubating
Commit: e50fc99b5e0982db48101af6389a101f131f8396
Parents: 40281e0
Author: Martin Harris <gi...@nakomis.com>
Authored: Tue Aug 25 16:50:43 2015 +0100
Committer: Martin Harris <gi...@nakomis.com>
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/brooklyn-server/blob/e50fc99b/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) {