Author: jdonnerstag
Date: Thu Jan 13 22:45:52 2011
New Revision: 1058769

URL: http://svn.apache.org/viewvc?rev=1058769&view=rev
Log:
As suggested by Igor I've added a simple FilterFactoryManager to manage "web 
filters"

Added:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/FilterFactoryManager.java
Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/AbstractRequestWrapperFactory.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/SecuredRemoteAddressRequestWrapperFactory.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperFactory.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperTest.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java?rev=1058769&r1=1058768&r2=1058769&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
 Thu Jan 13 22:45:52 2011
@@ -33,6 +33,8 @@ import org.apache.wicket.markup.html.pag
 import org.apache.wicket.markup.html.pages.InternalErrorPage;
 import org.apache.wicket.markup.html.pages.PageExpiredErrorPage;
 import org.apache.wicket.markup.resolver.AutoLinkResolver;
+import org.apache.wicket.protocol.http.servlet.AbstractRequestWrapperFactory;
+import org.apache.wicket.protocol.http.servlet.FilterFactoryManager;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
 import org.apache.wicket.protocol.http.servlet.ServletWebResponse;
 import org.apache.wicket.request.IRequestHandler;
@@ -118,6 +120,8 @@ public abstract class WebApplication ext
 
        private IContextProvider<AjaxRequestTarget, Page> 
ajaxRequestTargetProvider;
 
+       private FilterFactoryManager filterFactoryManager;
+
        /**
         * Covariant override for easy getting the current {@link 
WebApplication} without having to cast
         * it.
@@ -364,9 +368,16 @@ public abstract class WebApplication ext
         *            the filter mapping read from web.xml
         * @return a WebRequest object
         */
-       protected WebRequest newWebRequest(final HttpServletRequest 
servletRequest,
-               final String filterPath)
+       protected WebRequest newWebRequest(HttpServletRequest servletRequest, 
final String filterPath)
        {
+               if (hasFilterFactoryManager())
+               {
+                       for (AbstractRequestWrapperFactory factory : 
getFilterFactoryManager())
+                       {
+                               servletRequest = 
factory.getWrapper(servletRequest);
+                       }
+               }
+
                return new ServletWebRequest(servletRequest, filterPath);
        }
 
@@ -742,4 +753,24 @@ public abstract class WebApplication ext
                        return new AjaxRequestTarget(context);
                }
        }
+
+       /**
+        * @return True if at least one filter factory has been added.
+        */
+       public final boolean hasFilterFactoryManager()
+       {
+               return filterFactoryManager != null;
+       }
+
+       /**
+        * @return The filter factory manager
+        */
+       public final FilterFactoryManager getFilterFactoryManager()
+       {
+               if (filterFactoryManager == null)
+               {
+                       filterFactoryManager = new FilterFactoryManager();
+               }
+               return filterFactoryManager;
+       }
 }

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/AbstractRequestWrapperFactory.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/AbstractRequestWrapperFactory.java?rev=1058769&r1=1058768&r2=1058769&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/AbstractRequestWrapperFactory.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/AbstractRequestWrapperFactory.java
 Thu Jan 13 22:45:52 2011
@@ -40,6 +40,13 @@ public abstract class AbstractRequestWra
        private boolean enabled = true;
 
        /**
+        * Construct.
+        */
+       public AbstractRequestWrapperFactory()
+       {
+       }
+
+       /**
         * 
         * @return True, if filter is enabled
         */

Added: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/FilterFactoryManager.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/FilterFactoryManager.java?rev=1058769&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/FilterFactoryManager.java
 (added)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/FilterFactoryManager.java
 Thu Jan 13 22:45:52 2011
@@ -0,0 +1,114 @@
+/*
+ * 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.protocol.http.servlet;
+
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.FilterConfig;
+
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.util.lang.Generics;
+
+/**
+ * A very simple manager for web filter (web filter factories to be exact).
+ * 
+ * @author Juergen Donnerstag
+ */
+public class FilterFactoryManager implements 
Iterable<AbstractRequestWrapperFactory>
+{
+       private List<AbstractRequestWrapperFactory> filters;
+
+       /**
+        * Construct.
+        */
+       public FilterFactoryManager()
+       {
+       }
+
+       /**
+        * Add a filter factory
+        * 
+        * @param wrapperFactory
+        * @return this
+        */
+       public final FilterFactoryManager add(final 
AbstractRequestWrapperFactory wrapperFactory)
+       {
+               if (wrapperFactory != null)
+               {
+                       if (filters == null)
+                       {
+                               filters = Generics.newArrayList(2);
+                       }
+
+                       filters.add(wrapperFactory);
+               }
+
+               return this;
+       }
+
+       /**
+        * Add a X-Forwarded web filter factory
+        * 
+        * @param config
+        *            If null, 
<code>WebApplication.get().getWicketFilter().getFilterConfig()</code>
+        *            will be called to retrieve the config.
+        * @return this
+        */
+       public final FilterFactoryManager 
addXForwardedRequestWrapperFactory(FilterConfig config)
+       {
+               if (config == null)
+               {
+                       config = 
WebApplication.get().getWicketFilter().getFilterConfig();
+               }
+
+               XForwardedRequestWrapperFactory factory = new 
XForwardedRequestWrapperFactory();
+               factory.init(config);
+
+               return add(factory);
+       }
+
+       /**
+        * Add a Secure remote address web filter factory
+        * 
+        * @param config
+        *            If null, 
<code>WebApplication.get().getWicketFilter().getFilterConfig()</code>
+        *            will be called to retrieve the config.
+        * @return this
+        */
+       public final FilterFactoryManager 
addSecuredRemoteAddressRequestWrapperFactory(
+               FilterConfig config)
+       {
+               if (config == null)
+               {
+                       config = 
WebApplication.get().getWicketFilter().getFilterConfig();
+               }
+
+               SecuredRemoteAddressRequestWrapperFactory factory = new 
SecuredRemoteAddressRequestWrapperFactory();
+               factory.init(config);
+
+               return add(factory);
+       }
+
+       /**
+        * @see java.lang.Iterable#iterator()
+        */
+       public Iterator<AbstractRequestWrapperFactory> iterator()
+       {
+               return filters.iterator();
+       }
+}

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/SecuredRemoteAddressRequestWrapperFactory.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/SecuredRemoteAddressRequestWrapperFactory.java?rev=1058769&r1=1058768&r2=1058769&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/SecuredRemoteAddressRequestWrapperFactory.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/SecuredRemoteAddressRequestWrapperFactory.java
 Thu Jan 13 22:45:52 2011
