View Javadoc

1   /*
2    * Copyright 2003,2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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         // set current mode
340         stateFullControlParameter.put(getModeKey(window), mode.toString());
341     }
342 
343     public void setPortletId(PortletWindow window)
344     {
345         getStateFullControlParameter().put(getPortletIdKey(),window.getId().toString());
346         //getStateLessControlParameter().put(getPortletIdKey(),window.getId().toString());
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         public void setRequestParam(String name, String value)
357         {
358             requestParameter.put(name, value );
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 }