You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2012/11/06 13:18:21 UTC

svn commit: r1406110 - in /struts/struts2/trunk: plugins/convention/src/main/java/org/apache/struts2/convention/ plugins/embeddedjsp/src/main/java/org/apache/struts2/ xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/

Author: lukaszlenart
Date: Tue Nov  6 12:18:21 2012
New Revision: 1406110

URL: http://svn.apache.org/viewvc?rev=1406110&view=rev
Log:
WW-3917 removes FileManager dependency from UrlSet

Modified:
    struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
    struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/JSPLoader.java
    struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/UrlSet.java

Modified: struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java?rev=1406110&r1=1406109&r2=1406110&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java (original)
+++ struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/PackageBasedActionConfigBuilder.java Tue Nov  6 12:18:21 2012
@@ -65,6 +65,7 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -80,6 +81,7 @@ import java.util.regex.Pattern;
 public class PackageBasedActionConfigBuilder implements ActionConfigBuilder {
 
     private static final Logger LOG = LoggerFactory.getLogger(PackageBasedActionConfigBuilder.class);
+    private static final boolean EXTRACT_BASE_INTERFACES = true;
 
     private final Configuration configuration;
     private final ActionNameBuilder actionNameBuilder;
@@ -384,7 +386,8 @@ public class PackageBasedActionConfigBui
                 // only considers classes that match the action packages
                 // specified by the user
                 Test<String> classPackageTest = getClassPackageTest();
-                ClassFinder finder = new ClassFinder(getClassLoaderInterface(), buildUrlSet().getUrls(), true, this.fileProtocols, classPackageTest);
+                List<URL> urls = readUrls();
+                ClassFinder finder = new ClassFinder(getClassLoaderInterface(), urls, EXTRACT_BASE_INTERFACES, fileProtocols, classPackageTest);
 
                 Test<ClassFinder.ClassInfo> test = getActionClassTest();
                 classes.addAll(finder.findClasses(test));
@@ -397,9 +400,19 @@ public class PackageBasedActionConfigBui
         return classes;
     }
 
+    private List<URL> readUrls() throws IOException {
+        List<URL> list = buildUrlSet().getUrls();
+        // Usually the "classes" dir.
+        ArrayList<URL> classesList = Collections.list(getClassLoaderInterface().getResources(""));
+        for (URL url : classesList) {
+            list.addAll(fileManager.getAllPhysicalUrls(url));
+        }
+        return list;
+    }
+
     private UrlSet buildUrlSet() throws IOException {
         ClassLoaderInterface classLoaderInterface = getClassLoaderInterface();
-        UrlSet urlSet = new UrlSet(fileManager, classLoaderInterface, this.fileProtocols);
+        UrlSet urlSet = new UrlSet(classLoaderInterface, this.fileProtocols);
 
         //excluding the urls found by the parent class loader is desired, but fails in JBoss (all urls are removed)
         if (excludeParentClassLoader) {
@@ -425,7 +438,11 @@ public class PackageBasedActionConfigBui
         }
 
         //try to find classes dirs inside war files
-        urlSet = urlSet.includeClassesUrl(classLoaderInterface);
+        urlSet = urlSet.includeClassesUrl(classLoaderInterface, new UrlSet.FileProtocolNormalizer() {
+            public URL normalizeToFileProtocol(URL url) {
+                return fileManager.normalizeToFileProtocol(url);
+            }
+        });
 
 
         urlSet = urlSet.excludeJavaExtDirs();
@@ -472,7 +489,7 @@ public class PackageBasedActionConfigBui
                     }
                 }
             }
-            return new UrlSet(fileManager, includeUrls);
+            return new UrlSet(includeUrls);
         }
 
         return urlSet;

