You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2010/11/13 13:19:31 UTC

svn commit: r1034744 - in /wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util: file/WebXmlFile.java xml/ xml/CustomEntityResolver.java

Author: pete
Date: Sat Nov 13 12:19:30 2010
New Revision: 1034744

URL: http://svn.apache.org/viewvc?rev=1034744&view=rev
Log:
WICKET-3163: support offline builds of wicket (avoid hitting java.sun.com for lookup of web.xml 2.3 DTD)

Added:
    wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/xml/
    wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/xml/CustomEntityResolver.java
Modified:
    wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/file/WebXmlFile.java

Modified: wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/file/WebXmlFile.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/file/WebXmlFile.java?rev=1034744&r1=1034743&r2=1034744&view=diff
==============================================================================
--- wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/file/WebXmlFile.java (original)
+++ wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/file/WebXmlFile.java Sat Nov 13 12:19:30 2010
@@ -25,6 +25,7 @@ import javax.xml.parsers.DocumentBuilder
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import org.apache.wicket.util.xml.CustomEntityResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -34,7 +35,7 @@ import org.xml.sax.SAXException;
 
 /**
  * A utility class providing helper methods in dealing with web.xml
- * 
+ *
  * @author jcompagner
  * @author Juergen Donnerstag
  */
@@ -51,7 +52,7 @@ public class WebXmlFile
 
 	/**
 	 * Gets Wicket filter path via FilterConfig
-	 * 
+	 *
 	 * @param isServlet
 	 *            true if Servlet, false if Filter
 	 * @param filterConfig
@@ -65,7 +66,7 @@ public class WebXmlFile
 
 	/**
 	 * Gets Wicket filter path via ServletContext and the filter name
-	 * 
+	 *
 	 * @param isServlet
 	 *            true if Servlet, false if Filter
 	 * @param servletContext
@@ -109,7 +110,7 @@ public class WebXmlFile
 	 * web.xml file.
 	 * <p>
 	 * A typical Wicket web.xml entry looks like:
-	 * 
+	 *
 	 * <pre>
 	 * <code>
 	 * &lt;filter&gt;
@@ -120,7 +121,7 @@ public class WebXmlFile
 	 *     &lt;param-value&gt;org.apache.wicket.examples.helloworld.HelloWorldApplication&lt;/param-value&gt;
 	 *   &lt;/init-param&gt;
 	 * &lt;/filter&gt;
-	 * 
+	 *
 	 * &lt;filter-mapping&gt;
 	 *   &lt;filter-name&gt;HelloWorldApplication&lt;/filter-name&gt;
 	 *   &lt;url-pattern&gt;/helloworld/*&lt;/url-pattern&gt;
@@ -129,7 +130,7 @@ public class WebXmlFile
 	 * &lt;/filter-mapping&gt;
 	 * </code>
 	 * </pre>
-	 * 
+	 *
 	 * @param isServlet
 	 *            true if Servlet, false if Filter
 	 * @param filterName
@@ -145,6 +146,7 @@ public class WebXmlFile
 	{
 		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 		DocumentBuilder builder = factory.newDocumentBuilder();
+		builder.setEntityResolver(CustomEntityResolver.getPreloaded()); // try to pull DTD from local set of entities
 		Document document = builder.parse(is);
 
 		String tag = (isServlet ? "servlet" : "filter");
@@ -173,7 +175,7 @@ public class WebXmlFile
 	/**
 	 * Iterate through all children of 'node' and search for a node with name "filterName". Return
 	 * the value of node "url-pattern" if "filterName" was found.
-	 * 
+	 *
 	 * @param filterName
 	 * @param name
 	 * @param node
@@ -215,7 +217,7 @@ public class WebXmlFile
 	/**
 	 * Find a node with name 'mapping' within 'nodeList' and if found continue to search amongst its
 	 * children for a node with 'filterName' and "url-pattern'
-	 * 
+	 *
 	 * @param filterName
 	 * @param mapping
 	 * @param name

Added: wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/xml/CustomEntityResolver.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/xml/CustomEntityResolver.java?rev=1034744&view=auto
==============================================================================
--- wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/xml/CustomEntityResolver.java (added)
+++ wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/xml/CustomEntityResolver.java Sat Nov 13 12:19:30 2010
@@ -0,0 +1,157 @@
+/*
+ * 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 org.apache.wicket.util.xml;
+
+import org.apache.wicket.util.lang.Args;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.servlet.Filter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * entity resolver that tries to locate a document type definition (DTD) using a set of custom entity resolvers
+ *
+ * @author pete
+ */
+public class CustomEntityResolver implements EntityResolver
+{
+	private final Map<EntityKey, EntityLocator> entities = new HashMap<EntityKey, EntityLocator>(3);
+
+	/**
+	 * get default instances of custom entity resolver with preloaded well-known entities
+	 *
+	 * @return instance of resolver
+	 */
+	public static CustomEntityResolver getPreloaded()
+	{
+		CustomEntityResolver resolver = new CustomEntityResolver();
+
+		resolver.put(new EntityKey("-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",
+		                           "http://java.sun.com/dtd/web-app_2_3.dtd"),
+		             new ServletApiEntityLocator("web-app_2_3.dtd"));
+
+		return resolver;
+	}
+
+	/**
+	 * add custom entity resolver
+	 *
+	 * @param key key for lookup (contains id and url)
+	 * @param locator locator for looking up entity
+	 */
+	public void put(EntityKey key, EntityLocator locator)
+	{
+		Args.notNull(key, "key");
+		Args.notNull(locator, "locator");
+		entities.put(key, locator);
+	}
+
+	public InputSource resolveEntity(String id, String url) throws SAXException, IOException
+	{
+		for (Map.Entry<EntityKey, EntityLocator> entry : entities.entrySet())
+			if (entry.getKey().id.equals(id) || entry.getKey().url.equals(url))
+				return entry.getValue().locateInputSource();
+
+		return null;
+	}
+
+	/**
+	 * key for entity
+	 * <p/>
+	 * consists of id + url
+	 */
+	public static class EntityKey
+	{
+		private final String id;
+		private final String url;
+
+		private EntityKey(String id, String url)
+		{
+			Args.notEmpty(id, "id");
+			Args.notEmpty(url, "url");
+			this.id = id;
+			this.url = url;
+		}
+
+		@Override
+		public boolean equals(Object o)
+		{
+			if (this == o)
+				return true;
+			if (!(o instanceof EntityKey))
+				return false;
+
+			EntityKey key = (EntityKey) o;
+
+			if (!id.equals(key.id))
+				return false;
+
+			return url.equals(key.url);
+		}
+
+		@Override
+		public int hashCode()
+		{
+			int result = id.hashCode();
+			result = 31 * result + url.hashCode();
+			return result;
+		}
+	}
+
+	/**
+	 * entity locator
+	 * <p/>
+	 * manages locating an entity
+	 */
+	public static interface EntityLocator
+	{
+		InputSource locateInputSource() throws SAXException, IOException;
+	}
+
+	/**
+	 * entity locator for resources inside servlet-api.jar
+	 */
+	public static class ServletApiEntityLocator implements EntityLocator
+	{
+		private final String name;
+
+		private ServletApiEntityLocator(String name)
+		{
+			this.name = name;
+		}
+
+		/**
+		 * resolve servlet api resource, where e.g. 'web-app_2_3.dtd' is located
+		 *
+		 * @return input source
+		 */
+		public InputSource locateInputSource()
+		{
+			InputStream stream = Filter.class.getResourceAsStream("resources/" + name);
+
+			if (stream == null)
+				return null;
+
+			return new InputSource(stream);
+		}
+	}
+}