Author: markt Date: Fri Nov 12 16:52:02 2010 New Revision: 1034468 URL: http://svn.apache.org/viewvc?rev=1034468&view=rev Log: Additional tests and fixes for https://issues.apache.org/bugzilla/show_bug.cgi?id=49297 Duplicate attribute rules for the page directive are slightly different. Based on a patch by genspring
Added: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport1.jsp (with props) tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport2.jsp (with props) tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding1.jsp (with props) tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding2.jsp (with props) tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding3.jsp (with props) tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding4.jsp (with props) Modified: tomcat/trunk/java/org/apache/jasper/compiler/Parser.java tomcat/trunk/java/org/apache/jasper/util/UniqueAttributesImpl.java tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/jasper/compiler/Parser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/Parser.java?rev=1034468&r1=1034467&r2=1034468&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/compiler/Parser.java (original) +++ tomcat/trunk/java/org/apache/jasper/compiler/Parser.java Fri Nov 12 16:52:02 2010 @@ -150,7 +150,10 @@ class Parser implements TagConstants { * Attributes ::= (S Attribute)* S? */ Attributes parseAttributes() throws JasperException { - UniqueAttributesImpl attrs = new UniqueAttributesImpl(); + return parseAttributes(false); + } + Attributes parseAttributes(boolean pageDirective) throws JasperException { + UniqueAttributesImpl attrs = new UniqueAttributesImpl(pageDirective); reader.skipSpaces(); int ws = 1; @@ -177,7 +180,7 @@ class Parser implements TagConstants { public static Attributes parseAttributes(ParserController pc, JspReader reader) throws JasperException { Parser tmpParser = new Parser(pc, reader, false, false, null); - return tmpParser.parseAttributes(); + return tmpParser.parseAttributes(true); } /** @@ -327,7 +330,7 @@ class Parser implements TagConstants { * Attribute)* */ private void parsePageDirective(Node parent) throws JasperException { - Attributes attrs = parseAttributes(); + Attributes attrs = parseAttributes(true); Node.PageDirective n = new Node.PageDirective(attrs, start, parent); /* Modified: tomcat/trunk/java/org/apache/jasper/util/UniqueAttributesImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/util/UniqueAttributesImpl.java?rev=1034468&r1=1034467&r2=1034468&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/util/UniqueAttributesImpl.java (original) +++ tomcat/trunk/java/org/apache/jasper/util/UniqueAttributesImpl.java Fri Nov 12 16:52:02 2010 @@ -29,7 +29,19 @@ import org.xml.sax.helpers.AttributesImp */ public class UniqueAttributesImpl extends AttributesImpl { - private Set<String> qNames = new HashSet<String>(); + private static final String IMPORT = "import"; + private static final String PAGE_ENCODING = "pageEncoding"; + + private final boolean pageDirective; + private final Set<String> qNames = new HashSet<String>(); + + public UniqueAttributesImpl() { + this.pageDirective = false; + } + + public UniqueAttributesImpl(boolean pageDirective) { + this.pageDirective = pageDirective; + } @Override public void clear() { @@ -41,7 +53,7 @@ public class UniqueAttributesImpl extend public void setAttributes(Attributes atts) { for (int i = 0; i < atts.getLength(); i++) { if (!qNames.add(atts.getQName(i))) { - handleDuplicate(atts.getQName(i)); + handleDuplicate(atts.getQName(i), atts.getValue(i)); } } super.setAttributes(atts); @@ -53,7 +65,7 @@ public class UniqueAttributesImpl extend if (qNames.add(qName)) { super.addAttribute(uri, localName, qName, type, value); } else { - handleDuplicate(qName); + handleDuplicate(qName, value); } } @@ -64,7 +76,7 @@ public class UniqueAttributesImpl extend if (qNames.add(qName)) { super.setAttribute(index, uri, localName, qName, type, value); } else { - handleDuplicate(qName); + handleDuplicate(qName, value); } } @@ -80,8 +92,29 @@ public class UniqueAttributesImpl extend super.setQName(index, qName); } - private void handleDuplicate(String qName) { + private void handleDuplicate(String qName, String value) { + if (pageDirective) { + if (IMPORT.equalsIgnoreCase(qName)) { + // Always merge imports + int i = super.getIndex(IMPORT); + String v = super.getValue(i); + super.setValue(i, v + "," + value); + return; + } else if (PAGE_ENCODING.equalsIgnoreCase(qName)) { + // Page encoding can only occur once per file so a second + // attribute - even one with a duplicate value - is an error + } else { + // Other attributes can be repeated if and only if the values + // are identical + String v = super.getValue(qName); + if (v.equals(value)) { + return; + } + } + } + + // Ordinary tag attributes can't be repeated, even with identical values throw new IllegalArgumentException( - Localizer.getMessage("jsp.error.duplicateqname", qName)); + Localizer.getMessage("jsp.error.duplicateqname", qName)); } } Modified: tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java?rev=1034468&r1=1034467&r2=1034468&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java (original) +++ tomcat/trunk/test/org/apache/jasper/compiler/TestParser.java Fri Nov 12 16:52:02 2010 @@ -144,6 +144,116 @@ public class TestParser extends TomcatBa assertEquals(500, sc); } + public void testBug49297MultipleImport1() throws Exception { + + Tomcat tomcat = getTomcatInstance(); + + File appDir = new File("test/webapp-3.0"); + // app dir is relative to server home + tomcat.addWebapp(null, "/test", appDir.getAbsolutePath()); + + tomcat.start(); + + ByteChunk res = new ByteChunk(); + int sc = getUrl("http://localhost:" + getPort() + + "/test/bug49nnn/bug49297MultipleImport1.jsp", res, + new HashMap<String,List<String>>()); + + assertEquals(200, sc); + assertEcho(res.toString(), "OK"); + } + + public void testBug49297MultipleImport2() throws Exception { + + Tomcat tomcat = getTomcatInstance(); + + File appDir = new File("test/webapp-3.0"); + // app dir is relative to server home + tomcat.addWebapp(null, "/test", appDir.getAbsolutePath()); + + tomcat.start(); + + ByteChunk res = new ByteChunk(); + int sc = getUrl("http://localhost:" + getPort() + + "/test/bug49nnn/bug49297MultipleImport2.jsp", res, + new HashMap<String,List<String>>()); + + assertEquals(200, sc); + assertEcho(res.toString(), "OK"); + } + + public void testBug49297MultiplePageEncoding1() throws Exception { + + Tomcat tomcat = getTomcatInstance(); + + File appDir = new File("test/webapp-3.0"); + // app dir is relative to server home + tomcat.addWebapp(null, "/test", appDir.getAbsolutePath()); + + tomcat.start(); + + ByteChunk res = new ByteChunk(); + int sc = getUrl("http://localhost:" + getPort() + + "/test/bug49nnn/bug49297MultiplePageEncoding1.jsp", res, + new HashMap<String,List<String>>()); + + assertEquals(500, sc); + } + + public void testBug49297MultiplePageEncoding2() throws Exception { + + Tomcat tomcat = getTomcatInstance(); + + File appDir = new File("test/webapp-3.0"); + // app dir is relative to server home + tomcat.addWebapp(null, "/test", appDir.getAbsolutePath()); + + tomcat.start(); + + ByteChunk res = new ByteChunk(); + int sc = getUrl("http://localhost:" + getPort() + + "/test/bug49nnn/bug49297MultiplePageEncoding2.jsp", res, + new HashMap<String,List<String>>()); + + assertEquals(500, sc); + } + + public void testBug49297MultiplePageEncoding3() throws Exception { + + Tomcat tomcat = getTomcatInstance(); + + File appDir = new File("test/webapp-3.0"); + // app dir is relative to server home + tomcat.addWebapp(null, "/test", appDir.getAbsolutePath()); + + tomcat.start(); + + ByteChunk res = new ByteChunk(); + int sc = getUrl("http://localhost:" + getPort() + + "/test/bug49nnn/bug49297MultiplePageEncoding3.jsp", res, + new HashMap<String,List<String>>()); + + assertEquals(500, sc); + } + + public void testBug49297MultiplePageEncoding4() throws Exception { + + Tomcat tomcat = getTomcatInstance(); + + File appDir = new File("test/webapp-3.0"); + // app dir is relative to server home + tomcat.addWebapp(null, "/test", appDir.getAbsolutePath()); + + tomcat.start(); + + ByteChunk res = new ByteChunk(); + int sc = getUrl("http://localhost:" + getPort() + + "/test/bug49nnn/bug49297MultiplePageEncoding4.jsp", res, + new HashMap<String,List<String>>()); + + assertEquals(500, sc); + } + /** Assertion for text printed by tags:echo */ private static void assertEcho(String result, String expected) { assertTrue(result.indexOf("<p>" + expected + "</p>") > 0); Added: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport1.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport1.jsp?rev=1034468&view=auto ============================================================================== --- tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport1.jsp (added) +++ tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport1.jsp Fri Nov 12 16:52:02 2010 @@ -0,0 +1,28 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%...@page import="java.util.List" import="java.util.ArrayList" %> +<html> + <head><title>Bug 49297 multiple import test case</title></head> + <body> + <% + // Make sure the imports above do work + List<String> l = new ArrayList<String>(); + l.add("OK"); + %> + <p><%=l.get(0)%></p> + </body> +</html> \ No newline at end of file Propchange: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport1.jsp ------------------------------------------------------------------------------ svn:eol-style = native Added: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport2.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport2.jsp?rev=1034468&view=auto ============================================================================== --- tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport2.jsp (added) +++ tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport2.jsp Fri Nov 12 16:52:02 2010 @@ -0,0 +1,29 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%...@page import="java.util.List" %> +<%...@page import="java.util.ArrayList" %> +<html> + <head><title>Bug 49297 multiple import test case</title></head> + <body> + <% + // Make sure the imports above do work + List<String> l = new ArrayList<String>(); + l.add("OK"); + %> + <p><%=l.get(0)%></p> + </body> +</html> \ No newline at end of file Propchange: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultipleImport2.jsp ------------------------------------------------------------------------------ svn:eol-style = native Added: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding1.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding1.jsp?rev=1034468&view=auto ============================================================================== --- tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding1.jsp (added) +++ tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding1.jsp Fri Nov 12 16:52:02 2010 @@ -0,0 +1,24 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%...@page pageEncoding="ISO-8859-1" %> +<%...@page pageEncoding="ISO-8859-1" %> +<html> + <head><title>Bug 49297 multiple pageEncoding test case</title></head> + <body> + <p>Should fail</p> + </body> +</html> \ No newline at end of file Propchange: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding1.jsp ------------------------------------------------------------------------------ svn:eol-style = native Added: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding2.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding2.jsp?rev=1034468&view=auto ============================================================================== --- tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding2.jsp (added) +++ tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding2.jsp Fri Nov 12 16:52:02 2010 @@ -0,0 +1,23 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%...@page pageEncoding="ISO-8859-1" pageEncoding="ISO-8859-1" %> +<html> + <head><title>Bug 49297 multiple pageEncoding test case</title></head> + <body> + <p>Should fail</p> + </body> +</html> \ No newline at end of file Propchange: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding2.jsp ------------------------------------------------------------------------------ svn:eol-style = native Added: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding3.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding3.jsp?rev=1034468&view=auto ============================================================================== --- tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding3.jsp (added) +++ tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding3.jsp Fri Nov 12 16:52:02 2010 @@ -0,0 +1,24 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%...@page pageEncoding="ISO-8859-1" %> +<%...@page pageEncoding="UTF-8" %> +<html> + <head><title>Bug 49297 multiple pageEncoding test case</title></head> + <body> + <p>Should fail</p> + </body> +</html> \ No newline at end of file Propchange: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding3.jsp ------------------------------------------------------------------------------ svn:eol-style = native Added: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding4.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding4.jsp?rev=1034468&view=auto ============================================================================== --- tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding4.jsp (added) +++ tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding4.jsp Fri Nov 12 16:52:02 2010 @@ -0,0 +1,23 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%...@page pageEncoding="ISO-8859-1" pageEncoding="UTF-8"%> +<html> + <head><title>Bug 49297 multiple pageEncoding test case</title></head> + <body> + <p>Should fail</p> + </body> +</html> \ No newline at end of file Propchange: tomcat/trunk/test/webapp-3.0/bug49nnn/bug49297MultiplePageEncoding4.jsp ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1034468&r1=1034467&r2=1034468&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Fri Nov 12 16:52:02 2010 @@ -155,7 +155,9 @@ whitespace before the attribute name. The whitespace test can be disabled by setting the system property <code>org.apache.jasper.compiler.Parser.STRICT_WHITESPACE</code> to - <code>false</code>. (markt) + <code>false</code>. Attributes of the page directive have slightly + different rules. The implementation of that part of the fix is based on + a patch by genspring. (markt) </fix> <fix> <bug>50105</bug>: When processing composite EL expressions use --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org