Modified: struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/JSPLoader.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/JSPLoader.java?rev=1406110&r1=1406109&r2=1406110&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/JSPLoader.java (original)
+++ struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/JSPLoader.java Tue Nov  6 12:18:21 2012
@@ -184,7 +184,7 @@ public class JSPLoader {
 
         //find available jars
         ClassLoaderInterface classLoaderInterface = getClassLoaderInterface();
-        UrlSet urlSet = new UrlSet(fileManager, classLoaderInterface);
+        UrlSet urlSet = new UrlSet(classLoaderInterface);
 
         //find jars
         List<URL> urls = urlSet.getUrls();

Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/UrlSet.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/UrlSet.java?rev=1406110&r1=1406109&r2=1406110&view=diff
==============================================================================
--- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/UrlSet.java (original)
+++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/UrlSet.java Tue Nov  6 12:18:21 2012
@@ -15,7 +15,6 @@
  */
 package com.opensymphony.xwork2.util.finder;
 
-import com.opensymphony.xwork2.FileManager;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.commons.lang3.ObjectUtils;
@@ -26,6 +25,7 @@ import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -50,40 +50,41 @@ import java.util.Set;
  * @version $Rev$ $Date$
  */
 public class UrlSet {
+
     private static final Logger LOG = LoggerFactory.getLogger(UrlSet.class);
+
     private final Map<String,URL> urls;
     private Set<String> protocols;
-    private FileManager fileManager;
 
-    public UrlSet(FileManager fileManager, ClassLoaderInterface classLoader) throws IOException {
-        this(fileManager);
+    private UrlSet() {
+        this.urls = new HashMap<String,URL>();
+    }
+
+    public UrlSet(ClassLoaderInterface classLoader) throws IOException {
+        this();
         load(getUrls(classLoader));
     }
 
-    public UrlSet(FileManager fileManager, ClassLoaderInterface classLoader, Set<String> protocols) throws IOException {
-        this(fileManager);
+    public UrlSet(ClassLoaderInterface classLoader, Set<String> protocols) throws IOException {
+        this();
         this.protocols = protocols;
-        this.fileManager = fileManager;
         load(getUrls(classLoader, protocols));
     }
 
+    public UrlSet(URL... urls){
+        this(Arrays.asList(urls));
+    }
     /**
      * Ignores all URLs that are not "jar" or "file"
      * @param urls
      */
-    public UrlSet(FileManager fileManager, Collection<URL> urls){
-        this(fileManager);
+    public UrlSet(Collection<URL> urls){
+        this();
         load(urls);
     }
 
-    private UrlSet(FileManager fileManager) {
-        this.urls = new HashMap<String,URL>();
-        this.fileManager = fileManager;
-    }
-
-    private UrlSet(FileManager fileManager, Map<String, URL> urls) {
+    private UrlSet(Map<String, URL> urls) {
         this.urls = urls;
-        this.fileManager = fileManager;
     }
 
     private void load(Collection<URL> urls){
@@ -91,7 +92,9 @@ public class UrlSet {
             try {
                 this.urls.put(location.toExternalForm(), location);
             } catch (Exception e) {
-                e.printStackTrace();
+                if (LOG.isWarnEnabled()) {
+                    LOG.warn("Cannot translate url to external form!", e);
+                }
             }
         }
     }
@@ -99,7 +102,7 @@ public class UrlSet {
     public UrlSet include(UrlSet urlSet){
         Map<String, URL> urls = new HashMap<String, URL>(this.urls);
         urls.putAll(urlSet.urls);
-        return new UrlSet(fileManager, urls);
+        return new UrlSet(urls);
     }
 
     public UrlSet exclude(UrlSet urlSet) {
@@ -108,11 +111,11 @@ public class UrlSet {
         for (String url : parentUrls.keySet()) {
             urls.remove(url);
         }
-        return new UrlSet(fileManager, urls);
+        return new UrlSet(urls);
     }
 
     public UrlSet exclude(ClassLoaderInterface parent) throws IOException {
-        return exclude(new UrlSet(fileManager, parent, this.protocols));
+        return exclude(new UrlSet(parent, this.protocols));
     }
 
     public UrlSet exclude(File file) throws MalformedURLException {
@@ -177,13 +180,13 @@ public class UrlSet {
                 urls.put(url, entry.getValue());
             }
         }
-        return new UrlSet(fileManager, urls);
+        return new UrlSet(urls);
     }
 
     /**
      * Try to find a classes directory inside a war file add its normalized url to this set
      */
-    public UrlSet includeClassesUrl(ClassLoaderInterface classLoaderInterface) throws IOException {
+    public UrlSet includeClassesUrl(ClassLoaderInterface classLoaderInterface, FileProtocolNormalizer normalizer) throws IOException {
         Enumeration<URL> rootUrlEnumeration = classLoaderInterface.getResources("");
         while (rootUrlEnumeration.hasMoreElements()) {
             URL url = rootUrlEnumeration.nextElement();
@@ -192,14 +195,14 @@ public class UrlSet {
                 //if it is inside a war file, get the url to the file
                 externalForm = StringUtils.substringBefore(externalForm, "/WEB-INF/classes");
                 URL warUrl = new URL(externalForm);
-                URL normalizedUrl = fileManager.normalizeToFileProtocol(warUrl);
+                URL normalizedUrl = normalizer.normalizeToFileProtocol(warUrl);
                 URL finalUrl = ObjectUtils.defaultIfNull(normalizedUrl, warUrl);
 
                 Map<String, URL> newUrls = new HashMap<String, URL>(this.urls);
                 if ("jar".equals(finalUrl.getProtocol()) || "file".equals(finalUrl.getProtocol())) {
                     newUrls.put(finalUrl.toExternalForm(), finalUrl);
                 }
-                return new UrlSet(fileManager, newUrls);
+                return new UrlSet(newUrls);
             }
         }
 
@@ -207,7 +210,7 @@ public class UrlSet {
     }
 
     public UrlSet relative(File file) throws MalformedURLException {
-        String urlPath = file.toURL().toExternalForm();
+        String urlPath = file.toURI().toURL().toExternalForm();
         Map<String, URL> urls = new HashMap<String, URL>();
         for (Map.Entry<String, URL> entry : this.urls.entrySet()) {
             String url = entry.getKey();
@@ -215,7 +218,7 @@ public class UrlSet {
                 urls.put(url, entry.getValue());
             }
         }
-        return new UrlSet(fileManager, urls);
+        return new UrlSet(urls);
     }
 
     public List<URL> getUrls() {
@@ -265,14 +268,13 @@ public class UrlSet {
                 LOG.debug("Ignoring URL [#0] because it is not a valid protocol", url.toExternalForm());
 
         }
+        return list;
+    }
 
-        // Usually the "classes" dir.
-        ArrayList<URL> classesList = Collections.list(classLoader.getResources(""));
-        for (URL url : classesList) {
-            list.addAll(fileManager.getAllPhysicalUrls(url));
-        }
+    public static interface FileProtocolNormalizer {
+
+        URL normalizeToFileProtocol(URL url);
 
-        return list;
     }
 
 }