You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2014/01/20 11:40:08 UTC

svn commit: r1559665 [1/2] - in /sling/whiteboard/fmeschbe/parameters: engine/ engine/src/main/java/org/apache/sling/engine/impl/ engine/src/main/java/org/apache/sling/engine/impl/adapter/ engine/src/main/java/org/apache/sling/engine/impl/helper/ engin...

Author: fmeschbe
Date: Mon Jan 20 10:40:07 2014
New Revision: 1559665

URL: http://svn.apache.org/r1559665
Log:
Request Parameter Support prototype

- Create new parameters bundle
- Move parameters package (inkl tests) from engine to parameters
- Extract ParameterSupport API from ParameterSupport class
- Update to Servlet API 3.0
  (still need to check on whether and how to deploy on
   Servlet API 2.5 platform)
- Add support to get list of request parameter name-value pairs
  in order declared in the query string (first) and POST
  body (for both URL encoded and Multipart POSTs)
- Decode query and URL encoded POST parameters in Util class
  to have the correct parameter order preserved

Added:
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/engine/
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/engine/impl/
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/engine/impl/parameters/
      - copied from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java   (with props)
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java   (with props)
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/SlingUnsupportedEncodingException.java
      - copied, changed from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/SlingUnsupportedEncodingException.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java
      - copied, changed from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/AbstractRequestParameter.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java
      - copied, changed from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ContainerRequestParameter.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java
      - copied, changed from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/MultipartRequestParameter.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterEntryImpl.java   (with props)
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java
      - copied, changed from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterMap.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java
      - copied, changed from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterSupport.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/SlingPart.java   (with props)
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java
      - copied, changed from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/Util.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/package-info.java   (with props)
    sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/
    sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/
      - copied from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/test/java/org/apache/sling/engine/impl/parameters/
Removed:
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/
    sling/whiteboard/fmeschbe/parameters/engine/src/test/java/org/apache/sling/engine/impl/parameters/
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/engine/impl/parameters/AbstractRequestParameter.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/engine/impl/parameters/ContainerRequestParameter.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/engine/impl/parameters/MultipartRequestParameter.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/engine/impl/parameters/ParameterMap.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/engine/impl/parameters/ParameterSupport.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/engine/impl/parameters/SlingUnsupportedEncodingException.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/engine/impl/parameters/Util.java
Modified:
    sling/whiteboard/fmeschbe/parameters/engine/pom.xml
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/adapter/SlingServletRequestAdapter.java
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapper.java
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingFilterConfig.java
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/log/CustomLogFormat.java
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/log/RequestLoggerResponse.java
    sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/ContainerRequestParameterTest.java
    sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/UtilTest.java

