Author: ddewolf
Date: Fri Dec  8 07:02:24 2006
New Revision: 484626

URL: http://svn.apache.org/viewvc?view=rev&rev=484626
Log:
Providing a mechanism which allows only portions of the action to be 
exposed/converted to XML by the XSLT result

Added:
    
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/xslt/
    
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/xslt/JVMAction.java
   (with props)
    struts/struts2/trunk/apps/showcase/src/main/resources/struts-xslt.xml   
(with props)
    struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/
    struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/environment.xsl
    struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/index.jsp   (with 
props)
Modified:
    struts/struts2/trunk/apps/showcase/src/main/resources/struts.xml
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/xslt/XSLTResult.java

Added: 
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/xslt/JVMAction.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/xslt/JVMAction.java?view=auto&rev=484626
==============================================================================
--- 
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/xslt/JVMAction.java
 (added)
+++ 
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/xslt/JVMAction.java
 Fri Dec  8 07:02:24 2006
@@ -0,0 +1,83 @@
+package org.apache.struts2.showcase.xslt;
+
+import java.util.Map;
+import java.util.Properties;
+
+import com.opensymphony.xwork2.ActionSupport;
+
+import org.apache.struts2.interceptor.ServletRequestAware;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class JVMAction implements ServletRequestAware {
+
+    private ImportantInfo info;
+    private Map<String, String> environment;
+
+    /** Captured only to show that undesired data can creep into the result. */
+    private HttpServletRequest servletRequest;
+
+
+    public String execute() {
+        environment = System.getenv();
+        Properties props = System.getProperties();
+
+        String classpath = environment.get("CLASSPATH");
+        info = new ImportantInfo(classpath, props);
+
+        return ActionSupport.SUCCESS;
+    }
+
+
+    public HttpServletRequest getServletRequest() {
+        return servletRequest;
+    }
+
+    public void setServletRequest(HttpServletRequest servletRequest) {
+        this.servletRequest = servletRequest;
+    }
+
+    public Map<String, String> getEnvironment() {
+        return environment;
+    }
+
+    public void setEnvironment(Map<String, String> environment) {
+        this.environment = environment;
+    }
+
+
+    public ImportantInfo getInfo() {
+        return info;
+    }
+
+    public void setInfo(ImportantInfo info) {
+        this.info = info;
+    }
+
+    public class ImportantInfo {
+        private String classpath;
+        private Properties systemProperties;
+
+
+        public ImportantInfo(String classpath, Properties properties) {
+            this.classpath = classpath;
+            this.systemProperties = properties;
+        }
+
+        public String getClasspath() {
+            return classpath;
+        }
+
+        public void setClasspath(String classpath) {
+            this.classpath = classpath;
+        }
+
+        public Properties getSystemProperties() {
+            return systemProperties;
+        }
+
+        public void setSystemProperties(Properties systemProperties) {
+            this.systemProperties = systemProperties;
+        }
+    }
+}

Propchange: 
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/xslt/JVMAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
struts/struts2/trunk/apps/showcase/src/main/java/org/apache/struts2/showcase/xslt/JVMAction.java
------------------------------------------------------------------------------
    svn:keywords = Id Author Date Rev

Added: struts/struts2/trunk/apps/showcase/src/main/resources/struts-xslt.xml
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/apps/showcase/src/main/resources/struts-xslt.xml?view=auto&rev=484626
==============================================================================
--- struts/struts2/trunk/apps/showcase/src/main/resources/struts-xslt.xml 
(added)
+++ struts/struts2/trunk/apps/showcase/src/main/resources/struts-xslt.xml Fri 
Dec  8 07:02:24 2006
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE struts PUBLIC
+        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
+        "http://struts.apache.org/dtds/struts-2.0.dtd";>
+
+<struts>
+    <package name="xslt" extends="struts-default" namespace="/xslt">
+        <default-action-ref name="index"/>
+
+        <action name="index">
+            <result>index.jsp</result>
+        </action>
+
+        <action name="classpath" 
class="org.apache.struts2.showcase.xslt.JVMAction">
+            <result type="xslt">
+                <param name="exposedValue">info.classpath</param>
+            </result>
+        </action>
+        
+        <action name="jvmInfoRaw" 
class="org.apache.struts2.showcase.xslt.JVMAction">
+            <result type="xslt">
+                <param name="exposedValue">info</param>
+            </result>
+        </action>
+
+        <action name="jvmInfoAll" 
class="org.apache.struts2.showcase.xslt.JVMAction">
+            <result type="xslt"/>
+        </action>
+
+        <action name="jvmInfo" 
class="org.apache.struts2.showcase.xslt.JVMAction">
+            <result type="xslt">
+                <param name="stylesheetLocation">/xslt/environment.xsl</param>
+            </result>
+        </action>
+
+    </package>
+</struts>
+
+

