You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2007/12/13 21:32:06 UTC

svn commit: r604019 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry/internal/services/ main/resources/org/apache/tapestry/internal/services/ site/apt/guide/ test/java/org/apache/tapestry/internal/services/ test/resources...

Author: hlship
Date: Thu Dec 13 12:32:04 2007
New Revision: 604019

URL: http://svn.apache.org/viewvc?rev=604019&view=rev
Log:
TAPESTRY-1975: Template parser is insufficiently picky about component ids

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry/internal/services/invalid_block_id.tml
    tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry/internal/services/invalid_component_id.tml
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ServicesMessages.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/TemplateParserImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/internal/services/ServicesStrings.properties
    tapestry/tapestry5/trunk/tapestry-core/src/site/apt/guide/templates.apt
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/TemplateParserImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ServicesMessages.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ServicesMessages.java?rev=604019&r1=604018&r2=604019&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ServicesMessages.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ServicesMessages.java Thu Dec 13 12:32:04 2007
@@ -385,4 +385,9 @@
     {
         return MESSAGES.format("base-class-in-wrong-package", parentClassName, className, suggestedPackage);
     }
+
+    static String invalidId(String messageKey, String idValue)
+    {
+        return MESSAGES.format(messageKey, idValue);
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/TemplateParserImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/TemplateParserImpl.java?rev=604019&r1=604018&r2=604019&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/TemplateParserImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/TemplateParserImpl.java Thu Dec 13 12:32:04 2007
@@ -52,6 +52,10 @@
 
     public static final String TAPESTRY_SCHEMA_5_0_0 = "http://tapestry.apache.org/schema/tapestry_5_0_0.xsd";
 
+    private static final String ID_REGEXP = "^[a-z]([a-z]|[0-9]|_)*$";
+
+    private static final Pattern ID_PATTERN = Pattern.compile(ID_REGEXP, Pattern.CASE_INSENSITIVE);
+
     private XMLReader _reader;
 
     // Resource being parsed
@@ -287,8 +291,6 @@
             return;
         }
 
-        // TODO: Handle interpolations inside attributes?
-
         startPossibleComponent(attributes, localName, null);
     }
 
@@ -360,6 +362,8 @@
     {
         String blockId = findSingleParameter("block", "id", attributes);
 
+        validateId(blockId, "invalid-block-id");
+
         // null is ok for blockId
 
         _tokens.add(new BlockToken(blockId, getCurrentLocation()));
@@ -438,6 +442,9 @@
                 if (name.equalsIgnoreCase(ID_ATTRIBUTE_NAME))
                 {
                     id = nullForBlank(value);
+
+                    validateId(id, "invalid-component-id");
+
                     continue;
                 }
 
@@ -484,6 +491,17 @@
         // elements?
 
         _endTagHandlerStack.push(_addEndElementToken);
+    }
+
+    private void validateId(String id, String messageKey)
+    {
+        if (id == null) return;
+
+        if (ID_PATTERN.matcher(id).matches()) return;
+
+        // Not a match.
+
+        throw new TapestryException(ServicesMessages.invalidId(messageKey, id), getCurrentLocation(), null);
     }
 
     private void startBody()

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/internal/services/ServicesStrings.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/internal/services/ServicesStrings.properties?rev=604019&r1=604018&r2=604019&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/internal/services/ServicesStrings.properties (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry/internal/services/ServicesStrings.properties Thu Dec 13 12:32:04 2007
@@ -85,4 +85,5 @@
 no-markup-from-page-render=Page %s did not generate any markup when rendered. This could be because its template file could not be located, or because a \
   render phase method in the page prevented rendering.
 base-class-in-wrong-package=Base class %s (super class of %s) is not in a controlled package and is therefore not valid. You should try moving the class to package %s.
-
+invalid-component-id=Component id '%s' is not valid; component ids must be valid Java identifiers: start with a letter, and consist of letters, numbers and underscores.
+invalid-block-id=Block id '%s' is not valid; block ids must be valid Java identifiers: start with a letter, and consist of letters, numbers and underscores. 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/site/apt/guide/templates.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/site/apt/guide/templates.apt?rev=604019&r1=604018&r2=604019&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/site/apt/guide/templates.apt (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/site/apt/guide/templates.apt Thu Dec 13 12:32:04 2007
@@ -185,7 +185,11 @@
   
   A block may be anonymous, or it may have an id (specified with the id attribute).  Non-anonymous blocks may be 
   {{{inject.html}injected}} into the component.
-  
+
+  Ids must be valid Java identifiers: start with a letter, and contain only letters, numbers and underscores.
+
+  Note that the id parameter is <not> placed in the Tapestry namespace (since the element always <is> in the Tapestry namespace).
+
 * \<parameter\>
 
   A \<parameter\> element is a special kind of block.  It is placed inside the body of an embedded component.  The block defined by the
@@ -259,7 +263,8 @@
   These attributes are specified inside the t: namespace (i.e., <<<t:id="clear">>>).
   
   If the id attribute is ommitted, Tapestry will assign a unique id for the element.
-  
+
+  Ids must be valid Java identifiers: start with a letter, and contain only letters, numbers and underscores.
   
   Any other attributes are used to {{{parameters.html}bind parameters of the component}}. These may be formal parameters
   or informal parameters.  Formal parameters will have a default binding prefix (usually "prop:").  Informal parameters

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/TemplateParserImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/TemplateParserImplTest.java?rev=604019&r1=604018&r2=604019&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/TemplateParserImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/TemplateParserImplTest.java Thu Dec 13 12:32:04 2007
@@ -174,14 +174,14 @@
     /**
      * Test disabled when not online.
      */
-    @Test(enabled = false)
+    @Test(enabled = true)
     public void html_entity()
     {
         List<TemplateToken> tokens = tokens("html_entity.tml");
 
-        assertEquals(tokens.size(), 3);
+        assertEquals(tokens.size(), 4);
 
-        TextToken t = get(tokens, 1);
+        TextToken t = get(tokens, 2);
 
         // HTML entities are parsed into values that will ultimately
         // be output as numeric entities. This is less than ideal; would like
@@ -645,4 +645,31 @@
         assertEquals(t2.getSystemId(), systemId);
     }
 
+    @Test
+    public void invalid_component_id() throws Exception
+    {
+        try
+        {
+            parse("invalid_component_id.tml");
+            unreachable();
+        }
+        catch (RuntimeException ex)
+        {
+            assertMessageContains(ex, "Component id 'not-valid' is not valid");
+        }
+    }
+
+    @Test
+    public void invalid_block_id() throws Exception
+    {
+        try
+        {
+            parse("invalid_block_id.tml");
+            unreachable();
+        }
+        catch (RuntimeException ex)
+        {
+            assertMessageContains(ex, "Block id 'not-valid' is not valid");
+        }
+    }
 }

Added: tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry/internal/services/invalid_block_id.tml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry/internal/services/invalid_block_id.tml?rev=604019&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry/internal/services/invalid_block_id.tml (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry/internal/services/invalid_block_id.tml Thu Dec 13 12:32:04 2007
@@ -0,0 +1,3 @@
+<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
+    <t:block id="not-valid"/>
+</html>

Added: tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry/internal/services/invalid_component_id.tml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry/internal/services/invalid_component_id.tml?rev=604019&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry/internal/services/invalid_component_id.tml (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry/internal/services/invalid_component_id.tml Thu Dec 13 12:32:04 2007
@@ -0,0 +1,3 @@
+<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
+    <t:foo t:id="not-valid"/>
+</html>