Author: gvanmatre
Date: Sun Sep  4 09:05:48 2005
New Revision: 278606

URL: http://svn.apache.org/viewcvs?rev=278606&view=rev
Log:
Bug#:  35839  [shale] Clay processes components inside HTML comments

Modified:
    
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/AttributeTokenizer.java
    
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Parser.java
    
struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java

Modified: 
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/AttributeTokenizer.java
URL: 
http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/AttributeTokenizer.java?rev=278606&r1=278605&r2=278606&view=diff
==============================================================================
--- 
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/AttributeTokenizer.java
 (original)
+++ 
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/AttributeTokenizer.java
 Sun Sep  4 09:05:48 2005
@@ -264,10 +264,11 @@
             }
             
             // looks for the key value delimiter
-            TokenOffset key = nextToken(currOffset, "=", " ");
+            TokenOffset key = nextToken(currOffset, " ", "=", true);
             if (key == null)
                 break;
             
+            boolean skipValue = false;
             currOffset++;     
             String delim = " "; // old school html color=red
             String otherDelim = "\"";
@@ -276,9 +277,15 @@
                 delim = "\"";
                 otherDelim = " ";
                 currOffset++;
+            } else if (currOffset < buffer.length() && currOffset > 0 &&       
  
+                    buffer.charAt(currOffset - 1) == ' ') { //attribute 
without value   
+                currOffset--;        //back up <option selected value=
+                skipValue = true;
             }
  
-            TokenOffset value = nextToken(currOffset, delim, otherDelim);
+            TokenOffset value = null;
+            if (!skipValue)   // no value part <option selected value=xxx>
+               value = nextToken(currOffset, delim, otherDelim, false);
             
             tokenIndex.add(new AttributeEntry(key, value));
             
@@ -300,18 +307,35 @@
      * <code>endDelim</code>.
      * </p>
      */
-    protected TokenOffset nextToken(int startOffset, String endDelim, String 
otherDelim) {
-        // look for the value delimiter or the end of the parse fragment,
-        // whichever comes first
-        currOffset = Math.min(buffer.indexOf(endDelim, startOffset), 
endOffset);
-        // try another delimiter
-        if (currOffset == -1) 
-            currOffset = Math.min(buffer.indexOf(otherDelim, startOffset), 
endOffset);
+    protected TokenOffset nextToken(int startOffset, String endDelim, String 
otherDelim, boolean isKey) {
+        //If isKey is true, we are looking for an attribute name with a 
endDelim or otherDelim.
+        //Pick the one that comes first.
+        
+        //If isKey is false we are looking for an attribute value.  The 
endDelim is the best guess
+        //and the otherDelim is the next best guess.
+        if (isKey) {
+            int offsetEnd = Math.min(buffer.indexOf(endDelim, startOffset), 
endOffset);
+            int offsetOther = Math.min(buffer.indexOf(otherDelim, 
startOffset), endOffset);
+            if (offsetEnd == -1)
+               currOffset = offsetOther;
+            else if (offsetOther == -1) 
+               currOffset = offsetOther;
+            else
+               currOffset = Math.min(offsetEnd, offsetOther);
+        } else {
+           currOffset = Math.min(buffer.indexOf(endDelim, startOffset), 
endOffset);
+           // try another delimiter
+           if (currOffset == -1) 
+              currOffset = Math.min(buffer.indexOf(otherDelim, startOffset), 
endOffset);
+        }
+        
         
         if (currOffset == -1) {
             currOffset = endOffset;
         }
-        
+
+        // look for the value delimiter or the end of the parse fragment,
+        // whichever comes first        
         if (currOffset > -1 && currOffset <= endOffset && startOffset < 
currOffset) {
             
             int e = currOffset;

Modified: 
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Parser.java
URL: 
http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Parser.java?rev=278606&r1=278605&r2=278606&view=diff
==============================================================================
--- 
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Parser.java
 (original)
+++ 
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Parser.java
 Sun Sep  4 09:05:48 2005
@@ -269,6 +269,9 @@
                             node.setWellFormed(true);
                             break trash;
                         } else {
+                            //force all nodes to be comment within a comment
+                            node.setComment(true);
+                            node.setWellFormed(true);
                             node.addChild(bodyNode);
                         }                        
                     } // end while
@@ -434,6 +437,7 @@
                 
         return node;
     }
