Author: fmeschbe
Date: Mon Feb 17 07:47:44 2014
New Revision: 1568890

URL: http://svn.apache.org/r1568890
Log:
Some cleanup in the parameter support and a few unit tests

Added:
    
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/NamedRequestParameter.java
      - copied, changed from r1559665, 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java
Removed:
    
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java
    
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterEntryImpl.java
Modified:
    sling/whiteboard/fmeschbe/parameters/parameters/pom.xml
    
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java
    
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java
    
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java
    
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java
    
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java
    
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java
    
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.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/parameters/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/pom.xml?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/parameters/pom.xml (original)
+++ sling/whiteboard/fmeschbe/parameters/parameters/pom.xml Mon Feb 17 07:47:44 
2014
@@ -59,13 +59,6 @@
             <version>1.3</version>
             <scope>provided</scope>
         </dependency>
-        <!--
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
-            <version>2.5</version>
-        </dependency>
-        -->
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
@@ -73,6 +66,12 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.commons.osgi</artifactId>
+            <version>2.1.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>

Copied: 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/NamedRequestParameter.java
 (from r1559665, 
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/NamedRequestParameter.java?p2=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/NamedRequestParameter.java&p1=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java&r1=1559665&r2=1568890&rev=1568890&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java
 (original)
+++ 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/NamedRequestParameter.java
 Mon Feb 17 07:47:44 2014
@@ -23,10 +23,11 @@ import org.apache.sling.api.request.Requ
 import aQute.bnd.annotation.ProviderType;
 
 @ProviderType
-public interface ParameterEntry {
+public interface NamedRequestParameter extends RequestParameter {
 
+    /**
+     * @return the name of this {@code RequestParameter}
+     */
     String getName();
 
-    RequestParameter getParameter();
-
 }

Modified: 
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=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java
 (original)
+++ 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java
 Mon Feb 17 07:47:44 2014
@@ -26,6 +26,7 @@ import java.util.Map;
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
+
 import org.apache.sling.api.request.RequestParameter;
 import org.apache.sling.api.request.RequestParameterMap;
 import 
org.apache.sling.parameters.impl.ParameterSupportHttpServletRequestWrapper3;
@@ -37,6 +38,9 @@ import aQute.bnd.annotation.ProviderType
 @ProviderType
 public abstract class ParameterSupport {
 
+    /** The name of the form encoding parameter */
+    public final static String PARAMETER_FORMENCODING = "_charset_";
+
     private static final String ATTR_NAME = 
ParameterSupportImpl.class.getName();
 
     public static ParameterSupport getInstance(ServletRequest servletRequest) {
@@ -90,6 +94,6 @@ public abstract class ParameterSupport {
 
     public abstract RequestParameterMap getRequestParameterMap();
 
-    public abstract List<ParameterEntry> getRequestParameterList();
+    public abstract List<NamedRequestParameter> getRequestParameterList();
 
 }
\ No newline at end of file

Modified: 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java
 (original)
+++ 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java
 Mon Feb 17 07:47:44 2014
@@ -18,16 +18,27 @@
  */
 package org.apache.sling.parameters.impl;
 
-import org.apache.sling.api.request.RequestParameter;
+import org.apache.sling.parameters.NamedRequestParameter;
 
-abstract class AbstractRequestParameter implements RequestParameter {
+abstract class AbstractRequestParameter implements NamedRequestParameter {
+
+    private String name;
 
     private String encoding;
 
-    protected AbstractRequestParameter(String encoding) {
+    protected AbstractRequestParameter(String name, String encoding) {
+        this.name = name;
         this.encoding = encoding;
     }
 
+    void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
     void setEncoding(String encoding) {
         this.encoding = encoding;
     }

Modified: 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java
 (original)
+++ 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java
 Mon Feb 17 07:47:44 2014
@@ -33,8 +33,8 @@ public class ContainerRequestParameter e
 
     private byte[] content;
 
-    public ContainerRequestParameter(String value, String encoding) {
-        super(encoding);
+    public ContainerRequestParameter(String name, String value, String 
encoding) {
+        super(name, encoding);
         this.value = value;
         this.content = null;
     }
@@ -48,7 +48,7 @@ public class ContainerRequestParameter e
         } catch (UnsupportedEncodingException uee) {
             throw new SlingUnsupportedEncodingException(uee);
         }
-        
+
         super.setEncoding(encoding);
     }
 

Modified: 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java
 (original)
+++ 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java
 Mon Feb 17 07:47:44 2014
@@ -25,7 +25,12 @@ import java.io.UnsupportedEncodingExcept
 import org.apache.commons.fileupload.FileItem;
 
 /**
- * The <code>MultipartRequestParameter</code> TODO
+ * The <code>MultipartRequestParameter</code> represents a request parameter
+ * from a multipart/form-data POST request.
+ * <p>
+ * To not add a dependency to Servlet API 3 this class does not implement the
+ * Servlet API 3 {@code Part} interface. To support Servlet API 3 {@code Part}s
+ * the {@link SlingPart} class wraps instances of this class.
  */
 public class MultipartRequestParameter extends AbstractRequestParameter {
 
@@ -35,11 +40,8 @@ public class MultipartRequestParameter e
 
     private String cachedValue;
 
-    /**
-     *
-     */
     public MultipartRequestParameter(FileItem delegatee) {
-        super(null);
+        super(delegatee.getFieldName(), null);
         this.delegatee = delegatee;
     }
 
@@ -57,30 +59,18 @@ public class MultipartRequestParameter e
         cachedValue = null;
     }
 
-    /**
-     * @see org.apache.sling.api.request.RequestParameter#get()
-     */
     public byte[] get() {
         return this.delegatee.get();
     }
 
-    /**
-     * @see org.apache.sling.api.request.RequestParameter#getContentType()
-     */
     public String getContentType() {
         return this.delegatee.getContentType();
     }
 
-    /**
-     * @see org.apache.sling.api.request.RequestParameter#getInputStream()
-     */
     public InputStream getInputStream() throws IOException {
         return this.delegatee.getInputStream();
     }
 
-    /**
-     * @see org.apache.sling.api.request.RequestParameter#getFileName()
-     */
     public String getFileName() {
         if (this.encodedFileName == null && this.delegatee.getName() != null) {
             String tmpFileName = this.delegatee.getName();
@@ -98,16 +88,10 @@ public class MultipartRequestParameter e
         return this.encodedFileName;
     }
 
-    /**
-     * @see org.apache.sling.api.request.RequestParameter#getSize()
-     */
     public long getSize() {
         return this.delegatee.getSize();
     }
 
-    /**
-     * @see org.apache.sling.api.request.RequestParameter#getString()
-     */
     public String getString() {
         // only apply encoding in the case of a form field
         if (this.isFormField()) {
@@ -136,16 +120,10 @@ public class MultipartRequestParameter e
         return this.delegatee.getString();
     }
 
-    /**
-     * @see 
org.apache.sling.api.request.RequestParameter#getString(java.lang.String)
-     */
     public String getString(String enc) throws UnsupportedEncodingException {
         return this.delegatee.getString(enc);
     }
 
-    /**
-     * @see org.apache.sling.api.request.RequestParameter#isFormField()
-     */
     public boolean isFormField() {
         return this.delegatee.isFormField();
     }
@@ -155,7 +133,6 @@ public class MultipartRequestParameter e
             return this.getString();
         }
 
-        return "File: " + this.getFileName() + " (" + this.getSize()
-            + " bytes)";
+        return "File: " + this.getFileName() + " (" + this.getSize() + " 
bytes)";
     }
 }

Modified: 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java
 (original)
+++ 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java
 Mon Feb 17 07:47:44 2014
@@ -29,7 +29,8 @@ 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;
+import org.apache.sling.parameters.NamedRequestParameter;
+import org.slf4j.LoggerFactory;
 
 /**
  * The <code>ParameterMap</code> TODO
@@ -39,9 +40,17 @@ public class ParameterMap extends Linked
 
     private static final long serialVersionUID = -3984737679401682171L;
 
+    static final int DEFAULT_MAX_PARAMS = 10000;
+
+    private static int maxParameters = DEFAULT_MAX_PARAMS;
+
     private Map<String, String[]> stringParameterMap;
 
-    private List<ParameterEntry> requestParameters = new 
ArrayList<ParameterEntry>();
+    private List<NamedRequestParameter> requestParameters = new 
ArrayList<NamedRequestParameter>();
+
+    static void setMaxParameters(final int maxParameters) {
+    ParameterMap.maxParameters = (maxParameters > 0) ? maxParameters : -1;
+    }
 
     public RequestParameter getValue(String name) {
         RequestParameter[] params = getValues(name);
@@ -54,11 +63,25 @@ public class ParameterMap extends Linked
 
     void renameParameter(String oldName, String newName) {
         RequestParameter[] params = super.remove(oldName);
+
+        for (RequestParameter param : params) {
+            ((AbstractRequestParameter) param).setName(newName);
+        }
+
         super.put(newName, params);
     }
 
-    public void addParameter(String name, RequestParameter parameter, boolean 
prependNew) {
+    void addParameter(NamedRequestParameter parameter, boolean prependNew) {
+
+        // check number of parameters
+        if (this.requestParameters.size() == maxParameters) {
+            // TODO: how to handle this situation ?? just ignore or throw or 
what ??
+            LoggerFactory.getLogger(Util.class).warn("Too many name/value 
pairs, stopped processing after " + maxParameters + " entries");
+            return;
+        }
+
         // map of parameters
+        final String name = parameter.getName();
         RequestParameter[] current = this.get(name);
         if (current == null) {
             super.put(name, new RequestParameter[] { parameter });
@@ -71,7 +94,7 @@ public class ParameterMap extends Linked
         }
 
         // list of parameters
-        this.requestParameters.add(new ParameterEntryImpl(name, parameter));
+        this.requestParameters.add(parameter);
     }
 
     void setParameters(String name, RequestParameter[] parameters) {
@@ -124,7 +147,7 @@ public class ParameterMap extends Linked
 
     // ---------- Order Request Parameter access
 
-    public List<ParameterEntry> getRequestParameterList() {
+    public List<NamedRequestParameter> getRequestParameterList() {
         return Collections.unmodifiableList(requestParameters);
     }
 

Modified: 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java
 (original)
+++ 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java
 Mon Feb 17 07:47:44 2014
@@ -18,7 +18,6 @@
  */
 package org.apache.sling.parameters.impl;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
@@ -37,7 +36,7 @@ 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.NamedRequestParameter;
 import org.apache.sling.parameters.ParameterSupport;
 import org.apache.sling.parameters.SlingUnsupportedEncodingException;
 import org.slf4j.LoggerFactory;
@@ -125,7 +124,7 @@ public class ParameterSupportImpl extend
         return getRequestParameterMapInternal();
     }
 
-    public List<ParameterEntry> getRequestParameterList() {
+    public List<NamedRequestParameter> getRequestParameterList() {
         return getRequestParameterMapInternal().getRequestParameterList();
     }
 
@@ -171,8 +170,8 @@ public class ParameterSupportImpl extend
         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);
+                InputStream input = Util.toInputStream(query);
+                Util.parseQueryString(input, encoding, parameters, false);
             } catch (UnsupportedEncodingException e) {
                 // TODO: don't expect this, thus log !!
             } catch (IOException e) {
@@ -182,10 +181,11 @@ public class ParameterSupportImpl extend
 
         // 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())) {
+        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);
+                Util.parseQueryString(input, encoding, parameters, false);
             } catch (IllegalArgumentException e) {
                 // TODO: don't expect this, thus log !!
             } catch (UnsupportedEncodingException e) {
@@ -194,7 +194,7 @@ public class ParameterSupportImpl extend
                 // TODO: don't expect this, thus log !!
             }
             this.requestDataUsed = true;
-            }
+        }
 
 //        final Map<?, ?> pMap = getServletRequest().getParameterMap();
 //        for (Map.Entry<?, ?> entry : pMap.entrySet()) {
