You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by cb...@apache.org on 2018/07/07 15:38:57 UTC

svn commit: r1835318 - in /velocity/tools/trunk: velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/ velocity-tools-examples/velocity-tools-examples-showcase/src/test/java/org/apache/velocity/examples/showcase/ velocity-to...

Author: cbrisson
Date: Sat Jul  7 15:38:57 2018
New Revision: 1835318

URL: http://svn.apache.org/viewvc?rev=1835318&view=rev
Log:
[tools] Enable XInclude support - have FileFactoryConfiguration convey URL rather than InputStream" 

Modified:
    velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/tools.xml
    velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/web.xml
    velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/test/java/org/apache/velocity/examples/showcase/ViewToolsIT.java
    velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/ConfigurationUtils.java
    velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/FileFactoryConfiguration.java
    velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/PropertiesFactoryConfiguration.java
    velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/XmlFactoryConfiguration.java
    velocity/tools/trunk/velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ServletUtils.java
    velocity/tools/trunk/velocity-tools-view/src/test/java/org/apache/velocity/tools/view/VelocityViewTest.java

Modified: velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/tools.xml
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/tools.xml?rev=1835318&r1=1835317&r2=1835318&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/tools.xml (original)
+++ velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/tools.xml Sat Jul  7 15:38:57 2018
@@ -19,7 +19,7 @@
  under the License.
 -->
 
-<tools>
+<tools xmlns:xi="http://www.w3.org/2001/XInclude">
   <data key="author">Nathan Bubna</data>
   <toolbox scope="request">
     <tool class="org.apache.velocity.tools.examples.showcase.tool.LayoutLinkTool"/>
@@ -39,4 +39,12 @@
     <tool key="number" format="#0.0"/>
     <tool key="xml" file="file.xml" safeMode="false"/>
   </toolbox>
+
+  <!-- xi:include tests -->
+  <!-- cbrisson: I'm a bit polluting the showcase example webapp with XInclude testcases
+       but those testcases have an example value in the source code as well
+  -->
+  <xi:include href="included/test-xinclude1.xml"/>
+  <xi:include href="included/test-xinclude2.xml" xpointer="element(/1/1)"/> <!-- xpointer() scheme is not supported by xerces -->
+  <data key="xinclude_3"><xi:include href="included/test-xinclude3.txt" parse="text"/></data>
 </tools>

Modified: velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/web.xml?rev=1835318&r1=1835317&r2=1835318&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/web.xml (original)
+++ velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/main/webapp/WEB-INF/web.xml Sat Jul  7 15:38:57 2018
@@ -23,29 +23,42 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3.0.xsd"
          version="3.0">
+  <!-- servlets -->
   <servlet>
     <servlet-name>velocity</servlet-name>
     <servlet-class>org.apache.velocity.tools.examples.showcase.ShowcaseLayoutServlet</servlet-class>
-    <init-param>
-      <param-name>org.apache.velocity.tools.loadDefaults</param-name>
-      <param-value>true</param-value>
-    </init-param>
-    <init-param>
-      <param-name>org.apache.velocity.tools.cleanConfiguration</param-name>
-      <param-value>true</param-value>
-    </init-param>
-    <init-param>
-      <param-name>org.apache.velocity.tools.userCanOverwriteTools</param-name>
-      <param-value>false</param-value>
-    </init-param>
   </servlet>
+  <servlet>
+    <servlet-name>velocity-standard</servlet-name>
+    <servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-class>
+  </servlet>
+  <!-- servlet mappings -->
+  <servlet-mapping>
+    <servlet-name>velocity-standard</servlet-name>
+    <url-pattern>nolayout/*</url-pattern>
+  </servlet-mapping>
   <servlet-mapping>
     <servlet-name>velocity</servlet-name>
     <url-pattern>*.vm</url-pattern>
   </servlet-mapping>
+  <!-- context params -->
+  <context-param>
+    <param-name>org.apache.velocity.tools.loadDefaults</param-name>
+    <param-value>true</param-value>
+  </context-param>
+  <context-param>
+    <param-name>org.apache.velocity.tools.cleanConfiguration</param-name>
+    <param-value>true</param-value>
+  </context-param>
+  <context-param>
+    <param-name>org.apache.velocity.tools.userCanOverwriteTools</param-name>
+    <param-value>false</param-value>
+  </context-param> 
+  <!-- welcome file -->
   <welcome-file-list>
     <welcome-file>index.vm</welcome-file>
   </welcome-file-list>
+  <!-- listeners -->
   <listener>
     <listener-class>org.apache.velocity.tools.examples.showcase.sample.SampleListInitializer</listener-class>
   </listener>

Modified: velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/test/java/org/apache/velocity/examples/showcase/ViewToolsIT.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/test/java/org/apache/velocity/examples/showcase/ViewToolsIT.java?rev=1835318&r1=1835317&r2=1835318&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/test/java/org/apache/velocity/examples/showcase/ViewToolsIT.java (original)
+++ velocity/tools/trunk/velocity-tools-examples/velocity-tools-examples-showcase/src/test/java/org/apache/velocity/examples/showcase/ViewToolsIT.java Sat Jul  7 15:38:57 2018
@@ -208,7 +208,7 @@ public class ViewToolsIT {
         checkTextStart(resp, "get(java.lang.Object)", "org.apache.velocity.tools.view.ViewContextTool");
 
         /* check keys (the only expected uppercase is in 'velocityCount') */
