Author: lukaszlenart
Date: Tue Mar  6 08:48:30 2012
New Revision: 1297384

URL: http://svn.apache.org/viewvc?rev=1297384&view=rev
Log:
WW-3662 - improves support for JBoss server

Modified:
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/FileManager.java
    
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/ClassFinder.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/UrlSet.java
    
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/util/URLUtilTest.java

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/FileManager.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/FileManager.java?rev=1297384&r1=1297383&r2=1297384&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/FileManager.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/FileManager.java
 Tue Mar  6 08:48:30 2012
@@ -139,7 +139,7 @@ public class FileManager {
             if (LOG.isDebugEnabled()) {
                 LOG.debug("Creating revision for URL: " +fileName);
             }
-            if (URLUtil.isJBoss5Url(fileUrl)) {
+            if (URLUtil.isJBossUrl(fileUrl)) {
                 revision = JBossFileRevision.build(fileUrl);
             } else if (URLUtil.isJarURL(fileUrl)) {
                 revision = JarEntryRevision.build(fileUrl);

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=1297384&r1=1297383&r2=1297384&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
 Tue Mar  6 08:48:30 2012
@@ -15,19 +15,23 @@
  */
 package com.opensymphony.xwork2.util;
 
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-import java.net.URL;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
 import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * Helper class to extract file paths from different urls
  */
 public class URLUtil {
 
-    /**
-     * Prefix for Jar files in JBoss Virtual File System
-     */
+    private static final Logger LOG = LoggerFactory.getLogger(URLUtil.class);
     public static final String JBOSS5_VFS = "vfs";
     public static final String JBOSS5_VFSZIP = "vfszip";
     public static final String JBOSS5_VFSMEMORY = "vfsmemory";
@@ -45,8 +49,8 @@ public class URLUtil {
         String fileName = url.toExternalForm();
         Matcher jarMatcher = JAR_PATTERN.matcher(fileName);
         try {
-            if (isJBoss5Url(url)){
-                return new URL("file", null, 
fileName.substring(fileName.indexOf(":") + 1));
+            if (isJBossUrl(url)){
+                return getJBossPhysicalUrl(url);
             } else  if (jarMatcher.matches()) {
                 String path = jarMatcher.group(JAR_FILE_PATH);
                 return new URL("file", "", path);
@@ -57,6 +61,9 @@ public class URLUtil {
         } catch (MalformedURLException e) {
             //can this ever happen?
             return null;
+        } catch (IOException e) {
+            LOG.warn("Error opening JBoss vfs file", e);
+            return null;
         }
     }
 
@@ -99,10 +106,31 @@ public class URLUtil {
      * @param fileUrl
      * @return
      */
-    public static boolean isJBoss5Url(URL fileUrl) {
+    public static boolean isJBossUrl(URL fileUrl) {
         final String protocol = fileUrl.getProtocol();
         return JBOSS5_VFSZIP.equals(protocol) || 
JBOSS5_VFSMEMORY.equals(protocol) || JBOSS5_VFS.equals(protocol)
                 || ("true".equals(System.getProperty("jboss.vfs.forceVfsJar")) 
&& JBOSS5_VFSFILE.equals(protocol));
     }
 
+    /**
+     * Try to determine physical file location.
+     *
+     * @param url JBoss VFS URL
+     * @return URL pointing to physical file or original URL
+     * @throws IOException If conversion fails
+     */
+    public static URL getJBossPhysicalUrl(URL url) throws IOException {
+        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);
+                return physicalFile.toURI().toURL();
+            }
+        } catch (Exception e) {
+            LOG.warn("Error calling getPhysicalFile() on JBoss VirtualFile.", 
e);
+        }
+        return url;
+    }
+
 }

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/ClassFinder.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/ClassFinder.java?rev=1297384&r1=1297383&r2=1297384&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/ClassFinder.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/finder/ClassFinder.java
 Tue Mar  6 08:48:30 2012
@@ -469,7 +469,9 @@ public class ClassFinder {
             } else if (file.getName().endsWith(".class")) {
                 String name = file.getName();
                 name = name.replaceFirst(".class$", "");
-                classNames.add(packageName + name);
+                // Classes packaged in an exploded .war (e.g. in a VFS file 
system) should not
+                // have WEB-INF.classes in their package name.
+                classNames.add(StringUtils.removeStart(packageName, 
"WEB-INF.classes.") + name);
             }
         }
     }

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=1297384&r1=1297383&r2=1297384&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 Mar  6 08:48:30 2012
@@ -190,7 +190,9 @@ public class UrlSet {
                 URL finalUrl = (URL) ObjectUtils.defaultIfNull(normalizedUrl, 
warUrl);
 
                 Map<String, URL> newUrls = new HashMap<String, URL>(this.urls);
-                newUrls.put(finalUrl.toExternalForm(), finalUrl);
+                if ("jar".equals(finalUrl.getProtocol()) || 
"file".equals(finalUrl.getProtocol())) {
+                    newUrls.put(finalUrl.toExternalForm(), finalUrl);
+                }
                 return new UrlSet(newUrls);
             }
         }
@@ -258,8 +260,16 @@ public class UrlSet {
 
         }
 
-        //usually the "classes" dir
-        list.addAll(Collections.list(classLoader.getResources("")));
+        // Usually the "classes" dir.
+        ArrayList<URL> classesList = 
Collections.list(classLoader.getResources(""));
+        for (URL url : classesList) {
+            if (URLUtil.isJBossUrl(url)) {
+                list.add(URLUtil.getJBossPhysicalUrl(url));
+            } else {
+                list.add(url);
+            }
+        }
+
         return list;
     }
 

Modified: 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/util/URLUtilTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/util/URLUtilTest.java?rev=1297384&r1=1297383&r2=1297384&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/util/URLUtilTest.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/util/URLUtilTest.java
 Tue Mar  6 08:48:30 2012
@@ -161,9 +161,9 @@ public class URLUtilTest extends TestCas
     }
 
     public void testIsJBoss5Url() throws Exception {
-        assertTrue(URLUtil.isJBoss5Url(new 
URL("vfszip:/c:/somewar.war/somelibrary.jar")));
-        assertFalse(URLUtil.isJBoss5Url(new 
URL("vfsfile:/c:/somewar.war/somelibrary.jar")));
-        assertFalse(URLUtil.isJBoss5Url(new 
URL("jar:file:/c:/somelibrary.jar")));
-        assertTrue(URLUtil.isJBoss5Url(new 
URL("vfsmemory:/c:/somewar.war/somelibrary.jar")));
+        assertTrue(URLUtil.isJBossUrl(new 
URL("vfszip:/c:/somewar.war/somelibrary.jar")));
+        assertFalse(URLUtil.isJBossUrl(new 
URL("vfsfile:/c:/somewar.war/somelibrary.jar")));
+        assertFalse(URLUtil.isJBossUrl(new 
URL("jar:file:/c:/somelibrary.jar")));
+        assertTrue(URLUtil.isJBossUrl(new 
URL("vfsmemory:/c:/somewar.war/somelibrary.jar")));
     }
 }


Reply via email to