1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portal.kernel.portlet;
16  
17  import com.liferay.portal.kernel.util.ArrayUtil;
18  
19  import java.util.ArrayList;
20  import java.util.Collections;
21  import java.util.Enumeration;
22  import java.util.HashMap;
23  import java.util.List;
24  import java.util.Map;
25  
26  import javax.portlet.RenderRequest;
27  import javax.portlet.filter.RenderRequestWrapper;
28  
29  /**
30   * <a href="DynamicRenderRequest.java.html"><b><i>View Source</i></b></a>
31   *
32   * @author Brian Wing Shun Chan
33   */
34  public class DynamicRenderRequest extends RenderRequestWrapper {
35  
36      public DynamicRenderRequest(RenderRequest renderRequest) {
37          this(renderRequest, new HashMap<String, String[]>(), true);
38      }
39  
40      public DynamicRenderRequest(
41          RenderRequest renderRequest, Map<String, String[]> params) {
42  
43          this(renderRequest, params, true);
44      }
45  
46      public DynamicRenderRequest(RenderRequest renderRequest, boolean inherit) {
47          this(renderRequest, new HashMap<String, String[]>(), inherit);
48      }
49  
50      public DynamicRenderRequest(
51          RenderRequest renderRequest, Map<String, String[]> params,
52          boolean inherit) {
53  
54          super(renderRequest);
55  
56          _params = new HashMap<String, String[]>();
57          _inherit = inherit;
58  
59          if (params != null) {
60              for (Map.Entry<String, String[]> entry : params.entrySet()) {
61                  _params.put(entry.getKey(), entry.getValue());
62              }
63          }
64  
65          if (_inherit && (renderRequest instanceof DynamicRenderRequest)) {
66              DynamicRenderRequest dynamicRenderRequest =
67                  (DynamicRenderRequest)renderRequest;
68  
69              setRequest(dynamicRenderRequest.getRequest());
70  
71              params = dynamicRenderRequest.getDynamicParameterMap();
72  
73              if (params != null) {
74                  for (Map.Entry<String, String[]> entry : params.entrySet()) {
75                      String name = entry.getKey();
76                      String[] oldValues = entry.getValue();
77  
78                      String[] curValues = _params.get(name);
79  
80                      if (curValues == null) {
81                          _params.put(name, oldValues);
82                      }
83                      else {
84                          String[] newValues = ArrayUtil.append(
85                              oldValues, curValues);
86  
87                          _params.put(name, newValues);
88                      }
89                  }
90              }
91          }
92      }
93  
94      public String getParameter(String name) {
95          String[] values = _params.get(name);
96  
97          if (_inherit && (values == null)) {
98              return super.getParameter(name);
99          }
100 
101         if ((values != null) && (values.length > 0)) {
102             return values[0];
103         }
104         else {
105             return null;
106         }
107     }
108 
109     public Map<String, String[]> getParameterMap() {
110         Map<String, String[]> map = new HashMap<String, String[]>();
111 
112         Enumeration<String> enu = getParameterNames();
113 
114         while (enu.hasMoreElements()) {
115             String s = enu.nextElement();
116 
117             map.put(s, getParameterValues(s));
118         }
119 
120         return map;
121     }
122 
123     public Enumeration<String> getParameterNames() {
124         List<String> names = new ArrayList<String>();
125 
126         if (_inherit) {
127             Enumeration<String> enu = super.getParameterNames();
128 
129             while (enu.hasMoreElements()) {
130                 names.add(enu.nextElement());
131             }
132         }
133 
134         for (String s : _params.keySet()) {
135             if (!names.contains(s)) {
136                 names.add(s);
137             }
138         }
139 
140         return Collections.enumeration(names);
141     }
142 
143     public String[] getParameterValues(String name) {
144         String[] values = _params.get(name);
145 
146         if (_inherit && (values == null)) {
147             return super.getParameterValues(name);
148         }
149 
150         return values;
151     }
152 
153     public void setParameter(String name, String value) {
154         _params.put(name, new String[] {value});
155     }
156 
157     public void setParameterValues(String name, String[] values) {
158         _params.put(name, values);
159     }
160 
161     public Map<String, String[]> getDynamicParameterMap() {
162         return _params;
163     }
164 
165     private Map<String, String[]> _params;
166     private boolean _inherit;
167 
168 }