You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Vignesh Manickam Periaswamy (JIRA)" <ji...@apache.org> on 2011/01/24 17:27:44 UTC

[jira] Commented: (WW-3487) The plugin can't find the actions if the war embeded in an ear.

    [ https://issues.apache.org/jira/browse/WW-3487?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12985786#action_12985786 ] 

Vignesh Manickam Periaswamy commented on WW-3487:
-------------------------------------------------

I am facing this same issue and did mroe investigation to trace the problem. Initially I thought the problem could be that PackageBasedActionConfigBuilder.findActions() is not able to trace the WAR when it is deployed inside an EAR. But I was wrong and the real problem is related to the WAR's protocol recognized as "vfsfile" protocol. I am not part of the Struts developer group but I tried by best to learn internals of Struts and hope my troubeshooting could help resolve the issue.

I am using Struts 2.2.1.1 on JBoss 5.1. I have configured the below constant in struts.xml as I am using JBoss.
<constant name="struts.convention.action.fileProtocols" value="jar,vfsfile,vfszip" />

My troubleshooting involved 3 scenarios based on the way the WAR is deployed. Cases 1 & 2 WAR is deployed inside WAR; exploded and packaged respectively, investigate where the failure happens. Case 3 WAR is deployed directly without EAR, shows why it works correctly without the issues in Cases 1 & 2.

Case 1: EAR containing a WAR deployed as exploded
==========================================

Step (1): [Detecting the WAR] In URLSet.includeClassesUrl() method (invoked at PackageBasedActionConfigBuilder.buildUrlSet() line: 418), rootUrlEnumeration returns vfsfile:/C:/_server/jboss-eap-5.1/jboss-as/server/MyServer/deploy/MyTest.ear/MyWeb.war/WEB-INF/classes. The URL is normalized as vfsfile:/C:/_server/jboss-eap-5.1/jboss-as/server/MyServer/deploy/MyTest.ear/MyWeb.war truncating the "WEB-INF/classes". Please note that the WAR's protocol is "vfsfile" and not "vfszip", though it is an archive (exploded in my case). 
Step (2): [Built URL set] The URL of the WAR is included to the UrlSet passed as argument to the constructor of ClassFinder (at PackageBasedActionConfigBuilder.findActions() line: 377). 
Step (3): [Finding actions] While trying to add all classNames in the WAR file (at ClassFinder.<init>() line: 144) the util method jar(URL) normalizes the URL from JBoss file protocol using URLUtil.normalizeToFileProtocol(URL).
Step (4): [Converting protocol] While converting URL to "file" protocol, URLUtil.isJBoss5Url(URL) method checks whether the protocol is either "vfszip" or "vfsmemory". But in Case 1 stated above, the protocol of the WAR file is "vfsfile" and the method returns null. Henceforth the classNames are returned as an empty list.

And so, the plugin can't find the actions, though it tried looking into the WAR.

I also tried altering the value "vfsfile" protocol to "vfszip" in the debugger (to skip the vfsfile problem), but ClassFinder.jar(JarInputStream) fails while recognizing WAR as a JAR.

Case 2: EAR containing a WAR deployed as package
=========================================

Step (1): rootUrlEnumeration returns vfszip:/C:/_server/jboss-eap-5.1/jboss-as/server/MyServer/deploy/MyTest.ear/MyWeb.war/WEB-INF/classes and normalized as "file" protocol as opposed "vfsfile" in Case 1. (file:/C:/_server/jboss-eap-5.1/jboss-as/server/MyServer/deploy/MyTest.ear/MyWeb.war)
Step (2): Same as Case 1.
Step (3): As the protocol is "file", it checks if the file is a JAR and at JarURLConnection.getJarFile() gets a java.io.FileNotFoundException: C:\_server\jboss-eap-5.1\jboss-as\server\MyServer\deploy\MyTest.ear\MyWeb.war (The system cannot find the path specified), as it is directly pointing to a file inside an archive in the file system. It catches the exception and calls the util method file(URL), but returns no classes.

Case 3: WAR deployed directly
========================

Step (1): rootUrlEnumeration returns vfszip:/C:/_server/jboss-eap-5.1/jboss-as/server/MyServer/deploy/MyWeb.war/WEB-INF/classes and normalized as "file" protocol. file:/C:/_server/jboss-eap-5.1/jboss-as/server/MyServer/deploy/MyWeb.war.
Step (2): Same as Case 1.
Step (3): As the protocol is "file", it checks if the file is a JAR and JarURLConnection.getJarFile() gets the JAR file without any FileNotFoundException. The util jar(URL) returns all the class names in the WAR file!

Summary:
========
The issue in Case 1 when compared with Case 3 is the "vfsfile" protocol of the WAR. 
The issue in Case 2 when compared with Case 3 is the FileNotFoundException while referencing to the WAR inside an EAR archive in the file system.

I think both the issues need to be addressed for the bug to be resolved.

Please correct me if my assumptions about the source code are wrong.

> The plugin can't find the actions if the war embeded in an ear.
> ---------------------------------------------------------------
>
>                 Key: WW-3487
>                 URL: https://issues.apache.org/jira/browse/WW-3487
>             Project: Struts 2
>          Issue Type: Bug
>          Components: Plugin - Convention
>    Affects Versions: 2.2.1
>         Environment: JBoss 5.1
>            Reporter: Böszörményi Péter
>         Attachments: struts2-src.tar.gz, struts2.ear
>
>
> If I deploy an ear that contains a war, the plugin can't find the actions under JBoss 5.1. If I only deploy the war everything is fine. Tha actions defined in struts.xml works perfectly in both cases. I did some investigation, and i think the problem is in the method org.apache.struts2.convention.PackageBasedActionConfigBuilder.findActions.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.