Author: jboynes
Date: Tue Dec 2 05:09:47 2014
New Revision: 1642801
URL: http://svn.apache.org/r1642801
Log:
Cleanup warnings and add test for issue 57290
Added:
tomcat/taglibs/standard/trunk/spec/src/test/
tomcat/taglibs/standard/trunk/spec/src/test/java/
tomcat/taglibs/standard/trunk/spec/src/test/java/javax/
tomcat/taglibs/standard/trunk/spec/src/test/java/javax/servlet/
tomcat/taglibs/standard/trunk/spec/src/test/java/javax/servlet/jsp/
tomcat/taglibs/standard/trunk/spec/src/test/java/javax/servlet/jsp/jstl/
tomcat/taglibs/standard/trunk/spec/src/test/java/javax/servlet/jsp/jstl/tlv/
tomcat/taglibs/standard/trunk/spec/src/test/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLVTest.java
(with props)
Modified:
tomcat/taglibs/standard/trunk/spec/pom.xml
tomcat/taglibs/standard/trunk/spec/src/main/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLV.java
Modified: tomcat/taglibs/standard/trunk/spec/pom.xml
URL:
http://svn.apache.org/viewvc/tomcat/taglibs/standard/trunk/spec/pom.xml?rev=1642801&r1=1642800&r2=1642801&view=diff
==============================================================================
--- tomcat/taglibs/standard/trunk/spec/pom.xml (original)
+++ tomcat/taglibs/standard/trunk/spec/pom.xml Tue Dec 2 05:09:47 2014
@@ -80,6 +80,19 @@
<version>1.0</version>
<scope>provided</scope>
</dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.easymock</groupId>
+ <artifactId>easymock</artifactId>
+ <version>3.0</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
Modified:
tomcat/taglibs/standard/trunk/spec/src/main/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLV.java
URL:
http://svn.apache.org/viewvc/tomcat/taglibs/standard/trunk/spec/src/main/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLV.java?rev=1642801&r1=1642800&r2=1642801&view=diff
==============================================================================
---
tomcat/taglibs/standard/trunk/spec/src/main/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLV.java
(original)
+++
tomcat/taglibs/standard/trunk/spec/src/main/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLV.java
Tue Dec 2 05:09:47 2014
@@ -18,6 +18,7 @@ package javax.servlet.jsp.jstl.tlv;
import java.io.IOException;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
@@ -40,6 +41,10 @@ import org.xml.sax.helpers.DefaultHandle
* to tag libraries permitted to be imported on the page in addition to the tag
* library that references PermittedTaglibsTLV (which is allowed implicitly).
* </ul>
+ * <p>This implementation only detects tag libraries declared on the {@code
<jsp:root>} element,
+ * including libraries in regular JSP files or JSP Documents with a specific
{@code <jsp:root>}.
+ * It does not detect libraries declared on other elements as supported by JSP
2.0.
+ * </p>
*
* @author Shawn Bayern
*/
@@ -62,56 +67,31 @@ public class PermittedTaglibsTLV extends
private static final PageParser parser = new PageParser(false);
- //*********************************************************************
- // Validation and configuration state (protected)
-
- private Set permittedTaglibs; // what URIs are allowed?
- private boolean failed; // did the page fail?
- private String uri; // our taglib's URI
-
- //*********************************************************************
- // Constructor and lifecycle management
+ private final Set<String> permittedTaglibs; // what URIs are
allowed?
public PermittedTaglibsTLV() {
- super();
- init();
- }
-
- private void init() {
- permittedTaglibs = null;
+ permittedTaglibs = new HashSet<String>();
}
@Override
- public void release() {
- super.release();
- init();
+ public void setInitParameters(Map<String, Object> initParams) {
+ super.setInitParameters(initParams);
+ permittedTaglibs.clear();
+ String uris = (String) initParams.get(PERMITTED_TAGLIBS_PARAM);
+ if (uris != null) {
+ StringTokenizer st = new StringTokenizer(uris);
+ while (st.hasMoreTokens()) {
+ permittedTaglibs.add(st.nextToken());
+ }
+ }
}
-
- //*********************************************************************
- // Validation entry point
-
@Override
- public synchronized ValidationMessage[] validate(String prefix, String
uri, PageData page) {
+ public ValidationMessage[] validate(String prefix, String uri, PageData
page) {
try {
- // initialize
- this.uri = uri;
- permittedTaglibs = readConfiguration();
-
- // get a handler
- DefaultHandler h = new PermittedTaglibsHandler();
-
- // parse the page
+ PermittedTaglibsHandler h = new PermittedTaglibsHandler(prefix,
uri);
parser.parse(page, h);
-
- if (failed) {
- return vmFromString(
- "taglib " + prefix + " (" + uri + ") allows only the "
- + "following taglibs to be imported: " +
permittedTaglibs);
- } else {
- return null;
- }
-
+ return h.getResult();
} catch (SAXException ex) {
return vmFromString(ex.toString());
} catch (ParserConfigurationException ex) {
@@ -125,78 +105,62 @@ public class PermittedTaglibsTLV extends
//*********************************************************************
// Utility functions
- /**
- * Returns Set of permitted taglibs, based on configuration data.
- */
- private Set readConfiguration() {
-
- // initialize the Set
- Set s = new HashSet();
-
- // get the space-separated list of taglibs
- String uris = (String)
getInitParameters().get(PERMITTED_TAGLIBS_PARAM);
-
- // separate the list into individual uris and store them
- StringTokenizer st = new StringTokenizer(uris);
- while (st.hasMoreTokens()) {
- s.add(st.nextToken());
- }
-
- // return the new Set
- return s;
-
- }
-
// constructs a ValidationMessage[] from a single String and no ID
-
private ValidationMessage[] vmFromString(String message) {
- return new ValidationMessage[]{
- new ValidationMessage(null, message)
- };
+ return new ValidationMessage[]{new ValidationMessage(null, message)};
}
-
- //*********************************************************************
- // SAX handler
-
/**
* The handler that provides the base of our implementation.
*/
private class PermittedTaglibsHandler extends DefaultHandler {
+ private final String prefix;
+ private final String uri;
- // if the element is <jsp:root>, check its "xmlns:" attributes
-
- @Override
- public void startElement(
- String ns, String ln, String qn, Attributes a) {
+ private boolean failed;
- // ignore all but <jsp:root>
- if (!qn.equals(JSP_ROOT_QN) &&
- (!ns.equals(JSP_ROOT_URI) || !ln.equals(JSP_ROOT_NAME))) {
- return;
- }
-
- // for <jsp:root>, check the attributes
- for (int i = 0; i < a.getLength(); i++) {
- String name = a.getQName(i);
-
- // ignore non-namespace attributes, and xmlns:jsp
- if (!name.startsWith("xmlns:") || name.equals("xmlns:jsp")) {
- continue;
- }
+ public PermittedTaglibsHandler(String prefix, String uri) {
+ this.prefix = prefix;
+ this.uri = uri;
+ }
- String value = a.getValue(i);
- // ignore our own namespace declaration
- if (value.equals(uri)) {
- continue;
+ // TODO: https://issues.apache.org/bugzilla/show_bug.cgi?id=57290
(JSP2.0 Documents)
+ // If we had a way of determining if a namespace referred to a taglib
as opposed to being
+ // part of XML output we might be able to simplify this using
startPrefixMapping events.
+ @Override
+ public void startElement(String ns, String ln, String qn, Attributes
a) {
+ // look at namespaces declared on the <jsp:root> element
+ if (qn.equals(JSP_ROOT_QN) || (ns.equals(JSP_ROOT_URI) &&
ln.equals(JSP_ROOT_NAME))) {
+ for (int i = 0; i < a.getLength(); i++) {
+ String name = a.getQName(i);
+
+ // ignore non-namespace attributes
+ if (!name.startsWith("xmlns:")) {
+ continue;
+ }
+
+ String value = a.getValue(i);
+ // ignore any declaration for our taglib or the JSP
namespace
+ if (value.equals(uri) || value.equals(JSP_ROOT_URI)) {
+ continue;
+ }
+
+ // otherwise, ensure that 'value' is in 'permittedTaglibs'
set
+ if (!permittedTaglibs.contains(value)) {
+ failed = true;
+ }
}
+ }
+ }
- // otherwise, ensure that 'value' is in 'permittedTaglibs' set
- if (!permittedTaglibs.contains(value)) {
- failed = true;
- }
+ private ValidationMessage[] getResult() {
+ if (failed) {
+ return vmFromString(
+ "taglib " + prefix + " (" + uri + ") allows only the "
+ + "following taglibs to be imported: " +
permittedTaglibs);
+ } else {
+ return null;
}
}
}
-
}
Added:
tomcat/taglibs/standard/trunk/spec/src/test/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLVTest.java
URL:
http://svn.apache.org/viewvc/tomcat/taglibs/standard/trunk/spec/src/test/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLVTest.java?rev=1642801&view=auto
==============================================================================
---
tomcat/taglibs/standard/trunk/spec/src/test/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLVTest.java
(added)
+++
tomcat/taglibs/standard/trunk/spec/src/test/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLVTest.java
Tue Dec 2 05:09:47 2014
@@ -0,0 +1,99 @@
+/*
+ * 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.
+ */
+
+package javax.servlet.jsp.jstl.tlv;
+
+import java.io.StringBufferInputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.jsp.tagext.PageData;
+import javax.servlet.jsp.tagext.ValidationMessage;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import org.easymock.EasyMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+public class PermittedTaglibsTLVTest {
+
+ private static final String URI =
"http://jakarta.apache.org/taglibs/standard/permittedTaglibs";
+
+ private PermittedTaglibsTLV tlv;
+ private PageData page;
+ private Map<String, Object> initParams = new HashMap<String, Object>();
+
+ @Before
+ public void createTlv() {
+ tlv = new PermittedTaglibsTLV();
+ page = EasyMock.createMock(PageData.class);
+ }
+
+ @Test
+ public void tagPermittedWhenDeclaredAtRoot() {
+ initParams.put("permittedTaglibs", "urn:test");
+ String xmlView = "<jsp:root xmlns:jsp='http://java.sun.com/JSP/Page'
xmlns:x='urn:test'
xmlns:p='http://jakarta.apache.org/taglibs/standard/permittedTaglibs'></jsp:root>";
+ expect(page.getInputStream()).andStubReturn(new
StringBufferInputStream(xmlView));
+
+ replay(page);
+ tlv.setInitParameters(initParams);
+ ValidationMessage[] messages = tlv.validate(null, URI, page);
+ assertTrue(messages == null || messages.length == 0);
+ }
+
+ @Test
+ public void tagNotPermittedWhenDeclaredAtRoot() {
+ initParams.put("permittedTaglibs", "urn:none");
+ String xmlView = "<jsp:root xmlns:jsp='http://java.sun.com/JSP/Page'
xmlns:x='urn:test'
xmlns:p='http://jakarta.apache.org/taglibs/standard/permittedTaglibs'></jsp:root>";
+ expect(page.getInputStream()).andStubReturn(new
StringBufferInputStream(xmlView));
+
+ replay(page);
+ tlv.setInitParameters(initParams);
+ ValidationMessage[] messages = tlv.validate(null, URI, page);
+ assertNotNull(messages);
+ assertEquals(1, messages.length);
+ }
+
+ @Ignore("https://issues.apache.org/bugzilla/show_bug.cgi?id=57290")
+ @Test
+ public void tagNotPermittedWhenDeclaredInPage() {
+ initParams.put("permittedTaglibs", "urn:none");
+ // In the page for this XML view, 'd' and 'x' are taglibs but 'o' is
not
+ String xmlView = "<?xml version='1.0' encoding='UTF-8' ?>\n" +
+ "<jsp:root version='2.0'
xmlns:jsp='http://java.sun.com/JSP/Page' jsp:id='0'>\n" +
+ "<jsp:directive.page jsp:id='1' pageEncoding='UTF-8'
contentType='text/xml;charset=UTF-8'/>\n" +
+ "<o:doc xmlns:d='urn:dump' xmlns:o='urn:out' jsp:id='2'>\n" +
+ " <x:hello xmlns:x='urn:jsptagdir:/WEB-INF/tags/test'
jsp:id='3'/>\n" +
+ "</o:doc>\n" +
+ "</jsp:root>";
+ expect(page.getInputStream()).andStubReturn(new
StringBufferInputStream(xmlView));
+
+ replay(page);
+ tlv.setInitParameters(initParams);
+ ValidationMessage[] messages = tlv.validate(null, URI, page);
+ assertNotNull(messages);
+ assertEquals(1, messages.length);
+ }
+
+
+}
Propchange:
tomcat/taglibs/standard/trunk/spec/src/test/java/javax/servlet/jsp/jstl/tlv/PermittedTaglibsTLVTest.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]