Author: lukaszlenart Date: Mon Feb 18 19:13:44 2013 New Revision: 1447442 URL: http://svn.apache.org/r1447442 Log: WW-3984 Adds support for Convention plugin which based on actions in a Jar file embedded in Ear file on JBoss 5 server
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/fs/JBossFileManager.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/FileRevision.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/JarEntryRevision.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/Revision.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/fs/JBossFileManager.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/fs/JBossFileManager.java?rev=1447442&r1=1447441&r2=1447442&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/fs/JBossFileManager.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/fs/JBossFileManager.java Mon Feb 18 19:13:44 2013 @@ -2,12 +2,14 @@ package org.apache.struts2.util.fs; import com.opensymphony.xwork2.util.fs.DefaultFileManager; import com.opensymphony.xwork2.util.fs.FileRevision; +import com.opensymphony.xwork2.util.fs.JarEntryRevision; import com.opensymphony.xwork2.util.fs.Revision; 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.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; @@ -45,7 +47,7 @@ public class JBossFileManager extends De return true; } catch (ClassNotFoundException e) { if (LOG.isDebugEnabled()) { - LOG.debug("Cannot load [#0] class, not a JBoss 5!", VFS_JBOSS7); + LOG.debug("Cannot load [#0] class, not a JBoss 5!", VFS_JBOSS5); } return false; } @@ -70,7 +72,15 @@ public class JBossFileManager extends De if (LOG.isDebugEnabled()) { LOG.debug("Creating revision for URL: " + fileName); } - Revision revision = FileRevision.build(normalizeToFileProtocol(fileUrl)); + URL normalizedUrl = normalizeToFileProtocol(fileUrl); + Revision revision; + if ("file".equals(normalizedUrl.getProtocol())) { + revision = FileRevision.build(normalizedUrl); + } else if ("jar".equals(normalizedUrl.getProtocol())) { + revision = JarEntryRevision.build(normalizedUrl); + } else { + revision = Revision.build(normalizedUrl); + } files.put(fileName, revision); } else { super.monitorFile(fileUrl); @@ -122,43 +132,68 @@ public class JBossFileManager extends De */ protected URL getJBossPhysicalUrl(URL url) throws IOException { Object content = url.openConnection().getContent(); - try { - String s = content.getClass().toString(); - if (s.startsWith("class org.jboss.vfs.VirtualFile")) { // JBoss 7 and probably 6 - File physicalFile = readJBossPhysicalFile(content); - return physicalFile.toURI().toURL(); - } else if (s.startsWith("class org.jboss.virtual.VirtualFile")) { // JBoss 5 - String fileName = url.toExternalForm(); - return new URL("file", null, fileName.substring(fileName.indexOf(":") + 1)); - } - } catch (Exception e) { - LOG.warn("Error calling getPhysicalFile() on JBoss VirtualFile.", e); + String classContent = content.getClass().toString(); + if (classContent.startsWith("class org.jboss.vfs.VirtualFile")) { // JBoss 7 and probably 6 + File physicalFile = readJBossPhysicalFile(content); + return physicalFile.toURI().toURL(); + } else if (classContent.startsWith("class org.jboss.virtual.VirtualFile")) { // JBoss 5 + return readJBoss5Url(content); } return url; } - private File readJBossPhysicalFile(Object content) throws Exception { - Method method = content.getClass().getDeclaredMethod("getPhysicalFile"); - return (File) method.invoke(content); - } - private 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); + String classContent = content.getClass().toString(); + if (classContent.startsWith("class org.jboss.vfs.VirtualFile")) { + File physicalFile = readJBossPhysicalFile(content); + if (physicalFile != null) { readFile(urls, physicalFile); readFile(urls, physicalFile.getParentFile()); - } else { - urls.add(url); } - } catch (Exception e) { - LOG.warn("Error calling getPhysicalFile() on JBoss VirtualFile!", e); + } else if (classContent.startsWith("class org.jboss.virtual.VirtualFile")) { + URL physicalUrl = readJBoss5Url(content); + if (physicalUrl != null) { + urls.add(physicalUrl); + } + } else { + urls.add(url); } return urls; } + private File readJBossPhysicalFile(Object content) { + try { + Method method = content.getClass().getDeclaredMethod("getPhysicalFile"); + return (File) method.invoke(content); + } catch (NoSuchMethodException e) { + LOG.error("Provided class content [#0] is not a JBoss VirtualFile, getPhysicalFile() method not found!", e, content.getClass().getSimpleName()); + } catch (InvocationTargetException e) { + LOG.error("Cannot invoke getPhysicalFile() method!", e); + } catch (IllegalAccessException e) { + LOG.error("Cannot access getPhysicalFile() method!", e); + } + return null; + } + + private URL readJBoss5Url(Object content) { + try { + Method method = content.getClass().getDeclaredMethod("getHandler"); + method.setAccessible(true); + Object handler = method.invoke(content); + method = handler.getClass().getMethod("getRealURL"); + return (URL) method.invoke(handler); + } catch (NoSuchMethodException e) { + LOG.error("Provided class content [#0] is not a JBoss VirtualFile, getHandler() or getRealURL() method not found!", e, content.getClass().getSimpleName()); + } catch (InvocationTargetException e) { + LOG.error("Cannot invoke getHandler() or getRealURL() method!", e); + } catch (IllegalAccessException e) { + LOG.error("Cannot access getHandler() or getRealURL() method!", e); + } + return null; + } + private void readFile(List<URL> urls, File physicalFile) throws MalformedURLException { File[] files = physicalFile.listFiles(); if (physicalFile.isDirectory() && files != null) { Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java?rev=1447442&r1=1447441&r2=1447442&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/DefaultFileManager.java Mon Feb 18 19:13:44 2013 @@ -94,7 +94,7 @@ public class DefaultFileManager implemen LOG.debug("Creating revision for URL: " + fileName); } if (isJarURL(fileUrl)) { - revision = JarEntryRevision.build(fileUrl, this); + revision = JarEntryRevision.build(normalizeToFileProtocol(fileUrl)); } else { revision = FileRevision.build(fileUrl); } Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/FileRevision.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/FileRevision.java?rev=1447442&r1=1447441&r2=1447442&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/FileRevision.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/FileRevision.java Mon Feb 18 19:13:44 2013 @@ -45,14 +45,6 @@ public class FileRevision extends Revisi return file; } - public void setLastModified(long lastModified) { - this.lastModified = lastModified; - } - - public long getLastModified() { - return lastModified; - } - public boolean needsReloading() { return this.lastModified < this.file.lastModified(); } Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/JarEntryRevision.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/JarEntryRevision.java?rev=1447442&r1=1447441&r2=1447442&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/JarEntryRevision.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/JarEntryRevision.java Mon Feb 18 19:13:44 2013 @@ -1,6 +1,5 @@ package com.opensymphony.xwork2.util.fs; -import com.opensymphony.xwork2.FileManager; import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; import org.apache.commons.io.FileUtils; @@ -13,7 +12,7 @@ import java.util.zip.ZipEntry; /** * Represents jar resource revision, used for jar://* resource */ -class JarEntryRevision extends Revision { +public class JarEntryRevision extends Revision { private static Logger LOG = LoggerFactory.getLogger(JarEntryRevision.class); @@ -24,28 +23,7 @@ class JarEntryRevision extends Revision private String fileNameInJar; private long lastModified; - public JarEntryRevision(String jarFileName, String fileNameInJar, long lastModified) { - if ((jarFileName == null) || (fileNameInJar == null)) { - throw new IllegalArgumentException("JarFileName and FileNameInJar cannot be null"); - } - this.jarFileName = jarFileName; - this.fileNameInJar = fileNameInJar; - this.lastModified = lastModified; - } - - public boolean needsReloading() { - ZipEntry entry; - try { - JarFile jarFile = new JarFile(this.jarFileName); - entry = jarFile.getEntry(this.fileNameInJar); - } catch (IOException e) { - entry = null; - } - - return entry != null && (lastModified < entry.getTime()); - } - - public static Revision build(URL fileUrl, FileManager fileManager) { + public static Revision build(URL fileUrl) { // File within a Jar // Find separator index of jar filename and filename within jar String jarFileName = ""; @@ -66,19 +44,36 @@ class JarEntryRevision extends Revision int index = separatorIndex + JAR_FILE_NAME_SEPARATOR.length(); String fileNameInJar = fileName.substring(index).replaceAll("%20", " "); - URL url = fileManager.normalizeToFileProtocol(fileUrl); - if (url != null) { - JarFile jarFile = new JarFile(FileUtils.toFile(url)); - ZipEntry entry = jarFile.getEntry(fileNameInJar); - return new JarEntryRevision(jarFileName.toString(), fileNameInJar, entry.getTime()); - } else { - return null; - } + JarFile jarFile = new JarFile(FileUtils.toFile(fileUrl)); + ZipEntry entry = jarFile.getEntry(fileNameInJar); + return new JarEntryRevision(jarFileName, fileNameInJar, entry.getTime()); } catch (Throwable e) { if (LOG.isWarnEnabled()) { - LOG.warn("Could not create JarEntryRevision for [" + jarFileName + "]!", e); + LOG.warn("Could not create JarEntryRevision for [#0]!", e, jarFileName); } return null; } } + + private JarEntryRevision(String jarFileName, String fileNameInJar, long lastModified) { + if ((jarFileName == null) || (fileNameInJar == null)) { + throw new IllegalArgumentException("JarFileName and FileNameInJar cannot be null"); + } + this.jarFileName = jarFileName; + this.fileNameInJar = fileNameInJar; + this.lastModified = lastModified; + } + + public boolean needsReloading() { + ZipEntry entry; + try { + JarFile jarFile = new JarFile(this.jarFileName); + entry = jarFile.getEntry(this.fileNameInJar); + } catch (IOException e) { + entry = null; + } + + return entry != null && (lastModified < entry.getTime()); + } + } Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/Revision.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/Revision.java?rev=1447442&r1=1447441&r2=1447442&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/Revision.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/fs/Revision.java Mon Feb 18 19:13:44 2013 @@ -7,7 +7,7 @@ import java.net.URL; */ public class Revision { - public Revision() { + protected Revision() { } public boolean needsReloading() {