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() {


Reply via email to