001// Copyright 2007, 2008 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry5.upload.internal.services;
016
017import javax.servlet.http.HttpServletRequest;
018import javax.servlet.http.HttpServletRequestWrapper;
019
020import static org.apache.tapestry5.commons.util.CollectionFactory.newMap;
021
022import java.io.UnsupportedEncodingException;
023import java.util.Collections;
024import java.util.Enumeration;
025import java.util.Map;
026
027/**
028 * Wrapper for HttpServletRequest that overrides the parameter methods of the wrapped request. i.e. parameters are
029 * retrieved from the wrapper rather than the real request.
030 */
031public class ParametersServletRequestWrapper extends HttpServletRequestWrapper
032{
033    private final Map<String, ParameterValue> parameters = newMap();
034
035    public ParametersServletRequestWrapper(HttpServletRequest httpServletRequest)
036    {
037        super(httpServletRequest);
038    }
039
040    @Override
041    public String getParameter(String name)
042    {
043        return getValueFor(name).single();
044    }
045
046    @Override
047    public Map<String, String[]> getParameterMap()
048    {
049        Map<String, String[]> paramMap = newMap();
050
051        for (Map.Entry<String, ParameterValue> e : parameters.entrySet())
052        {
053            ParameterValue value = e.getValue();
054
055            paramMap.put(e.getKey(), value.multi());
056        }
057
058        return paramMap;
059    }
060
061    @Override
062    public Enumeration<String> getParameterNames()
063    {
064        return Collections.enumeration(parameters.keySet());
065    }
066
067    @Override
068    public String[] getParameterValues(String name)
069    {
070        return getValueFor(name).multi();
071    }
072
073    public void addParameter(String name, String value)
074    {
075        ParameterValue pv = parameters.get(name);
076        if (pv == null)
077        {
078            pv = new ParameterValue(value);
079            parameters.put(name, pv);
080        }
081        else
082        {
083            pv.add(value);
084        }
085    }
086
087    ParameterValue getValueFor(String name)
088    {
089        ParameterValue value = parameters.get(name);
090
091        return value == null ? ParameterValue.NULL : value;
092    }
093
094    /**
095     * Ignores any attempt to set the character encoding, as it already has been set before the request content was
096     * parsed.
097     *
098     * @see org.apache.tapestry5.http.TapestryHttpSymbolConstants#CHARSET
099     */
100    @Override
101    public void setCharacterEncoding(String enc) throws UnsupportedEncodingException
102    {
103
104    }
105}