You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by an...@apache.org on 2012/02/01 09:55:29 UTC

svn commit: r1239012 - /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java

Author: andygumbrecht
Date: Wed Feb  1 08:55:29 2012
New Revision: 1239012

URL: http://svn.apache.org/viewvc?rev=1239012&view=rev
Log:
Apply final where applicable.
Provided List<URL> jarList was being checked for contains(String) rather than contains(URL).
Filter out duplicate URLs due to case sensitivity in loadFromClasspath <-- The fact that we actually get duplicate URLs is still an issue.

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

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java?rev=1239012&r1=1239011&r2=1239012&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java Wed Feb  1 08:55:29 2012
@@ -46,7 +46,7 @@ public class DeploymentsResolver impleme
 
     private static final Logger logger = DeploymentLoader.logger;
 
-    public static void loadFrom(Deployments dep, FileUtils path, List<URL> jarList) {
+    public static void loadFrom(final Deployments dep, final FileUtils path, final List<URL> jarList) {
 
         ////////////////////////////////
         //
@@ -55,9 +55,10 @@ public class DeploymentsResolver impleme
         ////////////////////////////////
         if (dep.getDir() == null && dep.getJar() != null) {
             try {
-                File jar = path.getFile(dep.getJar(), false);
-                if (!jarList.contains(jar.getAbsolutePath())) {
-                    jarList.add(jar.toURI().toURL());
+                final File jar = path.getFile(dep.getJar(), false);
+                final URL url = jar.toURI().toURL();
+                if (!jarList.contains(url)) {
+                    jarList.add(url);
                 }
             } catch (Exception ignored) {
             }
@@ -77,33 +78,36 @@ public class DeploymentsResolver impleme
         //  Unpacked "Jar" directory with descriptor
         //
         ////////////////////////////////
-        File ejbJarXml = new File(dir, "META-INF" + File.separator + "ejb-jar.xml");
+        final File ejbJarXml = new File(dir, "META-INF" + File.separator + "ejb-jar.xml");
         if (ejbJarXml.exists()) {
             try {
-                if (!jarList.contains(dir.getAbsolutePath())) {
-                    jarList.add(dir.toURI().toURL());
+                final URL url = dir.toURI().toURL();
+                if (!jarList.contains(url)) {
+                    jarList.add(url);
                 }
             } catch (MalformedURLException ignore) {
             }
             return;
         }
 
-        File appXml = new File(dir, "META-INF" + File.separator + "application.xml");
+        final File appXml = new File(dir, "META-INF" + File.separator + "application.xml");
         if (appXml.exists()) {
             try {
-                if (!jarList.contains(dir.getAbsolutePath())) {
-                    jarList.add(dir.toURI().toURL());
+                final URL url = dir.toURI().toURL();
+                if (!jarList.contains(url)) {
+                    jarList.add(url);
                 }
             } catch (MalformedURLException ignore) {
             }
             return;
         }
 
-        File raXml = new File(dir, "META-INF" + File.separator + "ra.xml");
+        final File raXml = new File(dir, "META-INF" + File.separator + "ra.xml");
         if (raXml.exists()) {
             try {
-                if (!jarList.contains(dir.getAbsolutePath())) {
-                    jarList.add(dir.toURI().toURL());
+                final URL url = dir.toURI().toURL();
+                if (!jarList.contains(url)) {
+                    jarList.add(url);
                 }
             } catch (MalformedURLException ignore) {
             }
@@ -116,20 +120,24 @@ public class DeploymentsResolver impleme
         //
         ////////////////////////////////
         boolean hasNestedArchives = false;
-        for (File file : dir.listFiles()) {
+        for (final File file : dir.listFiles()) {
             try {
-                if (file.getName().endsWith(".jar") || file.getName().endsWith(".war")|| file.getName().endsWith(".rar")|| file.getName().endsWith(".ear")) {
-                    if (jarList.contains(file.getAbsolutePath())) continue;
-                    jarList.add(file.toURI().toURL());
+
+                final URL url = file.toURI().toURL();
+                if (jarList.contains(url)) continue;
+
+                if (file.getName().endsWith(".jar") || file.getName().endsWith(".war") || file.getName().endsWith(".rar") || file.getName().endsWith(".ear")) {
+                    jarList.add(url);
                     hasNestedArchives = true;
-                } else if (new File(file, "META-INF").exists()){ // Unpacked ear or jar
-                    jarList.add(file.toURI().toURL());
+                } else if (new File(file, "META-INF").exists()) { // Unpacked ear or jar
+                    jarList.add(url);
                     hasNestedArchives = true;
-                } else if (new File(file, "WEB-INF").exists()){  // Unpacked webapp
-                    jarList.add(file.toURI().toURL());
+                } else if (new File(file, "WEB-INF").exists()) {  // Unpacked webapp
+                    jarList.add(url);
                     hasNestedArchives = true;
                 }
-            } catch (Exception ignore) {
+            } catch (Exception e) {
+                logger.debug("loadFrom", e);
             }
         }
 
@@ -139,13 +147,14 @@ public class DeploymentsResolver impleme
         //
         ////////////////////////////////
         if (!hasNestedArchives) {
-            HashMap<String, URL> files = new HashMap<String, URL>();
+            final HashMap<String, URL> files = new HashMap<String, URL>();
             DeploymentLoader.scanDir(dir, files, "");
-            for (String fileName : files.keySet()) {
+            for (final String fileName : files.keySet()) {
                 if (fileName.endsWith(".class")) {
                     try {
-                        if (!jarList.contains(dir.getAbsolutePath())) {
-                            jarList.add(dir.toURI().toURL());
+                        final URL url = dir.toURI().toURL();
+                        if (!jarList.contains(url)) {
+                            jarList.add(url);
                         }
                     } catch (MalformedURLException ignore) {
                     }
@@ -171,17 +180,19 @@ public class DeploymentsResolver impleme
      * 2- Loading the resource is the default behaviour in case of not defining a value for any class-path pattern
      * This appears in step 3 of the above algorithm.
      */
-    public static void loadFromClasspath(FileUtils base, List<URL> jarList, ClassLoader classLoader) {
-        Options options = SystemInstance.get().getOptions();
-        String include = options.get(CLASSPATH_INCLUDE, ".*");
-        String exclude = options.get(CLASSPATH_EXCLUDE, "");
-        Set<RequireDescriptors> requireDescriptors = options.getAll(CLASSPATH_REQUIRE_DESCRIPTOR, RequireDescriptors.CLIENT);
-        boolean filterDescriptors = options.get(CLASSPATH_FILTER_DESCRIPTORS, false);
-        boolean filterSystemApps = options.get(CLASSPATH_FILTER_SYSTEMAPPS, true);
+    public static void loadFromClasspath(final FileUtils base, final List<URL> jarList, final ClassLoader classLoader) {
+        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);
 
         try {
             UrlSet urlSet = new UrlSet(classLoader);
-            UrlSet includes = urlSet.matching(include);
+
+            //final UrlSet includes = urlSet.matching(include);
+
             urlSet = urlSet.exclude(ClassLoader.getSystemClassLoader().getParent());
             urlSet = urlSet.excludeJavaExtDirs();
             urlSet = urlSet.excludeJavaEndorsedDirs();
@@ -191,7 +202,7 @@ public class DeploymentsResolver impleme
 
             // 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
-            UrlSet prefiltered = urlSet;
+            final UrlSet prefiltered = urlSet;
 
             // we should exclude system apps before and apply user properties after
 
@@ -202,14 +213,23 @@ public class DeploymentsResolver impleme
             if (prefiltered.size() == urlSet.size()) {
                 urlSet = NewLoaderLogic.applyBuiltinExcludes(urlSet);
 
-                if (filterSystemApps){
+                if (filterSystemApps) {
                     urlSet = urlSet.exclude(".*/openejb-[^/]+(.(jar|ear|war)(!/)?|/target/(test-)?classes/?)");
                 }
             }
 
+            final List<URL> urls = new ArrayList<URL>();
+            final boolean isWindows = System.getProperty("os.name", "unknown").toLowerCase().startsWith("windows");
 
-            List<URL> urls = urlSet.getUrls();
-            int size = urls.size();
+            for (final URL url : urlSet.getUrls()) {
+                final String ef = (isWindows ? url.toExternalForm().toLowerCase() : url.toExternalForm());
+                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 + "'");
                 return;
@@ -219,7 +239,7 @@ public class DeploymentsResolver impleme
                 logger.debug("Inspecting classpath for applications: " + urls.size() + " urls.");
             } else {
                 // Has the user allowed some module types to be discoverable via scraping?
-                boolean willScrape = requireDescriptors.size() < RequireDescriptors.values().length;
+                final boolean willScrape = 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 + "'");
@@ -229,27 +249,27 @@ public class DeploymentsResolver impleme
                 }
             }
 
-            long begin = System.currentTimeMillis();
+            final long begin = System.currentTimeMillis();
             processUrls(urls, classLoader, requireDescriptors, base, jarList);
-            long end = System.currentTimeMillis();
-            long time = end - begin;
+            final long end = System.currentTimeMillis();
+            final long time = end - begin;
 
             UrlSet unchecked = new UrlSet();
-            if (!filterDescriptors){
+            if (!filterDescriptors) {
                 unchecked = prefiltered.exclude(urlSet);
-                if (filterSystemApps){
+                if (filterSystemApps) {
                     unchecked = unchecked.exclude(".*/openejb-[^/]+(.(jar|ear|war)(./)?|/target/classes/?)");
                 }
                 processUrls(unchecked.getUrls(), classLoader, EnumSet.allOf(RequireDescriptors.class), base, jarList);
             }
 
             if (logger.isDebugEnabled()) {
-                int urlCount = urlSet.getUrls().size() + unchecked.getUrls().size();
-                logger.debug("URLs after filtering: "+ urlCount);
-                for (URL url : urlSet.getUrls()) {
+                final int urlCount = urlSet.getUrls().size() + unchecked.getUrls().size();
+                logger.debug("URLs after filtering: " + urlCount);
+                for (final URL url : urlSet.getUrls()) {
                     logger.debug("Annotations path: " + url);
                 }
-                for (URL url : unchecked.getUrls()) {
+                for (final URL url : unchecked.getUrls()) {
                     logger.debug("Descriptors path: " + url);
                 }
             }
@@ -266,12 +286,12 @@ public class DeploymentsResolver impleme
             } 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 + "'");
-                List<String> list = new ArrayList<String>();
-                for (URL url : urls) {
+                final List<String> list = new ArrayList<String>();
+                for (final URL url : urls) {
                     list.add(url.toExternalForm());
                 }
                 Collections.sort(list);
-                for (String url : list) {
+                for (final String url : list) {
                     logger.info("Matched: " + url);
                 }
             }
@@ -292,9 +312,9 @@ public class DeploymentsResolver impleme
      * @param requireDescriptors
      * @return
      */
-    private static boolean shouldFilter(String include, String exclude, Set<RequireDescriptors> requireDescriptors) {
-        boolean includeNothing = include.equals("");
-        boolean excludeEverything = exclude.equals(".*");
+    private static boolean shouldFilter(final String include, final String exclude, final Set<RequireDescriptors> requireDescriptors) {
+        final boolean includeNothing = include.equals("");
+        final boolean excludeEverything = exclude.equals(".*");
 
         //  If we are going to eliminate the entire classpath from
         //  scanning anyway, no sense in taking the time to do it
@@ -304,13 +324,11 @@ public class DeploymentsResolver impleme
         //  If we are forcably requiring descriptors for all possible file types
         //  then there is also no scanning and no point in filtering the
         //  classpath down bit by bit.  Return false
-        if (requireDescriptors.size() == RequireDescriptors.values().length) return false;
-
-        return true;
+        return requireDescriptors.size() != RequireDescriptors.values().length;
     }
 
     private static UrlSet applyBuiltinExcludes(UrlSet urlSet) throws MalformedURLException {
-        
+
         urlSet = urlSet.exclude(".*/activation(-[\\d.]+)?.jar(!/)?");
         urlSet = urlSet.exclude(".*/activeio-core(-[\\d.]+)?(-incubator)?.jar(!/)?");
         urlSet = urlSet.exclude(".*/activemq-(core|ra)(-[\\d.]+)?.jar(!/)?");
@@ -376,42 +394,46 @@ public class DeploymentsResolver impleme
         return urlSet;
     }
 
-    public static void processUrls(List<URL> urls, ClassLoader classLoader, Set<RequireDescriptors> requireDescriptors, FileUtils base, List<URL> jarList) {
+    public static void processUrls(final List<URL> urls, final ClassLoader classLoader, final Set<RequireDescriptors> requireDescriptors, final FileUtils base, final List<URL> jarList) {
         for (URL url : urls) {
 
-            String urlProtocol = url.getProtocol();
+            final String urlProtocol = url.getProtocol();
             //Currently, we only support jar and file protocol
-            boolean isValidURL = urlProtocol.equals("jar") || urlProtocol.equals("file");
+            final boolean isValidURL = urlProtocol.equals("jar") || urlProtocol.equals("file");
             if (!isValidURL) {
                 logger.warning("Unknown protocol " + urlProtocol);
                 continue;
             }
 
-            Deployments deployment;
+            final Deployments deployment;
             String path = "";
             try {
-                
-                DeploymentLoader deploymentLoader = new DeploymentLoader();
-                
-                Class<? extends DeploymentModule> moduleType = deploymentLoader.discoverModuleType(url, classLoader, requireDescriptors);
+
+                final DeploymentLoader deploymentLoader = new DeploymentLoader();
+
+                final Class<? extends DeploymentModule> moduleType = deploymentLoader.discoverModuleType(url, classLoader, requireDescriptors);
                 if (AppModule.class.isAssignableFrom(moduleType) || EjbModule.class.isAssignableFrom(moduleType) || PersistenceModule.class.isAssignableFrom(moduleType) || ConnectorModule.class.isAssignableFrom(moduleType) || ClientModule.class.isAssignableFrom(moduleType)) {
-                    deployment = JaxbOpenejb.createDeployments();
-                    if (urlProtocol.equals("jar")) {
-                        url = new URL(url.getFile().replaceFirst("!.*$", ""));
-                        File file = toFile(url);
-                        path = file.getAbsolutePath();
-                        deployment.setJar(path);
-                    } else if (urlProtocol.equals("file")) {
-                        File file = toFile(url);
-                        path = file.getAbsolutePath();
-                        deployment.setDir(path);
-                    }
-                    logger.info("Found " + moduleType.getSimpleName() + " in classpath: " + path);
 
                     if (AppModule.class.isAssignableFrom(moduleType) || ConnectorModule.class.isAssignableFrom(moduleType)) {
+
+                        deployment = JaxbOpenejb.createDeployments();
+
+                        if (urlProtocol.equals("jar")) {
+                            url = new URL(url.getFile().replaceFirst("!.*$", ""));
+                            final File file = toFile(url);
+                            path = file.getAbsolutePath();
+                            deployment.setJar(path);
+                        } else if (urlProtocol.equals("file")) {
+                            final File file = toFile(url);
+                            path = file.getAbsolutePath();
+                            deployment.setDir(path);
+                        }
+
+                        logger.info("Found " + moduleType.getSimpleName() + " in classpath: " + path);
+
                         loadFrom(deployment, base, jarList);
                     } else {
-                        if (!jarList.contains(path)){
+                        if (!jarList.contains(url)) {
                             jarList.add(url);
                         }
                     }