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 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         // set current mode
352         stateFullControlParameter.put(getModeKey(window), mode.toString());
353     }
354 
355     public void setPortletId(PortletWindow window)
356     {
357         getStateFullControlParameter().put(getPortletIdKey(),window.getId().toString());
358         //getStateLessControlParameter().put(getPortletIdKey(),window.getId().toString());
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         public void setRequestParam(String name, String value)
369         {
370             requestParameter.put(name, value );
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 }