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"))); } }