Modified: sling/whiteboard/fmeschbe/parameters/engine/pom.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/pom.xml?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/pom.xml (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/pom.xml Mon Jan 20 10:40:07 2014
@@ -60,21 +60,16 @@
                 <configuration>
                     <instructions>
                         <Export-Package>
-                            org.apache.sling.engine;version=2.1,
-                            org.apache.sling.engine.servlets;version=2.0.6,
-                            org.apache.sling.engine.jmx;version=1.0
+                            org.apache.sling.engine;version=2.1;provide:=true,
+                            org.apache.sling.engine.servlets;version=2.0.6;provide:=true,
+                            org.apache.sling.engine.jmx;version=1.0;provide:=true
                         </Export-Package>
                         <Private-Package>
                             org.apache.sling.engine.impl,
                             org.apache.sling.engine.impl.*
                         </Private-Package>
                         <Import-Package>
-                            org.apache.commons.fileupload;version=1.2,
-                            org.apache.commons.fileupload.disk;version=1.2,
-                            org.apache.commons.fileupload.portlet;version=1.2,
-                            org.apache.commons.fileupload.servlet;version=1.2,
                             org.osgi.service.useradmin;
-                            javax.portlet;
                             org.apache.commons.math.*;resolution:=optional,
                             *
                         </Import-Package>
@@ -105,6 +100,12 @@
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.parameters</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.settings</artifactId>
             <version>1.0.0</version>
             <scope>provided</scope>
@@ -133,18 +134,6 @@
             <version>2.5</version>
         </dependency>
         <dependency>
-            <groupId>commons-collections</groupId>
-            <artifactId>commons-collections</artifactId>
-            <version>3.2.1</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>commons-fileupload</groupId>
-            <artifactId>commons-fileupload</artifactId>
-            <version>1.2.2</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>

Modified: sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java Mon Jan 20 10:40:07 2014
@@ -20,16 +20,13 @@ package org.apache.sling.engine.impl;
 
 import java.io.IOException;
 import java.net.URL;
-import java.util.Enumeration;
-import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.sling.auth.core.AuthenticationSupport;
 import org.apache.sling.commons.mime.MimeTypeService;
-import org.apache.sling.engine.impl.parameters.ParameterSupport;
+import org.apache.sling.parameters.ParameterSupport;
 import org.osgi.service.http.HttpContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -118,32 +115,8 @@ class SlingHttpContext implements HttpCo
         if (authenticator != null) {
 
             // SLING-559: ensure correct parameter handling according to
-            // ParameterSupport
-            request = new HttpServletRequestWrapper(request) {
-                @Override
-                public String getParameter(String name) {
-                    return getParameterSupport().getParameter(name);
-                }
-
-                @Override
-                public Map<String, String[]> getParameterMap() {
-                    return getParameterSupport().getParameterMap();
-                }
-
-                @Override
-                public Enumeration<String> getParameterNames() {
-                    return getParameterSupport().getParameterNames();
-                }
-
-                @Override
-                public String[] getParameterValues(String name) {
-                    return getParameterSupport().getParameterValues(name);
-                }
-
-                private ParameterSupport getParameterSupport() {
-                    return ParameterSupport.getInstance(getRequest());
-                }
-            };
+            // ParameterSupportImpl
+            request = ParameterSupport.getParameterSupportRequestWrapper(request);
 
             return authenticator.handleSecurity(request, response);
 

Modified: sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java Mon Jan 20 10:40:07 2014
@@ -24,6 +24,7 @@ import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.security.Principal;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
@@ -36,6 +37,7 @@ import javax.servlet.ServletInputStream;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.Part;
 
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.request.RequestDispatcherOptions;
@@ -46,10 +48,10 @@ import org.apache.sling.api.request.Requ
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.engine.impl.helper.NullResourceBundle;
-import org.apache.sling.engine.impl.parameters.ParameterSupport;
 import org.apache.sling.engine.impl.request.ContentData;
 import org.apache.sling.engine.impl.request.RequestData;
 import org.apache.sling.engine.impl.request.SlingRequestDispatcher;
+import org.apache.sling.parameters.ParameterSupport;
 import org.osgi.service.http.HttpContext;
 import org.osgi.service.useradmin.Authorization;
 
@@ -164,6 +166,20 @@ public class SlingHttpServletRequestImpl
     }
 
     /**
+     * @see HttpServletRequestWrapper#getPart(String)
+     */
+    public Part getPart(String name) {
+        return this.getParameterSupport().getPart(name);
+    }
+
+    /**
+     * @see HttpServletRequestWrapper#getParts()
+     */
+    public Collection<Part> getParts() {
+        return this.getParameterSupport().getParts();
+    }
+
+    /**
      * @see org.apache.sling.api.SlingHttpServletRequest#getRequestParameter(java.lang.String)
      */
     public RequestParameter getRequestParameter(String name) {

Modified: sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java Mon Jan 20 10:40:07 2014
@@ -56,11 +56,11 @@ import org.apache.sling.engine.SlingRequ
 import org.apache.sling.engine.impl.filter.ServletFilterManager;
 import org.apache.sling.engine.impl.helper.RequestListenerManager;
 import org.apache.sling.engine.impl.helper.SlingServletContext;
-import org.apache.sling.engine.impl.parameters.ParameterSupport;
 import org.apache.sling.engine.impl.request.RequestData;
 import org.apache.sling.engine.impl.request.RequestHistoryConsolePlugin;
 import org.apache.sling.engine.jmx.RequestProcessorMBean;
 import org.apache.sling.engine.servlets.ErrorHandler;
+import org.apache.sling.parameters.ParameterSupport;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceRegistration;

Modified: sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/adapter/SlingServletRequestAdapter.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/adapter/SlingServletRequestAdapter.java?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/adapter/SlingServletRequestAdapter.java (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/adapter/SlingServletRequestAdapter.java Mon Jan 20 10:40:07 2014
@@ -101,12 +101,12 @@ public class SlingServletRequestAdapter 
     }
 
     @Override
-    public Enumeration<?> getHeaderNames() {
+    public Enumeration<String> getHeaderNames() {
         return request.getHeaderNames();
     }
 
     @Override
-    public Enumeration<?> getHeaders(String name) {
+    public Enumeration<String> getHeaders(String name) {
         return request.getHeaders(name);
     }
 
@@ -207,7 +207,7 @@ public class SlingServletRequestAdapter 
     }
 
     @Override
-    public Enumeration<?> getAttributeNames() {
+    public Enumeration<String> getAttributeNames() {
         return request.getAttributeNames();
     }
 
@@ -237,7 +237,7 @@ public class SlingServletRequestAdapter 
     }
 
     @Override
-    public Enumeration<?> getLocales() {
+    public Enumeration<Locale> getLocales() {
         return request.getLocales();
     }
 
@@ -247,12 +247,12 @@ public class SlingServletRequestAdapter 
     }
 
     @Override
-    public Map<?, ?> getParameterMap() {
+    public Map<String, String[]> getParameterMap() {
         return request.getParameterMap();
     }
 
     @Override
-    public Enumeration<?> getParameterNames() {
+    public Enumeration<String> getParameterNames() {
         return request.getParameterNames();
     }
 

Modified: sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapper.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapper.java?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapper.java (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/ExternalServletContextWrapper.java Mon Jan 20 10:40:07 2014
@@ -21,16 +21,25 @@ import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Enumeration;
+import java.util.EventListener;
+import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.Filter;
+import javax.servlet.FilterRegistration;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.Servlet;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+import javax.servlet.ServletRegistration.Dynamic;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletRequestWrapper;
 import javax.servlet.ServletResponse;
 import javax.servlet.ServletResponseWrapper;
+import javax.servlet.SessionCookieConfig;
+import javax.servlet.SessionTrackingMode;
+import javax.servlet.descriptor.JspConfigDescriptor;
 
 import org.apache.sling.engine.impl.SlingHttpServletRequestImpl;
 import org.apache.sling.engine.impl.SlingHttpServletResponseImpl;
@@ -201,4 +210,136 @@ class ExternalServletContextWrapper impl
 
     }
 
+    // New Servlet API 3.0 methods
+
+    public int getEffectiveMajorVersion() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public int getEffectiveMinorVersion() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public boolean setInitParameter(String name, String value) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public Dynamic addServlet(String servletName, String className) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Dynamic addServlet(String servletName, Servlet servlet) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public ServletRegistration getServletRegistration(String servletName) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Map<String, ? extends ServletRegistration> getServletRegistrations() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Filter filter) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public FilterRegistration getFilterRegistration(String filterName) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Map<String, ? extends FilterRegistration> getFilterRegistrations() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public SessionCookieConfig getSessionCookieConfig() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public Set<SessionTrackingMode> getDefaultSessionTrackingModes() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void addListener(String className) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public <T extends EventListener> void addListener(T t) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void addListener(Class<? extends EventListener> listenerClass) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public JspConfigDescriptor getJspConfigDescriptor() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public ClassLoader getClassLoader() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void declareRoles(String... roleNames) {
+        // TODO Auto-generated method stub
+
+    }
+
 }

Modified: sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingFilterConfig.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingFilterConfig.java?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingFilterConfig.java (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingFilterConfig.java Mon Jan 20 10:40:07 2014
@@ -76,8 +76,8 @@ public class SlingFilterConfig implement
     /**
      * @see javax.servlet.FilterConfig#getInitParameterNames()
      */
-    public Enumeration<?> getInitParameterNames() {
-        List<?> keys = Arrays.asList(reference.getPropertyKeys());
+    public Enumeration<String> getInitParameterNames() {
+        List<String> keys = Arrays.asList(reference.getPropertyKeys());
         return Collections.enumeration(keys);
     }
 

Modified: sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/helper/SlingServletContext.java Mon Jan 20 10:40:07 2014
@@ -24,12 +24,22 @@ import java.net.URL;
 import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Enumeration;
+import java.util.EventListener;
 import java.util.Hashtable;
+import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.Filter;
+import javax.servlet.FilterRegistration;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.Servlet;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+import javax.servlet.ServletRegistration.Dynamic;
+import javax.servlet.SessionCookieConfig;
+import javax.servlet.SessionTrackingMode;
+import javax.servlet.descriptor.JspConfigDescriptor;
 
 import org.apache.sling.engine.impl.SlingMainServlet;
 import org.apache.sling.engine.impl.request.SlingRequestDispatcher;
@@ -423,14 +433,14 @@ public class SlingServletContext impleme
 
     /** Returns an empty enumeration as defined in Servlet API 2.4 */
     @Deprecated
-    public Enumeration<?> getServletNames() {
-        return Collections.enumeration(Collections.emptyList());
+    public Enumeration<String> getServletNames() {
+        return Collections.enumeration(Collections.<String>emptyList());
     }
 
     /** Returns an empty enumeration as defined in Servlet API 2.4 */
     @Deprecated
-    public Enumeration<?> getServlets() {
-        return Collections.enumeration(Collections.emptyList());
+    public Enumeration<Servlet> getServlets() {
+        return Collections.enumeration(Collections.<Servlet>emptyList());
     }
 
     // ---------- internal -----------------------------------------------------
@@ -442,4 +452,136 @@ public class SlingServletContext impleme
     private ServletContext getServletContext() {
         return slingMainServlet.getServletContext();
     }
+
+    // New Servlet API 3.0 methods
+
+    public int getEffectiveMajorVersion() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public int getEffectiveMinorVersion() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public boolean setInitParameter(String name, String value) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public Dynamic addServlet(String servletName, String className) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Dynamic addServlet(String servletName, Servlet servlet) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public ServletRegistration getServletRegistration(String servletName) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Map<String, ? extends ServletRegistration> getServletRegistrations() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Filter filter) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public FilterRegistration getFilterRegistration(String filterName) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Map<String, ? extends FilterRegistration> getFilterRegistrations() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public SessionCookieConfig getSessionCookieConfig() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public Set<SessionTrackingMode> getDefaultSessionTrackingModes() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void addListener(String className) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public <T extends EventListener> void addListener(T t) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void addListener(Class<? extends EventListener> listenerClass) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public JspConfigDescriptor getJspConfigDescriptor() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public ClassLoader getClassLoader() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void declareRoles(String... roleNames) {
+        // TODO Auto-generated method stub
+
+    }
 }

Modified: sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/log/CustomLogFormat.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/log/CustomLogFormat.java?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/log/CustomLogFormat.java (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/log/CustomLogFormat.java Mon Jan 20 10:40:07 2014
@@ -937,7 +937,7 @@ class CustomLogFormat {
         }
 
         protected String getValue(RequestLoggerResponse response) {
-            return escape(response.getHeaders(this.headerName));
+            return escape(response.getHeadersString(this.headerName));
         }
     }
 }

Modified: sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/log/RequestLoggerResponse.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/log/RequestLoggerResponse.java?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/log/RequestLoggerResponse.java (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/log/RequestLoggerResponse.java Mon Jan 20 10:40:07 2014
@@ -271,7 +271,7 @@ class RequestLoggerResponse extends Http
         return (this.cookies != null) ? (Cookie) this.cookies.get(name) : null;
     }
 
-    public String getHeaders(String name) {
+    public String getHeadersString(String name) {
         // normalize header name to lower case to support case-insensitive
         // headers
         name = name.toLowerCase();

Modified: sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java?rev=1559665&r1=1559664&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java (original)
+++ sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java Mon Jan 20 10:40:07 2014
@@ -52,7 +52,7 @@ import org.apache.sling.engine.impl.Slin
 import org.apache.sling.engine.impl.SlingRequestProcessorImpl;
 import org.apache.sling.engine.impl.adapter.SlingServletRequestAdapter;
 import org.apache.sling.engine.impl.adapter.SlingServletResponseAdapter;
-import org.apache.sling.engine.impl.parameters.ParameterSupport;
+import org.apache.sling.parameters.ParameterSupport;
 
 /**
  * The <code>RequestData</code> class provides access to objects which are set
@@ -108,7 +108,7 @@ public class RequestData {
 
     /** The SlingMainServlet used for request dispatching and other stuff */
     private final SlingRequestProcessorImpl slingRequestProcessor;
-    
+
     private final long startTimestamp;
 
     /** The original servlet Servlet Request Object */
@@ -180,7 +180,7 @@ public class RequestData {
     public RequestData(SlingRequestProcessorImpl slingRequestProcessor,
             HttpServletRequest request, HttpServletResponse response) {
         this.startTimestamp = System.currentTimeMillis();
-        
+
         this.slingRequestProcessor = slingRequestProcessor;
 
         this.servletRequest = request;
@@ -550,15 +550,15 @@ public class RequestData {
     public RequestProgressTracker getRequestProgressTracker() {
         return requestProgressTracker;
     }
-    
+
     public int getPeakRecusionDepth() {
         return peakRecusionDepth;
     }
-    
+
     public int getServletCallCount() {
         return servletCallCounter;
     }
-    
+
     public long getElapsedTimeMsec() {
         return System.currentTimeMillis() - startTimestamp;
     }

Added: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java?rev=1559665&view=auto
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java (added)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java Mon Jan 20 10:40:07 2014
@@ -0,0 +1,32 @@
+/*
+ * 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.sling.parameters;
+
+import org.apache.sling.api.request.RequestParameter;
+
+import aQute.bnd.annotation.ProviderType;
+
+@ProviderType
+public interface ParameterEntry {
+
+    String getName();
+
+    RequestParameter getParameter();
+
+}

Propchange: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java?rev=1559665&view=auto
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java (added)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java Mon Jan 20 10:40:07 2014
@@ -0,0 +1,129 @@
+/*
+ * 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.sling.parameters;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.Part;
+
+import org.apache.sling.api.request.RequestParameter;
+import org.apache.sling.api.request.RequestParameterMap;
+import org.apache.sling.parameters.impl.ParameterSupportImpl;
+import org.apache.sling.parameters.impl.Util;
+
+import aQute.bnd.annotation.ProviderType;
+
+@ProviderType
+public abstract class ParameterSupport {
+
+    private static final String ATTR_NAME = ParameterSupportImpl.class.getName();
+
+    public static ParameterSupport getInstance(ServletRequest servletRequest) {
+        ParameterSupport instance = (ParameterSupport) servletRequest.getAttribute(ATTR_NAME);
+        if (instance == null) {
+            instance = new ParameterSupportImpl((HttpServletRequest) servletRequest);
+            servletRequest.setAttribute(ATTR_NAME, instance);
+        }
+        return instance;
+    }
+
+    /**
+     * Sets the default encoding used to decode request parameters if the
+     * <code>_charset_</code> request parameter is not set (or is not set to an
+     * encoding supported by the platform). By default this default encoding is
+     * <code>ISO-8859-1</code>. For applications which alway use the same
+     * encoding this default can be changed.
+     *
+     * @param encoding The default encoding to be used. If this encoding is
+     *            <code>null</code> or not supported by the platform the current
+     *            default encoding remains unchanged.
+     */
+    public static void setDefaultParameterEncoding(final String encoding) {
+        Util.setDefaultFixEncoding(encoding);
+    }
+
+    public static HttpServletRequestWrapper getParameterSupportRequestWrapper(final HttpServletRequest request) {
+        return new HttpServletRequestWrapper(request) {
+            @Override
+            public String getParameter(String name) {
+                return getParameterSupport().getParameter(name);
+            }
+
+            @Override
+            public Map<String, String[]> getParameterMap() {
+                return getParameterSupport().getParameterMap();
+            }
+
+            @Override
+            public Enumeration<String> getParameterNames() {
+                return getParameterSupport().getParameterNames();
+            }
+
+            @Override
+            public String[] getParameterValues(String name) {
+                return getParameterSupport().getParameterValues(name);
+            }
+
+            @Override
+            public Part getPart(String name) throws IOException, ServletException {
+                return getParameterSupport().getPart(name);
+            }
+
+            @Override
+            public Collection<Part> getParts() throws IOException, ServletException {
+                return getParameterSupport().getParts();
+            }
+
+            private ParameterSupport getParameterSupport() {
+                return ParameterSupport.getInstance(getRequest());
+            }
+        };
+    }
+
+    public abstract boolean requestDataUsed();
+
+    public abstract String getParameter(String name);
+
+    public abstract String[] getParameterValues(String name);
+
+    public abstract Map<String, String[]> getParameterMap();
+
+    public abstract Enumeration<String> getParameterNames();
+
+    public abstract RequestParameter getRequestParameter(String name);
+
+    public abstract RequestParameter[] getRequestParameters(String name);
+
+    public abstract Part getPart(String name);
+
+    public abstract Collection<Part> getParts();
+
+    public abstract RequestParameterMap getRequestParameterMap();
+
+    public abstract List<ParameterEntry> getRequestParameterList();
+
+}
\ No newline at end of file

Propchange: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/SlingUnsupportedEncodingException.java (from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/SlingUnsupportedEncodingException.java)
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/SlingUnsupportedEncodingException.java?p2=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/SlingUnsupportedEncodingException.java&p1=sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/SlingUnsupportedEncodingException.java&r1=1559659&r2=1559665&rev=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/SlingUnsupportedEncodingException.java (original)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/SlingUnsupportedEncodingException.java Mon Jan 20 10:40:07 2014
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.engine.impl.parameters;
+package org.apache.sling.parameters;
 
 import java.io.UnsupportedEncodingException;
 
@@ -26,7 +26,7 @@ public class SlingUnsupportedEncodingExc
 
     private static final long serialVersionUID = -4482276105859280247L;
 
-    SlingUnsupportedEncodingException(UnsupportedEncodingException uee) {
+    public SlingUnsupportedEncodingException(UnsupportedEncodingException uee) {
         super(uee);
     }
 

Copied: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java (from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/AbstractRequestParameter.java)
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java?p2=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java&p1=sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/AbstractRequestParameter.java&r1=1559659&r2=1559665&rev=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/AbstractRequestParameter.java (original)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java Mon Jan 20 10:40:07 2014
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.engine.impl.parameters;
+package org.apache.sling.parameters.impl;
 
 import org.apache.sling.api.request.RequestParameter;
 
@@ -32,7 +32,7 @@ abstract class AbstractRequestParameter 
         this.encoding = encoding;
     }
 
-    String getEncoding() {
+    public String getEncoding() {
         return this.encoding;
     }
 

Copied: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java (from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ContainerRequestParameter.java)
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java?p2=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java&p1=sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ContainerRequestParameter.java&r1=1559659&r2=1559665&rev=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ContainerRequestParameter.java (original)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java Mon Jan 20 10:40:07 2014
@@ -16,12 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.engine.impl.parameters;
+package org.apache.sling.parameters.impl;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 
+import org.apache.sling.parameters.SlingUnsupportedEncodingException;
+
 /**
  * The <code>ContainerRequestParameter</code> TODO
  */
@@ -31,14 +33,14 @@ public class ContainerRequestParameter e
 
     private byte[] content;
 
-    ContainerRequestParameter(String value, String encoding) {
+    public ContainerRequestParameter(String value, String encoding) {
         super(encoding);
         this.value = value;
         this.content = null;
     }
 
     @Override
-    void setEncoding(String encoding) {
+    public void setEncoding(String encoding) {
         // recode this parameter by encoding the string with the current
         // encoding and decode the bytes with the encoding
         try {

Copied: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java (from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/MultipartRequestParameter.java)
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java?p2=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java&p1=sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/MultipartRequestParameter.java&r1=1559659&r2=1559665&rev=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/MultipartRequestParameter.java (original)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java Mon Jan 20 10:40:07 2014
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.engine.impl.parameters;
+package org.apache.sling.parameters.impl;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -27,7 +27,7 @@ import org.apache.commons.fileupload.Fil
 /**
  * The <code>MultipartRequestParameter</code> TODO
  */
-class MultipartRequestParameter extends AbstractRequestParameter {
+public class MultipartRequestParameter extends AbstractRequestParameter {
 
     private final FileItem delegatee;
 
@@ -38,7 +38,7 @@ class MultipartRequestParameter extends 
     /**
      *
      */
-    MultipartRequestParameter(FileItem delegatee) {
+    public MultipartRequestParameter(FileItem delegatee) {
         super(null);
         this.delegatee = delegatee;
     }
@@ -47,6 +47,10 @@ class MultipartRequestParameter extends 
         this.delegatee.delete();
     }
 
+    FileItem getFileItem() {
+        return this.delegatee;
+    }
+
     @Override
     void setEncoding(String encoding) {
         super.setEncoding(encoding);

Added: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterEntryImpl.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterEntryImpl.java?rev=1559665&view=auto
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterEntryImpl.java (added)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterEntryImpl.java Mon Jan 20 10:40:07 2014
@@ -0,0 +1,43 @@
+/*
+ * 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.sling.parameters.impl;
+
+import org.apache.sling.api.request.RequestParameter;
+import org.apache.sling.parameters.ParameterEntry;
+
+class ParameterEntryImpl implements ParameterEntry {
+
+    final String name;
+
+    final RequestParameter parameter;
+
+    ParameterEntryImpl(final String name, final RequestParameter parameter) {
+        this.name = name;
+        this.parameter = parameter;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public RequestParameter getParameter() {
+        return parameter;
+    }
+
+}

Propchange: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterEntryImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java (from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterMap.java)
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java?p2=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java&p1=sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterMap.java&r1=1559659&r2=1559665&rev=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterMap.java (original)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java Mon Jan 20 10:40:07 2014
@@ -16,27 +16,32 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.engine.impl.parameters;
+package org.apache.sling.parameters.impl;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
+import javax.servlet.http.Part;
+
 import org.apache.sling.api.request.RequestParameter;
 import org.apache.sling.api.request.RequestParameterMap;
+import org.apache.sling.parameters.ParameterEntry;
 
 /**
  * The <code>ParameterMap</code> TODO
  */
-class ParameterMap extends LinkedHashMap<String, RequestParameter[]> implements
+public class ParameterMap extends LinkedHashMap<String, RequestParameter[]> implements
         RequestParameterMap {
 
     private static final long serialVersionUID = -3984737679401682171L;
 
     private Map<String, String[]> stringParameterMap;
 
-    ParameterMap() {
-    }
+    private List<ParameterEntry> requestParameters = new ArrayList<ParameterEntry>();
 
     public RequestParameter getValue(String name) {
         RequestParameter[] params = getValues(name);
@@ -52,18 +57,21 @@ class ParameterMap extends LinkedHashMap
         super.put(newName, params);
     }
 
-    void addParameter(String name, RequestParameter parameter) {
-        Object current = this.get(name);
+    public void addParameter(String name, RequestParameter parameter, boolean prependNew) {
+        // map of parameters
+        RequestParameter[] current = this.get(name);
         if (current == null) {
             super.put(name, new RequestParameter[] { parameter });
         } else {
-            RequestParameter[] ppo = (RequestParameter[]) current;
-            RequestParameter[] ppn = new RequestParameter[ppo.length + 1];
-            System.arraycopy(ppo, 0, ppn, 0, ppo.length);
-            ppn[ppo.length] = parameter;
+            RequestParameter[] ppn = new RequestParameter[current.length + 1];
+            System.arraycopy(current, 0, ppn, prependNew ? 1 : 0, current.length);
+            ppn[prependNew ? 0 : current.length] = parameter;
 
             super.put(name, ppn);
         }
+
+        // list of parameters
+        this.requestParameters.add(new ParameterEntryImpl(name, parameter));
     }
 
     void setParameters(String name, RequestParameter[] parameters) {
@@ -72,16 +80,16 @@ class ParameterMap extends LinkedHashMap
 
     //---------- String parameter support
 
-    String getStringValue(final String name) {
+    public String getStringValue(final String name) {
         final RequestParameter param = getValue(name);
         return (param != null) ? param.getString() : null;
     }
 
-    String[] getStringValues(final String name) {
+    public String[] getStringValues(final String name) {
         return toStringArray(getValues(name));
     }
 
-    Map<String, String[]> getStringParameterMap() {
+    public Map<String, String[]> getStringParameterMap() {
         if (this.stringParameterMap == null) {
             LinkedHashMap<String, String[]> pm = new LinkedHashMap<String, String[]>();
             for (Map.Entry<String, RequestParameter[]> ppmEntry : entrySet()) {
@@ -92,6 +100,34 @@ class ParameterMap extends LinkedHashMap
         return stringParameterMap;
     }
 
+    // ---------- Servlet API 3.0 Part
+
+    public Part getPart(final String name) {
+        final RequestParameter p = this.getValue(name);
+        if (p instanceof MultipartRequestParameter) {
+            return new SlingPart((MultipartRequestParameter) p);
+        }
+
+        // no such part
+        return null;
+    }
+
+    public Collection<Part> getParts() {
+        final ArrayList<Part> parts = new ArrayList<Part>(this.size());
+        for (RequestParameter[] param : this.values()) {
+            if (param.length >= 1 && param[0] instanceof MultipartRequestParameter) {
+                parts.add(new SlingPart((MultipartRequestParameter) param[0]));
+            }
+        }
+        return parts;
+    }
+
+    // ---------- Order Request Parameter access
+
+    public List<ParameterEntry> getRequestParameterList() {
+        return Collections.unmodifiableList(requestParameters);
+    }
+
     // ---------- Prohibited Write Access --------------------------------------
 
     /*

Copied: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java (from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterSupport.java)
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java?p2=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java&p1=sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterSupport.java&r1=1559659&r2=1559665&rev=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/ParameterSupport.java (original)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java Mon Jan 20 10:40:07 2014
@@ -16,18 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.engine.impl.parameters;
+package org.apache.sling.parameters.impl;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.Part;
 
-import org.apache.commons.collections.iterators.IteratorEnumeration;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileUploadException;
 import org.apache.commons.fileupload.RequestContext;
@@ -36,11 +39,12 @@ import org.apache.commons.fileupload.ser
 import org.apache.commons.fileupload.servlet.ServletRequestContext;
 import org.apache.sling.api.request.RequestParameter;
 import org.apache.sling.api.request.RequestParameterMap;
+import org.apache.sling.parameters.ParameterEntry;
+import org.apache.sling.parameters.ParameterSupport;
+import org.apache.sling.parameters.SlingUnsupportedEncodingException;
 import org.slf4j.LoggerFactory;
 
-public class ParameterSupport {
-
-    private static final String ATTR_NAME = ParameterSupport.class.getName();
+public class ParameterSupportImpl extends ParameterSupport {
 
     /**
      * The name of the request attribute to set to get the Jetty servlet
@@ -49,32 +53,17 @@ public class ParameterSupport {
      */
     private static final String ATTR_JETTY_QUERY_ENCODING = "org.mortbay.jetty.Request.queryEncoding";
 
+    /** Content type signaling parameters in request body */
+    private static final String WWW_FORM_URL_ENC = "application/x-www-form-urlencoded";
+
     private final HttpServletRequest servletRequest;
 
     private ParameterMap postParameterMap;
 
     private boolean requestDataUsed;
 
-    /**
-     * Sets the default encoding used to decode request parameters if the
-     * <code>_charset_</code> request parameter is not set (or is not set to an
-     * encoding supported by the platform). By default this default encoding is
-     * <code>ISO-8859-1</code>. For applications which alway use the same
-     * encoding this default can be changed.
-     *
-     * @param encoding The default encoding to be used. If this encoding is
-     *            <code>null</code> or not supported by the platform the current
-     *            default encoding remains unchanged.
-     */
-    public static void setDefaultParameterEncoding(final String encoding) {
-        Util.setDefaultFixEncoding(encoding);
-    }
-
-    public static ParameterSupport getInstance(ServletRequest servletRequest) {
-        ParameterSupport instance = (ParameterSupport) servletRequest.getAttribute(ATTR_NAME);
-        if (instance == null) {
-            instance = new ParameterSupport((HttpServletRequest) servletRequest);
-            servletRequest.setAttribute(ATTR_NAME, instance);
+    public ParameterSupportImpl(HttpServletRequest servletRequest) {
+        this.servletRequest = servletRequest;
 
             // SLING-559: Hack to get Jetty into decoding the request
             // query with ISO-8859-1 as stipulated by the servlet
@@ -82,12 +71,6 @@ public class ParameterSupport {
             servletRequest.setAttribute(ATTR_JETTY_QUERY_ENCODING,
                 Util.ENCODING_DIRECT);
         }
-        return instance;
-    }
-
-    private ParameterSupport(HttpServletRequest servletRequest) {
-        this.servletRequest = servletRequest;
-    }
 
     private HttpServletRequest getServletRequest() {
         return servletRequest;
@@ -111,8 +94,17 @@ public class ParameterSupport {
 
     @SuppressWarnings("unchecked")
     public Enumeration<String> getParameterNames() {
-        return new IteratorEnumeration(
-            this.getRequestParameterMapInternal().keySet().iterator());
+        return new Enumeration<String>() {
+            private final Iterator<String> base = ParameterSupportImpl.this.getRequestParameterMapInternal().keySet().iterator();
+
+            public boolean hasMoreElements() {
+                return this.base.hasNext();
+            }
+
+            public String nextElement() {
+                return this.base.next();
+            }
+        };
     }
 
     public RequestParameter getRequestParameter(String name) {
@@ -123,10 +115,22 @@ public class ParameterSupport {
         return getRequestParameterMapInternal().getValues(name);
     }
 
+    public Part getPart(String name) {
+        return getRequestParameterMapInternal().getPart(name);
+    }
+
+    public Collection<Part> getParts() {
+        return getRequestParameterMapInternal().getParts();
+    }
+
     public RequestParameterMap getRequestParameterMap() {
         return getRequestParameterMapInternal();
     }
 
+    public List<ParameterEntry> getRequestParameterList() {
+        return getRequestParameterMapInternal().getRequestParameterList();
+    }
+
     private ParameterMap getRequestParameterMapInternal() {
         if (this.postParameterMap == null) {
 
@@ -166,19 +170,47 @@ public class ParameterSupport {
             }
         }
 
-        final Map<?, ?> pMap = getServletRequest().getParameterMap();
-        for (Map.Entry<?, ?> entry : pMap.entrySet()) {
-
-            final String name = (String) entry.getKey();
-            final String[] values = (String[]) entry.getValue();
+        final String query = getServletRequest().getQueryString();
+        if (query != null) {
+            try {
+                ByteArrayInputStream input = new ByteArrayInputStream(query.getBytes(Util.ENCODING_DIRECT));
+                Util.parseQueryString(input, encoding, parameters, false, -1);
+            } catch (UnsupportedEncodingException e) {
+                // TODO: don't expect this, thus log !!
+            } catch (IOException e) {
+                // TODO: don't expect this, thus log !!
+            }
+        }
 
-            for (int i = 0; i < values.length; i++) {
-                parameters.addParameter(name, new ContainerRequestParameter(
-                    values[i], encoding));
+        // only read input in case of multipart-POST not handled
+        // by the servlet container
+        if ("POST".equals(this.getServletRequest().getMethod()) && WWW_FORM_URL_ENC.equalsIgnoreCase(this.getServletRequest().getContentType())) {
+            try {
+                InputStream input = this.getServletRequest().getInputStream();
+                Util.parseQueryString(input, encoding, parameters, false, -1);
+            } catch (IllegalArgumentException e) {
+                // TODO: don't expect this, thus log !!
+            } catch (UnsupportedEncodingException e) {
+                // TODO: don't expect this, thus log !!
+            } catch (IOException e) {
+                // TODO: don't expect this, thus log !!
+            }
+            this.requestDataUsed = true;
             }
 
+//        final Map<?, ?> pMap = getServletRequest().getParameterMap();
+//        for (Map.Entry<?, ?> entry : pMap.entrySet()) {
+//
+//            final String name = (String) entry.getKey();
+//            final String[] values = (String[]) entry.getValue();
+//
+//            for (int i = 0; i < values.length; i++) {
+//                parameters.addParameter(name, new ContainerRequestParameter(
+//                    values[i], encoding));
+//            }
+//
+//        }
         }
-    }
 
     private void parseMultiPartPost(ParameterMap parameters) {
         // parameters not read yet, read now
@@ -209,7 +241,7 @@ public class ParameterSupport {
             for (Iterator<?> ii = items.iterator(); ii.hasNext();) {
                 FileItem fileItem = (FileItem) ii.next();
                 RequestParameter pp = new MultipartRequestParameter(fileItem);
-                parameters.addParameter(fileItem.getFieldName(), pp);
+                parameters.addParameter(fileItem.getFieldName(), pp, false);
             }
         }
     }

Added: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/SlingPart.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/SlingPart.java?rev=1559665&view=auto
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/SlingPart.java (added)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/SlingPart.java Mon Jan 20 10:40:07 2014
@@ -0,0 +1,82 @@
+/*
+ * 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.sling.parameters.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import javax.servlet.http.Part;
+
+public class SlingPart implements Part {
+
+    private final MultipartRequestParameter param;
+
+    public SlingPart(final MultipartRequestParameter param) {
+        this.param = param;
+    }
+
+    public InputStream getInputStream() throws IOException {
+        return this.param.getInputStream();
+    }
+
+    public String getContentType() {
+        return this.param.getContentType();
+    }
+
+    public String getName() {
+        return this.param.getFileItem().getFieldName();
+    }
+
+    public long getSize() {
+        return this.param.getSize();
+    }
+
+    public void write(String fileName) throws IOException {
+        throw new IOException("Unsupported yet");
+    }
+
+    public void delete() {
+        this.param.getFileItem().delete();
+    }
+
+    public String getHeader(String name) {
+        return this.param.getFileItem().getHeaders().getHeader(name);
+    }
+
+    public Collection<String> getHeaders(String name) {
+        final ArrayList<String> headers = new ArrayList<String>();
+        final Iterator<String> itemHeaders = this.param.getFileItem().getHeaders().getHeaders(name);
+        while (itemHeaders.hasNext()) {
+            headers.add(itemHeaders.next());
+        }
+        return headers;
+    }
+
+    public Collection<String> getHeaderNames() {
+        final ArrayList<String> headers = new ArrayList<String>();
+        final Iterator<String> itemHeaders = this.param.getFileItem().getHeaders().getHeaderNames();
+        while (itemHeaders.hasNext()) {
+            headers.add(itemHeaders.next());
+        }
+        return headers;
+    }
+}

Propchange: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/SlingPart.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java (from r1559659, sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/Util.java)
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java?p2=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java&p1=sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/Util.java&r1=1559659&r2=1559665&rev=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/engine/src/main/java/org/apache/sling/engine/impl/parameters/Util.java (original)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java Mon Jan 20 10:40:07 2014
@@ -16,20 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.engine.impl.parameters;
+package org.apache.sling.parameters.impl;
 
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.apache.sling.api.request.RequestParameter;
+import org.slf4j.LoggerFactory;
 
 /**
  * The <code>Util</code> TODO
  */
-class Util {
+public class Util {
 
     /** The name of the form encoding parameter */
     public final static String PARAMETER_FORMENCODING = "_charset_";
@@ -48,7 +51,34 @@ class Util {
 
     public static final byte[] NO_CONTENT = new byte[0];
 
-    static void setDefaultFixEncoding(final String encoding) {
+    /** Parse state constant */
+    private static final int BEFORE_NAME =  0;
+
+    /** Parse state constant */
+    private static final int INSIDE_NAME =  BEFORE_NAME + 1;
+
+    /** Parse state constant */
+    private static final int ESC_NAME =  INSIDE_NAME + 1;
+
+    /** Parse state constant */
+    private static final int BEFORE_EQU =  ESC_NAME + 1;
+
+    /** Parse state constant */
+    private static final int BEFORE_VALUE =  BEFORE_EQU + 1;
+
+    /** Parse state constant */
+    private static final int INSIDE_VALUE =  BEFORE_VALUE + 1;
+
+    /** Parse state constant */
+    private static final int ESC_VALUE =  INSIDE_VALUE + 1;
+
+    /** Parse state constant */
+    private static final int AFTER_VALUE =  INSIDE_VALUE + 1;
+
+    /** Parse state constant */
+    private static final int BEFORE_SEP =  AFTER_VALUE + 1;
+
+    public static void setDefaultFixEncoding(final String encoding) {
         defaultFixEncoding = validateEncoding(encoding);
     }
 
@@ -85,7 +115,7 @@ class Util {
         return new ByteArrayInputStream(data);
     }
 
-    static void fixEncoding(ParameterMap parameterMap) {
+    public static void fixEncoding(ParameterMap parameterMap) {
         // default the encoding to defaultFixEncoding
         String formEncoding = defaultFixEncoding;
 
@@ -173,4 +203,203 @@ class Util {
         // no encoding or unsupported encoding
         return defaultFixEncoding;
     }
+
+    /**
+     * Parse a query string and store entries inside a map
+     *
+     * @param data       querystring data
+     * @param encoding   encoding to use for converting bytes to characters
+     * @param map        map to populate
+     * @param prependNew whether to prepend new values
+     * @param maxcount   maximum name/value count to process;
+     *                   <code>-1</code> to allow unlimited number
+     *
+     * @exception IllegalArgumentException if the query string is malformed
+     * @exception UnsupportedEncodingException if the encoding is not supported
+     * @throws IOException
+     */
+    public static void parseQueryString(InputStream data, String encoding, ParameterMap map,
+                                        boolean prependNew, int maxcount)
+            throws IllegalArgumentException, UnsupportedEncodingException, IOException {
+
+        parseNVPairString(data, encoding, map, '&', false, prependNew, maxcount);
+    }
+
+    /**
+     * Parse a name/value pair string and populate a map with key -> value[s]
+     *
+     * @param data        name value data
+     * @param encoding    encoding to use for converting bytes to characters
+     * @param map         map to populate
+     * @param separator   multi-value separator character
+     * @param allowSpaces allow spaces inside name/values
+     * @param prependNew  whether to prepend new values
+     * @param maxcount    maximum name/value count to process;
+     *                    <code>-1</code> to allow unlimited number
+     *
+     * @exception IllegalArgumentException if the nv string is malformed
+     */
+    private static void parseNVPairString(InputStream data, String encoding, ParameterMap map,
+                                          char separator, boolean allowSpaces,
+                                          boolean prependNew, int maxcount)
+            throws IllegalArgumentException, UnsupportedEncodingException, IOException {
+
+        ByteArrayOutputStream keyBuffer   = new ByteArrayOutputStream(256);
+        ByteArrayOutputStream valueBuffer = new ByteArrayOutputStream(256);
+        char[] chCode = new char[2];
+
+        int state = BEFORE_NAME;
+        int subState = 0, count = 0;
+
+        for (int in = data.read(); in >= 0; in = data.read()) {
+            char ch = (char) in;
+
+            switch (state) {
+                case BEFORE_NAME:
+                    if (ch == ' ') {
+                        continue;
+                    } else if (ch == '%') {
+                        state = ESC_NAME;
+                        subState = 0;
+                    } else if (ch == '+' && !allowSpaces) {
+                        keyBuffer.write(' ');
+                        state = INSIDE_NAME;
+                    } else {
+                        keyBuffer.write(ch);
+                        state = INSIDE_NAME;
+                    }
+                    break;
+                case INSIDE_NAME:
+                    if (ch == '=') {
+                        state = BEFORE_VALUE;
+                    } else if (ch == '+' && !allowSpaces) {
+                        keyBuffer.write(' ');
+                    } else if (ch == '%') {
+                        state = ESC_NAME;
+                        subState = 0;
+                    } else if (ch == '&') {
+                        String key = keyBuffer.toString(encoding);
+                        if (count++ == maxcount) {
+                            LoggerFactory.getLogger(Util.class).warn("Too many name/value pairs, stopped processing after " + maxcount + " entries");
+                            return;
+                        }
+                        addNVPair(map, key, "", encoding, prependNew);
+                        keyBuffer.reset();
+                        valueBuffer.reset();
+                        state = BEFORE_NAME;
+                    } else {
+                        keyBuffer.write(ch);
+                    }
+                    break;
+                case ESC_NAME:
+                    chCode[subState++] = ch;
+                    if (subState == chCode.length) {
+                        String code = new String(chCode);
+                        try {
+                            keyBuffer.write(Integer.parseInt(code, 16));
+                        } catch (NumberFormatException e) {
+                            throw new IllegalArgumentException(
+                                    "Bad escape sequence: %" + code);
+                        }
+                        state = INSIDE_NAME;
+                    }
+                    break;
+                case BEFORE_EQU:
+                    if (ch == '=') {
+                        state = BEFORE_VALUE;
+                    }
+                    break;
+                case BEFORE_VALUE:
+                    if (ch == ' ') {
+                        continue;
+                    } else if (ch == '%') {
+                        state = ESC_VALUE;
+                        subState = 0;
+                    } else if (ch == '+' && !allowSpaces) {
+                        valueBuffer.write(' ');
+                        state = INSIDE_VALUE;
+                    } else if (ch == separator) {
+                        String key   = keyBuffer.toString(encoding);
+                        String value = valueBuffer.toString(encoding);
+
+                        if (count++ == maxcount) {
+                            LoggerFactory.getLogger(Util.class).warn("Too many name/value pairs, stopped processing after " + maxcount + " entries");
+                            return;
+                        }
+                        addNVPair(map, key, value, encoding, prependNew);
+
+                        keyBuffer.reset();
+                        valueBuffer.reset();
+
+                        state = BEFORE_NAME;
+                    } else {
+                        valueBuffer.write(ch);
+                        state = INSIDE_VALUE;
+                    }
+                    break;
+                case INSIDE_VALUE:
+                    if (ch == separator) {
+                        String key   = keyBuffer.toString(encoding);
+                        String value = valueBuffer.toString(encoding);
+
+                        if (count++ == maxcount) {
+                            LoggerFactory.getLogger(Util.class).warn("Too many name/value pairs, stopped processing after " + maxcount + " entries");
+                            return;
+                        }
+                        addNVPair(map, key, value, encoding, prependNew);
+
+                        keyBuffer.reset();
+                        valueBuffer.reset();
+
+                        state = BEFORE_NAME;
+                    } else if (ch == '+' && !allowSpaces) {
+                        valueBuffer.write(' ');
+                    } else if (ch == '%') {
+                        state = ESC_VALUE;
+                        subState = 0;
+                    } else {
+                        valueBuffer.write(ch);
+                    }
+                    break;
+                case ESC_VALUE:
+                    chCode[subState++] = ch;
+                    if (subState == chCode.length) {
+                        String code = new String(chCode);
+                        try {
+                            valueBuffer.write(Integer.parseInt(code, 16));
+                        } catch (NumberFormatException e) {
+                            throw new IllegalArgumentException(
+                                    "Bad escape sequence: %" + code);
+                        }
+                        state = INSIDE_VALUE;
+                    }
+                    break;
+                case BEFORE_SEP:
+                    if (ch == separator) {
+                        state = BEFORE_NAME;
+                    }
+                    break;
+            }
+        }
+
+        if (keyBuffer.size() > 0) {
+            String key   = keyBuffer.toString(encoding);
+            String value = valueBuffer.toString(encoding);
+
+            if (count++ == maxcount) {
+                LoggerFactory.getLogger(Util.class).warn("Too many name/value pairs, stopped processing after " + maxcount + " entries");
+                return;
+            }
+            addNVPair(map, key, value, encoding, prependNew);
+        }
+    }
+
+    /**
+     * Add a name/value pair to a map. The values are string arrays
+     * @param encoding TODO
+     */
+    private static void addNVPair(ParameterMap map, String key, String value,
+                                  String encoding, boolean prependNew) {
+        map.addParameter(key, new ContainerRequestParameter(value, encoding), prependNew);
+    }
 }

Added: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/package-info.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/package-info.java?rev=1559665&view=auto
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/package-info.java (added)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/package-info.java Mon Jan 20 10:40:07 2014
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+@Version("1.0")
+@Export(optional="provide:=true")
+package org.apache.sling.parameters;
+
+import aQute.bnd.annotation.Export;
+import aQute.bnd.annotation.Version;
+

Propchange: sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/ContainerRequestParameterTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/ContainerRequestParameterTest.java?rev=1559665&r1=1559659&r2=1559665&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/ContainerRequestParameterTest.java (original)
+++ sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/ContainerRequestParameterTest.java Mon Jan 20 10:40:07 2014
@@ -16,10 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.engine.impl.parameters;
+package org.apache.sling.parameters.impl;
 
 import java.io.UnsupportedEncodingException;
 
+import org.apache.sling.parameters.impl.ContainerRequestParameter;
+
 import junit.framework.TestCase;
 
 public class ContainerRequestParameterTest extends TestCase {