View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.portals.bridges.velocity;
18  
19  import java.io.IOException;
20  import java.util.HashMap;
21  import java.util.Iterator;
22  import java.util.Map;
23  
24  import javax.portlet.ActionRequest;
25  import javax.portlet.ActionResponse;
26  import javax.portlet.PortletConfig;
27  import javax.portlet.PortletException;
28  import javax.portlet.PortletMode;
29  import javax.portlet.PortletPreferences;
30  import javax.portlet.PortletRequest;
31  import javax.portlet.RenderRequest;
32  import javax.portlet.RenderResponse;
33  import javax.portlet.WindowState;
34  
35  import org.apache.portals.bridges.common.GenericServletPortlet;
36  import org.apache.velocity.VelocityContext;
37  import org.apache.velocity.context.Context;
38  
39  /***
40   * <p>
41   * Generic Velocity Portlet emulating basic functionality provided in the
42   * Portlet API (for JSPs) to Velocity portlets and templates. Provides the
43   * following Velocity context variables emulating PLT.22 JSP request variables: *
44   * <ul>
45   * <li>$renderRequest
46   * <li>$renderResponse
47   * <li>$portletConfig
48   * </ul>
49   * </p>
50   * <p>
51   * PLT.22 Tags:
52   * <ul>
53   * <li>$actionURL -- use renderResponse.createActionURL()
54   * <li>$renderURL -- use renderResponse.createRenderURL()
55   * <li>$namespace -- use rennderResponse.getNamespace() (Namespace)
56   * </ul>
57   * Beware that Param tags cannot be added incrementally i.e.
58   * $renderURL.setParameter("name","value").setParameter("name","value") since
59   * the portlet api returns void on setParameter (or setWindowState,
60   * setPortletMode) Thus it is required to set each param or state on a single
61   * line:
62   * </p>
63   * <p>
64   * #set($max = $renderResponse.createRenderURL())
65   * $max.setWindowState($STATE_MAX) $max.setParameter("bush", "war")
66   * </p>
67   * <p>
68   * Constants: $MODE_EDIT, $MODE_HELP, $MODE_VIEW, $STATE_NORMAL, $STATE_MIN,
69   * $STATE_MAX, $USER_INFO
70   * 
71   * @author <a href="mailto:taylor@apache.org">David Sean Taylor </a>
72   * @version $Id: GenericVelocityPortlet.java,v 1.1 2004/10/29 01:29:50 taylor
73   *          Exp $
74   */
75  public class GenericVelocityPortlet extends GenericServletPortlet
76  {
77  
78      public final static String PORTLET_BRIDGE_CONTEXT = "portals.bridges.velocity.context";
79  
80      public GenericVelocityPortlet()
81      {
82      }
83  
84      public void init(PortletConfig config) throws PortletException
85      {
86          super.init(config);
87      }
88  
89      /***
90       * Execute the servlet as define by the init parameter or preference
91       * PARAM_ACTION_PAGE. The value if the parameter is a relative URL, i.e.
92       * /actionPage.jsp will execute the JSP editPage.jsp in the portlet
93       * application's web app. The action should not generate any content. The
94       * content will be generate by doCustom(), doHelp() , doEdit(), or doView().
95       * 
96       * See section PLT.16.2 of the JSR 168 Portlet Spec for more information
97       * around executing a servlet or JSP in processAction()
98       * 
99       * @see javax.portlet.GenericPortlet#processAction
100      * 
101      * @task Need to be able to execute a servlet for the action
102      */
103     public void processAction(ActionRequest request, ActionResponse actionResponse) throws PortletException,
104             IOException
105     {
106         super.processAction(request, actionResponse);
107     }
108 
109     /***
110      * Execute the servlet as define by the init parameter or preference
111      * PARAM_EDIT_PAGE. The value if the parameter is a relative URL, i.e.
112      * /editPage.jsp will execute the JSP editPage.jsp in the portlet
113      * application's web app.
114      * 
115      * @see javax.portlet.GenericPortlet#doCustom
116      */
117     public void doCustom(RenderRequest request, RenderResponse response) throws PortletException, IOException
118     {
119         super.doCustom(request, response);
120     }
121 
122     /***
123      * Execute the servlet as define by the init parameter or preference
124      * PARAM_EDIT_PAGE. The value if the parameter is a relative URL, i.e.
125      * /editPage.jsp will execute the JSP editPage.jsp in the portlet
126      * application's web app.
127      * 
128      * @see javax.portlet.GenericPortlet#doEdit
129      */
130     public void doEdit(RenderRequest request, RenderResponse response) throws PortletException, IOException
131     {
132         super.doEdit(request, response);
133     }
134 
135     /***
136      * Execute the servlet as define by the init parameter or preference
137      * PARAM_HELP_PAGE. The value if the parameter is a relative URL, i.e.
138      * /helpPage.jsp will exeute the JSP helpPage.jsp in the portlet
139      * application's web app.
140      * 
141      * @see javax.portlet.GenericPortlet#doView
142      */
143     public void doHelp(RenderRequest request, RenderResponse response) throws PortletException, IOException
144     {
145         super.doHelp(request, response);
146     }
147 
148     /***
149      * Execute the servlet as define by the init parameter or preference
150      * PARAM_VIEW_PAGE. The value if the parameter is a relative URL, i.e.
151      * /viewPage.jsp will execute the JSP viewPage.jsp in the portlet
152      * application's web app.
153      * 
154      * @see javax.portlet.GenericPortlet#doView
155      */
156     public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException
157     {
158         super.doView(request, response);
159     }
160 
161     public void render(RenderRequest request, RenderResponse response) throws PortletException, java.io.IOException
162     {
163         createPortletVelocityContext(request, response);
164         super.render(request, response);
165     }
166 
167     private Context createPortletVelocityContext(RenderRequest request, RenderResponse response)
168     {
169         Context ctx = new VelocityContext();
170         request.setAttribute(PORTLET_BRIDGE_CONTEXT, ctx);
171         // PLT.22
172         ctx.put("renderRequest", request);
173         ctx.put("renderResponse", response);
174         ctx.put("portletConfig", getPortletConfig());
175         // constants
176         ctx.put("STATE_NORMAL", WindowState.NORMAL);
177         ctx.put("STATE_MAX", WindowState.MAXIMIZED);
178         ctx.put("STATE_MIN", WindowState.MINIMIZED);
179         ctx.put("MODE_VIEW", PortletMode.VIEW);
180         ctx.put("MODE_EDIT", PortletMode.EDIT);
181         ctx.put("MODE_HELP", PortletMode.HELP);
182         ctx.put("USER_INFO", PortletRequest.USER_INFO);
183         return ctx;
184     }
185 
186     public Context getContext(RenderRequest request)
187     {
188         return (Context) request.getAttribute(PORTLET_BRIDGE_CONTEXT);
189     }
190     
191     public Context getContext(RenderRequest request, RenderResponse response)
192     {
193         Context context = (Context) request.getAttribute(PORTLET_BRIDGE_CONTEXT);
194         
195         if (context == null)
196         {
197             context = createPortletVelocityContext(request, response);
198         }
199         
200         return context;
201     }
202 
203     public void setupPreferencesEdit(RenderRequest request, RenderResponse response)
204     {
205         Context context = getContext(request, response);
206         PortletPreferences prefs = request.getPreferences();
207         Map map = prefs.getMap();
208         Iterator it = map.entrySet().iterator();
209         context.put("prefs", it);
210         
211         Map result = new HashMap(map.size());
212         Iterator f = map.entrySet().iterator();
213         while(f.hasNext())
214         {
215             Map.Entry e = (Map.Entry)f.next();
216             String []why = (String[])e.getValue();
217             if (why == null || why[0] == null)
218             {
219                 result.put(e.getKey(), "");                
220             }
221             else
222             {
223                 result.put(e.getKey(), why[0]);
224             }
225         }
226         context.put("prefsMap", result);
227     }
228     
229     public void doPreferencesEdit(RenderRequest request, RenderResponse response) throws PortletException, IOException
230     {
231         setupPreferencesEdit(request, response);
232         super.doEdit(request, response);
233     }
234 
235 }