001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.kernel.portlet;
016    
017    import com.liferay.portal.kernel.util.ArrayUtil;
018    
019    import java.util.Collections;
020    import java.util.Enumeration;
021    import java.util.HashMap;
022    import java.util.LinkedHashSet;
023    import java.util.Map;
024    import java.util.Set;
025    
026    import javax.portlet.RenderRequest;
027    import javax.portlet.filter.RenderRequestWrapper;
028    
029    /**
030     * @author Brian Wing Shun Chan
031     */
032    public class DynamicRenderRequest extends RenderRequestWrapper {
033    
034            public DynamicRenderRequest(RenderRequest renderRequest) {
035                    this(renderRequest, new HashMap<String, String[]>(), true);
036            }
037    
038            public DynamicRenderRequest(
039                    RenderRequest renderRequest, Map<String, String[]> params) {
040    
041                    this(renderRequest, params, true);
042            }
043    
044            public DynamicRenderRequest(RenderRequest renderRequest, boolean inherit) {
045                    this(renderRequest, new HashMap<String, String[]>(), inherit);
046            }
047    
048            public DynamicRenderRequest(
049                    RenderRequest renderRequest, Map<String, String[]> params,
050                    boolean inherit) {
051    
052                    super(renderRequest);
053    
054                    _params = new HashMap<String, String[]>();
055                    _inherit = inherit;
056    
057                    if (params != null) {
058                            for (Map.Entry<String, String[]> entry : params.entrySet()) {
059                                    _params.put(entry.getKey(), entry.getValue());
060                            }
061                    }
062    
063                    if (_inherit && (renderRequest instanceof DynamicRenderRequest)) {
064                            DynamicRenderRequest dynamicRenderRequest =
065                                    (DynamicRenderRequest)renderRequest;
066    
067                            setRequest(dynamicRenderRequest.getRequest());
068    
069                            params = dynamicRenderRequest.getDynamicParameterMap();
070    
071                            if (params != null) {
072                                    for (Map.Entry<String, String[]> entry : params.entrySet()) {
073                                            String name = entry.getKey();
074                                            String[] oldValues = entry.getValue();
075    
076                                            String[] curValues = _params.get(name);
077    
078                                            if (curValues == null) {
079                                                    _params.put(name, oldValues);
080                                            }
081                                            else {
082                                                    String[] newValues = ArrayUtil.append(
083                                                            oldValues, curValues);
084    
085                                                    _params.put(name, newValues);
086                                            }
087                                    }
088                            }
089                    }
090            }
091    
092            public String getParameter(String name) {
093                    String[] values = _params.get(name);
094    
095                    if (_inherit && (values == null)) {
096                            return super.getParameter(name);
097                    }
098    
099                    if ((values != null) && (values.length > 0)) {
100                            return values[0];
101                    }
102                    else {
103                            return null;
104                    }
105            }
106    
107            public Map<String, String[]> getParameterMap() {
108                    Map<String, String[]> map = new HashMap<String, String[]>();
109    
110                    Enumeration<String> enu = getParameterNames();
111    
112                    while (enu.hasMoreElements()) {
113                            String s = enu.nextElement();
114    
115                            map.put(s, getParameterValues(s));
116                    }
117    
118                    return map;
119            }
120    
121            public Enumeration<String> getParameterNames() {
122                    Set<String> names = new LinkedHashSet<String>();
123    
124                    if (_inherit) {
125                            Enumeration<String> enu = super.getParameterNames();
126    
127                            while (enu.hasMoreElements()) {
128                                    names.add(enu.nextElement());
129                            }
130                    }
131    
132                    names.addAll(_params.keySet());
133    
134                    return Collections.enumeration(names);
135            }
136    
137            public String[] getParameterValues(String name) {
138                    String[] values = _params.get(name);
139    
140                    if (_inherit && (values == null)) {
141                            return super.getParameterValues(name);
142                    }
143    
144                    return values;
145            }
146    
147            public void setParameter(String name, String value) {
148                    _params.put(name, new String[] {value});
149            }
150    
151            public void setParameterValues(String name, String[] values) {
152                    _params.put(name, values);
153            }
154    
155            public Map<String, String[]> getDynamicParameterMap() {
156                    return _params;
157            }
158    
159            private Map<String, String[]> _params;
160            private boolean _inherit;
161    
162    }