+
     
     /**
      * <p>Declare an array of [EMAIL PROTECTED] Rule}s that validate an ending 
[EMAIL PROTECTED] Token}.</p>
@@ -491,6 +495,16 @@
         new Rule('%', true, 1, false),
         new Rule('>', false, -1, true)};
     
+    
+    /**
+     * <p>Declare an array of [EMAIL PROTECTED] Rule}s that validate JSP block 
[EMAIL PROTECTED] Token}.</p>
+     */    
+    private static Rule[] JSP_RULES = {new Rule('<', true, 0, true),
+        new Rule('%', true, 1, true),
+        new Rule('>', false, -1, true),
+        new Rule('%', false, -2, true)};
+
+    
     /**
      * <p>Declare an array of [EMAIL PROTECTED] Shape}s further defined by 
[EMAIL PROTECTED] Rule}s that 
      * are used to determine the type of [EMAIL PROTECTED] Node} the [EMAIL 
PROTECTED] Token} defines.</p>
@@ -502,7 +516,8 @@
         new Shape(true, false, true, BEGIN_COMMENT_TAG_RULES),
         new Shape(false, true, true, END_COMMENT_TAG_RULES),
         new Shape(true, true, true, DOCTYPE_TAG_RULES),
-        new Shape(true, false, false, BEGIN_TAG_RULES)};
+        new Shape(true, false, false, BEGIN_TAG_RULES),
+        new Shape(true, true, true, JSP_RULES)};
     
     
     /**

Modified: 
struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java
URL: 
http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java?rev=278606&r1=278605&r2=278606&view=diff
==============================================================================
--- 
struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java
 (original)
+++ 
struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java
 Sun Sep  4 09:05:48 2005
@@ -153,6 +153,17 @@
         node = (Node) nodes1.get(0);
         assertTrue("node is a valid comment", node.isComment());
 
+        
+        // truncate the buffer
+        doc1.setLength(0);
+        doc1.append("<!--- </ -->");
+        
+        nodes1 = p.parse(doc1);
+        assertTrue("one root node", nodes1.size() == 1);
+        
+        node = (Node) nodes1.get(0);
+        assertTrue("node is a valid comment", node.isComment());
+        
     }
 
     /**
@@ -447,13 +458,13 @@
         Node node = (Node) nodes.get(0);
 
         String value = (String) node.getAttributes().get("type");
-        assertTrue("Attribute test type=text", value.equals("text"));
+        assertEquals("Attribute type", value, "text");
         
         value = (String) node.getAttributes().get("size");
-        assertTrue("Attribute test size=10", value.equals("10"));
+        assertEquals("Attribute size", value, "10");
         
         value = (String) node.getAttributes().get("name");
-        assertTrue("Attribute test name=date", value.equals("date"));
+        assertEquals("Attribute name", value, "date");
         
         //test bogus attribute with missing delimiter
         doc.setLength(0);
@@ -465,13 +476,13 @@
         node = (Node) nodes.get(0);
 
         value = (String) node.getAttributes().get("type");
-        assertTrue("Attribute test type=text", value.equals("text"));
+        assertEquals("Attribute type", value, "text");
 
         value = (String) node.getAttributes().get("size");
-        assertTrue("Attribute test size=10", value.equals("10"));
+        assertEquals("Attribute size", value, "10");
 
         value = (String) node.getAttributes().get("name");
-        assertTrue("Attribute test name=date", value.equals("date"));
+        assertEquals("Attribute name", value, "date");
 
       
         //test bogus attribute with missing delimiter
@@ -484,32 +495,43 @@
         node = (Node) nodes.get(0);
 
         value = (String) node.getAttributes().get("type");
-        assertTrue("Attribute test type=radio", value.equals("radio"));
+        assertEquals("Attribute type", value, "radio");
 
         value = (String) node.getAttributes().get("name");
-        assertTrue("Attribute test name=date", value.equals("date"));
+        assertEquals("Attribute name", value, "date");
         
+        assertTrue("Attribute checked exists", 
node.getAttributes().containsKey("checked"));
         value = (String) node.getAttributes().get("checked");
-        assertTrue("Attribute checked=null", value == null);
+        assertNull("Attribute checked", value);
 
 
         doc.setLength(0);
-        doc.append("<option value=\"\"/>");
+        doc.append("<option selected value=\"\"/>");
 
         nodes = p.parse(doc);
         assertTrue("1 root node", nodes.size() == 1);
         
         node = (Node) nodes.get(0);
 
+        assertTrue("Attribute selected exists", 
node.getAttributes().containsKey("selected"));
+        value = (String) node.getAttributes().get("selected");
+        assertNull("Attribute selected", value);
+        
+        assertTrue("Attribute selected exists", 
node.getAttributes().containsKey("value"));
         value = (String) node.getAttributes().get("value");
-        assertTrue("Attribute value=null", value == null);
+        assertNull("Attribute value", value);
  
     }
     
     public void testJSPTag() {
         Parser p = new Parser();
         StringBuffer doc = new StringBuffer();
-        doc.append("<table>")
+        
+        doc.append("<%@ taglib uri=\"/tags/struts-html\" prefix=\"html\" %>")
+           .append("<%@ taglib uri=\"/tags/struts-bean\" prefix=\"bean\" %>")
+           .append("<%@ page language=\"java\" contentType=\"text/html; 
charset=ISO-8859-1\" session=\"true\" %>")
+           .append("<%@ page errorPage=\"../error.jsp\" %>")
+           .append("<table>")
            .append("<tr><td>")
            .append("<bean:message key=\"msg.username\"/><td><html:text 
property=\"userName\" size=\"10\" maxlength=\"10\"/>")
            .append("<tr><td>")
@@ -517,9 +539,9 @@
            .append("</table>");
         
         List nodes = p.parse(doc);
-        assertTrue("Well-formed JSP, 1 root node", nodes.size() == 1);
+        assertTrue("Well-formed JSP, 5 root node", nodes.size() == 5);
         
-        Node root = (Node) nodes.get(0);
+        Node root = (Node) nodes.get(4);
         assertNotNull("table node not null", root);
 
         Node tr = (Node) root.getChildren().get(0);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to