@@ -123,6 +123,13 @@ public class SecuredRemoteAddressRequest
        private Config config = new Config();
 
        /**
+        * Construct.
+        */
+       public SecuredRemoteAddressRequestWrapperFactory()
+       {
+       }
+
+       /**
         * @return SecuredRemoteAddress and XForwarded filter specific config
         */
        public final Config getConfig()
@@ -141,7 +148,7 @@ public class SecuredRemoteAddressRequest
        }
 
        /**
-        * @see 
org.apache.wicket.protocol.http.servlet.AbstractRequestWrapperFactory#getWrapper(javax.servlet.http.HttpServletRequest)
+        * {@inheritDoc}
         */
        @Override
        public HttpServletRequest getWrapper(final HttpServletRequest request)
@@ -159,9 +166,7 @@ public class SecuredRemoteAddressRequest
        }
 
        /**
-        * 
-        * @param request
-        * @return True, if a wrapper is needed
+        * {@inheritDoc}
         */
        @Override
        public boolean needsWrapper(final HttpServletRequest request)

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperFactory.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperFactory.java?rev=1058769&r1=1058768&r2=1058769&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperFactory.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperFactory.java
 Thu Jan 13 22:45:52 2011
@@ -604,6 +604,13 @@ public class XForwardedRequestWrapperFac
        private Config config = new Config();
 
        /**
+        * Construct.
+        */
+       public XForwardedRequestWrapperFactory()
+       {
+       }
+
+       /**
         * @return XForwarded filter specific config
         */
        public final Config getConfig()
@@ -622,9 +629,7 @@ public class XForwardedRequestWrapperFac
        }
 
        /**
-        * 
-        * @param request
-        * @return True, if a wrapper is needed
+        * {@inheritDoc}
         */
        @Override
        public boolean needsWrapper(final HttpServletRequest request)
@@ -655,9 +660,10 @@ public class XForwardedRequestWrapperFac
                LinkedList<String> proxiesHeaderValue = new 
LinkedList<String>();
 
                String[] remoteIPHeaderValue = 
commaDelimitedListToStringArray(request.getHeader(config.remoteIPHeader));
-               int idx;
+
                // loop on remoteIPHeaderValue to find the first trusted remote 
ip and to build the
                // proxies chain
+               int idx;
                for (idx = remoteIPHeaderValue.length - 1; idx >= 0; idx--)
                {
                        String currentRemoteIp = remoteIPHeaderValue[idx];
@@ -676,6 +682,7 @@ public class XForwardedRequestWrapperFac
                                break;
                        }
                }
+
                // continue to loop on remoteIPHeaderValue to build the new 
value of the remoteIPHeader
                LinkedList<String> newRemoteIpHeaderValue = new 
LinkedList<String>();
                for (; idx >= 0; idx--)

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperTest.java?rev=1058769&r1=1058768&r2=1058769&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/XForwardedRequestWrapperTest.java
 Thu Jan 13 22:45:52 2011
@@ -23,7 +23,6 @@ import org.apache.wicket.markup.html.bas
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
 import org.apache.wicket.protocol.http.mock.MockHttpServletResponse;
-import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.util.tester.WicketTester;
 
 /**
@@ -159,10 +158,10 @@ public class XForwardedRequestWrapperTes
 
        private class MyApplication extends MockApplication
        {
-               public XForwardedRequestWrapperFactory factory;
+               XForwardedRequestWrapperFactory factory;
 
                /**
-                * @see org.apache.wicket.protocol.http.WebApplication#init()
+                * {@inheritDoc}
                 */
                @Override
                protected void init()
@@ -171,17 +170,8 @@ public class XForwardedRequestWrapperTes
 
                        factory = new XForwardedRequestWrapperFactory();
                        factory.init(getWicketFilter().getFilterConfig());
-               }
 
-               /**
-                * @see 
org.apache.wicket.protocol.http.WebApplication#newWebRequest(javax.servlet.http.HttpServletRequest,
-                *      java.lang.String)
-                */
-               @Override
-               protected WebRequest newWebRequest(HttpServletRequest request, 
String filterPath)
-               {
-                       HttpServletRequest xRequest = 
factory.getWrapper(request);
-                       return super.newWebRequest(xRequest, filterPath);
+                       getFilterFactoryManager().add(factory);
                }
        }
 


Reply via email to