From dd1da37153358dffc2622876e4f41155b5662f92 Mon Sep 17 00:00:00 2001 From: markt Date: Sat, 13 Feb 2010 18:25:07 +0000 Subject: [PATCH] Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48371 Skip comments when working out where to insert generated servlets and associated mappings git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@909869 13f79535-47bb-0310-9956-ffa450edef68 --- java/org/apache/jasper/JspC.java | 141 ++++++++++++++++++++++----------------- 1 file changed, 79 insertions(+), 62 deletions(-) diff --git a/java/org/apache/jasper/JspC.java b/java/org/apache/jasper/JspC.java index d9537eeab..174216d5f 100644 --- a/java/org/apache/jasper/JspC.java +++ b/java/org/apache/jasper/JspC.java @@ -27,15 +27,18 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; +import java.io.Reader; import java.io.Writer; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.HashMap; +import java.util.Set; import java.util.Stack; import java.util.StringTokenizer; import java.util.Vector; @@ -123,20 +126,31 @@ public class JspC implements Options { protected static final String SWITCH_ENCODING = "-javaEncoding"; protected static final String SWITCH_SMAP = "-smap"; protected static final String SWITCH_DUMP_SMAP = "-dumpsmap"; - protected static final String SHOW_SUCCESS ="-s"; protected static final String LIST_ERRORS = "-l"; protected static final int INC_WEBXML = 10; protected static final int ALL_WEBXML = 20; protected static final int DEFAULT_DIE_LEVEL = 1; protected static final int NO_DIE_LEVEL = 0; - - protected static final String[] insertBefore = - { "", "", "", - "", "", "", "", - "", "", "", - "", "", "", "", - "" }; + protected static final Set insertBefore = new HashSet(); + + static { + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + insertBefore.add(""); + } protected static int die; protected String classPath = null; @@ -864,66 +878,37 @@ public class JspC implements Options { PrintWriter writer = new PrintWriter(new FileWriter(webXml2)); // Insert the and declarations - int pos = -1; - String line = null; - while (true) { - line = reader.readLine(); - if (line == null) { - break; - } - // Skip anything previously generated by JSPC - if (line.indexOf(insertStartMarker) >= 0) { - while (true) { - line = reader.readLine(); - if (line == null) { - return; - } - if (line.indexOf(insertEndMarker) >= 0) { - line = reader.readLine(); - line = reader.readLine(); + boolean inserted = false; + int current = reader.read(); + while (current > -1) { + if (!inserted && current == '<') { + String element = getElement(reader); + if (insertBefore.contains(element)) { + // Insert generated content here + writer.println(insertStartMarker); + while (true) { + String line = fragmentReader.readLine(); if (line == null) { - return; + writer.println(); + break; } - break; + writer.println(line); + } + writer.println(insertEndMarker); + writer.println(); + writer.write(element); + } else if (element.contains(insertStartMarker)) { + // Skip the previous auto-generated content + while (!element.contains(insertEndMarker)) { + element = getElement(reader); } + } else { + writer.write(element); } - } - for (int i = 0; i < insertBefore.length; i++) { - pos = line.indexOf(insertBefore[i]); - if (pos >= 0) - break; - } - if (pos >= 0) { - writer.print(line.substring(0, pos)); - break; } else { - writer.println(line); - } - } - - writer.println(insertStartMarker); - while (true) { - String line2 = fragmentReader.readLine(); - if (line2 == null) { - writer.println(); - break; + writer.write(current); } - writer.println(line2); - } - writer.println(insertEndMarker); - writer.println(); - - for (int i = 0; i < pos; i++) { - writer.print(" "); - } - writer.println(line.substring(pos)); - - while (true) { - line = reader.readLine(); - if (line == null) { - break; - } - writer.println(line); + current = reader.read(); } writer.close(); @@ -949,6 +934,38 @@ public class JspC implements Options { (new File(webxmlFile)).delete(); } + + /* + * Assumes valid xml + */ + private String getElement(Reader reader) throws IOException { + StringBuilder result = new StringBuilder(); + result.append('<'); + + boolean done = false; + + while (!done) { + int current = reader.read(); + while (current != '>') { + result.append((char) current); + current = reader.read(); + } + result.append((char) current); + + int len = result.length(); + if (len > 7 && result.substring(0, 4).equals("")) { + done = true; + } + } else { + done = true; + } + } + + + return result.toString(); + } protected void processFile(String file) throws JasperException -- 2.11.0