Author: almaw
Date: Mon Jun 18 02:12:33 2007
New Revision: 548268

URL: http://svn.apache.org/viewvc?view=rev&rev=548268
Log:
Don't just naïvely catch all the exceptions and throw them away (what if we run 
OutOfMemory?).
Fix WICKET-416 - handle root mapping properly.

Modified:
    
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java

Modified: 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java?view=diff&rev=548268&r1=548267&r2=548268
==============================================================================
--- 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
 (original)
+++ 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
 Mon Jun 18 02:12:33 2007
@@ -19,6 +19,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
+import java.text.ParseException;
 import java.util.ArrayList;
 
 import javax.servlet.Filter;
@@ -42,6 +43,7 @@
 import org.apache.wicket.session.ISessionStore;
 import org.apache.wicket.settings.IRequestCycleSettings;
 import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.time.Time;
 import org.slf4j.Logger;
@@ -356,7 +358,8 @@
 
                        // Try to configure filterPath from web.xml if it's not 
specified as
                        // an init-param.
-                       if 
(filterConfig.getInitParameter(WicketFilter.FILTER_MAPPING_PARAM) == null)
+                       String filterMapping = 
filterConfig.getInitParameter(WicketFilter.FILTER_MAPPING_PARAM);
+                       if (filterMapping == null || 
filterMapping.equals(WicketFilter.SERVLET_PATH_HOLDER))
                        {
                                InputStream is = 
filterConfig.getServletContext().getResourceAsStream(
                                                "/WEB-INF/web.xml");
@@ -366,18 +369,21 @@
                                        {
                                                filterPath = 
getFilterPath(filterConfig.getFilterName(), is);
                                        }
-                                       catch (Exception e)
+                                       catch (ServletException e)
                                        {
-                                               log.debug("Error parsing 
web.xml", e);
-                                               // Swallow IOException or 
SecurityException or similar,
-                                               // and log.info below.
+                                               log.error("Error reading 
servlet/filter path from web.xml", e);
+                                       }
+                                       catch (SecurityException e)
+                                       {
+                                               // Swallow this at INFO.
+                                               log.info("Couldn't read web.xml 
to automatically pick up servlet/filter path: " + e.getMessage());
+                                       }
+                                       if (filterPath == null)
+                                       {
+                                               log.info("Unable to parse 
filter mapping web.xml for "
+                                                               + 
filterConfig.getFilterName() + ". " + "Configure with init-param "
+                                                               + 
FILTER_MAPPING_PARAM + " if it is not \"/*\".");
                                        }
-                               }
-                               if (filterPath == null)
-                               {
-                                       log.info("Unable to parse filter 
mapping web.xml for "
-                                                       + 
filterConfig.getFilterName() + ". " + "Configure with init-param "
-                                                       + FILTER_MAPPING_PARAM 
+ " if it is not \"/*\".");
                                }
                        }
 
@@ -424,6 +430,9 @@
 
        private String getFilterPath(String filterName, InputStream is) throws 
ServletException
        {
+               String prefix = servletMode ? "servlet" : "filter";
+               String mapping = prefix + "-mapping";
+               String name = prefix + "-name";
 
                // Filter mappings look like this:
                //                
@@ -434,16 +443,16 @@
                        ArrayList urlPatterns = new ArrayList();
                        XmlPullParser parser = new XmlPullParser();
                        parser.parse(is);
-
+                       
                        while (true)
-                       {
+                       {                               
                                XmlTag elem;
                                do
                                {
                                        elem = (XmlTag)parser.nextTag();
                                }
                                while (elem != null
-                                               && 
(!(elem.getName().equals("filter-mapping") && elem.isOpen())));
+                                               && 
(!(elem.getName().equals(mapping) && elem.isOpen())));
 
                                if (elem == null)
                                        break;
@@ -457,7 +466,7 @@
                                        {
                                                parser.setPositionMarker();
                                        }
-                                       else if (elem.isClose() && 
elem.getName().equals("filter-name"))
+                                       else if (elem.isClose() && 
elem.getName().equals(name))
                                        {
                                                encounteredFilterName = 
parser.getInputFromPositionMarker(elem.getPos())
                                                                .toString();
@@ -473,6 +482,8 @@
                                        urlPatterns.add(urlPattern);
                        }
 
+                       String prefixUppered = 
Character.toUpperCase(prefix.charAt(0)) + prefix.substring(1);
+                       
                        // By the time we get here, we have a list of 
urlPatterns we match
                        // this filter against.
                        // In all likelihood, we will only have one. If we have 
none, we
@@ -481,8 +492,8 @@
                        // 302 redirects that require absolute URLs.
                        if (urlPatterns.size() == 0)
                        {
-                               throw new ServletException(
-                                               "Error initialising 
WicketFilter - you have no filter-mapping element with a url-pattern that uses 
filter: "
+                               throw new IllegalArgumentException(
+                                               "Error initialising Wicket" + 
prefixUppered + " - you have no <" + mapping + "> element with a url-pattern 
that uses " + prefix + ": "
                                                                + filterName);
                        }
                        String urlPattern = (String)urlPatterns.get(0);
@@ -490,16 +501,23 @@
                        // Check for leading '/' and trailing '*'.
                        if (!urlPattern.startsWith("/") || 
!urlPattern.endsWith("*"))
                        {
-                               throw new ServletException(
-                                               "Filter mappings for Wicket 
filter must start with '/' and end with '*'.");
+                               throw new IllegalArgumentException("<" + 
mapping + "> for Wicket" + prefixUppered + " \"" + filterName + "\" must start 
with '/' and end with '*'.");
                        }
 
                        // Strip trailing '*' and leading '/'.
                        return urlPattern.substring(1, urlPattern.length() - 1);
                }
-               catch (Exception e)
+               catch (IOException e)
+               {
+                       throw new ServletException("Error finding <" + prefix + 
"> " + filterName + " in web.xml", e);
+               }
+               catch (ParseException e)
+               {
+                       throw new ServletException("Error finding <" + prefix + 
"> " + filterName + " in web.xml", e);
+               }
+               catch (ResourceStreamNotFoundException e)
                {
-                       throw new ServletException("Error finding filter " + 
filterName + " in web.xml", e);
+                       throw new ServletException("Error finding <" + prefix + 
"> " + filterName + " in web.xml", e);
                }
        }
 


Reply via email to