You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2011/03/09 06:35:31 UTC

svn commit: r1079669 - in /wicket/branches/wicket-1.4.x/wicket/src: main/java/org/apache/wicket/markup/MarkupParser.java test/java/org/apache/wicket/markup/MarkupParserTest.java

Author: ivaynberg
Date: Wed Mar  9 05:35:31 2011
New Revision: 1079669

URL: http://svn.apache.org/viewvc?rev=1079669&view=rev
Log:
fix for markup parser comments problem
Issue: WICKET-3500

Modified:
    wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/MarkupParser.java
    wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/MarkupParserTest.java

Modified: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/MarkupParser.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/MarkupParser.java?rev=1079669&r1=1079668&r2=1079669&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/MarkupParser.java (original)
+++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/MarkupParser.java Wed Mar  9 05:35:31 2011
@@ -65,8 +65,8 @@ public class MarkupParser
 	/** Log for reporting. */
 	private static final Logger log = LoggerFactory.getLogger(MarkupParser.class);
 
-	/** Conditional comment section, which is NOT treated as a comment section */
-	private static final Pattern CONDITIONAL_COMMENT = Pattern.compile("\\[if .+\\]>((?s).*)<!\\[endif\\]");
+	/** Opening a conditional comment section, which is NOT treated as a comment section */
+	public static final Pattern CONDITIONAL_COMMENT_OPENING = Pattern.compile("(s?)^[^>]*?<!--\\[if.*?\\]>(-->)?(<!.*?-->)?");
 
 	/** The XML parser to use */
 	private final IXmlPullParser xmlParser;
@@ -480,39 +480,27 @@ public class MarkupParser
 	 * @param rawMarkup
 	 * @return raw markup
 	 */
-	private String removeComment(String rawMarkup)
+	private static String removeComment(String rawMarkup)
 	{
-		// For reasons I don't understand, the following regex <code>"<!--(.|\n|\r)*?-->"<code>
-		// causes a stack overflow in some circumstances (jdk 1.5)
-		// See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5050507
-		// See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6337993
 		int pos1 = rawMarkup.indexOf("<!--");
 		while (pos1 != -1)
 		{
-			int pos2 = rawMarkup.indexOf("-->", pos1 + 4);
-
 			final StringBuilder buf = new StringBuilder(rawMarkup.length());
-			if (pos2 != -1)
+			final String possibleComment = rawMarkup.substring(pos1);
+			Matcher matcher = CONDITIONAL_COMMENT_OPENING.matcher(possibleComment);
+			if (matcher.find())
 			{
-				final String comment = rawMarkup.substring(pos1 + 4, pos2);
-
-				// See wicket-2105 for an example where this rather simple regex throws an exception
-				// CONDITIONAL_COMMENT = Pattern.compile("\\[if .+\\]>(.|\n|\r)*<!\\[endif\\]");
-				// See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5050507
-				// See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6337993
-				if (CONDITIONAL_COMMENT.matcher(comment).matches() == false)
-				{
-					buf.append(rawMarkup.substring(0, pos1));
-					if (rawMarkup.length() >= pos2 + 3)
-					{
-						buf.append(rawMarkup.substring(pos2 + 3));
-					}
-					rawMarkup = buf.toString();
-				}
-				else
+				pos1 = pos1 + matcher.end();
+			}
+			else
+			{
+				int pos2 = rawMarkup.indexOf("-->", pos1 + 4);
+				buf.append(rawMarkup.substring(0, pos1));
+				if (rawMarkup.length() >= pos2 + 3)
 				{
-					pos1 = pos2;
+					buf.append(rawMarkup.substring(pos2 + 3));
 				}
+				rawMarkup = buf.toString();
 			}
 			pos1 = rawMarkup.indexOf("<!--", pos1);
 		}

Modified: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/MarkupParserTest.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/MarkupParserTest.java?rev=1079669&r1=1079668&r2=1079669&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/MarkupParserTest.java (original)
+++ wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/MarkupParserTest.java Wed Mar  9 05:35:31 2011
@@ -19,6 +19,7 @@ package org.apache.wicket.markup;
 import java.io.IOException;
 import java.text.ParseException;
 import java.util.Locale;
+import java.util.regex.Matcher;
 
 import junit.framework.Assert;
 
@@ -427,4 +428,52 @@ public final class MarkupParserTest exte
 		RawMarkup raw = (RawMarkup)markup.get(0);
 		assertEquals("<span> </span>", raw.toString());
 	}
+
+	/**
+	 * 
+	 */
+	public void testOpenConditionalCommentPattern()
+	{
+		assertFalse(MarkupParser.CONDITIONAL_COMMENT_OPENING.matcher("<!--x--> <!--[if IE]>")
+			.find());
+
+		String markup = " <!--[if IE]> <![endif]--><!--[if IE]>--><!--<![endif]--><!--[if IE]><!--><!--<![endif]--><!--[if IE]><! --><!--<![endif]-->";
+		Matcher m = MarkupParser.CONDITIONAL_COMMENT_OPENING.matcher(markup);
+		assertTrue(m.find());
+		assertEquals(" <!--[if IE]>", m.group());
+		assertFalse(m.find());
+
+		markup = " <!--[if IE]>--> <![endif]--><!--[if IE]>--><!--<![endif]--><!--[if IE]><!--><!--<![endif]--><!--[if IE]><! --><!--<![endif]-->";
+		m = MarkupParser.CONDITIONAL_COMMENT_OPENING.matcher(markup);
+		assertTrue(m.find());
+		assertEquals(" <!--[if IE]>-->", m.group());
+		assertFalse(m.find());
+
+		markup = " <!--[if IE]><!--> <![endif]--><!--[if IE]>--><!--<![endif]--><!--[if IE]><!--><!--<![endif]--><!--[if IE]><! --><!--<![endif]-->";
+		m = MarkupParser.CONDITIONAL_COMMENT_OPENING.matcher(markup);
+		assertTrue(m.find());
+		assertEquals(" <!--[if IE]><!-->", m.group());
+		assertFalse(m.find());
+
+		markup = " <!--[if IE]><! --> <![endif]--><!--[if IE]>--><!--<![endif]--><!--[if IE]><!--><!--<![endif]--><!--[if IE]><! --><!--<![endif]-->";
+		m = MarkupParser.CONDITIONAL_COMMENT_OPENING.matcher(markup);
+		assertTrue(m.find());
+		assertEquals(" <!--[if IE]><! -->", m.group());
+		assertFalse(m.find());
+
+	}
+
+	/**
+	 * @throws IOException
+	 * @throws ResourceStreamNotFoundException
+	 */
+	public void testRawMakupParsingWithStripCommentsSetTrue() throws IOException,
+		ResourceStreamNotFoundException
+	{
+		tester.getApplication().getMarkupSettings().setStripComments(true);
+		String conditionalComment = "\r\n <!--[if IE 6]>\r\n<![endif]-->";
+		MarkupParser parser = new MarkupParser(conditionalComment);
+		Markup markup = parser.parse();
+		assertEquals(conditionalComment, markup.get(0).toString());
+	}
 }