You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by an...@apache.org on 2005/08/20 21:08:52 UTC

svn commit: r234114 - in /cocoon: blocks/xsp/trunk/java/org/apache/cocoon/components/language/markup/xsp/java/xsp.xsl blocks/xsp/trunk/samples/java/escaping.xsp blocks/xsp/trunk/samples/samples.xml trunk/status.xml trunk/tools/src/blocks-build.xsl

Author: anathaniel
Date: Sat Aug 20 12:08:44 2005
New Revision: 234114

URL: http://svn.apache.org/viewcvs?rev=234114&view=rev
Log:
XSP block: Add xsp:expr and various other contexts where text must be
passed through XSLTExtension:escape in order to preserve non-ASCII
characters in Java string constants independently of the XSP source file
and compiler expected encodings.

Added:
    cocoon/blocks/xsp/trunk/samples/java/escaping.xsp   (with props)
Modified:
    cocoon/blocks/xsp/trunk/java/org/apache/cocoon/components/language/markup/xsp/java/xsp.xsl
    cocoon/blocks/xsp/trunk/samples/samples.xml
    cocoon/trunk/status.xml
    cocoon/trunk/tools/src/blocks-build.xsl

Modified: cocoon/blocks/xsp/trunk/java/org/apache/cocoon/components/language/markup/xsp/java/xsp.xsl
URL: http://svn.apache.org/viewcvs/cocoon/blocks/xsp/trunk/java/org/apache/cocoon/components/language/markup/xsp/java/xsp.xsl?rev=234114&r1=234113&r2=234114&view=diff
==============================================================================
--- cocoon/blocks/xsp/trunk/java/org/apache/cocoon/components/language/markup/xsp/java/xsp.xsl (original)
+++ cocoon/blocks/xsp/trunk/java/org/apache/cocoon/components/language/markup/xsp/java/xsp.xsl Sat Aug 20 12:08:44 2005
@@ -133,7 +133,7 @@
         public void generate() throws SAXException, IOException, ProcessingException {
             <!-- Do any user-defined necessary initializations -->
             <xsl:for-each select="xsp:init-page">
-              <xsl:copy-of select="."/>
+              <xsl:value-of select="XSLTExtension:escape($extension,.)"/>
             </xsl:for-each>
 
             this.contentHandler.startDocument();
@@ -151,7 +151,7 @@
 
             <!-- Do any user-defined necessary clean-ups -->
             <xsl:for-each select="xsp:exit-page">
-              <xsl:copy-of select="."/>
+              <xsl:value-of select="XSLTExtension:escape($extension,.)"/>
             </xsl:for-each>
         }
     }
@@ -356,9 +356,9 @@
         <xsl:if test="position() &gt; 1"> + </xsl:if>
         <xsl:choose>
           <xsl:when test="namespace-uri(.) = $xsp-uri and local-name(.) = 'expr'">
-            String.valueOf(<xsl:value-of select="."/>)
+            String.valueOf(<xsl:value-of select="XSLTExtension:escape($extension,.)"/>)
           </xsl:when>
-          <xsl:otherwise> "<xsl:value-of select="XSLTExtension:escape($extension,.)"/>" </xsl:otherwise>
+          <xsl:otherwise> "<xsl:value-of select="XSLTExtension:escapeJava($extension,.)"/>" </xsl:otherwise>
         </xsl:choose>
       </xsl:for-each>
       <xsl:if test="not(text()|xsp:expr|xsp:text)"> "" </xsl:if>
@@ -380,14 +380,14 @@
              Expression is nested inside another XSP tag:
              preserve its Java type
         -->
-        (<xsl:value-of select="."/>)
+        (<xsl:value-of select="XSLTExtension:escape($extension,.)"/>)
       </xsl:when>
       <xsl:when test="string-length(.) = 0">
         <!-- Do nothing -->
       </xsl:when>
       <xsl:otherwise>
         <!-- Output the value as elements or character data depending on its type -->
-        XSPObjectHelper.xspExpr(contentHandler, <xsl:value-of select="."/>);
+        XSPObjectHelper.xspExpr(contentHandler, <xsl:value-of select="XSLTExtension:escape($extension,.)"/>);
       </xsl:otherwise>
     </xsl:choose>
   </xsl:template>
@@ -489,7 +489,7 @@
       "<xsl:value-of select="local-name(.)"/>",
       "<xsl:value-of select="name(.)"/>",
       "CDATA",
-      "<xsl:value-of select="XSLTExtension:escape($extension,.)"/>"
+      "<xsl:value-of select="XSLTExtension:escapeJava($extension,.)"/>"
     );
     </xsl:if>
   </xsl:template>
@@ -509,12 +509,6 @@
         this.characters("<xsl:value-of select="XSLTExtension:escapeJava($extension, .)"/>");
       </xsl:otherwise>
     </xsl:choose>
