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]