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

svn commit: r995709 - in /wicket/trunk: wicket-examples/src/main/webapp/WEB-INF/ wicket-util/src/main/java/org/apache/wicket/util/file/ wicket-util/src/test/java/org/apache/wicket/util/file/ wicket/src/main/disabled/org/apache/wicket/protocol/http/ wic...

Author: jdonnerstag
Date: Fri Sep 10 09:18:30 2010
New Revision: 995709

URL: http://svn.apache.org/viewvc?rev=995709&view=rev
Log:
fixed WICKET-3039 and added test case: WicketServlet failes to initialise with NullPointerException in WebXmlFile.getFilterPath()
Issue: WICKET-3029

Modified:
    wicket/trunk/wicket-examples/src/main/webapp/WEB-INF/web.xml
    wicket/trunk/wicket-util/src/main/java/org/apache/wicket/util/file/WebXmlFile.java
    wicket/trunk/wicket-util/src/test/java/org/apache/wicket/util/file/WebXmlFileTest.java
    wicket/trunk/wicket/src/main/disabled/org/apache/wicket/protocol/http/MockWebApplication.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/ReloadingWicketFilter.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WicketServlet.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WicketFilterTest.java

Modified: wicket/trunk/wicket-examples/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-examples/src/main/webapp/WEB-INF/web.xml?rev=995709&r1=995708&r2=995709&view=diff
==============================================================================
--- wicket/trunk/wicket-examples/src/main/webapp/WEB-INF/web.xml (original)
+++ wicket/trunk/wicket-examples/src/main/webapp/WEB-INF/web.xml Fri Sep 10 09:18:30 2010
@@ -707,18 +707,18 @@
 		  <param-value>org.apache.wicket.examples.events.EventsApplication</param-value>
 		</init-param>
 	</filter>
+	
 	<filter-mapping>
 		<filter-name>EventsApplication</filter-name>
         <url-pattern>/events/*</url-pattern>
 	</filter-mapping>
 
-
-
-
+	<!-- LISTENER -->
 	<listener>
 		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 	</listener>
 
+	<!-- SERVLET -->
 	<servlet>
 		<servlet-name>HelloWorldServlet</servlet-name>
 		<servlet-class>org.apache.wicket.examples.HelloWorldServlet</servlet-class>
@@ -729,6 +729,22 @@
 		<url-pattern>/helloworldservlet/*</url-pattern>
 	</servlet-mapping>
 
+	<servlet>
+   		<servlet-name>ServletTest</servlet-name>
+   		<servlet-class>org.apache.wicket.protocol.http.WicketServlet</servlet-class>
+   		<init-param>
+     		<param-name>applicationClassName</param-name>
+     		<param-value>org.apache.wicket.examples.helloworld.HelloWorldApplication</param-value>
+   		</init-param>
+   		<load-on-startup>0</load-on-startup>
+ 	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ServletTest</servlet-name>
+		<url-pattern>/servlettest/*</url-pattern>
+	</servlet-mapping>
+
+
 	<session-config>
 		<session-timeout>5</session-timeout>
 	</session-config>

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=995709&r1=995708&r2=995709&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 Fri Sep 10 09:18:30 2010
@@ -52,29 +52,35 @@ public class WebXmlFile
 	/**
 	 * Gets Wicket filter path via FilterConfig
 	 * 
+	 * @param isServlet
+	 *            true if Servlet, false if Filter
 	 * @param filterConfig
 	 * @return Filter path retrieved from "url-pattern". Null if not found or error occured
 	 */
-	public final String getFilterPath(final FilterConfig filterConfig)
+	public final String getFilterPath(final boolean isServlet, final FilterConfig filterConfig)
 	{
-		return getFilterPath(filterConfig.getServletContext(), filterConfig.getFilterName());
+		return getFilterPath(isServlet, filterConfig.getServletContext(),
+			filterConfig.getFilterName());
 	}
 
 	/**
 	 * Gets Wicket filter path via ServletContext and the filter name
 	 * 
+	 * @param isServlet
+	 *            true if Servlet, false if Filter
 	 * @param servletContext
 	 * @param filterName
 	 * @return Filter path retrieved from "url-pattern". Null if not found or error occured
 	 */