Propchange: 
struts/struts2/trunk/apps/showcase/src/main/resources/struts-xslt.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
struts/struts2/trunk/apps/showcase/src/main/resources/struts-xslt.xml
------------------------------------------------------------------------------
    svn:keywords = Id Author Date Rev

Modified: struts/struts2/trunk/apps/showcase/src/main/resources/struts.xml
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/apps/showcase/src/main/resources/struts.xml?view=diff&rev=484626&r1=484625&r2=484626
==============================================================================
--- struts/struts2/trunk/apps/showcase/src/main/resources/struts.xml (original)
+++ struts/struts2/trunk/apps/showcase/src/main/resources/struts.xml Fri Dec  8 
07:02:24 2006
@@ -43,6 +43,8 @@
 
     <include file="struts-tiles.xml" />
 
+    <include file="struts-xslt.xml" />
+
     <package name="default" extends="struts-default">
         <interceptors>
             <interceptor-stack name="crudStack">

Added: struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/environment.xsl
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/environment.xsl?view=auto&rev=484626
==============================================================================
--- struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/environment.xsl 
(added)
+++ struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/environment.xsl Fri 
Dec  8 07:02:24 2006
@@ -0,0 +1,25 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0"
+                xmlns="http://www.w3.org/1999/xhtml";>
+
+    <xsl:template match="/result">
+        <html>
+            <head>
+                <title>JVM Info</title>
+            </head>
+            <body>
+                <h1>JVM Info</h1>
+                <xsl:value-of select="info/classpath"/>
+                <table>
+                    <tr><th>System Property</th><th>Value</th></tr>
+                    <xsl:for-each select="info/systemProperties/entry">
+                        <tr>
+                            <td><xsl:value-of select="key"/></td>
+                            <td><xsl:value-of select="value"/></td>
+                        </tr>
+                    </xsl:for-each>
+                </table>
+            </body>
+        </html>
+    </xsl:template>
+
+</xsl:stylesheet>

Added: struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/index.jsp
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/index.jsp?view=auto&rev=484626
==============================================================================
--- struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/index.jsp (added)
+++ struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/index.jsp Fri Dec  
8 07:02:24 2006
@@ -0,0 +1,26 @@
+<[EMAIL PROTECTED] prefix="s" uri="/struts-tags" %>
+
+<html>
+<head>
+<title>Showcase - XSLT </title>
+</head>
+<body>
+<h1> XSLT Result Showcase</h1>
+
+<p>
+    The XSLT result can be used to generate xml from the action. By default, 
each of the action's
+    properties will be converted into a DOM and rendered.  These results can 
be transformed via
+    xslt.  Additionally, the result's exposedValue parameter can be used to 
define an ognl expression
+    which can be used to manipulate the object which will be converted to xml.
+
+    <ul>
+        <li><s:url id="url" namespace="/xslt" action="jvmInfo"/><s:a 
href="%{url}">Render the exposed portion of the action as html</s:a></li>
+        <li><s:url id="url" namespace="/xslt" action="jvmInfoRaw"/><s:a 
href="%{url}">Render the exposed portion of the action as xml</s:a></li>
+        <li><s:url id="url" namespace="/xslt" action="jvmInfoAll"/><s:a 
href="%{url}">Render the action as xml</s:a></li>
+        <li><s:url id="url" namespace="/xslt" action="classpath"/><s:a 
href="%{url}">Render an ognl property</s:a></li>
+    </ul>
+</p>
+
+
+</body>
+</html>
\ No newline at end of file

Propchange: struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/index.jsp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/struts2/trunk/apps/showcase/src/main/webapp/xslt/index.jsp
------------------------------------------------------------------------------
    svn:keywords = Id Author Date Rev

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/xslt/XSLTResult.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/xslt/XSLTResult.java?view=diff&rev=484626&r1=484625&r2=484626
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/xslt/XSLTResult.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/xslt/XSLTResult.java
 Fri Dec  8 07:02:24 2006
@@ -151,6 +151,19 @@
  * &lt;/result&gt;
  * <!-- END SNIPPET: description.example --></pre>
  *
+ * <p>
+ * In the following example the XSLT result would use the action's user 
property
+ * instead of the action as it's base document and walk through it's 
properties.
+ * The exposedValue uses an ognl expression to derive it's value.
+ * </p>
+ *
+ * <pre>
+ * &lt;result name="success" type="xslt"&gt;
+ *   &lt;param name="location"&gt;foo.xslt&lt;/param&gt;
+ *   &lt;param name="exposedValue"&gt;user$&lt;/param&gt;
+ * &lt;/result&gt;
+ * </pre>
+ * *
  * <b>This result type takes the following parameters:</b>
  *
  * <!-- START SNIPPET: params -->
