You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by gv...@apache.org on 2005/09/04 02:15:06 UTC
svn commit: r267521 - in /struts/shale/trunk/clay-plugin/src:
java/org/apache/shale/clay/parser/AttributeTokenizer.java
java/org/apache/shale/clay/parser/Node.java
test/org/apache/shale/clay/parser/ParserTestCase.java
Author: gvanmatre
Date: Sat Sep 3 17:14:51 2005
New Revision: 267521
URL: http://svn.apache.org/viewcvs?rev=267521&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/Node.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=267521&r1=267520&r2=267521&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 Sat Sep 3 17:14:51 2005
@@ -264,19 +264,21 @@
}
// looks for the key value delimiter
- TokenOffset key = nextToken(currOffset, "=");
+ TokenOffset key = nextToken(currOffset, "=", " ");
if (key == null)
break;
- currOffset++;
+ currOffset++;
String delim = " "; // old school html color=red
- if (buffer.charAt(currOffset) == '"') { // xmlish attribute
- // delimiter
+ String otherDelim = "\"";
+ if (currOffset < buffer.length() &&
+ buffer.charAt(currOffset) == '"') { // xmlish attribute
delim = "\"";
+ otherDelim = " ";
currOffset++;
}
-
- TokenOffset value = nextToken(currOffset, delim);
+
+ TokenOffset value = nextToken(currOffset, delim, otherDelim);
tokenIndex.add(new AttributeEntry(key, value));
@@ -298,23 +300,32 @@
* <code>endDelim</code>.
* </p>
*/
- protected TokenOffset nextToken(int startOffset, String endDelim) {
+ 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);
- // old school html <form name=old>
- if ((currOffset == -1) && (endDelim.equals(" "))) {
+ // try another delimiter
+ if (currOffset == -1)
+ currOffset = Math.min(buffer.indexOf(otherDelim, startOffset), endOffset);
+
+ if (currOffset == -1) {
currOffset = endOffset;
}
- if (currOffset > -1 && currOffset <= endOffset) {
+ if (currOffset > -1 && currOffset <= endOffset && startOffset < currOffset) {
+
+ int e = currOffset;
+ //forgive an attribute with Inconsistent delimiters, color=red"
+ if (buffer.charAt(e - 1) == '"')
+ --e;
+
- TokenOffset value = new TokenOffset(startOffset, currOffset);
+ TokenOffset value = new TokenOffset(startOffset, e);
if (log.isDebugEnabled()) {
log.debug(messages.getMessage("attribute.token.range",
new Object[] { new Integer(startOffset),
- new Integer(currOffset) }));
+ new Integer(e) }));
}
return value;
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Node.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Node.java?rev=267521&r1=267520&r2=267521&view=diff
==============================================================================
--- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Node.java (original)
+++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Node.java Sat Sep 3 17:14:51 2005
@@ -235,8 +235,9 @@
public String toString() {
StringBuffer buff = new StringBuffer();
buff.append("name=").append(name).append(" isStart=\"").append(isStart)
- .append(" isEnd=\"").append(isEnd).append(" isWellFormed=\"")
- .append(isWellFormed).append("\n").append(token).append("\n").append(attributes);
+ .append(" isEnd=\"").append(isEnd).append(" isWellFormed=")
+ .append(isWellFormed).append(" isComment=").append(isComment)
+ .append("\n").append(token).append("\n").append(attributes);
return buff.toString();
}
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=267521&r1=267520&r2=267521&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 Sat Sep 3 17:14:51 2005
@@ -120,8 +120,39 @@
node = (Node) nodes1.get(0);
assertTrue("node is a valid comment", node.isComment());
+
+ // truncate the buffer
+ doc1.setLength(0);
+ doc1.append("<!-- <a attr=\"> -->");
+ nodes1 = p.parse(doc1);
+ assertTrue("one root node", nodes1.size() == 1);
+
+ node = (Node) nodes1.get(0);
+ assertTrue("node is a valid comment", node.isComment());
+
+ // truncate the buffer
+ doc1.setLength(0);
+ doc1.append("<!-- <a attr=\" size=4 class=\"test\"> -->");
+
+ nodes1 = p.parse(doc1);
+ assertTrue("one root node", nodes1.size() == 1);
+
+ node = (Node) nodes1.get(0);
+ assertTrue("node is a valid comment", node.isComment());
+
+
+ // truncate the buffer
+ doc1.setLength(0);
+ doc1.append("<!-- <a attr=> -->");
+
+ nodes1 = p.parse(doc1);
+ assertTrue("one root node", nodes1.size() == 1);
+
+ node = (Node) nodes1.get(0);
+ assertTrue("node is a valid comment", node.isComment());
+
}
/**
@@ -400,6 +431,122 @@
}
}
+ }
+
+ /**
+ * <p>Test attribute parsing.</p>
+ */
+ public void testAttributes() {
+ Parser p = new Parser();
+ StringBuffer doc = new StringBuffer();
+ doc.append("<input type=text size=\"10\" name=date>");
+
+ List nodes = p.parse(doc);
+ assertTrue("1 root node", nodes.size() == 1);
+
+ Node node = (Node) nodes.get(0);
+
+ String value = (String) node.getAttributes().get("type");
+ assertTrue("Attribute test type=text", value.equals("text"));
+
+ value = (String) node.getAttributes().get("size");
+ assertTrue("Attribute test size=10", value.equals("10"));
+
+ value = (String) node.getAttributes().get("name");
+ assertTrue("Attribute test name=date", value.equals("date"));
+
+ //test bogus attribute with missing delimiter
+ doc.setLength(0);
+ doc.append("<input type=text size=\"10 name=date>");
+
+ nodes = p.parse(doc);
+ assertTrue("1 root node", nodes.size() == 1);
+
+ node = (Node) nodes.get(0);
+
+ value = (String) node.getAttributes().get("type");
+ assertTrue("Attribute test type=text", value.equals("text"));
+
+ value = (String) node.getAttributes().get("size");
+ assertTrue("Attribute test size=10", value.equals("10"));
+
+ value = (String) node.getAttributes().get("name");
+ assertTrue("Attribute test name=date", value.equals("date"));
+
+
+ //test bogus attribute with missing delimiter
+ doc.setLength(0);
+ doc.append("<input type=radio\" name=date checked>");
+
+ nodes = p.parse(doc);
+ assertTrue("1 root node", nodes.size() == 1);
+
+ node = (Node) nodes.get(0);
+
+ value = (String) node.getAttributes().get("type");
+ assertTrue("Attribute test type=radio", value.equals("radio"));
+
+ value = (String) node.getAttributes().get("name");
+ assertTrue("Attribute test name=date", value.equals("date"));
+
+ value = (String) node.getAttributes().get("checked");
+ assertTrue("Attribute checked=null", value == null);
+
+
+ doc.setLength(0);
+ doc.append("<option value=\"\"/>");
+
+ nodes = p.parse(doc);
+ assertTrue("1 root node", nodes.size() == 1);
+
+ node = (Node) nodes.get(0);
+
+ value = (String) node.getAttributes().get("value");
+ assertTrue("Attribute value=null", value == null);
+
+ }
+
+ public void testJSPTag() {
+ Parser p = new Parser();
+ StringBuffer doc = new StringBuffer();
+ doc.append("<table>")
+ .append("<tr><td>")
+ .append("<bean:message key=\"msg.username\"/><td><html:text property=\"userName\" size=\"10\" maxlength=\"10\"/>")
+ .append("<tr><td>")
+ .append("<bean:message key=\"msg.password\"/><td><html:text property=\"password\" size=\"10\" maxlength=10/><br>")
+ .append("</table>");
+
+ List nodes = p.parse(doc);
+ assertTrue("Well-formed JSP, 1 root node", nodes.size() == 1);
+
+ Node root = (Node) nodes.get(0);
+ assertNotNull("table node not null", root);
+
+ Node tr = (Node) root.getChildren().get(0);
+ assertNotNull("tr node not null", tr);
+
+ Node td = (Node) tr.getChildren().get(0);
+ assertNotNull("td node not null", td);
+
+ Node message = (Node) td.getChildren().get(0);
+ assertNotNull("bean:message node not null", message);
+
+ assertEquals("node.name", message.getName(), "message");
+ assertEquals("node.qname", message.getQname(), "bean");
+ assertEquals("node.attributes.key", message.getAttributes().get("key"), "msg.username");
+
+ td = (Node) tr.getChildren().get(1);
+ assertNotNull("td node not null", td);
+
+ Node text = (Node) td.getChildren().get(0);
+ assertNotNull("bean:message node not null", text);
+
+ assertEquals("node.name", text.getName(), "text");
+ assertEquals("node.qname", text.getQname(), "html");
+ assertEquals("node.attributes.property", text.getAttributes().get("property"), "userName");
+ assertEquals("node.attributes.size", text.getAttributes().get("size"), "10");
+ assertEquals("node.attributes.maxlength", text.getAttributes().get("maxlength"), "10");
+
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org