You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/10/10 11:04:25 UTC

svn commit: r1630740 - in /tomee/tomee/trunk: container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java

Author: rmannibucau
Date: Fri Oct 10 09:04:25 2014
New Revision: 1630740

URL: http://svn.apache.org/r1630740
Log:
extracting classpath url resolution to be able to reuse it easily without having to have modules

Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
    tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java?rev=1630740&r1=1630739&r2=1630740&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java Fri Oct 10 09:04:25 2014
@@ -214,114 +214,61 @@ public class DeploymentsResolver impleme
      * This appears in step 3 of the above algorithm.
      */
     public static List<URL> loadFromClasspath(final ClassLoader classLoader) {
-        final List<URL> jarList = new ArrayList<>(16);
-        final Options options = SystemInstance.get().getOptions();
-        final String include = options.get(CLASSPATH_INCLUDE, ".*");
-        final String exclude = options.get(CLASSPATH_EXCLUDE, "");
-        final Set<RequireDescriptors> requireDescriptors = options.getAll(CLASSPATH_REQUIRE_DESCRIPTOR, RequireDescriptors.CLIENT);
-        final boolean filterDescriptors = options.get(CLASSPATH_FILTER_DESCRIPTORS, false);
-        final boolean filterSystemApps = options.get(CLASSPATH_FILTER_SYSTEMAPPS, true);
+        final ClasspathSearcher searchResult = new ClasspathSearcher().loadUrls(classLoader);
+        if (searchResult.prefiltered == null || searchResult.urlSet == null) { // an error occured
+            return new ArrayList<>(); // allow iterator to fully work compared to emptyList()
+        }
 
         try {
-            UrlSet urlSet = new UrlSet(classLoader);
-
-            urlSet = URLs.cullSystemJars(urlSet);
-
-            // save the prefiltered list of jars before excluding system apps
-            // so that we can choose not to filter modules with descriptors on the full list
-            final UrlSet prefiltered = urlSet;
-
-            Filter includeFilter = Filters.patterns(include);
-
-            // we should exclude system apps before and apply user properties after
-            if (!".*".equals(include) || !"".equals(exclude)) { // if we are using default this will not do anything
-                // the next line should probably replaced by:
-                // final Filter filter = new ExcludeIncludeFilter(includeFilter, Filters.patterns(exclude));
-                final Filter filter;
-                if (EXCLUDE_INCLUDE_ORDER.startsWith("include")) { // this test should be simply enough
-                    filter = new IncludeExcludeFilter(includeFilter, Filters.patterns(exclude));
-                } else {
-                    filter = new ExcludeIncludeFilter(includeFilter, Filters.patterns(exclude));
-                }
+            final List<URL> jarList = new ArrayList<>(searchResult.urls.size());
 
-                // filter using user parameters
-                urlSet = urlSet.filter(filter);
-            } else {
-                includeFilter = null;
-            }
-
-            if (prefiltered.size() == urlSet.size()) {
-                urlSet = NewLoaderLogic.applyBuiltinExcludes(urlSet, includeFilter);
-
-                if (filterSystemApps) {
-                    urlSet = urlSet.exclude(".*/openejb-[^/]+(.(jar|ear|war)(!/)?|/target/(test-)?classes/?)");
-                }
-            }
-
-            final boolean isWindows = System.getProperty("os.name", "unknown").toLowerCase().startsWith("windows");
-            final List<URL> urls;
-            if (!isWindows) {
-                urls = urlSet.getUrls();
-            } else {
-                urls = new ArrayList<URL>();
-                for (final URL url : urlSet.getUrls()) {
-                    final String ef = url.toExternalForm().toLowerCase();
-                    final URL u = new URL(ef);
-                    if (!urls.contains(u)) {
-                        urls.add(u);
-                    }
-                }
-            }
-
-            final int size = urls.size();
-            if (size == 0 && include.length() > 0) {
-                logger.warning("No classpath URLs matched.  Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + "='" + include + "'");
+            final int size = searchResult.urls.size();
+            if (size == 0 && searchResult.include.length() > 0) {
+                logger.warning("No classpath URLs matched.  Current settings: " +
+                        CLASSPATH_EXCLUDE + "='" + searchResult.exclude + "', " +
+                        CLASSPATH_INCLUDE + "='" + searchResult.include + "'");
                 return jarList;
-            } else if (size == 0 && !filterDescriptors && prefiltered.getUrls().size() == 0) {
+            } else if (size == 0 && !searchResult.filterDescriptors && searchResult.prefiltered.getUrls().size() == 0) {
                 return jarList;
             } else if (size < 20) {
-                logger.debug("Inspecting classpath for applications: " + urls.size() + " urls.");
+                logger.debug("Inspecting classpath for applications: " + size + " urls.");
             } else {
                 // Has the user allowed some module types to be discoverable via scraping?
-                final boolean willScrape = requireDescriptors.size() < RequireDescriptors.values().length;
+                final boolean willScrape = searchResult.requireDescriptors.size() < RequireDescriptors.values().length;
 
                 if (size < 50 && willScrape) {
                     logger.info("Inspecting classpath for applications: " +
-                        urls.size() +
-                        " urls. Consider adjusting your exclude/include.  Current settings: " +
-                        CLASSPATH_EXCLUDE +
-                        "='" +
-                        exclude +
-                        "', " +
-                        CLASSPATH_INCLUDE +
-                        "='" +
-                        include +
-                        "'");
+                            size +
+                            " urls. Consider adjusting your exclude/include.  " +
+                            "Current settings: " + CLASSPATH_EXCLUDE + "='" + searchResult.exclude + "', " +
+                            CLASSPATH_INCLUDE + "='" + searchResult.include + "'");
                 } else if (willScrape) {
-                    logger.warning("Inspecting classpath for applications: " + urls.size() + " urls.");
-                    logger.warning("ADJUST THE EXCLUDE/INCLUDE!!!.  Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + "='" + include + "'");
+                    logger.warning("Inspecting classpath for applications: " + size + " urls.");
+                    logger.warning("ADJUST THE EXCLUDE/INCLUDE!!!.  Current settings: " +
+                            CLASSPATH_EXCLUDE + "='" + searchResult.exclude + "', " +
+                            CLASSPATH_INCLUDE + "='" + searchResult.include + "'");
                 }
             }
 
             final long begin = System.currentTimeMillis();
-            processUrls("DeploymentsResolver1", urls, classLoader, requireDescriptors, jarList);
+            processUrls("DeploymentsResolver1", searchResult.urls, classLoader, searchResult.requireDescriptors, jarList);
             final long end = System.currentTimeMillis();
             final long time = end - begin;
 
             UrlSet unchecked = new UrlSet();
 
-            if (!filterDescriptors) {
-                unchecked = NewLoaderLogic.applyBuiltinExcludes(prefiltered.exclude(urlSet));
-                if (filterSystemApps) {
+            if (!searchResult.filterDescriptors) {
+                unchecked = NewLoaderLogic.applyBuiltinExcludes(searchResult.prefiltered.exclude(searchResult.prefiltered));
+                if (searchResult.filterSystemApps) {
                     unchecked = unchecked.exclude(".*/openejb-[^/]+(.(jar|ear|war)(./)?|/target/classes/?)");
                 }
                 processUrls("DeploymentsResolver2", unchecked.getUrls(), classLoader, EnumSet.allOf(RequireDescriptors.class), jarList);
             }
 
             if (logger.isDebugEnabled()) {
-                final int urlCount = urlSet.getUrls().size() + unchecked.getUrls().size();
+                final int urlCount = searchResult.urlSet.getUrls().size() + unchecked.getUrls().size();
                 logger.debug("DeploymentsResolver: URLs after filtering: " + urlCount);
-                for (final URL url : urlSet.getUrls()) {
+                for (final URL url : searchResult.urlSet.getUrls()) {
                     logger.debug("Annotations path: " + url);
                 }
                 for (final URL url : unchecked.getUrls()) {
@@ -329,30 +276,27 @@ public class DeploymentsResolver impleme
                 }
             }
 
-            if (urls.size() == 0) {
+            final int urlSize = searchResult.urls.size();
+            if (urlSize == 0) {
                 return jarList;
             }
 
             if (time < 1000) {
-                logger.debug("Searched " + urls.size() + " classpath urls in " + time + " milliseconds.  Average " + time / urls.size() + " milliseconds per url.");
-            } else if (time < 4000 || urls.size() < 3) {
-                logger.info("Searched " + urls.size() + " classpath urls in " + time + " milliseconds.  Average " + time / urls.size() + " milliseconds per url.");
+                logger.debug("Searched " + urlSize + " classpath urls in " + time + " milliseconds.  Average " + time / urlSize + " milliseconds per url.");
+            } else if (time < 4000 || urlSize < 3) {
+                logger.info("Searched " + urlSize + " classpath urls in " + time + " milliseconds.  Average " + time / urlSize + " milliseconds per url.");
             } else if (time < 10000) {
-                logger.warning("Searched " + urls.size() + " classpath urls in " + time + " milliseconds.  Average " + time / urls.size() + " milliseconds per url.");
+                logger.warning("Searched " + urlSize + " classpath urls in " + time + " milliseconds.  Average " + time / urlSize + " milliseconds per url.");
                 logger.warning("Consider adjusting your " +
-                    CLASSPATH_EXCLUDE +
-                    " and " +
-                    CLASSPATH_INCLUDE +
-                    " settings.  Current settings: exclude='" +
-                    exclude +
-                    "', include='" +
-                    include +
-                    "'");
+                    CLASSPATH_EXCLUDE + " and " + CLASSPATH_INCLUDE + " settings.  Current settings: exclude='" +
+                        searchResult.exclude + "', include='" + searchResult.include + "'");
             } else {
-                logger.fatal("Searched " + urls.size() + " classpath urls in " + time + " milliseconds.  Average " + time / urls.size() + " milliseconds per url.  TOO LONG!");
-                logger.fatal("ADJUST THE EXCLUDE/INCLUDE!!!.  Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + "='" + include + "'");
+                logger.fatal("Searched " + urlSize + " classpath urls in " + time + " milliseconds.  Average " + time / urlSize + " milliseconds per url.  TOO LONG!");
+                logger.fatal("ADJUST THE EXCLUDE/INCLUDE!!!.  Current settings: " +
+                        CLASSPATH_EXCLUDE + "='" + searchResult.exclude + "', " +
+                        CLASSPATH_INCLUDE + "='" + searchResult.include + "'");
                 final List<String> list = new ArrayList<String>();
-                for (final URL url : urls) {
+                for (final URL url : searchResult.urls) {
                     list.add(url.toExternalForm());
                 }
                 Collections.sort(list);
@@ -360,12 +304,11 @@ public class DeploymentsResolver impleme
                     logger.info("Matched: " + url);
                 }
             }
+            return jarList;
         } catch (final IOException e1) {
-            e1.printStackTrace();
             logger.warning("Unable to search classpath for modules: Received Exception: " + e1.getClass().getName() + " " + e1.getMessage(), e1);
         }
-
-        return jarList;
+        return new ArrayList<>();
     }
 
     @Deprecated
@@ -428,4 +371,89 @@ public class DeploymentsResolver impleme
             }
         }
     }
+
+    public static class ClasspathSearcher {
+        // config used for scanning
+        private final String include;
+        private final String exclude;
+        private final boolean filterSystemApps;
+        private final Set<RequireDescriptors> requireDescriptors;
+        private final boolean filterDescriptors;
+
+        // set got
+        private UrlSet urlSet;
+        private UrlSet prefiltered;
+
+        // final result
+        private List<URL> urls;
+
+        public ClasspathSearcher() {
+            final Options options = SystemInstance.get().getOptions();
+            include = options.get(CLASSPATH_INCLUDE, ".*");
+            exclude = options.get(CLASSPATH_EXCLUDE, "");
+            filterSystemApps = options.get(CLASSPATH_FILTER_SYSTEMAPPS, true);
+            requireDescriptors = options.getAll(CLASSPATH_REQUIRE_DESCRIPTOR, RequireDescriptors.CLIENT);
+            filterDescriptors = options.get(CLASSPATH_FILTER_DESCRIPTORS, false);
+        }
+
+        public List<URL> getUrls() {
+            return urls;
+        }
+
+        public ClasspathSearcher loadUrls(final ClassLoader classLoader) {
+            try {
+                urlSet = URLs.cullSystemJars(new UrlSet(classLoader));
+
+                // save the prefiltered list of jars before excluding system apps
+                // so that we can choose not to filter modules with descriptors on the full list
+                prefiltered = urlSet;
+
+                Filter includeFilter = Filters.patterns(include);
+
+                // we should exclude system apps before and apply user properties after
+                if (!".*".equals(include) || !"".equals(exclude)) { // if we are using default this will not do anything
+                    // the next line should probably replaced by:
+                    // final Filter filter = new ExcludeIncludeFilter(includeFilter, Filters.patterns(exclude));
+                    final Filter filter;
+                    if (EXCLUDE_INCLUDE_ORDER.startsWith("include")) { // this test should be simply enough
+                        filter = new IncludeExcludeFilter(includeFilter, Filters.patterns(exclude));
+                    } else {
+                        filter = new ExcludeIncludeFilter(includeFilter, Filters.patterns(exclude));
+                    }
+
+                    // filter using user parameters
+                    urlSet = urlSet.filter(filter);
+                } else {
+                    includeFilter = null;
+                }
+
+                if (prefiltered.size() == urlSet.size()) {
+                    urlSet = NewLoaderLogic.applyBuiltinExcludes(urlSet, includeFilter);
+
+                    if (filterSystemApps) {
+                        urlSet = urlSet.exclude(".*/openejb-[^/]+(.(jar|ear|war)(!/)?|/target/(test-)?classes/?)");
+                    }
+                }
+
+                final boolean isWindows = System.getProperty("os.name", "unknown").toLowerCase().startsWith("windows");
+                if (!isWindows) {
+                    urls = urlSet.getUrls();
+                } else {
+                    urls = new ArrayList<>();
+                    for (final URL url : urlSet.getUrls()) {
+                        final String ef = url.toExternalForm().toLowerCase();
+                        final URL u = new URL(ef);
+                        if (!urls.contains(u)) {
+                            urls.add(u);
+                        }
+                    }
+                }
+
+                return this;
+            } catch (final IOException e1) {
+                logger.warning("Unable to search classpath", e1);
+            }
+            return this;
+        }
+    }
 }

Modified: tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java?rev=1630740&r1=1630739&r2=1630740&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java (original)
+++ tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java Fri Oct 10 09:04:25 2014
@@ -131,7 +131,7 @@ public class Container implements AutoCl
     }
 
     public Container deployClasspathAsWebApp(final String context, final File docBase, final String... dependencies) {
-        final List<URL> jarList = DeploymentsResolver.loadFromClasspath(Thread.currentThread().getContextClassLoader());
+        final List<URL> jarList = new DeploymentsResolver.ClasspathSearcher().loadUrls(Thread.currentThread().getContextClassLoader()).getUrls();
         if (dependencies != null) {
             for (final String dep : dependencies) {
                 final Set<String> strings = SystemInstance.get().getComponent(ProvisioningResolver.class).realLocation(dep);