-        checkTextRegex(resp, "getKeys()", "^\\[[a-z_A-Z]+(?:,\\s*[a-z_A-Z]+)*\\]$");
+        checkTextRegex(resp, "getKeys()", "^\\[[a-z_A-Z][a-z_A-Z0-9]*(?:,\\s*[a-z_A-Z][a-z_A-Z0-9]*)*\\]$");
 
         /* check toolbox */
         checkTextRegex(resp,"getToolbox()","^\\{[a-z_A-Z]+=.*(?:,\\s*[a-z_A-Z]+=.*)*\\}$");
@@ -336,4 +336,11 @@ public class ViewToolsIT {
         checkText(resp, "foo", "bar");
     }
 
+    public @Test void testXInclude() throws Exception
+    {
+        WebConversation conv = new WebConversation();
+        WebRequest req = new GetMethodWebRequest(ROOT_URL+"nolayout/xinclude.txt");
+        WebResponse resp = conv.getResponse(req);
+        assertEquals("success success success", resp.getText().trim());
+    }
 }

Modified: velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/ConfigurationUtils.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/ConfigurationUtils.java?rev=1835318&r1=1835317&r2=1835318&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/ConfigurationUtils.java (original)
+++ velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/ConfigurationUtils.java Sat Jul  7 15:38:57 2018
@@ -331,30 +331,14 @@ public class ConfigurationUtils
         }
 
         // now, try to read the file
-        InputStream inputStream = null;
         try
         {
-            inputStream = url.openStream();
-            config.read(inputStream);
+            config.read(url);
         }
-        catch (IOException ioe)
+        catch (Exception e)
         {
             return null;
         }
-        finally
-        {
-            if (inputStream != null)
-            {
-                try
-                {
-                    inputStream.close();
-                }
-                catch (IOException ioe)
-                {
-                    throw new RuntimeException("Could not close input stream for "+path, ioe);
-                }
-            }
-        }
         return config;
     }
 

Modified: velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/FileFactoryConfiguration.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/FileFactoryConfiguration.java?rev=1835318&r1=1835317&r2=1835318&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/FileFactoryConfiguration.java (original)
+++ velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/FileFactoryConfiguration.java Sat Jul  7 15:38:57 2018
@@ -19,7 +19,6 @@ package org.apache.velocity.tools.config
  * under the License.
  */
 
-import java.io.InputStream;
 import java.io.IOException;
 import java.net.URL;
 
@@ -29,8 +28,7 @@ import org.apache.velocity.exception.Res
 import org.apache.velocity.tools.ConversionUtils;
 
 /**
- * Provides support for reading a configuration file from a specified path,
- * This frees the user from having to obtain an InputStream themselves.
+ * Provides support for reading a configuration file from a specified path.
  *
  * @author Nathan Bubna
  * @version $Id: XmlFactoryConfiguration.java 511959 2007-02-26 19:24:39Z nbubna $
@@ -43,11 +41,11 @@ public abstract class FileFactoryConfigu
     }
 
     /**
-     * <p>Reads an configuration from an {@link InputStream}.</p>
+     * <p>Reads an configuration from an {@link URL}.</p>
      * 
-     * @param input the InputStream to read from
+     * @param url the InputStream to read from
      */
