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