@@ -238,8 +238,8 @@ public class ParameterSupportImpl extend
         if (items != null && items.size() > 0) {
             for (Iterator<?> ii = items.iterator(); ii.hasNext();) {
                 FileItem fileItem = (FileItem) ii.next();
-                RequestParameter pp = new MultipartRequestParameter(fileItem);
-                parameters.addParameter(fileItem.getFieldName(), pp, false);
+                NamedRequestParameter pp = new 
MultipartRequestParameter(fileItem);
+                parameters.addParameter(pp, false);
             }
         }
     }

Modified: 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java
 (original)
+++ 
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java
 Mon Feb 17 07:47:44 2014
@@ -26,24 +26,44 @@ import java.io.UnsupportedEncodingExcept
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Property;
 import org.apache.sling.api.request.RequestParameter;
-import org.slf4j.LoggerFactory;
+import org.apache.sling.commons.osgi.PropertiesUtil;
+import org.apache.sling.parameters.ParameterSupport;
 
-/**
- * The <code>Util</code> TODO
- */
+@Component(
+        metatype = true,
+        name = "org.apache.sling.parameters.config",
+        label = "Apache Sling Request Parameter Handling",
+        description = "Configures Sling's request parameter handling.")
 public class Util {
 
-    /** The name of the form encoding parameter */
-    public final static String PARAMETER_FORMENCODING = "_charset_";
+    @Property(value = Util.ENCODING_DIRECT,
+            label = "Default Parameter Encoding",
+            description = "The default request parameter encoding used to 
decode request "
+                + "parameters into strings. If this property is not set the 
default encoding "
+                + "is 'ISO-8859-1' as mandated by the Servlet API spec. This 
default encoding "
+                + "is used if the '_charset_' request parameter is not set to 
another "
+                + "(supported) character encoding. Applications being sure to 
always use the "
+                + "same encoding (e.g. UTF-8) can set this default here and 
may omit the "
+                + "'_charset_' request parameter")
+    private static final String PROP_FIX_ENCODING = 
"sling.default.parameter.encoding";
+
+    @Property(
+            intValue = ParameterMap.DEFAULT_MAX_PARAMS,
+            label = "Maximum POST Parameters",
+            description = "The maximum number of parameters supported. To 
prevent a DOS-style attack with an "
+                + "overrunning number of parameters the number of parameters 
supported can be limited. This "
+                + "includes all of the query string as well as 
application/x-www-form-urlencoded and "
+                + "multipart/form-data parameters. The default value is " + 
ParameterMap.DEFAULT_MAX_PARAMS + ".")
+    private static final String PROP_MAX_PARAMS = 
"sling.default.max.parameters";
 
     // ISO-8859-1 mapps all characters 0..255 to \u0000..\u00ff directly
     public static final String ENCODING_DIRECT = "ISO-8859-1";
 
-    // the default encoding used in #fixEncoding if the _charset_ request
-    // parameter is not set
-    private static String defaultFixEncoding = ENCODING_DIRECT;
-
     // Default query (and www-form-encoded) parameter encoding as per
     // HTML spec.
     // see http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.1
@@ -51,6 +71,10 @@ public class Util {
 
     public static final byte[] NO_CONTENT = new byte[0];
 
+    // the default encoding used in #fixEncoding if the _charset_ request
+    // parameter is not set
+    private static String defaultFixEncoding = ENCODING_DIRECT;
+
     /** Parse state constant */
     private static final int BEFORE_NAME =  0;
 
@@ -78,6 +102,14 @@ public class Util {
     /** Parse state constant */
     private static final int BEFORE_SEP =  AFTER_VALUE + 1;
 
+    @Activate
+    @Deactivate
+    private void configure(Map<String, Object> props) {
+        
setDefaultFixEncoding(PropertiesUtil.toString(props.get(PROP_FIX_ENCODING), 
ENCODING_DIRECT));
+        
ParameterMap.setMaxParameters(PropertiesUtil.toInteger(props.get(PROP_MAX_PARAMS),
+            ParameterMap.DEFAULT_MAX_PARAMS));
+    }
+
     public static void setDefaultFixEncoding(final String encoding) {
         defaultFixEncoding = validateEncoding(encoding);
     }
@@ -110,17 +142,17 @@ public class Util {
         return data;
     }
 
-    static InputStream getInputStream(String source) {
+    static InputStream toInputStream(String source) {
         byte[] data = fromIdentityEncodedString(source);
         return new ByteArrayInputStream(data);
     }
 
-    public static void fixEncoding(ParameterMap parameterMap) {
+    static void fixEncoding(ParameterMap parameterMap) {
         // default the encoding to defaultFixEncoding
         String formEncoding = defaultFixEncoding;
 
         // check whether a form encoding parameter overwrites this default
-        RequestParameter[] feParm = parameterMap.get(PARAMETER_FORMENCODING);
+        RequestParameter[] feParm = 
parameterMap.get(ParameterSupport.PARAMETER_FORMENCODING);
         if (feParm != null) {
             // get and check form encoding
             byte[] rawEncoding = feParm[0].get();
@@ -211,18 +243,16 @@ public class Util {
      * @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)
+                                        boolean prependNew)
             throws IllegalArgumentException, UnsupportedEncodingException, 
IOException {
 
-        parseNVPairString(data, encoding, map, '&', false, prependNew, 
maxcount);
+        parseNVPairString(data, encoding, map, '&', false, prependNew);
     }
 
     /**
@@ -234,14 +264,12 @@ public class Util {
      * @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)
+                                          boolean prependNew)
             throws IllegalArgumentException, UnsupportedEncodingException, 
IOException {
 
         ByteArrayOutputStream keyBuffer   = new ByteArrayOutputStream(256);
@@ -278,14 +306,7 @@ public class Util {
                         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();
+                        addNVPair(map, keyBuffer, valueBuffer, encoding, 
prependNew);
                         state = BEFORE_NAME;
                     } else {
                         keyBuffer.write(ch);
@@ -319,18 +340,7 @@ public class Util {
                         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();
-
+                        addNVPair(map, keyBuffer, valueBuffer, encoding, 
prependNew);
                         state = BEFORE_NAME;
                     } else {
                         valueBuffer.write(ch);
@@ -339,18 +349,7 @@ public class Util {
                     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();
-
+                        addNVPair(map, keyBuffer, valueBuffer, encoding, 
prependNew);
                         state = BEFORE_NAME;
                     } else if (ch == '+' && !allowSpaces) {
                         valueBuffer.write(' ');
@@ -383,23 +382,21 @@ public class Util {
         }
 
         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);
+            addNVPair(map, keyBuffer, valueBuffer, encoding, prependNew);
         }
     }
 
     /**
      * Add a name/value pair to a map. The values are string arrays
      * @param encoding TODO
+     * @throws UnsupportedEncodingException If the provided encoding is not 
supported
      */
-    private static void addNVPair(ParameterMap map, String key, String value,
-                                  String encoding, boolean prependNew) {
-        map.addParameter(key, new ContainerRequestParameter(value, encoding), 
prependNew);
+    private static void addNVPair(ParameterMap map, ByteArrayOutputStream 
keyBuffer, ByteArrayOutputStream valueBuffer,
+            String encoding, boolean prependNew) throws 
UnsupportedEncodingException {
+        final String key = keyBuffer.toString(encoding);
+        final String value = valueBuffer.toString(encoding);
+        map.addParameter(new ContainerRequestParameter(key, value, encoding), 
prependNew);
+        keyBuffer.reset();
+        valueBuffer.reset();
     }
 }

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=1568890&r1=1568889&r2=1568890&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 Feb 17 07:47:44 2014
@@ -39,7 +39,7 @@ public class ContainerRequestParameterTe
         // encoded LATIN-1 String of UTF-8 encoding
         testInternal("\u00c3\u00b6\u00c3\u00a4\u00c3\u00bc", UTF8, LATIN1);
     }
-    
+
     public void testChangeEncodingUpper() throws UnsupportedEncodingException {
         // runic letter e, katakana letter pa, halfwidth katakana letter no
         // encoded LATIN-1 String of UTF-8 encoding
@@ -48,7 +48,7 @@ public class ContainerRequestParameterTe
 
     private void testInternal(String value, String baseEncoding,
             String targetEncoding) throws UnsupportedEncodingException {
-        ContainerRequestParameter par = new ContainerRequestParameter(value,
+        ContainerRequestParameter par = new ContainerRequestParameter("name", 
value,
             baseEncoding);
 
         assertEquals(baseEncoding, par.getEncoding());

Modified: 
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/UtilTest.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/UtilTest.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
--- 
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/UtilTest.java
 (original)
+++ 
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/UtilTest.java
 Mon Feb 17 07:47:44 2014
@@ -18,8 +18,12 @@
  */
 package org.apache.sling.parameters.impl;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.util.List;
 
+import org.apache.sling.parameters.NamedRequestParameter;
 import org.apache.sling.parameters.impl.ContainerRequestParameter;
 import org.apache.sling.parameters.impl.ParameterMap;
 import org.apache.sling.parameters.impl.ParameterSupportImpl;
@@ -93,7 +97,7 @@ public class UtilTest extends TestCase {
     public void test_fix_encoding_direct() throws UnsupportedEncodingException 
{
 
         ParameterMap pm = new ParameterMap();
-        pm.addParameter("par", new ContainerRequestParameter(utf8Coded,
+        pm.addParameter(new ContainerRequestParameter("par", utf8Coded,
             Util.ENCODING_DIRECT), false);
         Util.fixEncoding(pm);
         assertEquals(utf8Coded, pm.getValue("par").getString());
@@ -102,9 +106,9 @@ public class UtilTest extends TestCase {
 
     public void test_fix_encoding_charset() {
         ParameterMap pm2 = new ParameterMap();
-        pm2.addParameter("par", new ContainerRequestParameter(utf8Coded,
+        pm2.addParameter(new ContainerRequestParameter("par", utf8Coded,
             Util.ENCODING_DIRECT), false);
-        pm2.addParameter("_charset_", new ContainerRequestParameter(utf8,
+        pm2.addParameter(new ContainerRequestParameter("_charset_", utf8,
             Util.ENCODING_DIRECT), false);
         Util.fixEncoding(pm2);
         assertEquals(utf8String, pm2.getValue("par").getString());
@@ -112,11 +116,41 @@ public class UtilTest extends TestCase {
 
     public void test_fix_encoding_configured() {
         ParameterMap pm3 = new ParameterMap();
-        pm3.addParameter("par", new ContainerRequestParameter(utf8Coded,
+        pm3.addParameter(new ContainerRequestParameter("par", utf8Coded,
             Util.ENCODING_DIRECT), false);
         Util.setDefaultFixEncoding(utf8);
         Util.fixEncoding(pm3);
         assertEquals(utf8String, pm3.getValue("par").getString());
         Util.setDefaultFixEncoding(Util.ENCODING_DIRECT);
     }
+
+    public void test_decode_query() throws IllegalArgumentException, 
UnsupportedEncodingException, IOException {
+        final ParameterMap map = new ParameterMap();
+        final String query = "a=1&b=2&c=3";
+        Util.parseQueryString(new 
ByteArrayInputStream(query.getBytes(Util.ENCODING_DIRECT)), 
Util.ENCODING_DIRECT, map, false);
+
+        assertEquals(3, map.size());
+
+        List<NamedRequestParameter> pars = map.getRequestParameterList();
+        assertEquals(3, pars.size());
+        assertEquals("a", pars.get(0).getName());
+        assertEquals("1", pars.get(0).getString());
+        assertEquals("b", pars.get(1).getName());
+        assertEquals("2", pars.get(1).getString());
+        assertEquals("c", pars.get(2).getName());
+        assertEquals("3", pars.get(2).getString());
+    }
+
+    public void test_getParameter_with_space() throws Exception {
+        final ParameterMap map = new ParameterMap();
+        final String query = 
"cmsaction=createPage&templateName=/apps/geometrixx/templates/contentpage"
+            + "&label=&title=Some Page&parentPath=/content/geometrixx";
+        Util.parseQueryString(new 
ByteArrayInputStream(query.getBytes(Util.ENCODING_DIRECT)), 
Util.ENCODING_DIRECT,
+            map, false);
+        assertEquals("createPage", map.getStringValue("cmsaction"));
+        assertEquals("/apps/geometrixx/templates/contentpage", 
map.getStringValue("templateName"));
+        assertEquals("", map.getStringValue("label"));
+        assertEquals("Some Page", map.getStringValue("title"));
+        assertEquals("/content/geometrixx", map.getStringValue("parentPath"));
+    }
 }


Reply via email to