@@ -192,17 +205,41 @@
 public class XSLTResult implements Result {
 
     private static final long serialVersionUID = 6424691441777176763L;
-    private static final Log log = LogFactory.getLog(XSLTResult.class);
+
+    /** Log instance for this result. */
+    private static final Log LOG = LogFactory.getLog(XSLTResult.class);
+
+    /** 'stylesheetLocation' parameter.  Points to the xsl. */
     public static final String DEFAULT_PARAM = "stylesheetLocation";
 
+    /** Cache of all tempaltes. */
+    private static final Map<String, Templates> templatesCache;
+
+    static {
+        templatesCache = new HashMap<String, Templates>();
+    }
+
+    // Configurable Parameters
+
+    /** Determines whether or not the result should allow caching. */
     protected boolean noCache;
-    private final Map<String, Templates> templatesCache;
+
+    /** Indicates the location of the xsl template. */
     private String stylesheetLocation;
+
+    /** Indicates the property name patterns which should be exposed to the 
xml. */
+    private String matchingPattern;
+
+    /** Indicates the property name patterns which should be excluded from the 
xml. */
+    private String exludingPattern;
+
+    /** Indicates the ognl expression respresenting the bean which is to be 
exposed as xml. */
+    private String exposedValue;
+
     private boolean parse;
     private AdapterFactory adapterFactory;
 
     public XSLTResult() {
-        templatesCache = new HashMap<String, Templates>();
     }
 
     public XSLTResult(String stylesheetLocation) {
@@ -232,6 +269,30 @@
         return stylesheetLocation;
     }
 
+    public String getExposedValue() {
+        return exposedValue;
+    }
+
+    public void setExposedValue(String exposedValue) {
+        this.exposedValue = exposedValue;
+    }
+
+    public String getMatchingPattern() {
+        return matchingPattern;
+    }
+
+    public void setMatchingPattern(String matchingPattern) {
+        this.matchingPattern = matchingPattern;
+    }
+
+    public String getExludingPattern() {
+        return exludingPattern;
+    }
+
+    public void setExludingPattern(String exludingPattern) {
+        this.exludingPattern = exludingPattern;
+    }
+
     /**
      * If true, parse the stylesheet location for OGNL expressions.
      *
@@ -250,6 +311,7 @@
             location = TextParseUtil.translateVariables(location, stack);
         }
 
+
         try {
             HttpServletResponse response = ServletActionContext.getResponse();
 
@@ -278,23 +340,29 @@
 
             response.setContentType(mimeType);
 
-            Source xmlSource = getDOMSourceForStack(invocation.getAction());
+            Object result = invocation.getAction();
+            if (exposedValue != null) {
+                ValueStack stack = invocation.getStack();
+                result = stack.findValue(exposedValue);
+            }
+
+            Source xmlSource = getDOMSourceForStack(result);
 
             // Transform the source XML to System.out.
             PrintWriter out = response.getWriter();
 
-            log.debug("xmlSource = " + xmlSource);
+            LOG.debug("xmlSource = " + xmlSource);
             transformer.transform(xmlSource, new StreamResult(out));
 
             out.close(); // ...and flush...
 
-            if (log.isDebugEnabled()) {
-                log.debug("Time:" + (System.currentTimeMillis() - startTime) + 
"ms");
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Time:" + (System.currentTimeMillis() - startTime) + 
"ms");
             }
 
             writer.flush();
         } catch (Exception e) {
-            log.error("Unable to render XSLT Template, '" + location + "'", e);
+            LOG.error("Unable to render XSLT Template, '" + location + "'", e);
             throw e;
         }
     }
@@ -337,7 +405,7 @@
                     throw new TransformerException("Stylesheet " + path + " 
not found in resources.");
                 }
 
-                log.debug("Preparing XSLT stylesheet templates: " + path);
+                LOG.debug("Preparing XSLT stylesheet templates: " + path);
 
                 TransformerFactory factory = TransformerFactory.newInstance();
                 templates = factory.newTemplates(new 
StreamSource(resource.openStream()));
@@ -348,8 +416,8 @@
         return templates;
     }
 
-    protected Source getDOMSourceForStack(Object action)
+    protected Source getDOMSourceForStack(Object value)
             throws IllegalAccessException, InstantiationException {
-        return new DOMSource(getAdapterFactory().adaptDocument("result", 
action) );
+        return new DOMSource(getAdapterFactory().adaptDocument("result", 
value) );
     }
 }


Reply via email to