-    public abstract void read(InputStream input) throws IOException;
+    protected abstract void readImpl(URL url) throws IOException;
 
     /**
      * <p>Reads a configuration file from the specified file path
@@ -115,7 +113,7 @@ public abstract class FileFactoryConfigu
     {
         try
         {
-            read(url, url.openStream(), required, log);
+            readImpl(url);
             // only add the sources which can be read
             addSource("    .read("+url.toString()+")");
         }
@@ -132,44 +130,4 @@ public abstract class FileFactoryConfigu
             }
         }
     }
-
-
-    protected void read(Object source, InputStream inputStream,
-                        boolean required, Logger log)
-    {
-        try
-        {
-            read(inputStream);
-        }
-        catch (IOException ioe)
-        {
-            String msg = "InputStream could not be read from: "+source;
-            if (log != null)
-            {
-                log.debug(msg, ioe);
-            }
-            if (required)
-            {
-                throw new RuntimeException(msg, ioe);
-            }
-        }
-        finally
-        {
-            try
-            {
-                if (inputStream != null)
-                {
-                    inputStream.close();
-                }
-            }
-            catch (IOException ioe)
-            {
-                if (log != null)
-                {
-                    log.error("Failed to close input stream for {}", source, ioe);
-                }
-            }
-        }
-    }
-
 }

Modified: velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/PropertiesFactoryConfiguration.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/PropertiesFactoryConfiguration.java?rev=1835318&r1=1835317&r2=1835318&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/PropertiesFactoryConfiguration.java (original)
+++ velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/PropertiesFactoryConfiguration.java Sat Jul  7 15:38:57 2018
@@ -21,6 +21,7 @@ package org.apache.velocity.tools.config
 
 import java.io.InputStream;
 import java.io.IOException;
+import java.net.URL;
 import java.util.Iterator;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.velocity.util.ExtProperties;
@@ -83,12 +84,12 @@ public class PropertiesFactoryConfigurat
      * <p>Reads an properties file from an {@link InputStream}
      * and uses it to configure this {@link FactoryConfiguration}.</p>
      * 
-     * @param input the InputStream to read from
+     * @param url the URL to read from
      */