-	public final String getFilterPath(final ServletContext servletContext, final String filterName)
+	public final String getFilterPath(final boolean isServlet, final ServletContext servletContext,
+		final String filterName)
 	{
 		InputStream is = servletContext.getResourceAsStream("/WEB-INF/web.xml");
 		if (is != null)
 		{
 			try
 			{
-				return getFilterPath(filterName, is);
+				return getFilterPath(isServlet, filterName, is);
 			}
 			catch (ParserConfigurationException ex)
 			{
@@ -124,6 +130,8 @@ public class WebXmlFile
 	 * </code>
 	 * </pre>
 	 * 
+	 * @param isServlet
+	 *            true if Servlet, false if Filter
 	 * @param filterName
 	 * @param is
 	 *            The web.xml file
@@ -132,17 +140,31 @@ public class WebXmlFile
 	 * @throws IOException
 	 * @throws SAXException
 	 */
-	public final String getFilterPath(final String filterName, final InputStream is)
-		throws ParserConfigurationException, SAXException, IOException
+	public final String getFilterPath(final boolean isServlet, final String filterName,
+		final InputStream is) throws ParserConfigurationException, SAXException, IOException
 	{
 		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 		DocumentBuilder builder = factory.newDocumentBuilder();
 		Document document = builder.parse(is);
 
-		String mapping = "filter-mapping";
-		String name = "filter-name";
+		String tag = (isServlet ? "servlet" : "filter");
+		String mapping = tag + "-mapping";
+		String name = tag + "-name";
 
 		String urlPattern = getFilterPath(filterName, mapping, name, document.getChildNodes());
+		if (urlPattern == null)
+		{
+			if (log.isWarnEnabled())
+			{
+				log.warn("web.xml: No url-pattern found for " + tag + " with name " + filterName);
+			}
+			return null;
+		}
+		else if (log.isInfoEnabled())
+		{
+			log.info("web.xml: found " + tag + " with name " + filterName + ". url-pattern=" +
+				urlPattern);
+		}
 
 		// remove leading "/" and trailing "*"
 		return urlPattern.substring(1, urlPattern.length() - 1);

Modified: wicket/trunk/wicket-util/src/test/java/org/apache/wicket/util/file/WebXmlFileTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-util/src/test/java/org/apache/wicket/util/file/WebXmlFileTest.java?rev=995709&r1=995708&r2=995709&view=diff
==============================================================================
--- wicket/trunk/wicket-util/src/test/java/org/apache/wicket/util/file/WebXmlFileTest.java (original)
+++ wicket/trunk/wicket-util/src/test/java/org/apache/wicket/util/file/WebXmlFileTest.java Fri Sep 10 09:18:30 2010
@@ -31,29 +31,87 @@ import org.xml.sax.SAXException;
  */
 public class WebXmlFileTest extends TestCase
 {
-	public void test_1() throws ParserConfigurationException, SAXException, IOException
+	/**
+	 * 
+	 * @throws ParserConfigurationException
+	 * @throws SAXException
+	 * @throws IOException
+	 */
+	public void test_filter() throws ParserConfigurationException, SAXException, IOException
+	{
+		filterOrServlet(false);
+	}
+
+	/**
+	 * 
+	 * @throws ParserConfigurationException
+	 * @throws SAXException
+	 * @throws IOException
+	 */
+	public void test_servlet() throws ParserConfigurationException, SAXException, IOException
+	{
+		filterOrServlet(true);
+	}
+
+	/**
+	 * 
+	 * @param servlet
+	 * @throws ParserConfigurationException
+	 * @throws SAXException
+	 * @throws IOException
+	 */
+	public void filterOrServlet(boolean servlet) throws ParserConfigurationException, SAXException,
+		IOException
+	{
+		String tag = servlet ? "servlet" : "filter";
+
+		String webxml = getWebXml(tag, "/*");
+		String path = new WebXmlFile().getFilterPath(servlet, "HelloWorldApplication",
+			new ByteArrayInputStream(webxml.toString().getBytes()));
+		assertEquals("", path);
+
+		webxml = getWebXml(tag, "/test/*");
+		path = new WebXmlFile().getFilterPath(servlet, "HelloWorldApplication",
+			new ByteArrayInputStream(webxml.toString().getBytes()));
+		assertEquals("test/", path);
+
+		path = new WebXmlFile().getFilterPath(servlet, "xxx", new ByteArrayInputStream(
+			webxml.toString().getBytes()));
+		assertNull(path);
+
+		path = new WebXmlFile().getFilterPath(!servlet, "HelloWorldApplication",
+			new ByteArrayInputStream(webxml.toString().getBytes()));
+		assertNull(path);
+	}
+
+	/**
+	 * 
+	 * @param filter
+	 * @param url
+	 * @return webxml
+	 */
+	private String getWebXml(String filter, String url)
 	{
 		StringBuffer webxml = new StringBuffer();
 		webxml.append("<web-app>");
-		webxml.append("<filter>");
-		webxml.append(" <filter-name>HelloWorldApplication</filter-name>");
-		webxml.append(" <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>");
+		webxml.append("<" + filter + ">");
+		webxml.append(" <" + filter + "-name>HelloWorldApplication</" + filter + "-name>");
+		webxml.append(" <" + filter + "-class>org.apache.wicket.protocol.http.WicketFilter</" +
+			filter + "-class>");
 		webxml.append(" <init-param>");
 		webxml.append("  <param-name>applicationClassName</param-name>");
 		webxml.append("  <param-value>org.apache.wicket.examples.helloworld.HelloWorldApplication</param-value>");
 		webxml.append(" </init-param>");
-		webxml.append("</filter>");
+		webxml.append("</" + filter + ">");
 		webxml.append("");
-		webxml.append("<filter-mapping>");
-		webxml.append(" <filter-name>HelloWorldApplication</filter-name>");
-		webxml.append(" <url-pattern>/*</url-pattern>");
+		webxml.append("<" + filter + "-mapping>");
+		webxml.append(" <" + filter + "-name>HelloWorldApplication</" + filter + "-name>");
+		webxml.append(" <url-pattern>" + url + "</url-pattern>");
 		webxml.append(" <dispatcher>REQUEST</dispatcher>");
 		webxml.append(" <dispatcher>INCLUDE</dispatcher>");
-		webxml.append("</filter-mapping>");
+		webxml.append("</" + filter + "-mapping>");
 		webxml.append("</web-app>");
 
-		String path = new WebXmlFile().getFilterPath("HelloWorldApplication",
-			new ByteArrayInputStream(webxml.toString().getBytes()));
-		assertEquals("", path);
+		return webxml.toString();
 	}
 }

Modified: wicket/trunk/wicket/src/main/disabled/org/apache/wicket/protocol/http/MockWebApplication.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/disabled/org/apache/wicket/protocol/http/MockWebApplication.java?rev=995709&r1=995708&r2=995709&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/disabled/org/apache/wicket/protocol/http/MockWebApplication.java (original)
+++ wicket/trunk/wicket/src/main/disabled/org/apache/wicket/protocol/http/MockWebApplication.java Fri Sep 10 09:18:30 2010
@@ -37,6 +37,7 @@ import org.apache.wicket.Page;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.Session;
 import org.apache.wicket.markup.html.pages.ExceptionErrorPage;
+import org.apache.wicket.protocol.http.WicketFilter;
 import org.apache.wicket.protocol.http.request.WebErrorCodeResponseHandler;
 import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy;
 import org.apache.wicket.request.target.coding.WebRequestEncoder;
@@ -172,7 +173,6 @@ public class MockWebApplication
 		{
 			filter.init(new FilterConfig()
 			{
-
 				public ServletContext getServletContext()
 				{
 					return context;
@@ -185,12 +185,6 @@ public class MockWebApplication
 
 				public String getInitParameter(String name)
 				{
-					if (name.equals(WicketFilter.FILTER_MAPPING_PARAM))
-					{
-						return WicketFilter.SERVLET_PATH_HOLDER;
-						// return "/" + MockWebApplication.this.getName() +
-						// "/*";
-					}
 					return null;
 				}
 

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/ReloadingWicketFilter.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/ReloadingWicketFilter.java?rev=995709&r1=995708&r2=995709&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/ReloadingWicketFilter.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/ReloadingWicketFilter.java Fri Sep 10 09:18:30 2010
@@ -143,10 +143,11 @@ public class ReloadingWicketFilter exten
 	}
 
 	/**
-	 * @see org.apache.wicket.protocol.http.WicketFilter#init(javax.servlet.FilterConfig)
+	 * @see org.apache.wicket.protocol.http.WicketFilter#init(boolean, javax.servlet.FilterConfig)
 	 */
 	@Override
-	public void init(final FilterConfig filterConfig) throws ServletException
+	public void init(final boolean isServlet, final FilterConfig filterConfig)
+		throws ServletException
 	{
 		reloadingClassLoader.setListener(new IChangeListener()
 		{
@@ -172,6 +173,6 @@ public class ReloadingWicketFilter exten
 			}
 		});
 
-		super.init(filterConfig);
+		super.init(isServlet, filterConfig);
 	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java?rev=995709&r1=995708&r2=995709&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java Fri Sep 10 09:18:30 2010
@@ -67,8 +67,6 @@ public class WicketFilter implements Fil
 	/** The name of the context parameter that specifies application factory class */
 	public static final String APP_FACT_PARAM = "applicationFactoryClassName";
 
-	static final String SERVLET_PATH_HOLDER = "<servlet>";
-
 	// Wicket's Application object
 	private WebApplication application;
 
@@ -245,9 +243,28 @@ public class WicketFilter implements Fil
 	}
 
 	/**
+	 * If you do have a need to subclass, you may subclass {@link #init(boolean, FilterConfig)}
+	 * 
 	 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
 	 */
-	public void init(final FilterConfig filterConfig) throws ServletException
+	public final void init(final FilterConfig filterConfig) throws ServletException
+	{
+		init(false, filterConfig);
+	}
+
+	/**
+	 * Servlets and Filters are treated essentially the same with Wicket. This is the entry point
+	 * for both of them.
+	 * 
+	 * @see #init(FilterConfig)
+	 * 
+	 * @param isServlet
+	 *            True if Servlet, false of Filter
+	 * @param filterConfig
+	 * @throws ServletException
+	 */
+	public void init(final boolean isServlet, final FilterConfig filterConfig)
+		throws ServletException
 	{
 		this.filterConfig = filterConfig;
 
@@ -259,8 +276,8 @@ public class WicketFilter implements Fil
 		// Allow the filterPath to tbe preset via setFilterPath()
 		if (filterPath == null)
 		{
-			filterPath = new WebXmlFile().getFilterPath(filterConfig);
-			if (filterPath == null)
+			filterPath = new WebXmlFile().getFilterPath(isServlet, filterConfig);
+			if ((filterPath == null) && log.isInfoEnabled())
 			{
 				log.info("Unable to parse filter mapping web.xml for " +
 					filterConfig.getFilterName() + ". " + "Configure with init-param " +

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WicketServlet.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WicketServlet.java?rev=995709&r1=995708&r2=995709&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WicketServlet.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WicketServlet.java Fri Sep 10 09:18:30 2010
@@ -162,7 +162,12 @@ public class WicketServlet extends HttpS
 		}
 	}
 
-	private static String getURL(HttpServletRequest httpServletRequest)
+	/**
+	 * 
+	 * @param httpServletRequest
+	 * @return URL
+	 */
+	private static String getURL(final HttpServletRequest httpServletRequest)
 	{
 		/*
 		 * Servlet 2.3 specification :
@@ -183,8 +188,7 @@ public class WicketServlet extends HttpS
 			url += pathInfo;
 		}
 
-		final String queryString = httpServletRequest.getQueryString();
-
+		String queryString = httpServletRequest.getQueryString();
 		if (queryString != null)
 		{
 			url += ("?" + queryString);
@@ -199,7 +203,13 @@ public class WicketServlet extends HttpS
 		return url;
 	}
 
-	private void fallback(HttpServletRequest request, HttpServletResponse response)
+	/**
+	 * 
+	 * @param request
+	 * @param response
+	 * @throws IOException
+	 */
+	private void fallback(final HttpServletRequest request, final HttpServletResponse response)
 		throws IOException
 	{
 		// The ServletWebRequest is created here to avoid code duplication. The getURL call doesn't
@@ -251,7 +261,7 @@ public class WicketServlet extends HttpS
 	public void init() throws ServletException
 	{
 		wicketFilter = newWicketFilter();
-		wicketFilter.init(new FilterConfig()
+		wicketFilter.init(true, new FilterConfig()
 		{
 			/**
 			 * @see javax.servlet.FilterConfig#getServletContext()
@@ -273,12 +283,8 @@ public class WicketServlet extends HttpS
 			/**
 			 * @see javax.servlet.FilterConfig#getInitParameter(java.lang.String)
 			 */
-			public String getInitParameter(String name)
+			public String getInitParameter(final String name)
 			{
-				if (WicketFilter.FILTER_MAPPING_PARAM.equals(name))
-				{
-					return WicketFilter.SERVLET_PATH_HOLDER;
-				}
 				return WicketServlet.this.getInitParameter(name);
 			}
 
@@ -309,5 +315,4 @@ public class WicketServlet extends HttpS
 		wicketFilter.destroy();
 		wicketFilter = null;
 	}
-
 }

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WicketFilterTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WicketFilterTest.java?rev=995709&r1=995708&r2=995709&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WicketFilterTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/protocol/http/WicketFilterTest.java Fri Sep 10 09:18:30 2010
@@ -143,7 +143,7 @@ public class WicketFilterTest extends Te
 	{
 		try
 		{
-			return new WebXmlFile().getFilterPath(string, in);
+			return new WebXmlFile().getFilterPath(false, string, in);
 		}
 		catch (ParserConfigurationException ex)
 		{