-  </xsl:template>
-
-  <!-- FIXME: there seems to be no apply-templates with that mode,
-              i.e. can this template be removed? -->
-  <xsl:template match="text()" mode="value">
-    <xsl:value-of select="."/>
   </xsl:template>
 
   <xsl:template match="processing-instruction()">

Added: cocoon/blocks/xsp/trunk/samples/java/escaping.xsp
URL: http://svn.apache.org/viewcvs/cocoon/blocks/xsp/trunk/samples/java/escaping.xsp?rev=234114&view=auto
==============================================================================
--- cocoon/blocks/xsp/trunk/samples/java/escaping.xsp (added)
+++ cocoon/blocks/xsp/trunk/samples/java/escaping.xsp Sat Aug 20 12:08:44 2005
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Important to be encoding="iso-8859-1" -->
+<!--
+  Copyright 2005 The Apache Software Foundation
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<!-- SVN $Id$ -->
+
+<xsp:page
+  language="java"
+  xmlns:xsp-interpolation="http://apache.org/xsp/interpolation/1.0"
+  xmlns:xsp="http://apache.org/xsp">
+
+  <!-- 
+       Check that LATIN1 characters are properly propagated
+       by applying XSLTExtension:escape in xsp.xsl.
+       The string constant contain also a quote (") in order to
+       verify that XSLTExtension:escapeJava is used where required.
+   -->
+
+  <xsp:logic>
+    String logicHeader = "Héllô \"wörld\"! 1";
+  </xsp:logic>
+
+  <xsp:init-page>
+    String initPage = "Héllô \"wörld\"! 2";
+  </xsp:init-page>
+
+  <xsp:init-page>
+    String exprInit = <xsp:expr>"Héllô \"wörld\"! 3"</xsp:expr>;
+  </xsp:init-page>
+
+  <xsp:logic>
+    // Use static to check exit-page logic the second time the page is called.
+    static String exitPage = "Reload page please";
+    static String exprExit = "Reload page please";
+  </xsp:logic>
+  <xsp:exit-page>
+    exitPage = "Héllô \"wörld\"! 4";
+    exprExit = <xsp:expr>"Héllô \"wörld\"! 5"</xsp:expr>;
+  </xsp:exit-page>
+
+  <xsp:logicsheet location="logicsheets/interpolation.xsl"/>
+
+  <page>
+    <title>Escaping of non-ASCII characters</title>
+    <content>
+      <xsp:logic>
+        String logicContent = "Héllô \"wörld\"! 6";
+      </xsp:logic>
+
+      <xsp:logic>
+        String exprLogic = <xsp:expr>"Héllô \"wörld\"! 7"</xsp:expr>;
+      </xsp:logic>
+
+      <p>
+        For the various Java compilers which have been interfaced to Cocoon
+        there is no unified method to tell the compiler the encoding of the
+        Java source.
+        Some compilers always assume UTF-8, others deduce it from the
+        systems locale settings.
+      </p>
+
+      <p>
+        If there is a mismatch in the encodings, umlauts, accents,
+        and other international characters will be mutilated in the output.
+        In order to avoid this problem, XSP preprocesses all Java code and
+        converts all non-ASCII characters to their \u1234 equivalent.
+        Thus the Java compiler sees only ASCII characters, and the encoding
+        becomes irrelevant (at least for character sets such as ISO-8859-1
+        which coincide which ASCII in the lower 128 characters).
+      </p>
+
+      <p>
+        Older Cocoon versions omitted to do the \u1234 conversion in some of
+        the XSP contexts where Java string constants could be used.
+      </p>
+
+      <p>
+        In Cocoon 2.1.8 this is now fixed, as this test is supposed to show:
+      </p>
+      <table border="1">
+        <tr>
+          <th>Context</th>
+          <th>Result</th>
+        </tr>
+        <tr>
+          <td>xsp:page/xsp:logic</td>
+          <td><xsp:expr>logicHeader</xsp:expr></td>
+        </tr>
+        <tr>
+          <td>xsp:page/xsp:init-page</td>
+          <td><xsp:expr>initPage</xsp:expr></td>
+        </tr>
+        <tr>
+          <td>xsp:init-page/xsp:expr</td>
+          <td><xsp:expr>exprInit</xsp:expr></td>
+        </tr>
+        <tr>
+          <td>xsp:page/xsp:exit-page</td>
+          <td><xsp:expr>exitPage</xsp:expr></td>
+        </tr>
+        <tr>
+          <td>xsp:exit-page/xsp:expr</td>
+          <td><xsp:expr>exprExit</xsp:expr></td>
+        </tr>
+        <tr>
+          <td>xsp:logic</td>
+          <td><xsp:expr>logicContent</xsp:expr></td>
+        </tr>
+        <tr>
+          <td>xsp:logic/xsp:expr</td>
+          <td><xsp:expr>exprLogic</xsp:expr></td>
+        </tr>
+        <tr>
+          <td>xsp:content/xsp:expr</td>
+          <td><xsp:content><xsp:expr>"Héllô \"wörld\"! 8"</xsp:expr></xsp:content></td>
+        </tr>
+        <tr>
+          <td>xsp:expr</td>
+          <td><xsp:expr>"Héllô \"wörld\"! 9"</xsp:expr></td>
+        </tr>
+        <tr>
+          <td>text()</td>
+          <td>Héllô "wörld"! 10</td>
+        </tr>
+        <tr>
+          <td>attribute</td>
+          <td><img src=".gif" alt='Héllô "wörld"! 11'/></td>
+        </tr>
+        <tr>
+          <td>xsp:attribute/text()</td>
+          <td><img src=".gif"><xsp:attribute name="alt">Héllô "wörld"! 12</xsp:attribute></img></td>
+        </tr>
+        <tr>
+          <td>xsp:attribute/xsp:expr</td>
+          <td><img src=".gif"><xsp:attribute name="alt"><xsp:expr>"Héllô \"wörld\"! 13"</xsp:expr></xsp:attribute></img></td>
+        </tr>
+      </table>
+    </content>
+  </page>
+
+</xsp:page>

Propchange: cocoon/blocks/xsp/trunk/samples/java/escaping.xsp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/blocks/xsp/trunk/samples/java/escaping.xsp
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: cocoon/blocks/xsp/trunk/samples/samples.xml
URL: http://svn.apache.org/viewcvs/cocoon/blocks/xsp/trunk/samples/samples.xml?rev=234114&r1=234113&r2=234114&view=diff
==============================================================================
--- cocoon/blocks/xsp/trunk/samples/samples.xml (original)
+++ cocoon/blocks/xsp/trunk/samples/samples.xml Sat Aug 20 12:08:44 2005
@@ -67,6 +67,9 @@
    <sample name="Util" href="java/resolver" xlink:role="dynamic">
     Util logicsheet tests.
    </sample>
+   <sample name="Escaping" href="java/escaping" xlink:role="dynamic">
+    Escaping of non-ASCII characters.
+   </sample>
   </group>
 
   <group name="eXtensible Server Pages in Javascript">

Modified: cocoon/trunk/status.xml
URL: http://svn.apache.org/viewcvs/cocoon/trunk/status.xml?rev=234114&r1=234113&r2=234114&view=diff
==============================================================================
--- cocoon/trunk/status.xml (original)
+++ cocoon/trunk/status.xml Sat Aug 20 12:08:44 2005
@@ -197,6 +197,12 @@
 
   <changes>
   <release version="@version@" date="@date@">
+    <action dev="AN" type="fix">
+      XSP block: Add xsp:expr and various other contexts where text must be
+      passed through XSLTExtension:escape in order to preserve non-ASCII
+      characters in Java string constants independently of the XSP source file
+      and compiler expected encodings.
+    </action>
     <action dev="AN" type="add">
       XSP block: Extend {#expr} interpolation parser to understand {}, "}", '}'
       as not being the closing brace.

Modified: cocoon/trunk/tools/src/blocks-build.xsl
URL: http://svn.apache.org/viewcvs/cocoon/trunk/tools/src/blocks-build.xsl?rev=234114&r1=234113&r2=234114&view=diff
==============================================================================
--- cocoon/trunk/tools/src/blocks-build.xsl (original)
+++ cocoon/trunk/tools/src/blocks-build.xsl Sat Aug 20 12:08:44 2005
@@ -316,7 +316,18 @@
           <if>
             <available file="@{{dir}}/samples/sitemap.xmap"/>
             <then>
-              <copy filtering="on" todir="${{build.webapp}}/samples/blocks/@{{name}}">
+              <!-- Important to use here encoding="iso-8859-1" to avoid
+                   mutilating LATIN-1 characters in the copy operation.
+                   If these were read assuming UTF-8 encoding, umlauts
+                   are invalid byte sequences and get replaced by '?'.
+              
+                   On the other hand, reading UTF-8 files using LATIN-1
+                   encoding is not a problem in this context since every
+                   UTF-8 byte sequence maps to one or more LATIN-1 characters.
+                   We only need to assume that the tokens to be replaced
+                   by the filtering option are written in ASCII only.
+               -->
+              <copy filtering="on" todir="${{build.webapp}}/samples/blocks/@{{name}}" encoding="iso-8859-1">
                 <fileset dir="@{{dir}}/samples">
                   <exclude name="**/*.gif"/>
                   <exclude name="**/*.jpg"/>