1 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 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 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 70 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 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 195 protected void updateRegistryEntry(RunData rundata, RegistryEntry registryEntry) throws Exception 196 { 197 super.updateRegistryEntry(rundata, registryEntry); 198 setPortletEntryInfo(rundata, (PortletEntry)registryEntry); 199 } 200 201 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 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 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 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 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 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 398 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 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 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 } 441 442 443 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 } 466 catch (Exception e) 467 { 468 if (logger.isDebugEnabled()) 469 { 470 logger.debug("PortletUpdateAction: Failed to clear user data"); 471 } 472 } 473 } 474 475 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 } 492 | Popular Tags |