Author: lukaszlenart
Date: Fri Apr 27 12:12:03 2012
New Revision: 1331373

URL: http://svn.apache.org/viewvc?rev=1331373&view=rev
Log:
WW-3803 improves support for JAR inside EAR package when used with JBoss 7

Modified:
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/UrlSet.java

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java?rev=1331373&r1=1331372&r2=1331373&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/URLUtil.java
 Fri Apr 27 12:12:03 2012
@@ -23,6 +23,8 @@ import java.io.IOException;
 import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -123,8 +125,7 @@ public class URLUtil {
         Object content = url.openConnection().getContent();
         try {
             if (content.getClass().toString().startsWith("class 
org.jboss.vfs.VirtualFile")) {
-                Method method = 
content.getClass().getDeclaredMethod("getPhysicalFile");
-                File physicalFile = (File) method.invoke(content);
+                File physicalFile = readJBossPhysicalFile(content);
                 return physicalFile.toURI().toURL();
             }
         } catch (Exception e) {
@@ -133,4 +134,44 @@ public class URLUtil {
         return url;
     }
 
+    public static List<URL> getAllJBossPhysicalUrls(URL url) throws 
IOException {
+        List<URL> urls = new ArrayList<URL>();
+        Object content = url.openConnection().getContent();
+        try {
+            if (content.getClass().toString().startsWith("class 
org.jboss.vfs.VirtualFile")) {
+                File physicalFile = readJBossPhysicalFile(content);
+                readFile(urls, physicalFile);
+                readFile(urls, physicalFile.getParentFile());
+            } else {
+                urls.add(url);
+            }
+        } catch (Exception e) {
+            LOG.warn("Error calling getPhysicalFile() on JBoss VirtualFile.", 
e);
+        }
+        return urls;
+    }
+
+    private static File readJBossPhysicalFile(Object content) throws Exception 
{
+        Method method = 
content.getClass().getDeclaredMethod("getPhysicalFile");
+        return (File) method.invoke(content);
+    }
+
+    private static void readFile(List<URL> urls, File physicalFile) throws 
MalformedURLException {
+        if (physicalFile.isDirectory()) {
+            for (File file : physicalFile.listFiles()) {
+                if (file.isFile()) {
+                    addIfAbsent(urls, file.toURI().toURL());
+                } else if (file.isDirectory()) {
+                    readFile(urls, file);
+                }
+            }
+        }
+    }
+
+    private static void addIfAbsent(List<URL> urls, URL fileUrl) {
+        if (!urls.contains(fileUrl)) {
+            urls.add(fileUrl);
+        }
+    }
+
 }

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=1331373&r1=1331372&r2=1331373&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
 Fri Apr 27 12:12:03 2012
@@ -264,7 +264,7 @@ public class UrlSet {
         ArrayList<URL> classesList = 
Collections.list(classLoader.getResources(""));
         for (URL url : classesList) {
             if (URLUtil.isJBossUrl(url)) {
-                list.add(URLUtil.getJBossPhysicalUrl(url));
+                list.addAll(URLUtil.getAllJBossPhysicalUrls(url));
             } else {
                 list.add(url);
             }


Reply via email to