1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.pluto.portalImpl.core;
21
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.Iterator;
25 import java.util.Map;
26 import java.util.StringTokenizer;
27
28 import javax.portlet.PortletMode;
29 import javax.portlet.WindowState;
30
31 import org.apache.pluto.om.window.PortletWindow;
32 import org.apache.pluto.portalImpl.aggregation.Fragment;
33 import org.apache.pluto.portalImpl.aggregation.PortletFragment;
34 import org.apache.pluto.util.StringUtils;
35
36 public class PortalControlParameter {
37
38 static public final String ACTION = "ac";
39 static public final String MODE = "md";
40 static public final String PORTLET_ID = "pid";
41 static public final String PREFIX = "_";
42 static public final String PREV_MODE = "pm";
43 static public final String PREV_STATE = "ps";
44 static public final String RENDER_PARAM = "rp";
45 static public final String STATE = "st";
46
47 public static String decodeParameterName(String paramName)
48 {
49 return paramName.substring(PREFIX.length());
50 }
51
52 public static String decodeParameterValue(String paramName, String paramValue)
53 {
54 return paramValue;
55 }
56
57 private static String[] decodeRenderParamValues(String encodedParamValues)
58 {
59 StringTokenizer tokenizer = new StringTokenizer(encodedParamValues, "_");
60 if (!tokenizer.hasMoreTokens()) return null;
61 String _count = tokenizer.nextToken();
62 int count = Integer.valueOf(_count).intValue();
63 String[] values = new String[count];
64 for (int i=0; i<count; i++) {
65 if (!tokenizer.hasMoreTokens()) return null;
66 values[i] = decodeValue(tokenizer.nextToken());
67 }
68 return values;
69 }
70
71 private static String decodeValue(String value)
72 {
73 value = StringUtils.replace(value, "0x1", "_" );
74 value = StringUtils.replace(value, "0x2", "." );
75 value = StringUtils.replace(value, "0x3", "/" );
76 value = StringUtils.replace(value, "0x4", "\r" );
77 value = StringUtils.replace(value, "0x5", "\n" );
78 value = StringUtils.replace(value, "0x6", "<" );
79 value = StringUtils.replace(value, "0x7", ">" );
80 value = StringUtils.replace(value, "0x8", " " );
81 return value;
82 }
83
84 public static String encodeParameter(String param)
85 {
86 return PREFIX+param;
87 }
88
89 public static String encodeRenderParamName(PortletWindow window, String paramName)
90 {
91 StringBuffer returnvalue = new StringBuffer(50);
92 returnvalue.append(RENDER_PARAM);
93 returnvalue.append("_");
94 returnvalue.append(window.getId().toString());
95 returnvalue.append("_");
96 returnvalue.append(paramName);
97 return returnvalue.toString();
98 }
99
100 public static String encodeRenderParamValues(String[] paramValues)
101 {
102 StringBuffer returnvalue = new StringBuffer(100);
103 returnvalue.append(paramValues.length);
104 for (int i=0; i<paramValues.length; i++) {
105 returnvalue.append("_");
106 if(paramValues[i]!=null) {
107 returnvalue.append(encodeValue(paramValues[i]));
108 }
109 }
110 return returnvalue.toString();
111 }
112
113
114 private static String encodeValue(String value)
115 {
116 value = StringUtils.replace(value, "_", "0x1" );
117 value = StringUtils.replace(value, ".", "0x2" );
118 value = StringUtils.replace(value, "/", "0x3" );
119 value = StringUtils.replace(value, "\r", "0x4" );
120 value = StringUtils.replace(value, "\n", "0x5" );
121 value = StringUtils.replace(value, "<", "0x6" );
122 value = StringUtils.replace(value, ">", "0x7" );
123 value = StringUtils.replace(value, " ", "0x8" );
124 return value;
125 }
126
127 public static String getRenderParamKey(PortletWindow window)
128 {
129 return RENDER_PARAM+"_"+window.getId().toString();
130 }
131
132 public static boolean isControlParameter(String param)
133 {
134 return param.startsWith(PREFIX);
135 }
136
137 public static boolean isStateFullParameter(String param)
138 {
139 if (isControlParameter(param)) {
140 if ((param.startsWith(PREFIX+MODE)) ||
141 (param.startsWith(PREFIX+PREV_MODE)) ||
142 (param.startsWith(PREFIX+STATE)) ||
143 (param.startsWith(PREFIX+PREV_STATE)) ||
144 (param.startsWith(PREFIX+RENDER_PARAM))) {
145 return true;
146 }
147 }
148 return false;
149 }
150 private Map requestParameter = new HashMap();
151 private Map stateFullControlParameter = null;
152 private Map stateLessControlParameter = null;
153
154
155
156
157
158 private PortalURL url;
159
160 public PortalControlParameter(PortalURL url)
161 {
162 this.url = url;
163 stateFullControlParameter = this.url.getClonedStateFullControlParameter();
164 stateLessControlParameter = this.url.getClonedStateLessControlParameter();
165 }
166
167 public void clearRenderParameters(PortletWindow portletWindow)
168 {
169 String prefix = getRenderParamKey(portletWindow);
170 Iterator keyIterator = stateFullControlParameter.keySet().iterator();
171
172 while (keyIterator.hasNext()) {
173 String name = (String)keyIterator.next();
174 if (name.startsWith(prefix)) {
175 keyIterator.remove();
176 }
177 }
178 }
179
180 private String getActionKey(PortletWindow window)
181 {
182 return ACTION+"_"+window.getId().toString();
183 }
184
185 public String[] getActionParameter(PortletWindow window, String paramName)
186 {
187 String encodedValues = (String)stateFullControlParameter.get(encodeRenderParamName(window, paramName));
188 String[] values = decodeRenderParamValues(encodedValues);
189 return values;
190 }
191
192
193 public PortletMode getMode(PortletWindow window)
194 {
195 String mode = (String)stateFullControlParameter.get(getModeKey(window));
196 if (mode!=null)
197 return new PortletMode(mode);
198 else
199 return PortletMode.VIEW;
200 }
201
202
203
204
205 private String getModeKey(PortletWindow window)
206 {
207 return MODE+"_"+window.getId().toString();
208 }
209
210 public String getPIDValue()
211 {
212 String value = (String)stateLessControlParameter.get(getPortletIdKey());
213 return value==null?"":value;
214 }
215
216 private String getPortletIdKey()
217 {
218 return PORTLET_ID;
219 }
220
221 public PortletWindow getPortletWindowOfAction()
222 {
223 Iterator iterator = getStateLessControlParameter().keySet().iterator();
224 while (iterator.hasNext()) {
225 String name = (String)iterator.next();
226 if (name.startsWith(ACTION)) {
227 String id = name.substring(ACTION.length()+1);
228 Fragment fragment = org.apache.pluto.portalImpl.services.pageregistry.PageRegistry.getFragment(id);
229 if (fragment instanceof PortletFragment) {
230 return((PortletFragment)fragment).getPortletWindow();
231 }
232 }
233 }
234 return null;
235 }
236
237 public PortletMode getPrevMode(PortletWindow window)
238 {
239 String mode = (String)stateFullControlParameter.get(getPrevModeKey(window));
240 if (mode!=null)
241 return new PortletMode(mode);
242 else
243 return null;
244 }
245 private String getPrevModeKey(PortletWindow window)
246 {
247 return PREV_MODE+"_"+window.getId().toString();
248 }
249
250 public WindowState getPrevState(PortletWindow window)
251 {
252 String state = (String)stateFullControlParameter.get(getPrevStateKey(window));
253 if (state!=null)
254 return new WindowState(state);
255 else
256 return null;
257 }
258 private String getPrevStateKey(PortletWindow window)
259 {
260 return PREV_STATE+"_"+window.getId().toString();
261 }
262
263 public Iterator getRenderParamNames(PortletWindow window)
264 {
265 ArrayList returnvalue = new ArrayList();
266 String prefix = getRenderParamKey(window);
267 Iterator keyIterator = stateFullControlParameter.keySet().iterator();
268
269 while (keyIterator.hasNext()) {
270 String name = (String)keyIterator.next();
271 if (name.startsWith(prefix)) {
272 returnvalue.add(name.substring(prefix.length()+1));
273 }
274 }
275
276 return returnvalue.iterator();
277 }
278
279 public String[] getRenderParamValues(PortletWindow window, String paramName)
280 {
281 String encodedValues = (String)stateFullControlParameter.get(encodeRenderParamName(window, paramName));
282 String[] values = decodeRenderParamValues(encodedValues);
283 return values;
284 }
285
286 public Map getRequestParameter()
287 {
288 return requestParameter;
289 }
290
291 public WindowState getState(PortletWindow window)
292 {
293 String state = (String)stateFullControlParameter.get(getStateKey(window));
294 if (state!=null)
295 return new WindowState(state);
296 else
297 return WindowState.NORMAL;
298 }
299
300 public Map getStateFullControlParameter()
301 {
302 return stateFullControlParameter;
303 }
304
305 private String getStateKey(PortletWindow window)
306 {
307 return STATE+"_"+window.getId().toString();
308 }
309
310 public Map getStateLessControlParameter()
311 {
312 return stateLessControlParameter;
313 }
314
315 public boolean isOnePortletWindowMaximized()
316 {
317 Iterator iterator = stateFullControlParameter.keySet().iterator();
318 while (iterator.hasNext()) {
319 String name = (String)iterator.next();
320 if (name.startsWith(STATE)) {
321 if (stateFullControlParameter.get(name).equals(WindowState.MAXIMIZED.toString())) {
322 return true;
323 }
324 }
325 }
326 return false;
327 }
328
329 public void setAction(PortletWindow window)
330 {
331 getStateFullControlParameter().put(getActionKey(window),ACTION.toUpperCase());
332 }
333
334 public void setMode(PortletWindow window, PortletMode mode)
335 {
336 Object prevMode = stateFullControlParameter.get(getModeKey(window));
337 if (prevMode!=null)
338 stateFullControlParameter.put(getPrevModeKey(window), prevMode);
339
340 stateFullControlParameter.put(getModeKey(window), mode.toString());
341 }
342
343 public void setPortletId(PortletWindow window)
344 {
345 getStateFullControlParameter().put(getPortletIdKey(),window.getId().toString());
346
347 }
348
349 public void setRenderParam(PortletWindow window, String name, String[] values)
350 {
351 stateFullControlParameter.put(encodeRenderParamName(window, name),
352 encodeRenderParamValues(values) );
353 }
354
355
356
357
358
359
360
361 public void setRequestParam(String name, String[] values )
362 {
363 requestParameter.put(name, values );
364 }
365
366
367 public void setState(PortletWindow window, WindowState state)
368 {
369 Object prevState = stateFullControlParameter.get(getStateKey(window));
370 if (prevState!=null)
371 stateFullControlParameter.put(getPrevStateKey(window), prevState);
372 stateFullControlParameter.put(getStateKey(window), state.toString());
373 }
374
375 }