-    public void read(InputStream input) throws IOException
+    protected void readImpl(URL url) throws IOException
     {
         ExtProperties props = new ExtProperties();
-        props.load(input);
+        props.load(url.openStream());
 
         // all factory settings should be prefixed with "tools"
         read(props.subset("tools"));

Modified: velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/XmlFactoryConfiguration.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/XmlFactoryConfiguration.java?rev=1835318&r1=1835317&r2=1835318&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/XmlFactoryConfiguration.java (original)
+++ velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/config/XmlFactoryConfiguration.java Sat Jul  7 15:38:57 2018
@@ -19,8 +19,8 @@ package org.apache.velocity.tools.config
  * under the License.
  */
 
-import java.io.InputStream;
 import java.io.IOException;
+import java.net.URL;
 import org.xml.sax.SAXException;
 import org.apache.commons.digester3.Digester;
 import org.apache.commons.digester3.RuleSet;
@@ -47,6 +47,11 @@ public class XmlFactoryConfiguration ext
 {
     private RuleSet ruleSet;
 
+    /**
+     * Creates an instance
+     *
+     * @see FactoryConfiguration#setSource(String)
+     */
     public XmlFactoryConfiguration()
     {
         this("");
@@ -54,7 +59,7 @@ public class XmlFactoryConfiguration ext
 
     /**
      * Creates an instance using the specified string
-     * as an identifier to distinguish this instance when debugging.
+     * as an identifier to distinguish this instance when debugging
      *
      * @param id the name of the "source" of this instance
      * @see FactoryConfiguration#setSource(String)
@@ -85,21 +90,23 @@ public class XmlFactoryConfiguration ext
 
 
     /**
-     * <p>Reads an XML document from an {@link InputStream}
+     * <p>Reads an XML document from an {@link URL}
      * and uses it to configure this {@link FactoryConfiguration}.</p>
      * 
-     * @param input the InputStream to read from
+     * @param url the URL to read from
      */
-    public void read(InputStream input) throws IOException
+    protected void readImpl(URL url) throws IOException
     {
         Digester digester = new Digester();
+        digester.setNamespaceAware(true);
+        digester.setXIncludeAware(true);
         digester.setValidating(false);
         digester.setUseContextClassLoader(true);
         digester.push(this);
         digester.addRuleSet(getRuleSet());
         try
         {
-            digester.parse(input);
+            digester.parse(url);
         }
         catch (SAXException saxe)
         {

Modified: velocity/tools/trunk/velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ServletUtils.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ServletUtils.java?rev=1835318&r1=1835317&r2=1835318&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ServletUtils.java (original)
+++ velocity/tools/trunk/velocity-tools-view/src/main/java/org/apache/velocity/tools/view/ServletUtils.java Sat Jul  7 15:38:57 2018
@@ -25,6 +25,8 @@ import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.io.IOException;
 import java.lang.reflect.Constructor;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import javax.servlet.FilterConfig;
@@ -297,11 +299,15 @@ public class ServletUtils
         return null;
     }
 
+    protected static boolean isWebappResource(String path)
+    {
+      return path != null && (path.startsWith("WEB-INF") || path.startsWith("/WEB-INF"));
+    }
+
     public static InputStream getInputStream(final String path, final ServletContext application)
     {
         InputStream inputStream = null;
-        boolean webappResource = path != null && (path.startsWith("WEB-INF") || path.startsWith("/WEB-INF"));
-        if (!webappResource)
+        if (!isWebappResource(path))
         {
             // search classpath except for WEB-INF/*
             inputStream = ClassUtils.getResourceAsStream(path, ServletUtils.class);
@@ -330,6 +336,48 @@ public class ServletUtils
         return inputStream;
     }
 
+    public static URL getURL(final String path, final ServletContext application)
+    {
+        URL url = null;
+        if (!isWebappResource(path))
+        {
+            // search classpath except for WEB-INF/*
+            url = ClassUtils.getResource(path, ServletUtils.class);
+        }
+        else
+        {
+            // then webapp only for WEB-INF/*
+            if (System.getSecurityManager() != null)
+            {
+                url = AccessController.doPrivileged(
+                    new PrivilegedAction<URL>()
+                    {
+                        @Override
+                        public URL run()
+                        {
+                            try
+                            {
+                                return application.getResource(path);
+                            }
+                            catch (MalformedURLException mue)
+                            {
+                                return null;
+                            }
+                        }
+                    });
+            }
+            else
+            {
+                try
+                {
+                    url = application.getResource(path);
+                }
+                catch (MalformedURLException mue) {}
+            }
+        }
+        return url;
+    }
+
     public static FactoryConfiguration getConfiguration(ServletContext application)
     {
         Object obj = application.getAttribute(CONFIGURATION_KEY);
@@ -348,11 +396,11 @@ public class ServletUtils
         return null;
     }
 
-    public static FactoryConfiguration getConfiguration(String path, ServletContext application)
+    public static FactoryConfiguration getConfiguration(final String path, final ServletContext application)
     {
         // first make sure we can even get such a file
-        InputStream inputStream = getInputStream(path, application);
-        if (inputStream == null)
+        URL url = getURL(path, application);
+        if (url == null)
         {
             return null;
         }
@@ -378,25 +426,11 @@ public class ServletUtils
         // now, try to read the file
         try
         {
-            config.read(inputStream);
+            config.read(url);
         }
-        catch (IOException ioe)
-        {
-            throw new RuntimeException("Failed to load configuration at: "+path, ioe);
-        }
-        finally
+        catch (Exception e)
         {
-            try
-            {
-                if (inputStream != null)
-                {
-                    inputStream.close();
-                }
-            }
-            catch (IOException ioe)
-            {
-                throw new RuntimeException("Failed to close input stream for "+path, ioe);
-            }
+            throw new RuntimeException("Failed to load configuration at: "+path, e);
         }
         return config;
     }

Modified: velocity/tools/trunk/velocity-tools-view/src/test/java/org/apache/velocity/tools/view/VelocityViewTest.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-view/src/test/java/org/apache/velocity/tools/view/VelocityViewTest.java?rev=1835318&r1=1835317&r2=1835318&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-view/src/test/java/org/apache/velocity/tools/view/VelocityViewTest.java (original)
+++ velocity/tools/trunk/velocity-tools-view/src/test/java/org/apache/velocity/tools/view/VelocityViewTest.java Sat Jul  7 15:38:57 2018
@@ -26,6 +26,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringWriter;
+import java.net.URL;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
@@ -114,7 +115,7 @@ public class VelocityViewTest
         expect(servletContext.getInitParameter(VelocityView.TOOLS_KEY)).andAnswer(eval((String)null));
         expect(config.getInitParameter(VelocityView.TOOLS_KEY)).andAnswer(eval((String)null));
         expect(servletContext.getAttribute(ServletUtils.CONFIGURATION_KEY)).andAnswer(eval((String)null));
-        expect(servletContext.getResourceAsStream(VelocityView.USER_TOOLS_PATH)).andAnswer(eval((InputStream)null));
+        expect(servletContext.getResource(VelocityView.USER_TOOLS_PATH)).andAnswer(eval((URL)null));
         expect(request.getAttribute("javax.servlet.include.servlet_path")).andAnswer(eval("/charset-test.vm"));
         expect(request.getAttribute("javax.servlet.include.path_info")).andAnswer(eval((String)null));