1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.jetspeed.modules.actions.portlets;
18
19 import java.util.Collection;
20 import java.util.Iterator;
21
22 import org.apache.commons.lang.SerializationUtils;
23 import org.apache.jetspeed.modules.actions.portlets.security.SecurityConstants;
24 import org.apache.jetspeed.om.BaseSecurityReference;
25 import org.apache.jetspeed.om.SecurityReference;
26 import org.apache.jetspeed.om.registry.MediaTypeRegistry;
27 import org.apache.jetspeed.om.registry.PortletEntry;
28 import org.apache.jetspeed.om.registry.RegistryEntry;
29 import org.apache.jetspeed.om.registry.base.BaseParameter;
30 import org.apache.jetspeed.om.registry.base.BaseSecurity;
31 import org.apache.jetspeed.portal.portlets.VelocityPortlet;
32 import org.apache.jetspeed.services.JetspeedSecurity;
33 import org.apache.jetspeed.services.Registry;
34 import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
35 import org.apache.jetspeed.services.logging.JetspeedLogger;
36 import org.apache.turbine.util.DynamicURI;
37 import org.apache.turbine.util.RunData;
38 import org.apache.turbine.util.TurbineException;
39 import org.apache.velocity.context.Context;
40
41 /***
42 * This action enables the creation and editing of portlets
43 *
44 * @author <a href="mailto:caius1440@hotmail.com">Jeremy Ford</a>
45 * @version $Id: PortletUpdateAction.java,v 1.8 2004/02/23 02:56:58 jford Exp $
46 */
47 public class PortletUpdateAction extends RegistryUpdateAction
48 {
49 private static final String PORTLET_UPDATE_PANE = "portlet-form";
50
51 private static final String PORTLET_NAME = "portlet_name";
52 private static final String TAB_PARAMETER = "tab";
53
54 /***
55 * Static initialization of the logger for this class
56 */
57 private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(PortletUpdateAction.class.getName());
58
59 public PortletUpdateAction()
60 {
61 registryEntryName = PORTLET_NAME;
62 registry = Registry.PORTLET;
63 pane = PORTLET_UPDATE_PANE;
64 }
65
66 /***
67 * Subclasses must override this method to provide default behavior
68 * for the portlet action
69 */
70 /***
71 * Build the normal state content for this portlet.
72 *
73 * @param portlet The velocity-based portlet that is being built.
74 * @param context The velocity context for this request.
75 * @param rundata The turbine rundata context for this request.
76 */
77 protected void buildNormalContext(
78 VelocityPortlet portlet,
79 Context context,
80 RunData rundata)
81 throws Exception
82 {
83 super.buildNormalContext(portlet, context, rundata);
84
85 String mode =
86 rundata.getParameters().getString(SecurityConstants.PARAM_MODE);
87
88 if (mode != null && mode.equals(SecurityConstants.PARAM_MODE_INSERT))
89 {
90 context.put("parents", PortletFilter.buildParentList(PortletFilter.getAllPortlets()));
91 context.put(
92 "securitys",
93 CustomizeSetAction.buildList(rundata, Registry.SECURITY));
94 }
95
96 if (mode != null && mode.equals(SecurityConstants.PARAM_MODE_UPDATE))
97 {
98 String portletName =
99 rundata.getParameters().getString(PORTLET_NAME);
100 PortletEntry portletEntry =
101 (PortletEntry) Registry.getEntry(Registry.PORTLET, portletName);
102
103 context.put("groups", iteratorToCollection(JetspeedSecurity.getGroups()));
104 context.put("categories", PortletFilter.buildCategoryList(PortletFilter.getAllPortlets()));
105
106 String tab = rundata.getParameters().getString(TAB_PARAMETER);
107 context.put("currentTab", tab);
108
109 context.put(
110 "securitys",
111 CustomizeSetAction.buildList(rundata, Registry.SECURITY));
112
113 context.put("entry", portletEntry);
114
115 MediaTypeRegistry mediaTypeReg = (MediaTypeRegistry)Registry.get(Registry.MEDIA_TYPE);
116 context.put("media_types", iteratorToCollection(mediaTypeReg.listEntryNames()));
117
118 if(portletEntry.getType() != null && portletEntry.getType().equals("ref"))
119 {
120 PortletEntry parentEntry = (PortletEntry) Registry.getEntry(Registry.PORTLET, portletEntry.getParent());
121 if(parentEntry == null)
122 {
123 logger.error(this.getClass().getName() + ": Portlet " + portletName + " of type ref has no parent. This portlet will not work properly.");
124 }
125 else
126 {
127 Collection parentCategories = iteratorToCollection(parentEntry.listCategories());
128 context.put("parent_categories", parentCategories);
129
130 Collection parentMediaTypes = iteratorToCollection(parentEntry.listMediaTypes());
131 context.put("parent_mediatypes", parentMediaTypes);
132 }
133 }
134 }
135
136 if (mode != null && mode.equals(SecurityConstants.PARAM_MODE_DELETE))
137 {
138 String portletName =
139 rundata.getParameters().getString(PORTLET_NAME);
140 PortletEntry portletEntry =
141 (PortletEntry) Registry.getEntry(registry, portletName);
142
143 context.put("entry", portletEntry);
144 }
145 }
146
147 public void doInsert(RunData rundata, Context context) throws Exception
148 {
149 super.doInsert(rundata, context);
150
151 String entryName =
152 rundata.getParameters().getString(registryEntryName);
153
154 PortletEntry portletEntry =
155 (PortletEntry) Registry.getEntry(registry, entryName);
156 if (portletEntry == null)
157 {
158 String message = "Portlet entry " + entryName + " does not exist. The portlet was not added to the registry.";
159 logger.error(this.getClass().getName() + ": " + message);
160
161 throw new IllegalStateException(message);
162 }
163 else
164 {
165 if(portletEntry.getType().equals("ref")) {
166 PortletEntry parentEntry = (PortletEntry)Registry.getEntry(Registry.PORTLET, portletEntry.getParent());
167
168 if(parentEntry == null)
169 {
170 logger.error(this.getClass().getName() + ": Portlet " + entryName + " of type ref has no parent. This portlet will not work properly.");
171 }
172 else
173 {
174
175
176
177 Iterator paramIter = portletEntry.getParameterNames();
178 while(paramIter.hasNext())
179 {
180 String paramName = (String)paramIter.next();
181 BaseParameter param = (BaseParameter) portletEntry.getParameter(paramName);
182 BaseParameter clonedParameter = (BaseParameter)SerializationUtils.clone(param);
183 portletEntry.addParameter(clonedParameter);
184 }
185
186 Registry.addEntry(Registry.PORTLET, portletEntry);
187 }
188 }
189 }
190 }
191
192 /***
193 * @see org.apache.jetspeed.modules.actions.portlets.RegistryUpdateAction#updateRegistryEntry(org.apache.turbine.util.RunData, org.apache.jetspeed.om.registry.RegistryEntry)
194 */
195 protected void updateRegistryEntry(RunData rundata, RegistryEntry registryEntry) throws Exception
196 {
197 super.updateRegistryEntry(rundata, registryEntry);
198 setPortletEntryInfo(rundata, (PortletEntry)registryEntry);
199 }
200
201 /***
202 * Sets the portlet entry's fields
203 * @param rundata
204 * @param portletEntry
205 */
206 private void setPortletEntryInfo(
207 RunData rundata,
208 PortletEntry portletEntry)
209 {
210 String parent = rundata.getParameters().getString("parent");
211 String title = rundata.getParameters().getString("title");
212 String description = rundata.getParameters().getString("description");
213 String url = rundata.getParameters().getString("url");
214 String type = rundata.getParameters().getString("portlet_type");
215
216 String mediaType = rundata.getParameters().getString("media_type");
217
218
219 String image = rundata.getParameters().getString("image");
220
221 String className = rundata.getParameters().getString("class_name");
222
223 boolean isApplication =
224 rundata.getParameters().getBoolean("is_application", false);
225 boolean isCachedOnURL =
226 rundata.getParameters().getBoolean("is_cached_on_url", false);
227 boolean isHidden =
228 rundata.getParameters().getBoolean("is_hidden", false);
229 boolean isAdmin = rundata.getParameters().getBoolean("is_admin", false);
230
231 String newSecurityParent =
232 rundata.getParameters().getString("security_ref");
233
234 String newSecurityRole =
235 rundata.getParameters().getString("security_role");
236
237 portletEntry.setTitle(title);
238 portletEntry.setDescription(description);
239 portletEntry.setURL(url);
240 portletEntry.setParent(parent);
241 portletEntry.setType(type);
242 portletEntry.getMetaInfo().setImage(image);
243
244
245 portletEntry.listMediaTypes();
246 portletEntry.addMediaType(mediaType);
247
248 if (className != null && className.length() > 0)
249 {
250 portletEntry.setClassname(className);
251 }
252
253 portletEntry.setApplication(isApplication);
254 portletEntry.setCachedOnURL(isCachedOnURL);
255 portletEntry.setHidden(isHidden);
256
257
258 if (newSecurityParent != null && newSecurityParent.length() > 0)
259 {
260 SecurityReference securityRef = new BaseSecurityReference();
261 securityRef.setParent(newSecurityParent);
262 portletEntry.setSecurityRef(securityRef);
263 }
264
265 if (newSecurityRole != null && newSecurityRole.length() > 0)
266 {
267 BaseSecurity securityRole = new BaseSecurity();
268 securityRole.setRole(newSecurityRole);
269 portletEntry.setSecurity(securityRole);
270 }
271 }
272
273 /***
274 * Add a category to a portlet
275 * @param rundata The turbine rundata context for this request.
276 * @param context The velocity context for this request.
277 * @throws Exception
278 */
279 public void doAddcategory(RunData rundata, Context context)
280 throws Exception
281 {
282 try
283 {
284 String portletName =
285 rundata.getParameters().getString(PORTLET_NAME);
286 PortletEntry portletEntry =
287 (PortletEntry) Registry.getEntry(Registry.PORTLET, portletName);
288 if (portletEntry != null)
289 {
290 String categoryName =
291 rundata.getParameters().getString("category_name");
292 if (categoryName != null && categoryName.length() > 0)
293 {
294 String categoryGroup =
295 rundata.getParameters().getString(
296 "category_group",
297 "Jetspeed");
298 portletEntry.addCategory(categoryName, categoryGroup);
299
300 Registry.addEntry(registry, portletEntry);
301
302 clearUserData(rundata);
303 }
304 else
305 {
306 DynamicURI duri = redirect(rundata, SecurityConstants.PARAM_MODE_UPDATE, SecurityConstants.MID_MISSING_PARAMETER);
307 rundata.setRedirectURI(duri.toString());
308
309 resetForm(rundata);
310 }
311 }
312 else
313 {
314 DynamicURI duri = redirect(rundata, SecurityConstants.PARAM_MODE_UPDATE, SecurityConstants.MID_INVALID_ENTITY_NAME);
315 rundata.setRedirectURI(duri.toString());
316 resetForm(rundata);
317
318 logger.error("Failed to find registry entry while trying to add category");
319 }
320 }
321 catch (Exception e)
322 {
323 DynamicURI duri = redirect(rundata, SecurityConstants.PARAM_MODE_UPDATE, SecurityConstants.MID_UPDATE_FAILED);
324 rundata.setRedirectURI(duri.toString());
325 resetForm(rundata);
326
327 logger.error("Exception", e);
328 }
329 }
330
331 /***
332 * Remove categories from a portlet
333 * @param rundata The turbine rundata context for this request.
334 * @param context The velocity context for this request.
335 * @throws Exception
336 */
337 public void doRemovecategories(RunData rundata, Context context)
338 throws Exception
339 {
340 try
341 {
342 String portletName =
343 rundata.getParameters().getString(PORTLET_NAME);
344 PortletEntry portletEntry =
345 (PortletEntry) Registry.getEntry(Registry.PORTLET, portletName);
346 if (portletEntry != null)
347 {
348 String[] categories =
349 rundata.getParameters().getStrings("category_name");
350 if (categories != null && categories.length > 0)
351 {
352 for (int i = 0; i < categories.length; i++)
353 {
354 String categoryName = categories[i];
355 String categoryGroup =
356 rundata.getParameters().getString(
357 categoryName + ".category_group",
358 "Jetspeed");
359 portletEntry.removeCategory(
360 categoryName,
361 categoryGroup);
362 }
363
364 Registry.addEntry(registry, portletEntry);
365 clearUserData(rundata);
366 }
367 else
368 {
369 DynamicURI duri = redirect(rundata, SecurityConstants.PARAM_MODE_UPDATE, SecurityConstants.MID_MISSING_PARAMETER);
370 duri = duri.addQueryData(PORTLET_NAME, portletName);
371 rundata.setRedirectURI(duri.toString());
372
373 resetForm(rundata);
374 }
375 }
376 else
377 {
378 DynamicURI duri = redirect(rundata, SecurityConstants.PARAM_MODE_UPDATE, SecurityConstants.MID_INVALID_ENTITY_NAME);
379 rundata.setRedirectURI(duri.toString());
380 resetForm(rundata);
381
382 logger.error("Failed to find registry entry while trying to remove categories");
383 }
384 }
385 catch (Exception e)
386 {
387 DynamicURI duri = redirect(rundata, SecurityConstants.PARAM_MODE_UPDATE, SecurityConstants.MID_UPDATE_FAILED);
388 rundata.setRedirectURI(duri.toString());
389 resetForm(rundata);
390
391 logger.error("Exception", e);
392 }
393 }
394
395 /***
396 * @see org.apache.jetspeed.modules.actions.portlets.RegistryUpdateAction#resetForm(org.apache.turbine.util.RunData)
397 */
398 /***
399 * Populates the user's temp storage with form data
400 * @param rundata The turbine rundata context for this request.
401 */
402 protected void resetForm(RunData rundata)
403 {
404 super.resetForm(rundata);
405
406 String parent = rundata.getParameters().getString("parent");
407 String title = rundata.getParameters().getString("title");
408 String description = rundata.getParameters().getString("description");
409 String url = rundata.getParameters().getString("url");
410 String type = rundata.getParameters().getString("portlet_type");
411
412
413 String image = rundata.getParameters().getString("image");
414
415 String className = rundata.getParameters().getString("class_name");
416
417 String isApplication =
418 rundata.getParameters().getString("is_application");
419 String isCachedOnURL =
420 rundata.getParameters().getString("is_cached_on_url");
421 String isHidden = rundata.getParameters().getString("is_hidden");
422 String isAdmin = rundata.getParameters().getString("is_admin");
423
424 String newSecurityParent =
425 rundata.getParameters().getString("security_ref");
426
427
428
429 rundata.getUser().setTemp("parent", parent);
430 rundata.getUser().setTemp("portlet_type", type);
431 rundata.getUser().setTemp("class_name", className);
432 rundata.getUser().setTemp("url", url);
433 rundata.getUser().setTemp("image", image);
434 rundata.getUser().setTemp("is_application", isApplication);
435 rundata.getUser().setTemp("is_cached_on_url", isCachedOnURL);
436 rundata.getUser().setTemp("is_hidden", isHidden);
437 rundata.getUser().setTemp("is_admin", isAdmin);
438 rundata.getUser().setTemp("security_ref", newSecurityParent);
439
440 }
441
442
443 /***
444 * @see org.apache.jetspeed.modules.actions.portlets.RegistryUpdateAction#clearUserData(org.apache.turbine.util.RunData)
445 */
446 protected void clearUserData(RunData rundata)
447 {
448 try
449 {
450 super.clearUserData(rundata);
451
452 rundata.getUser().removeTemp("parameter_name");
453 rundata.getUser().removeTemp("paramter_value");
454 rundata.getUser().removeTemp("parent");
455 rundata.getUser().removeTemp("portlet_type");
456 rundata.getUser().removeTemp("class_name");
457 rundata.getUser().removeTemp("url");
458 rundata.getUser().removeTemp("image");
459 rundata.getUser().removeTemp("is_application");
460 rundata.getUser().removeTemp("is_cached_on_url");
461 rundata.getUser().removeTemp("is_hidden");
462 rundata.getUser().removeTemp("is_admin");
463 rundata.getUser().removeTemp("security_ref");
464
465 }
466 catch (Exception e)
467 {
468 if (logger.isDebugEnabled())
469 {
470 logger.debug("PortletUpdateAction: Failed to clear user data");
471 }
472 }
473 }
474
475 /***
476 * @see org.apache.jetspeed.modules.actions.portlets.RegistryUpdateAction#redirect(org.apache.turbine.util.RunData, java.lang.String, int)
477 */
478 protected DynamicURI redirect(RunData rundata, String mode, int reason)
479 throws TurbineException
480 {
481 DynamicURI duri = super.redirect(rundata, mode, reason);
482
483 String tab = rundata.getParameters().getString(TAB_PARAMETER);
484 if(tab != null && tab.length() > 0)
485 {
486 duri.addQueryData(TAB_PARAMETER, tab);
487 }
488
489 return duri;
490 }
491 }