1 23 24 package org.infoglue.deliver.invokers; 25 26 import java.io.File ; 27 import java.io.PrintWriter ; 28 import java.io.StringWriter ; 29 import java.net.URLEncoder ; 30 import java.util.ArrayList ; 31 import java.util.Collection ; 32 import java.util.HashMap ; 33 import java.util.Iterator ; 34 import java.util.List ; 35 import java.util.Locale ; 36 import java.util.Map ; 37 38 import org.apache.log4j.Logger; 39 import org.dom4j.Document; 40 import org.infoglue.cms.controllers.kernel.impl.simple.AccessRightController; 41 import org.infoglue.cms.controllers.kernel.impl.simple.ContentController; 42 import org.infoglue.cms.controllers.kernel.impl.simple.PageTemplateController; 43 import org.infoglue.cms.entities.content.ContentVO; 44 import org.infoglue.cms.entities.content.ContentVersionVO; 45 import org.infoglue.cms.entities.management.LanguageVO; 46 import org.infoglue.cms.exception.SystemException; 47 import org.infoglue.cms.io.FileHelper; 48 import org.infoglue.cms.security.InfoGluePrincipal; 49 import org.infoglue.cms.util.CmsPropertyHandler; 50 import org.infoglue.cms.util.StringManager; 51 import org.infoglue.cms.util.StringManagerFactory; 52 import org.infoglue.cms.util.XMLHelper; 53 import org.infoglue.cms.util.dom.DOMBuilder; 54 import org.infoglue.deliver.applications.actions.InfoGlueComponent; 55 import org.infoglue.deliver.applications.databeans.ComponentBinding; 56 import org.infoglue.deliver.applications.databeans.ComponentProperty; 57 import org.infoglue.deliver.applications.databeans.ComponentPropertyOption; 58 import org.infoglue.deliver.applications.databeans.ComponentTask; 59 import org.infoglue.deliver.applications.databeans.DeliveryContext; 60 import org.infoglue.deliver.applications.databeans.Slot; 61 import org.infoglue.deliver.controllers.kernel.impl.simple.BasicTemplateController; 62 import org.infoglue.deliver.controllers.kernel.impl.simple.ContentDeliveryController; 63 import org.infoglue.deliver.controllers.kernel.impl.simple.DecoratedComponentLogic; 64 import org.infoglue.deliver.controllers.kernel.impl.simple.IntegrationDeliveryController; 65 import org.infoglue.deliver.controllers.kernel.impl.simple.LanguageDeliveryController; 66 import org.infoglue.deliver.controllers.kernel.impl.simple.NodeDeliveryController; 67 import org.infoglue.deliver.controllers.kernel.impl.simple.TemplateController; 68 import org.infoglue.deliver.util.CacheController; 69 import org.infoglue.deliver.util.Timer; 70 import org.infoglue.deliver.util.VelocityTemplateProcessor; 71 import org.w3c.dom.NodeList ; 72 73 79 80 public class DecoratedComponentBasedHTMLPageInvoker extends ComponentBasedHTMLPageInvoker 81 { 82 private final static Logger logger = Logger.getLogger(DecoratedComponentBasedHTMLPageInvoker.class.getName()); 83 84 private String propertiesDivs = ""; 85 private String tasksDivs = ""; 86 87 90 91 public void invokePage() throws SystemException, Exception 92 { 93 Timer timer = new Timer(); 94 timer.setActive(false); 95 96 String decoratePageTemplate = ""; 97 98 NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(this.getDeliveryContext()); 99 100 timer.printElapsedTime("Initialized controllers"); 101 102 Integer repositoryId = nodeDeliveryController.getSiteNode(getDatabase(), this.getDeliveryContext().getSiteNodeId()).getRepository().getId(); 103 String componentXML = getPageComponentsString(getDatabase(), this.getTemplateController(), this.getDeliveryContext().getSiteNodeId(), this.getDeliveryContext().getLanguageId(), this.getDeliveryContext().getContentId()); 104 106 timer.printElapsedTime("After getPageComponentsString"); 107 108 Timer decoratorTimer = new Timer(); 109 decoratorTimer.setActive(false); 110 111 if(componentXML == null || componentXML.length() == 0) 112 { 113 decoratePageTemplate = showInitialBindingDialog(this.getDeliveryContext().getSiteNodeId(), this.getDeliveryContext().getLanguageId(), this.getDeliveryContext().getContentId()); 114 } 115 else 116 { 117 Document document = null; 118 try 119 { 120 document = new DOMBuilder().getDocument(componentXML); 121 } 122 catch(Exception e) 123 { 124 throw new SystemException("There was a problem parsing the component structure on the page. Could be invalid XML in the ComponentStructure attribute. Message:" + e.getMessage(), e); 125 } 126 127 decoratorTimer.printElapsedTime("After reading document"); 128 129 List pageComponents = getPageComponents(getDatabase(), componentXML, document.getRootElement(), "base", this.getTemplateController(), null); 130 131 InfoGlueComponent baseComponent = null; 132 if(pageComponents.size() > 0) 133 { 134 baseComponent = (InfoGlueComponent)pageComponents.get(0); 135 } 136 137 decoratorTimer.printElapsedTime("After getting basecomponent"); 138 139 if(baseComponent == null) 140 { 141 decoratePageTemplate = showInitialBindingDialog(this.getDeliveryContext().getSiteNodeId(), this.getDeliveryContext().getLanguageId(), this.getDeliveryContext().getContentId()); 142 } 143 else 144 { 145 ContentVO metaInfoContentVO = nodeDeliveryController.getBoundContent(getDatabase(), this.getTemplateController().getPrincipal(), this.getDeliveryContext().getSiteNodeId(), this.getDeliveryContext().getLanguageId(), true, "Meta information", this.getDeliveryContext()); 152 decoratePageTemplate = decorateComponent(baseComponent, this.getTemplateController(), repositoryId, this.getDeliveryContext().getSiteNodeId(), this.getDeliveryContext().getLanguageId(), this.getDeliveryContext().getContentId()); 153 decoratePageTemplate = decorateTemplate(this.getTemplateController(), decoratePageTemplate, this.getDeliveryContext(), baseComponent); 154 } 156 } 157 158 timer.printElapsedTime("After main decoration"); 159 160 decoratePageTemplate += propertiesDivs + tasksDivs; 162 163 String componentEditorUrl = CmsPropertyHandler.getComponentEditorUrl(); 164 165 Map context = getDefaultContext(); 168 169 context.put("componentEditorUrl", componentEditorUrl); 170 boolean oldUseFullUrl = this.getTemplateController().getDeliveryContext().getUseFullUrl(); 171 this.getTemplateController().getDeliveryContext().setUseFullUrl(true); 172 context.put("currentUrl", URLEncoder.encode(this.getTemplateController().getCurrentPageUrl(), "UTF-8")); 173 context.put("contextName", this.getRequest().getContextPath()); 174 175 this.getTemplateController().getDeliveryContext().setUseFullUrl(oldUseFullUrl); 176 StringWriter cacheString = new StringWriter (); 177 PrintWriter cachedStream = new PrintWriter (cacheString); 178 179 new VelocityTemplateProcessor().renderTemplate(context, cachedStream, decoratePageTemplate); 180 181 this.setPageString(cacheString.toString()); 182 183 timer.printElapsedTime("End invokePage"); 184 } 185 186 189 190 private String showInitialBindingDialog(Integer siteNodeId, Integer languageId, Integer contentId) 191 { 192 String componentEditorUrl = CmsPropertyHandler.getComponentEditorUrl(); 193 String url = "javascript:window.open('" + componentEditorUrl + "ViewSiteNodePageComponents!listComponents.action?siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&specifyBaseTemplate=true&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + "', 'BaseTemplate', 'width=600,height=700,left=50,top=50,toolbar=no,status=no,scrollbars=yes,location=no,menubar=no,directories=no,resizable=yes');"; 194 195 String pageTemplateHTML = " or choose a page template below.<br><br>"; 196 197 boolean foundPageTemplate = false; 198 199 try 200 { 201 List sortedPageTemplates = PageTemplateController.getController().getPageTemplates(this.getTemplateController().getPrincipal()); 202 Iterator sortedPageTemplatesIterator = sortedPageTemplates.iterator(); 203 while(sortedPageTemplatesIterator.hasNext()) 204 { 205 ContentVO contentVO = (ContentVO)sortedPageTemplatesIterator.next(); 206 ContentVersionVO contentVersionVO = this.getTemplateController().getContentVersion(contentVO.getId(), LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(getDatabase(), siteNodeId).getId(), false); 207 if(contentVersionVO != null) 208 { 209 String imageUrl = this.getTemplateController().getAssetUrl(contentVO.getId(), "thumbnail"); 210 if(imageUrl == null || imageUrl.equals("")) 211 imageUrl = this.getRequest().getContextPath() + "/images/undefinedPageTemplate.jpg"; 212 213 pageTemplateHTML += "<div style=\"border: 1px solid #C2D0E2; float: left; text-align: center; padding: 5px 5px 5px 5px;\"><a HREF=\"" + componentEditorUrl + "ViewSiteNodePageComponents!addPageTemplate.action?repositoryId=" + contentVO.getRepositoryId() + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&pageTemplateContentId=" + contentVO.getId() + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + "\"><img SRC=\"" + imageUrl + "\" border=\"0\"><br>"; 214 pageTemplateHTML += contentVO.getName() + "</a>"; 215 pageTemplateHTML += "</div>"; 216 foundPageTemplate = true; 217 } 218 } 219 } 220 catch(Exception e) 221 { 222 logger.warn("A problem arouse when getting the page templates:" + e.getMessage(), e); 223 } 224 225 this.getTemplateController().getDeliveryContext().setContentType("text/html"); 226 this.getTemplateController().getDeliveryContext().setDisablePageCache(true); 227 return "<html><body style=\"font-family:verdana, sans-serif; font-size:10px;\">The page has no base component assigned yet. Click <a HREF=\"" + url + "\">here</a> to assign one" + (foundPageTemplate ? pageTemplateHTML : "") + "</body></html>"; 228 } 229 230 231 234 235 private String decorateTemplate(TemplateController templateController, String template, DeliveryContext deliveryContext, InfoGlueComponent component) 236 { 237 Timer timer = new Timer(); 238 timer.setActive(false); 239 240 String decoratedTemplate = template; 241 242 try 243 { 244 InfoGluePrincipal principal = templateController.getPrincipal(); 245 String cmsUserName = (String )templateController.getHttpServletRequest().getSession().getAttribute("cmsUserName"); 246 if(cmsUserName != null) 247 principal = templateController.getPrincipal(cmsUserName); 248 249 boolean hasAccessToAccessRights = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "ComponentEditor.ChangeSlotAccess", ""); 250 boolean hasAccessToAddComponent = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "ComponentEditor.AddComponent", "" + component.getContentId() + "_" + component.getSlotName()); 251 boolean hasAccessToDeleteComponent = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "ComponentEditor.DeleteComponent", "" + component.getContentId() + "_" + component.getSlotName()); 252 boolean hasSaveTemplateAccess = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "StructureTool.SaveTemplate", ""); 253 254 String extraHeader = FileHelper.getFileAsString(new File (CmsPropertyHandler.getContextRootPath() + "preview/pageComponentEditorHeader.vm")); 255 String extraBody = FileHelper.getFileAsString(new File (CmsPropertyHandler.getContextRootPath() + "preview/pageComponentEditorBody.vm")); 256 257 Locale locale = templateController.getLocale(); 258 String submitToPublishHTML = getLocalizedString(locale, "deliver.editOnSight.submitToPublish"); 259 String addComponentHTML = getLocalizedString(locale, "deliver.editOnSight.addComponentHTML"); 260 String deleteComponentHTML = getLocalizedString(locale, "deliver.editOnSight.deleteComponentHTML"); 261 String accessRightsHTML = getLocalizedString(locale, "deliver.editOnSight.accessRightsHTML"); 262 String pageComponentsHTML = getLocalizedString(locale, "deliver.editOnSight.pageComponentsHTML"); 263 String viewSourceHTML = getLocalizedString(locale, "deliver.editOnSight.viewSourceHTML"); 264 String componentEditorInNewWindowHTML = getLocalizedString(locale, "deliver.editOnSight.componentEditorInNewWindowHTML"); 265 String savePageTemplateHTML = getLocalizedString(locale, "deliver.editOnSight.savePageTemplateHTML"); 266 267 String componentEditorUrl = CmsPropertyHandler.getComponentEditorUrl(); 268 String saveTemplateUrl = "saveComponentStructure('" + componentEditorUrl + "CreatePageTemplate!input.action?contentId=" + templateController.getSiteNode(deliveryContext.getSiteNodeId()).getMetaInfoContentId() + "');"; 269 if(!hasSaveTemplateAccess) 270 saveTemplateUrl = "alert('Not authorized to save template');"; 271 272 extraBody = extraBody.replaceAll("\\$siteNodeId", "" + templateController.getSiteNodeId()); 273 extraBody = extraBody.replaceAll("\\$repositoryId", "" + templateController.getSiteNode().getRepositoryId()); 274 extraBody = extraBody.replaceAll("\\$originalFullURL", URLEncoder.encode(templateController.getOriginalFullURL(), "UTF-8")); 275 276 extraBody = extraBody.replaceAll("\\$submitToPublishHTML", submitToPublishHTML); 277 extraBody = extraBody.replaceAll("\\$addComponentHTML", addComponentHTML); 278 extraBody = extraBody.replaceAll("\\$deleteComponentHTML", deleteComponentHTML); 279 extraBody = extraBody.replaceAll("\\$accessRightsHTML", accessRightsHTML); 280 281 extraBody = extraBody.replaceAll("\\$pageComponents", pageComponentsHTML); 282 extraBody = extraBody.replaceAll("\\$componentEditorInNewWindowHTML", componentEditorInNewWindowHTML); 283 extraBody = extraBody.replaceAll("\\$savePageTemplateHTML", savePageTemplateHTML); 284 extraBody = extraBody.replaceAll("\\$saveTemplateUrl", saveTemplateUrl); 285 extraBody = extraBody.replaceAll("\\$viewSource", viewSourceHTML); 286 287 extraBody = extraBody.replaceAll("\\$addComponentJavascript", "var hasAccessToAddComponent" + component.getSlotName() + " = " + hasAccessToAddComponent + ";"); 288 extraBody = extraBody.replaceAll("\\$deleteComponentJavascript", "var hasAccessToDeleteComponent" + component.getSlotName() + " = " + hasAccessToDeleteComponent + ";"); 289 extraBody = extraBody.replaceAll("\\$changeAccessJavascript", "var hasAccessToAccessRights" + component.getSlotName() + " = " + hasAccessToAccessRights + ";"); 290 291 294 296 304 305 307 timer.printElapsedTime("Read files"); 308 309 StringBuffer modifiedTemplate = new StringBuffer (template); 310 311 int indexOfHeadEndTag = modifiedTemplate.indexOf("</head"); 313 if(indexOfHeadEndTag == -1) 314 indexOfHeadEndTag = modifiedTemplate.indexOf("</HEAD"); 315 316 if(indexOfHeadEndTag > -1) 317 { 318 modifiedTemplate = modifiedTemplate.replace(indexOfHeadEndTag, modifiedTemplate.indexOf(">", indexOfHeadEndTag) + 1, extraHeader); 319 } 320 else 321 { 322 int indexOfHTMLStartTag = modifiedTemplate.indexOf("<html"); 323 if(indexOfHTMLStartTag == -1) 324 indexOfHTMLStartTag = modifiedTemplate.indexOf("<HTML"); 325 326 if(indexOfHTMLStartTag > -1) 327 { 328 modifiedTemplate = modifiedTemplate.insert(modifiedTemplate.indexOf(">", indexOfHTMLStartTag) + 1, "<head>" + extraHeader); 329 } 330 else 331 { 332 logger.info("The current template is not a valid document. It does not comply with the simplest standards such as having a correct header."); 333 } 334 } 335 336 timer.printElapsedTime("Header handled"); 337 338 int indexOfBodyStartTag = modifiedTemplate.indexOf("<body"); 340 if(indexOfBodyStartTag == -1) 341 indexOfBodyStartTag = modifiedTemplate.indexOf("<BODY"); 342 343 if(indexOfBodyStartTag > -1) 344 { 345 String pageComponentStructureDiv = getPageComponentStructureDiv(templateController, deliveryContext.getSiteNodeId(), deliveryContext.getLanguageId(), component); 347 timer.printElapsedTime("pageComponentStructureDiv"); 348 String componentPaletteDiv = getComponentPaletteDiv(deliveryContext.getSiteNodeId(), deliveryContext.getLanguageId(), templateController); 349 timer.printElapsedTime("componentPaletteDiv"); 351 modifiedTemplate = modifiedTemplate.insert(modifiedTemplate.indexOf(">", indexOfBodyStartTag) + 1, extraBody + pageComponentStructureDiv + componentPaletteDiv); 352 } 353 else 354 { 355 logger.info("The current template is not a valid document. It does not comply with the simplest standards such as having a correct body."); 356 } 357 358 timer.printElapsedTime("Body handled"); 359 360 decoratedTemplate = modifiedTemplate.toString(); 361 } 362 catch(Exception e) 363 { 364 logger.warn("An error occurred when deliver tried to decorate your template to enable onSiteEditing. Reason " + e.getMessage(), e); 365 } 366 367 return decoratedTemplate; 368 } 369 370 371 private String decorateComponent(InfoGlueComponent component, TemplateController templateController, Integer repositoryId, Integer siteNodeId, Integer languageId, Integer contentId) throws Exception 372 { 373 String decoratedComponent = ""; 374 375 377 379 String componentEditorUrl = CmsPropertyHandler.getComponentEditorUrl(); 380 381 Timer timer = new Timer(); 382 timer.setActive(false); 383 384 try 385 { 386 String componentString = getComponentString(templateController, component.getContentId(), component); 387 388 if(component.getParentComponent() == null && templateController.getDeliveryContext().getShowSimple()) 389 { 390 templateController.getDeliveryContext().setContentType("text/html"); 391 templateController.getDeliveryContext().setDisablePageCache(true); 392 componentString = "<html><head></head><body onload=\"toggleDiv('pageComponents');\">" + componentString + "</body></html>"; 393 } 394 395 templateController.setComponentLogic(new DecoratedComponentLogic(templateController, component)); 396 Map context = super.getDefaultContext(); 397 context.put("templateLogic", templateController); 398 StringWriter cacheString = new StringWriter (); 399 PrintWriter cachedStream = new PrintWriter (cacheString); 400 new VelocityTemplateProcessor().renderTemplate(context, cachedStream, componentString); 401 componentString = cacheString.toString(); 402 403 int bodyIndex = componentString.indexOf("<body"); 404 if(bodyIndex == -1) 405 bodyIndex = componentString.indexOf("<BODY"); 406 407 if(component.getParentComponent() == null && bodyIndex > -1) 408 { 409 String onContextMenu = " onload=\"javascript:setToolbarInitialPosition();\""; 412 if(templateController.getDeliveryContext().getShowSimple()) 413 onContextMenu = " onload=\"javascript:setToolbarInitialPosition();\""; 414 415 416 StringBuffer sb = new StringBuffer (componentString); 417 sb.insert(bodyIndex + 5, onContextMenu); 418 componentString = sb.toString(); 419 420 org.w3c.dom.Document componentPropertiesDocument = getComponentPropertiesDocument(templateController, siteNodeId, languageId, component.getContentId()); 421 this.propertiesDivs += getComponentPropertiesDiv(templateController, repositoryId, siteNodeId, languageId, contentId, component.getId(), component.getContentId(), componentPropertiesDocument); 422 423 org.w3c.dom.Document componentTasksDocument = getComponentTasksDocument(templateController, siteNodeId, languageId, component.getContentId()); 424 this.tasksDivs += getComponentTasksDiv(repositoryId, siteNodeId, languageId, contentId, component, componentTasksDocument, templateController); 425 } 426 427 int offset = 0; 429 int slotStartIndex = componentString.indexOf("<ig:slot", offset); 430 while(slotStartIndex > -1) 432 { 433 decoratedComponent += componentString.substring(offset, slotStartIndex); 434 int slotStopIndex = componentString.indexOf("</ig:slot>", slotStartIndex); 435 436 String slot = componentString.substring(slotStartIndex, slotStopIndex + 10); 437 String id = slot.substring(slot.indexOf("id") + 4, slot.indexOf("\"", slot.indexOf("id") + 4)); 439 440 Slot slotBean = new Slot(); 441 String [] allowedComponentNamesArray = null; 442 int allowedComponentNamesIndex = slot.indexOf("allowedComponentNames"); 443 if(allowedComponentNamesIndex > -1) 444 { 445 String allowedComponentNames = slot.substring(allowedComponentNamesIndex + 23, slot.indexOf("\"", allowedComponentNamesIndex + 23)); 446 allowedComponentNamesArray = allowedComponentNames.split(","); 447 448 slotBean.setId(id); 449 slotBean.setAllowedComponentsArray(allowedComponentNamesArray); 450 } 451 452 boolean inherit = true; 453 int inheritIndex = slot.indexOf("inherit"); 454 if(inheritIndex > -1) 455 { 456 String inheritString = slot.substring(inheritIndex + 9, slot.indexOf("\"", inheritIndex + 9)); 457 inherit = Boolean.getBoolean(inheritString); 458 } 459 slotBean.setInherit(inherit); 460 461 String subComponentString = ""; 462 463 if(component.getIsInherited()) 465 subComponentString += "<div id=\"" + component.getId() + "_" + id + "\" class=\"inheritedComponentDiv\");\">"; 466 else 467 subComponentString += "<div id=\"" + component.getId() + "_" + id + "\" class=\"componentDiv\" onmouseup=\"javascript:assignComponent('" + siteNodeId + "', '" + languageId + "', '" + contentId + "', '" + component.getId() + "', '" + id + "', '" + false + "', '" + slotBean.getAllowedComponentsArrayAsUrlEncodedString() + "');\">"; 468 469 List subComponents = getInheritedComponents(getDatabase(), templateController, component, templateController.getSiteNodeId(), id, inherit); 470 471 InfoGluePrincipal principal = templateController.getPrincipal(); 472 String cmsUserName = (String )templateController.getHttpServletRequest().getSession().getAttribute("cmsUserName"); 473 if(cmsUserName != null) 474 principal = templateController.getPrincipal(cmsUserName); 475 476 String clickToAddHTML = ""; 477 boolean hasAccessToAddComponent = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "ComponentEditor.AddComponent", "" + component.getContentId() + "_" + id); 478 if(hasAccessToAddComponent) 479 clickToAddHTML = getLocalizedString(templateController.getLocale(), "deliver.editOnSight.slotInstructionHTML"); 480 481 if(subComponents != null && subComponents.size() > 0) 483 { 484 int index = 0; 486 Iterator subComponentsIterator = subComponents.iterator(); 487 while(subComponentsIterator.hasNext()) 488 { 489 InfoGlueComponent subComponent = (InfoGlueComponent)subComponentsIterator.next(); 490 if(subComponent != null) 491 { 492 component.getComponents().put(subComponent.getSlotName(), subComponent); 493 if(subComponent.getIsInherited()) 494 { 495 String childComponentsString = decorateComponent(subComponent, templateController, repositoryId, siteNodeId, languageId, contentId); 497 if(!this.getTemplateController().getDeliveryContext().getShowSimple()) 498 subComponentString += "<span id=\""+ id + index + "Comp\" class=\"inheritedslot\">" + childComponentsString + "</span>"; 499 else 500 subComponentString += childComponentsString; 501 502 org.w3c.dom.Document componentPropertiesDocument = getComponentPropertiesDocument(templateController, siteNodeId, languageId, component.getContentId()); 503 this.propertiesDivs += getComponentPropertiesDiv(templateController, repositoryId, siteNodeId, languageId, contentId, new Integer (siteNodeId.intValue()*100 + subComponent.getId().intValue()), subComponent.getContentId(), componentPropertiesDocument); 504 505 org.w3c.dom.Document componentTasksDocument = getComponentTasksDocument(templateController, siteNodeId, languageId, subComponent.getContentId()); 506 this.tasksDivs += getComponentTasksDiv(repositoryId, siteNodeId, languageId, contentId, subComponent, componentTasksDocument, templateController); 507 508 } 509 else 510 { 511 String childComponentsString = decorateComponent(subComponent, templateController, repositoryId, siteNodeId, languageId, contentId); 513 515 if(!this.getTemplateController().getDeliveryContext().getShowSimple()) 516 { 517 String allowedComponentNamesAsEncodedString = null; 518 519 for(int i=0; i < subComponent.getParentComponent().getSlotList().size(); i++) 520 { 521 Slot subSlotBean = (Slot)subComponent.getParentComponent().getSlotList().get(i); 522 523 if(subSlotBean.getId() != null && subSlotBean.getId().equals(subComponent.getSlotName())) 524 { 525 allowedComponentNamesAsEncodedString = subSlotBean.getAllowedComponentsArrayAsUrlEncodedString(); 526 } 527 } 528 529 subComponentString += "<span id=\""+ id + index + "_" + subComponent.getId() + "Comp\">" + childComponentsString + "<script type=\"text/javascript\">initializeComponentEventHandler('" + id + index + "_" + subComponent.getId() + "Comp', '" + subComponent.getId() + "', '" + componentEditorUrl + "ViewSiteNodePageComponents!listComponents.action?siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&parentComponentId=" + component.getId() + "&slotId=" + id + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + ((allowedComponentNamesAsEncodedString != null) ? "&" + allowedComponentNamesAsEncodedString : "&AAAA=1") + "', '" + componentEditorUrl + "ViewSiteNodePageComponents!deleteComponent.action?siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + subComponent.getId() + "&slotId=" + id + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + "');</script></span>"; 530 } 531 else 532 { 533 subComponentString += childComponentsString; 534 } 535 536 org.w3c.dom.Document componentPropertiesDocument = getComponentPropertiesDocument(templateController, siteNodeId, languageId, subComponent.getContentId()); 537 this.propertiesDivs += getComponentPropertiesDiv(templateController, repositoryId, siteNodeId, languageId, contentId, subComponent.getId(), subComponent.getContentId(), componentPropertiesDocument); 538 539 org.w3c.dom.Document componentTasksDocument = getComponentTasksDocument(templateController, siteNodeId, languageId, subComponent.getContentId()); 540 this.tasksDivs += getComponentTasksDiv(repositoryId, siteNodeId, languageId, contentId, subComponent, componentTasksDocument, templateController); 541 } 542 } 543 index++; 544 } 545 subComponentString += "" + clickToAddHTML; 546 } 547 else 548 { 549 subComponentString += "" + clickToAddHTML; 550 } 551 552 if(!component.getIsInherited()) 553 { 554 String allowedComponentNamesAsEncodedString = null; 555 556 for(int i=0; i < component.getSlotList().size(); i++) 557 { 558 Slot subSlotBean = (Slot)component.getSlotList().get(i); 559 if(subSlotBean.getId() != null && subSlotBean.getId().equals(id)) 560 { 561 allowedComponentNamesAsEncodedString = subSlotBean.getAllowedComponentsArrayAsUrlEncodedString(); 562 } 563 } 564 565 subComponentString += "<script type=\"text/javascript\">initializeSlotEventHandler('" + component.getId() + "_" + id + "', '" + componentEditorUrl + "ViewSiteNodePageComponents!listComponents.action?siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&parentComponentId=" + component.getId() + "&slotId=" + id + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + ((allowedComponentNamesAsEncodedString != null) ? "&" + allowedComponentNamesAsEncodedString : "&BBBB=1") + "', '', '" + id + "', '" + component.getContentId() + "');</script></div>"; 566 } 567 else 568 subComponentString += "</div>"; 569 570 573 574 boolean hasAccessToAccessRights = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "ComponentEditor.ChangeSlotAccess", ""); 575 boolean hasAccessToDeleteComponent = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "ComponentEditor.DeleteComponent", "" + component.getContentId() + "_" + id); 576 577 StringBuffer sb = new StringBuffer (); 578 sb.append("<script type=\"text/javascript\">"); 579 sb.append("hasAccessToAddComponent" + id + " = " + hasAccessToAddComponent + ";"); 581 sb.append("hasAccessToAccessRights" + id + " = " + hasAccessToAccessRights + ";"); 582 sb.append("</script>"); 584 585 subComponentString += sb.toString(); 586 589 590 decoratedComponent += subComponentString; 591 592 offset = slotStopIndex + 10; 593 slotStartIndex = componentString.indexOf("<ig:slot", offset); 594 } 595 596 decoratedComponent += componentString.substring(offset); 598 } 599 catch(Exception e) 600 { 601 logger.warn("An component with either an empty template or with no template in the sitelanguages was found:" + e.getMessage(), e); 602 } 603 604 return decoratedComponent; 605 } 606 607 608 611 612 private String getComponentPropertiesDiv(TemplateController templateController, Integer repositoryId, Integer siteNodeId, Integer languageId, Integer contentId, Integer componentId, Integer componentContentId, org.w3c.dom.Document document) throws Exception 613 { 614 if(templateController.getRequestParameter("skipPropertiesDiv") != null && templateController.getRequestParameter("skipPropertiesDiv").equalsIgnoreCase("true")) 615 return ""; 616 617 StringBuffer sb = new StringBuffer (); 618 Timer timer = new Timer(); 619 timer.setActive(false); 620 621 Locale locale = templateController.getLocale(); 622 623 timer.printElapsedTime("After locale"); 624 625 String componentEditorUrl = CmsPropertyHandler.getComponentEditorUrl(); 626 632 sb.append("<div id=\"component" + componentId + "Properties\" class=\"componentProperties\" style=\"right:5px; top:5px; visibility:hidden;\">"); 633 sb.append(" <div id=\"component" + componentId + "PropertiesHandle\" class=\"componentPropertiesHandle\"><div id=\"leftPaletteHandle\">Properties</div><div id=\"rightPaletteHandle\"><a HREF=\"javascript:hideDiv('component" + componentId + "Properties');\" class=\"white\"><img SRC=\"" + componentEditorUrl + "/images/closeIcon.gif\" border=\"0\"/></a></div></div>"); 634 sb.append(" <div id=\"component" + componentId + "PropertiesBody\" class=\"componentPropertiesBody\">"); 635 636 sb.append(" <form id=\"component" + componentId + "PropertiesForm\" name=\"component" + componentId + "PropertiesForm\" action=\"" + componentEditorUrl + "ViewSiteNodePageComponents!updateComponentProperties.action\" method=\"POST\">"); 638 sb.append(" <table class=\"igPropertiesTable\" border=\"0\" cellpadding=\"4\" cellspacing=\"0\">"); 639 640 sb.append(" <tr class=\"igtr\">"); 641 sb.append(" <td class=\"igpropertylabel\" align=\"left\">Choose language</td>"); sb.append(" <td class=\"igtd\"> </td>"); 643 sb.append(" <td class=\"igpropertyvalue\" align=\"left\">"); 644 645 sb.append(" "); 646 sb.append(" <select class=\"mediumdrop\" name=\"languageId\" onChange=\"javascript:changeLanguage(" + siteNodeId + ", this, " + contentId + ");\">"); 647 648 List languages = LanguageDeliveryController.getLanguageDeliveryController().getAvailableLanguages(getDatabase(), siteNodeId); 649 650 Iterator languageIterator = languages.iterator(); 651 int index = 0; 652 int languageIndex = index; 653 while(languageIterator.hasNext()) 654 { 655 LanguageVO languageVO = (LanguageVO)languageIterator.next(); 656 if(languageVO.getLanguageId().intValue() == languageId.intValue()) 657 { 658 sb.append(" <option class=\"iglabel\" value=\"" + languageVO.getLanguageId() + "\" selected><span class=\"iglabel\">" + languageVO.getName() + "</span></option>"); 659 sb.append(" <script type=\"text/javascript\">"); 660 sb.append(" </script>"); 661 languageIndex = index; 662 } 663 else 664 { 665 sb.append(" <option value=\"" + languageVO.getLanguageId() + "\">" + languageVO.getName() + "</option>"); 666 } 667 index++; 668 } 669 sb.append(" </select>"); 670 sb.append(" <!--"); 671 sb.append(" var originalIndex = " + languageIndex + ";"); 672 sb.append(" -->"); 673 674 sb.append(" </td>"); 675 sb.append(" <td class=\"igtd\"> </td>"); 676 sb.append(" </tr>"); 677 678 Collection componentProperties = getComponentProperties(componentId, document); 679 680 int propertyIndex = 0; 681 Iterator componentPropertiesIterator = componentProperties.iterator(); 682 while(componentPropertiesIterator.hasNext()) 683 { 684 ComponentProperty componentProperty = (ComponentProperty)componentPropertiesIterator.next(); 685 686 InfoGluePrincipal principal = templateController.getPrincipal(); 687 String cmsUserName = (String )templateController.getHttpServletRequest().getSession().getAttribute("cmsUserName"); 688 if(cmsUserName != null) 689 principal = templateController.getPrincipal(cmsUserName); 690 691 boolean hasAccessToProperty = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "ComponentPropertyEditor.EditProperty", "" + componentContentId + "_" + componentProperty.getName()); 692 693 if(componentProperty.getType().equalsIgnoreCase(ComponentProperty.BINDING)) 694 { 695 String assignUrl = ""; 696 String createUrl = ""; 697 698 if(componentProperty.getVisualizingAction() != null && !componentProperty.getVisualizingAction().equals("")) 699 { 700 assignUrl = componentEditorUrl + componentProperty.getVisualizingAction() + "?repositoryId=" + repositoryId + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&showSimple=" + getTemplateController().getDeliveryContext().getShowSimple(); 701 } 702 else 703 { 704 if(componentProperty.getEntityClass().equalsIgnoreCase("Content")) 705 { 706 String allowedContentTypeIdParameters = ""; 707 708 if(componentProperty.getAllowedContentTypeNamesArray() != null && componentProperty.getAllowedContentTypeNamesArray().length > 0) 709 { 710 allowedContentTypeIdParameters = "&" + componentProperty.getAllowedContentTypeIdAsUrlEncodedString(templateController.getDatabase()); 711 logger.info("allowedContentTypeIdParameters:" + allowedContentTypeIdParameters); 712 } 713 714 if(componentProperty.getIsMultipleBinding()) 715 assignUrl = componentEditorUrl + "ViewSiteNodePageComponents!showContentTreeForMultipleBinding.action?repositoryId=" + repositoryId + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + allowedContentTypeIdParameters + "&showSimple=" + getTemplateController().getDeliveryContext().getShowSimple(); 716 else 717 assignUrl = componentEditorUrl + "ViewSiteNodePageComponents!showContentTree.action?repositoryId=" + repositoryId + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + allowedContentTypeIdParameters + "&showSimple=" + getTemplateController().getDeliveryContext().getShowSimple(); 718 } 719 else if(componentProperty.getEntityClass().equalsIgnoreCase("SiteNode")) 720 { 721 if(componentProperty.getIsMultipleBinding()) 722 assignUrl = componentEditorUrl + "ViewSiteNodePageComponents!showStructureTreeForMultipleBinding.action?repositoryId=" + repositoryId + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&showSimple=" + getTemplateController().getDeliveryContext().getShowSimple(); 723 else 724 assignUrl = componentEditorUrl + "ViewSiteNodePageComponents!showStructureTree.action?repositoryId=" + repositoryId + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&showSimple=" + getTemplateController().getDeliveryContext().getShowSimple(); 725 } 726 else if(componentProperty.getEntityClass().equalsIgnoreCase("Category")) 727 { 728 if(componentProperty.getIsMultipleBinding()) 729 assignUrl = componentEditorUrl + "ViewSiteNodePageComponents!showCategoryTreeForMultipleBinding.action?repositoryId=" + repositoryId + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&showSimple=" + getTemplateController().getDeliveryContext().getShowSimple(); 730 else 731 assignUrl = componentEditorUrl + "ViewSiteNodePageComponents!showCategoryTree.action?repositoryId=" + repositoryId + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&showSimple=" + getTemplateController().getDeliveryContext().getShowSimple(); 732 } 733 } 734 735 if(componentProperty.getCreateAction() != null && !componentProperty.getCreateAction().equals("")) 736 { 737 createUrl = componentEditorUrl + componentProperty.getCreateAction() + "?repositoryId=" + repositoryId + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&showSimple=" + getTemplateController().getDeliveryContext().getShowSimple(); 738 } 739 else 740 { 741 if(componentProperty.getVisualizingAction() != null && !componentProperty.getVisualizingAction().equals("")) 742 { 743 createUrl = assignUrl; 744 } 745 else if(componentProperty.getEntityClass().equalsIgnoreCase("Content")) 746 { 747 String allowedContentTypeIdParameters = ""; 748 749 if(componentProperty.getAllowedContentTypeNamesArray() != null && componentProperty.getAllowedContentTypeNamesArray().length > 0) 750 { 751 allowedContentTypeIdParameters = "&" + componentProperty.getAllowedContentTypeIdAsUrlEncodedString(templateController.getDatabase()); 752 logger.info("allowedContentTypeIdParameters:" + allowedContentTypeIdParameters); 753 } 754 755 String returnAddress = URLEncoder.encode("ViewSiteNodePageComponents!addComponentPropertyBinding.action?siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=-1&entity=Content&entityId=#entityId&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&path=#path&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + "", "UTF-8"); 756 757 if(componentProperty.getIsMultipleBinding()) 758 createUrl = componentEditorUrl + "CreateContentWizardFinish.action?repositoryId=" + repositoryId + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + allowedContentTypeIdParameters + "&refreshAddress=" + returnAddress + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple(); 759 else 760 createUrl = componentEditorUrl + "CreateContentWizardFinish.action?repositoryId=" + repositoryId + "&siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + allowedContentTypeIdParameters + "&refreshAddress=" + returnAddress + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple(); 761 } 762 else if(componentProperty.getEntityClass().equalsIgnoreCase("SiteNode")) 763 { 764 createUrl = null; 765 771 } 772 } 773 774 StringBuffer helpSB = new StringBuffer (); 775 helpSB.append("<div style=\"border: 1px solid black; visibility: hidden; z-index: 200000; position: absolute;\" id=\"helpLayer" + componentProperty.getComponentId() + "_" + componentProperty.getName() + "\">"); 776 helpSB.append("<table class=\"igtable\" bgcolor=\"white\" width=\"200\"><tr class=\"igtr\"><td class=\"igpropertylabel\">" + (componentProperty.getDescription().equalsIgnoreCase("") ? "No description" : componentProperty.getDescription()) + "</td></tr></table>"); 777 helpSB.append("</div>"); 778 779 sb.append(" <tr class=\"igtr\">"); 780 sb.append(" <td class=\"igpropertylabel\" valign=\"top\" align=\"left\">" + componentProperty.getName() + "</td>"); 781 sb.append(" <td class=\"igtd\" width=\"16\"><img SRC=\"" + componentEditorUrl + "/images/questionMark.gif\" onMouseOver=\"javascript:showDiv('helpLayer" + componentProperty.getComponentId() + "_" + componentProperty.getName() + "');\" onMouseOut=\"javascript:hideDiv('helpLayer" + componentProperty.getComponentId() + "_" + componentProperty.getName() + "');\">" + helpSB + "</td>"); 782 sb.append(" <td class=\"igpropertyvalue\" align=\"left\">"); 783 784 if(hasAccessToProperty) 785 sb.append("<a class=\"componentEditorLink\" HREF=\"javascript:window.open('" + assignUrl + "','Assign','toolbar=no,status=yes,scrollbars=yes,location=no,menubar=no,directories=no,resizable=no,width=300,height=600,left=5,top=5');\">"); 786 787 sb.append("" + (componentProperty.getValue().equalsIgnoreCase("") ? "Undefined" : componentProperty.getValue())); 788 789 if(hasAccessToProperty) 790 sb.append("</a>"); 791 792 sb.append("</td>"); 793 794 if(componentProperty.getValue().equalsIgnoreCase("Undefined")) 795 { 796 if(hasAccessToProperty && createUrl != null) 797 sb.append(" <td class=\"igtd\" width=\"16\"><a class=\"componentEditorLink\" HREF=\"" + createUrl + "\"><img SRC=\"" + componentEditorUrl + "/images/createContent.gif\" border=\"0\" alt=\"Create new content to show\"></a></td>"); 798 else 799 sb.append(" <td class=\"igtd\" width=\"16\"> </td>"); 800 } 801 else 802 { 803 sb.append(" <td class=\"igtd\" width=\"16\"><a class=\"componentEditorLink\" HREF=\"" + componentEditorUrl + "ViewSiteNodePageComponents!deleteComponentPropertyValue.action?siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + "\"><img SRC=\"" + componentEditorUrl + "/images/delete.gif\" border=\"0\"></a></td>"); 804 } 805 806 sb.append(" </tr>"); 807 } 808 else if(componentProperty.getType().equalsIgnoreCase(ComponentProperty.TEXTFIELD)) 809 { 810 sb.append(" <tr class=\"igtr\">"); 811 sb.append(" <td class=\"igpropertylabel\" valign=\"top\" align=\"left\">" + componentProperty.getName() + "</td>"); 812 sb.append(" <td class=\"igtd\" width=\"16\"><img SRC=\"" + componentEditorUrl + "/images/questionMark.gif\" title=\"" + (componentProperty.getDescription().equalsIgnoreCase("") ? "No description" : componentProperty.getDescription()) + "\"></td>"); 813 814 if(hasAccessToProperty) 815 sb.append(" <td class=\"igpropertyvalue\" align=\"left\"><input type=\"hidden\" name=\"" + propertyIndex + "_propertyName\" value=\"" + componentProperty.getName() + "\"><input type=\"text\" class=\"propertytextfield\" name=\"" + componentProperty.getName() + "\" value=\"" + componentProperty.getValue() + "\"></td>"); 816 else 817 sb.append(" <td class=\"igpropertyvalue\" align=\"left\">" + componentProperty.getValue() + "</td>"); 818 819 if(hasAccessToProperty) 820 sb.append(" <td class=\"igtd\" width=\"16\"><a class=\"componentEditorLink\" HREF=\"" + componentEditorUrl + "ViewSiteNodePageComponents!deleteComponentPropertyValue.action?siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + "\"><img SRC=\"" + componentEditorUrl + "/images/delete.gif\" border=\"0\"></a></td>"); 821 else 822 sb.append(" <td class=\"igtd\" width=\"16\"></td>"); 823 824 sb.append(" <!--<td> </td>-->"); 825 sb.append(" </tr>"); 826 827 if(hasAccessToProperty) 828 propertyIndex++; 829 } 830 else if(componentProperty.getType().equalsIgnoreCase(ComponentProperty.TEXTAREA)) 831 { 832 sb.append(" <tr class=\"igtr\">"); 833 sb.append(" <td class=\"igpropertylabel\" valign=\"top\" align=\"left\">" + componentProperty.getName() + "</td>"); 834 sb.append(" <td class=\"igtd\" width=\"16\"><img SRC=\"" + componentEditorUrl + "/images/questionMark.gif\" title=\"" + (componentProperty.getDescription().equalsIgnoreCase("") ? "No description" : componentProperty.getDescription()) + "\"></td>"); 835 836 if(hasAccessToProperty) 837 sb.append(" <td class=\"igpropertyvalue\" align=\"left\"><input type=\"hidden\" name=\"" + propertyIndex + "_propertyName\" value=\"" + componentProperty.getName() + "\"><textarea class=\"propertytextarea\" name=\"" + componentProperty.getName() + "\">" + (componentProperty.getValue() == null ? "" : componentProperty.getValue()) + "</textarea></td>"); 838 else 839 sb.append(" <td class=\"igpropertyvalue\" align=\"left\">" + componentProperty.getValue() + "</td>"); 840 841 if(hasAccessToProperty) 842 sb.append(" <td class=\"igtd\" width=\"16\"><a class=\"componentEditorLink\" HREF=\"" + componentEditorUrl + "ViewSiteNodePageComponents!deleteComponentPropertyValue.action?siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + "\"><img SRC=\"" + componentEditorUrl + "/images/delete.gif\" border=\"0\"></a></td>"); 843 else 844 sb.append(" <td class=\"igtd\" width=\"16\"></td>"); 845 846 sb.append(" <!--<td> </td>-->"); 847 sb.append(" </tr>"); 848 849 if(hasAccessToProperty) 850 propertyIndex++; 851 } 852 else if(componentProperty.getType().equalsIgnoreCase(ComponentProperty.SELECTFIELD)) 853 { 854 sb.append(" <tr class=\"igtr\">"); 855 sb.append(" <td class=\"igpropertylabel\" valign=\"top\" align=\"left\">" + componentProperty.getName() + "</td>"); 856 sb.append(" <td class=\"igtd\" width=\"16\"><img SRC=\"" + componentEditorUrl + "/images/questionMark.gif\" title=\"" + (componentProperty.getDescription().equalsIgnoreCase("") ? "No description" : componentProperty.getDescription()) + "\"></td>"); 857 858 if(hasAccessToProperty) 859 { 860 sb.append(" <td class=\"igpropertyvalue\" align=\"left\"><input type=\"hidden\" name=\"" + propertyIndex + "_propertyName\" value=\"" + componentProperty.getName() + "\"><select class=\"propertyselect\" name=\"" + componentProperty.getName() + "\">"); 861 862 Iterator optionsIterator = componentProperty.getOptions().iterator(); 863 while(optionsIterator.hasNext()) 864 { 865 ComponentPropertyOption option = (ComponentPropertyOption)optionsIterator.next(); 866 boolean isSame = componentProperty.getValue().equals(option.getValue()); 867 sb.append("<option value=\"" + option.getValue() + "\"" + (isSame ? " selected=\"1\"" : "") + ">" + option.getName() + "</option>"); 868 } 869 870 sb.append("</td>"); 871 } 872 else 873 sb.append(" <td class=\"igpropertyvalue\" align=\"left\">" + componentProperty.getValue() + "</td>"); 874 875 if(hasAccessToProperty) 876 sb.append(" <td class=\"igtd\" width=\"16\"><a class=\"componentEditorLink\" HREF=\"" + componentEditorUrl + "ViewSiteNodePageComponents!deleteComponentPropertyValue.action?siteNodeId=" + siteNodeId + "&languageId=" + languageId + "&contentId=" + contentId + "&componentId=" + componentId + "&propertyName=" + componentProperty.getName() + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + "\"><img SRC=\"" + componentEditorUrl + "/images/delete.gif\" border=\"0\"></a></td>"); 877 else 878 sb.append(" <td class=\"igtd\" width=\"16\"></td>"); 879 880 sb.append(" <!--<td> </td>-->"); 881 sb.append(" </tr>"); 882 883 if(hasAccessToProperty) 884 propertyIndex++; 885 } 886 } 887 888 timer.printElapsedTime("getComponentPropertiesDiv: 5"); 889 890 sb.append(" <tr class=\"igtr\">"); 891 sb.append(" <td colspan=\"4\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/trans.gif\" height=\"5\" width=\"1\"></td>"); 892 sb.append(" </tr>"); 893 sb.append(" <tr class=\"igtr\">"); 894 sb.append(" <td colspan=\"4\">"); 895 sb.append(" <a HREF=\"javascript:submitForm('component" + componentId + "PropertiesForm');\"><img SRC=\"" + componentEditorUrl + "" + this.getDeliveryContext().getInfoGlueAbstractAction().getLocalizedString(this.getDeliveryContext().getSession().getLocale(), "images.contenttool.buttons.save") + "\" width=\"50\" height=\"25\" border=\"0\"></a>"); 896 sb.append(" <a HREF=\"javascript:hideDiv('component" + componentId + "Properties');\"><img SRC=\"" + componentEditorUrl + "" + this.getDeliveryContext().getInfoGlueAbstractAction().getLocalizedString(this.getDeliveryContext().getSession().getLocale(), "images.contenttool.buttons.close") + "\" width=\"50\" height=\"25\" border=\"0\"></a>"); 897 sb.append(" </td>"); 898 sb.append(" </tr>"); 899 sb.append(" </table>"); 900 sb.append(" <input type=\"hidden\" name=\"repositoryId\" value=\"" + repositoryId + "\">"); 901 sb.append(" <input type=\"hidden\" name=\"siteNodeId\" value=\"" + siteNodeId + "\">"); 902 sb.append(" <input type=\"hidden\" name=\"languageId\" value=\"" + languageId + "\">"); 903 sb.append(" <input type=\"hidden\" name=\"contentId\" value=\"" + contentId + "\">"); 904 sb.append(" <input type=\"hidden\" name=\"componentId\" value=\"" + componentId + "\">"); 905 sb.append(" <input type=\"hidden\" name=\"showSimple\" value=\"" + this.getTemplateController().getDeliveryContext().getShowSimple() + "\">"); 906 sb.append(" </form>"); 907 sb.append(" </div>"); 908 sb.append(" </div>"); 909 910 sb.append(" <script type=\"text/javascript\">"); 911 sb.append(" var theHandle = document.getElementById(\"component" + componentId + "PropertiesHandle\");"); 912 sb.append(" var theRoot = document.getElementById(\"component" + componentId + "Properties\");"); 913 914 sb.append(" componentId = \"" + componentId + "\";"); 915 sb.append(" activatedComponentId = QueryString(\"activatedComponentId\");"); 916 sb.append(" if(activatedComponentId && activatedComponentId == componentId)"); 917 sb.append(" showDiv(\"component\" + componentId + \"Properties\");"); 918 919 sb.append(" Drag.init(theHandle, theRoot);"); 920 sb.append(" theRoot.style.left = 160;"); 921 sb.append(" theRoot.style.top = 150;"); 922 923 sb.append(" floatDiv(\"component" + componentId + "Properties\", 200, 50).flt();"); 924 sb.append(" </script>"); 925 926 return sb.toString(); 927 } 928 929 930 933 934 private String getComponentTasksDiv(Integer repositoryId, Integer siteNodeId, Integer languageId, Integer contentId, InfoGlueComponent component, org.w3c.dom.Document document, TemplateController templateController) throws Exception 935 { 936 InfoGluePrincipal principal = templateController.getPrincipal(); 937 String cmsUserName = (String )templateController.getHttpServletRequest().getSession().getAttribute("cmsUserName"); 938 if(cmsUserName != null) 939 principal = templateController.getPrincipal(cmsUserName); 940 941 boolean hasAccessToAccessRights = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "ComponentEditor.ChangeSlotAccess", ""); 942 boolean hasAccessToAddComponent = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "ComponentEditor.AddComponent", "" + (component.getParentComponent() == null ? component.getContentId() : component.getParentComponent().getContentId()) + "_" + component.getSlotName()); 943 boolean hasAccessToDeleteComponent = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "ComponentEditor.DeleteComponent", "" + (component.getParentComponent() == null ? component.getContentId() : component.getParentComponent().getContentId()) + "_" + component.getSlotName()); 944 boolean hasSaveTemplateAccess = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "StructureTool.SaveTemplate", ""); 945 946 if(component.getIsInherited()) 947 { 948 StringBuffer sb = new StringBuffer (); 949 sb.append("<script type=\"text/javascript\">"); 950 sb.append("hasAccessToAddComponent" + component.getSlotName() + " = " + hasAccessToAddComponent + ";"); 952 sb.append("hasAccessToDeleteComponent" + component.getSlotName() + " = " + hasAccessToDeleteComponent + ";"); 953 sb.append("hasAccessToAccessRights" + component.getSlotName() + " = " + hasAccessToAccessRights + ";"); 954 sb.append("</script>"); 956 return sb.toString(); 957 } 958 959 StringBuffer sb = new StringBuffer (); 960 Timer timer = new Timer(); 961 timer.setActive(false); 962 963 String componentEditorUrl = CmsPropertyHandler.getComponentEditorUrl(); 964 965 sb.append("<div id=\"component" + component.getId() + "Menu\" class=\"skin0\">"); 969 970 Collection componentTasks = getComponentTasks(component.getId(), document); 971 972 int taskIndex = 0; 973 Iterator componentTasksIterator = componentTasks.iterator(); 974 while(componentTasksIterator.hasNext()) 975 { 976 ComponentTask componentTask = (ComponentTask)componentTasksIterator.next(); 977 978 String view = componentTask.getView(); 979 980 view = view.replaceAll("\\$componentEditorUrl", componentEditorUrl); 981 view = view.replaceAll("\\$repositoryId", repositoryId.toString()); 982 view = view.replaceAll("\\$siteNodeId", siteNodeId.toString()); 983 view = view.replaceAll("\\$languageId", languageId.toString()); 984 view = view.replaceAll("\\$componentId", component.getId().toString()); 985 sb.append("<div class=\"igmenuitems\" onMouseover=\"javascript:highlightie5(event);\" onMouseout=\"javascript:lowlightie5(event);\" onClick=\"executeTask('" + view + "');\">" + componentTask.getName() + "</div>"); 986 } 987 988 Locale locale = templateController.getLocale(); 989 String editHTML = getLocalizedString(locale, "deliver.editOnSight.editHTML"); 990 String submitToPublishHTML = getLocalizedString(locale, "deliver.editOnSight.submitToPublish"); 991 String addComponentHTML = getLocalizedString(locale, "deliver.editOnSight.addComponentHTML"); 992 String deleteComponentHTML = getLocalizedString(locale, "deliver.editOnSight.deleteComponentHTML"); 993 String propertiesHTML = getLocalizedString(locale, "deliver.editOnSight.propertiesHTML"); 994 String pageComponentsHTML = getLocalizedString(locale, "deliver.editOnSight.pageComponentsHTML"); 995 String viewSourceHTML = getLocalizedString(locale, "deliver.editOnSight.viewSourceHTML"); 996 String componentEditorInNewWindowHTML = getLocalizedString(locale, "deliver.editOnSight.componentEditorInNewWindowHTML"); 997 String savePageTemplateHTML = getLocalizedString(locale, "deliver.editOnSight.savePageTemplateHTML"); 998 999 sb.append("<div class=\"igmenuitems\" onMouseover=\"javascript:highlightie5(event);\" onMouseout=\"javascript:lowlightie5(event);\" onClick=\"edit();\">" + editHTML + "</div>"); 1000 sb.append("<div class=\"igmenuitems\" onMouseover=\"javascript:highlightie5(event);\" onMouseout=\"javascript:lowlightie5(event);\" onClick=\"submitToPublish(" + siteNodeId + ", " + repositoryId + ", '" + URLEncoder.encode(templateController.getOriginalFullURL(), "UTF-8") + "');\">" + submitToPublishHTML + "</div>"); 1001 if(hasAccessToAddComponent) 1002 sb.append("<div class=\"igmenuitems\" onMouseover=\"javascript:highlightie5(event);\" onMouseout=\"javascript:lowlightie5(event);\" onClick=\"insertComponent();\">" + addComponentHTML + "</div>"); 1003 if(hasAccessToDeleteComponent) 1004 sb.append("<div class=\"igmenuitems\" onMouseover=\"javascript:highlightie5(event);\" onMouseout=\"javascript:lowlightie5(event);\" onClick=\"deleteComponent();\">" + deleteComponentHTML + "</div>"); 1005 if(hasSaveTemplateAccess) 1006 sb.append("<div class=\"igmenuitems\" onMouseover=\"javascript:highlightie5(event);\" onMouseout=\"javascript:lowlightie5(event);\" onClick=\"saveComponentStructure('" + componentEditorUrl + "CreatePageTemplate!input.action?contentId=" + templateController.getSiteNode(siteNodeId).getMetaInfoContentId() + "');\">" + savePageTemplateHTML + "</div>"); 1007 1008 sb.append("<hr/>"); 1010 sb.append("<div class=\"igmenuitems\" onMouseover=\"javascript:highlightie5(event);\" onMouseout=\"javascript:lowlightie5(event);\" onClick=\"javascript:showComponent();\">" + propertiesHTML + "</div>"); 1011 sb.append("<hr/>"); 1012 sb.append("<div class=\"igmenuitems\" onMouseover=\"javascript:highlightie5(event);\" onMouseout=\"javascript:lowlightie5(event);\" onClick=\"javascript:toggleDiv('pageComponents');\">" + pageComponentsHTML + "</div>"); 1014 sb.append("<div class=\"igmenuitems\" onMouseover=\"javascript:highlightie5(event);\" onMouseout=\"javascript:lowlightie5(event);\" onClick=\"window.open(document.location.href,'PageComponents','');\">" + componentEditorInNewWindowHTML + "</div>"); 1015 sb.append("<div class=\"igmenuitems\" onMouseover=\"javascript:highlightie5(event);\" onMouseout=\"javascript:lowlightie5(event);\" onClick=\"javascript:viewSource();\">" + viewSourceHTML + "</div>"); 1016 sb.append("</div>"); 1018 1019 sb.append("<script type=\"text/javascript\">"); 1020 sb.append("hasAccessToAddComponent" + component.getSlotName() + " = " + hasAccessToAddComponent + ";"); 1022 sb.append("hasAccessToDeleteComponent" + component.getSlotName() + " = " + hasAccessToDeleteComponent + ";"); 1023 sb.append("hasAccessToAccessRights" + component.getSlotName() + " = " + hasAccessToAccessRights + ";"); 1024 sb.append("</script>"); 1026 1027 return sb.toString(); 1028 } 1029 1030 1033 1034 private String getPageComponentStructureDiv(TemplateController templateController, Integer siteNodeId, Integer languageId, InfoGlueComponent component) throws Exception 1035 { 1036 if(templateController.getRequestParameter("skipComponentStructure") != null && templateController.getRequestParameter("skipComponentStructure").equalsIgnoreCase("true")) 1037 return ""; 1038 1039 StringBuffer sb = new StringBuffer (); 1040 1041 String componentEditorUrl = CmsPropertyHandler.getComponentEditorUrl(); 1042 1043 sb.append("<div id=\"pageComponents\" style=\"right:5px; top:5px; visibility:hidden; display: none;\">"); 1044 1045 sb.append(" <div id=\"dragCorner\" style=\"position: absolute; width: 16px; height: 16px; background-color: white; bottom: 0px; right: 0px;\"><a HREF=\"javascript:expandWindow('pageComponents');\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/enlarge.gif\" border=\"0\" width=\"16\" height=\"16\"></a></div>"); 1046 1047 sb.append(" <div id=\"pageComponentsHandle\"><div id=\"leftPaletteHandle\">Page components</div><div id=\"rightPaletteHandle\"><a HREF=\"javascript:hideDiv('pageComponents');\" class=\"white\">close</a></div></div>"); 1048 sb.append(" <div id=\"pageComponentsBody\"><table class=\"igtable\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"); 1049 1050 sb.append(" <tr class=\"igtr\">"); 1051 sb.append(" <td class=\"igtd\" colspan=\"20\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/tcross.png\" width=\"19\" height=\"16\"><span id=\"" + component.getSlotName() + "ClickableDiv\" class=\"iglabel\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/slotIcon.gif\" width=\"16\" height=\"16\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/trans.gif\" width=\"5\" height=\"1\">" + component.getName() + "</span><script type=\"text/javascript\">initializeSlotEventHandler('" + component.getSlotName() + "ClickableDiv', '" + componentEditorUrl + "ViewSiteNodePageComponents!listComponents.action?siteNodeId=" + templateController.getSiteNodeId() + "&languageId=" + templateController.getLanguageId() + "&contentId=" + templateController.getContentId() + "&parentComponentId=" + component.getId() + "&slotId=base&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + "', '', 'base', '" + component.getContentId() + "');</script></td>"); 1053 sb.append(" </tr>"); 1054 1055 renderComponentTree(templateController, sb, component, 0, 0, 1); 1056 1057 sb.append(" <tr class=\"igtr\">"); 1058 for(int i=0; i<20; i++) 1059 { 1060 sb.append("<td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/trans.gif\" width=\"19\" height=\"1\"></td>"); 1061 } 1062 sb.append(" </tr>"); 1063 sb.append(" </table>"); 1064 sb.append(" </div>"); 1065 sb.append(" </div>"); 1066 1067 sb.append(" <script type=\"text/javascript\">"); 1068 sb.append(" var theHandle = document.getElementById(\"pageComponentsHandle\");"); 1069 sb.append(" var theRoot = document.getElementById(\"pageComponents\");"); 1070 sb.append(" Drag.init(theHandle, theRoot);"); 1071 sb.append(" theRoot.style.left = 160;"); 1072 sb.append(" theRoot.style.top = 150;"); 1073 sb.append(" </script>"); 1074 1075 return sb.toString(); 1076 } 1077 1078 1081 1082 private void renderComponentTree(TemplateController templateController, StringBuffer sb, InfoGlueComponent component, int level, int position, int maxPosition) throws Exception 1083 { 1084 String componentEditorUrl = CmsPropertyHandler.getComponentEditorUrl(); 1085 1086 ContentVO componentContentVO = templateController.getContent(component.getContentId()); 1087 1088 int colspan = 20 - level; 1089 1090 sb.append(" <tr class=\"igtr\">"); 1091 sb.append(" <td class=\"igtd\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/trans.gif\" width=\"19\" height=\"16\"></td>"); 1092 1093 for(int i=0; i<level; i++) 1094 { 1095 sb.append("<td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/vline.png\" width=\"19\" height=\"16\"></td>"); 1096 } 1097 1098 sb.append("<td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/tcross.png\" width=\"19\" height=\"16\"></td><td class=\"igtd\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/componentIcon.gif\" width=\"16\" height=\"16\"></td><td class=\"igtd\" colspan=\"" + (colspan - 2) + "\"><span id=\"" + component.getId() + "\" onclick=\"javascript:showDiv('component" + component.getId() + "Properties');\" class=\"clickableLabel\">" + componentContentVO.getName() + "</span><script type=\"text/javascript\">initializeComponentInTreeEventHandler('" + component.getId() + "', '" + component.getId() + "', '', '" + componentEditorUrl + "ViewSiteNodePageComponents!deleteComponent.action?siteNodeId=" + templateController.getSiteNodeId() + "&languageId=" + templateController.getLanguageId() + "&contentId=" + templateController.getContentId() + "&componentId=" + component.getId() + "&slotId=" + component.getId() + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + "', '" + component.getSlotName() + "');</script>"); 1099 String upUrl = componentEditorUrl + "ViewSiteNodePageComponents!moveComponent.action?siteNodeId=" + templateController.getSiteNodeId() + "&languageId=" + templateController.getLanguageId() + "&contentId=" + templateController.getContentId() + "&componentId=" + component.getId() + "&direction=0&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + ""; 1100 String downUrl = componentEditorUrl + "ViewSiteNodePageComponents!moveComponent.action?siteNodeId=" + templateController.getSiteNodeId() + "&languageId=" + templateController.getLanguageId() + "&contentId=" + templateController.getContentId() + "&componentId=" + component.getId() + "&direction=1&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + ""; 1101 1102 if(position > 0) 1103 sb.append("<a HREF=\"" + upUrl + "\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/upArrow.gif\" border=\"0\" width=\"11\" width=\"10\"></a>"); 1104 if(maxPosition > position) 1105 sb.append("<a HREF=\"" + downUrl + "\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/downArrow.gif\" border=\"0\" width=\"11\" width=\"10\"></a>"); 1106 1107 sb.append("</td>"); 1108 1109 sb.append(" </tr>"); 1110 1111 sb.append(" <tr class=\"igtr\">"); 1113 sb.append(" <td class=\"igtd\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/trans.gif\" width=\"19\" height=\"1\"></td><td class=\"igtd\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/vline.png\" width=\"19\" height=\"16\"></td>"); 1114 for(int i=0; i<level; i++) 1115 { 1116 sb.append("<td class=\"igtd\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/vline.png\" width=\"19\" height=\"16\"></td>"); 1117 } 1118 sb.append("<td class=\"igtd\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/tcross.png\" width=\"19\" height=\"16\"></td><td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/propertiesIcon.gif\" width=\"16\" height=\"16\" border=\"0\"></td><td class=\"igtd\" colspan=\"" + (colspan - 3) + "\"><span onclick=\"javascript:showComponentProperties('component" + component.getId() + "Properties');\" class=\"iglabel\">Properties</span></td>"); 1119 sb.append(" </tr>"); 1120 1121 sb.append(" <tr class=\"igtr\">"); 1122 sb.append(" <td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/trans.gif\" width=\"19\" height=\"1\"></td><td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/vline.png\" width=\"19\" height=\"16\"></td>"); 1123 for(int i=0; i<level; i++) 1124 { 1125 sb.append("<td class=\"igtd\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/vline.png\" width=\"19\" height=\"16\"></td>"); 1126 } 1127 sb.append("<td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/endline.png\" width=\"19\" height=\"16\"></td><td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/containerIcon.gif\" width=\"16\" height=\"16\"></td><td class=\"igtd\" colspan=\"" + (colspan - 4) + "\"><span class=\"iglabel\">Slots</span></td>"); 1128 sb.append("</tr>"); 1129 1130 Iterator slotIterator = component.getSlotList().iterator(); 1131 while(slotIterator.hasNext()) 1132 { 1133 Slot slot = (Slot)slotIterator.next(); 1134 1135 sb.append(" <tr class=\"igtr\">"); 1136 sb.append(" <td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/trans.gif\" width=\"19\" height=\"16\"></td><td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/vline.png\" width=\"19\" height=\"16\"></td><td class=\"igtd\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/vline.png\" width=\"19\" height=\"16\"></td>"); 1137 for(int i=0; i<level; i++) 1138 { 1139 sb.append("<td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/vline.png\" width=\"19\" height=\"16\"></td>"); 1140 } 1141 if(slot.getComponents().size() > 0) 1142 sb.append("<td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/tcross.png\" width=\"19\" height=\"16\"></td><td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/slotIcon.gif\" width=\"16\" height=\"16\"></td>"); 1143 else 1144 sb.append("<td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/endline.png\" width=\"19\" height=\"16\"></td><td class=\"igtd\" width=\"19\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/slotIcon.gif\" width=\"16\" height=\"16\"></td>"); 1145 1146 String allowedComponentNamesAsEncodedString = slot.getAllowedComponentsArrayAsUrlEncodedString(); 1147 1148 sb.append("<td class=\"igtd\" colspan=\"" + (colspan - 4) + "\"><span id=\"" + slot.getId() + "ClickableDiv\" class=\"iglabel\">" + slot.getId() + "</span><script type=\"text/javascript\">initializeSlotEventHandler('" + slot.getId() + "ClickableDiv', '" + componentEditorUrl + "ViewSiteNodePageComponents!listComponents.action?siteNodeId=" + templateController.getSiteNodeId() + "&languageId=" + templateController.getLanguageId() + "&contentId=" + templateController.getContentId() + "&parentComponentId=" + component.getId() + "&slotId=" + slot.getId() + "&showSimple=" + this.getTemplateController().getDeliveryContext().getShowSimple() + ((allowedComponentNamesAsEncodedString != null) ? "&" + allowedComponentNamesAsEncodedString : "") + "', '', '" + slot.getId() + "', '" + component.getContentId() + "');</script></td>"); 1149 1150 sb.append(" </tr>"); 1151 1152 List slotComponents = slot.getComponents(); 1153 1155 if(slotComponents != null) 1156 { 1157 Iterator slotComponentIterator = slotComponents.iterator(); 1158 int newPosition = 0; 1159 while(slotComponentIterator.hasNext()) 1160 { 1161 InfoGlueComponent slotComponent = (InfoGlueComponent)slotComponentIterator.next(); 1162 ContentVO componentContent = templateController.getContent(slotComponent.getContentId()); 1163 1164 String imageUrl = "" + this.getRequest().getContextPath() + "/images/componentIcon.gif"; 1165 1169 renderComponentTree(templateController, sb, slotComponent, level + 3, newPosition, slotComponents.size() - 1); 1170 1171 newPosition++; 1172 } 1173 } 1174 } 1175 } 1176 1177 1178 1181 1183 private String getComponentPaletteDiv(Integer siteNodeId, Integer languageId, TemplateController templateController) throws Exception 1184 { 1185 InfoGluePrincipal principal = templateController.getPrincipal(); 1186 String cmsUserName = (String )templateController.getHttpServletRequest().getSession().getAttribute("cmsUserName"); 1187 if(cmsUserName != null) 1188 principal = templateController.getPrincipal(cmsUserName); 1189 1190 if(!templateController.getDeliveryContext().getShowSimple()) 1191 { 1192 boolean hasAccess = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "StructureTool.Palette", ""); 1193 1194 if(!hasAccess || templateController.getRequestParameter("skipToolbar") != null && templateController.getRequestParameter("skipToolbar").equalsIgnoreCase("true")) 1195 return ""; 1196 } 1197 1198 ContentVO contentVO = templateController.getBoundContent(BasicTemplateController.META_INFO_BINDING_NAME); 1199 1200 String key = "" + templateController.getPrincipal().getName(); 1202 String componentPaletteDiv = (String )CacheController.getCachedObject("componentPaletteDivCache", key); 1203 if(componentPaletteDiv != null) 1204 { 1205 if(componentPaletteDiv != null && (templateController.getRequestParameter("refresh") == null || !templateController.getRequestParameter("refresh").equalsIgnoreCase("true"))) 1206 { 1207 return componentPaletteDiv.replaceAll("CreatePageTemplate\\!input.action\\?contentId=.*?'", "CreatePageTemplate!input.action?contentId=" + contentVO.getContentId() + "'"); 1208 } 1209 } 1210 1212 StringBuffer sb = new StringBuffer (); 1213 1214 String componentEditorUrl = CmsPropertyHandler.getComponentEditorUrl(); 1215 String componentRendererUrl = CmsPropertyHandler.getComponentRendererUrl(); 1216 String componentRendererAction = CmsPropertyHandler.getComponentRendererAction(); 1217 1218 1219 sb.append("<div id=\"buffer\" style=\"top: 0px; left: 0px; z-index:200;\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/componentDraggedIcon.gif\"></div>"); 1220 1221 Map componentGroups = getComponentGroups(getComponentContents(), templateController); 1222 1223 sb.append("<div id=\"paletteDiv\">"); 1224 1225 sb.append("<div id=\"paletteHandle\">"); 1226 sb.append(" <div id=\"leftPaletteHandle\">Component palette</div><div id=\"rightPaletteHandle\"><a HREF=\"javascript:hideDiv('paletteDiv');\" class=\"white\">close</a></div>"); 1227 sb.append("</div>"); 1228 1229 sb.append("<div id=\"paletteBody\">"); 1230 sb.append("<table class=\"tabPanel\" cellpadding=\"0\" cellspacing=\"0\">"); 1231 sb.append(" <tr class=\"igtr\">"); 1232 1233 Iterator groupIterator = componentGroups.keySet().iterator(); 1234 int index = 0; 1235 String groupName = ""; 1236 String initialGroupName = ""; 1237 while(groupIterator.hasNext()) 1238 { 1239 groupName = (String )groupIterator.next(); 1240 1241 if(index == 0) 1242 { 1243 sb.append(" <td id=\"" + groupName + "Tab\" valign=\"top\" class=\"thistab\" onclick=\"javascript:changeTab('" + groupName + "');\" height=\"20\"><nobr>" + groupName + "</nobr></td>"); 1244 initialGroupName = groupName; 1245 } 1246 else if(!groupIterator.hasNext()) 1247 sb.append(" <td id=\"" + groupName + "Tab\" valign=\"top\" class=\"tab\" style=\"border-right: solid thin black\" onclick=\"javascript:changeTab('" + groupName + "');\"><nobr>" + groupName + "</nobr></td>"); 1248 else 1249 sb.append(" <td id=\"" + groupName + "Tab\" valign=\"top\" class=\"tab\" onclick=\"javascript:changeTab('" + groupName + "');\"><nobr>" + groupName + "</nobr></td>"); 1250 1251 index++; 1252 } 1253 1254 boolean hasSaveTemplateAccess = AccessRightController.getController().getIsPrincipalAuthorized(templateController.getDatabase(), principal, "StructureTool.SaveTemplate", ""); 1255 1256 sb.append(" <td class=\"igpalettetd\" width=\"90%\" style=\"text-align: right; border-right: solid thin gray; border-bottom: solid thin white\" align=\"right\"> <a HREF=\"javascript:refreshComponents(document.location.href);\" class=\"white\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/refresh.gif\" alt=\"Refresh palette\" border=\"0\"></a> <a HREF=\"javascript:moveDivDown('paletteDiv');\" class=\"white\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/arrowDown.gif\" alt=\"Move down\" border=\"0\"></a> <a HREF=\"javascript:moveDivUp('paletteDiv');\" class=\"white\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/arrowUp.gif\" alt=\"Move up\" border=\"0\"></a> <a HREF=\"javascript:toggleDiv('pageComponents');\" class=\"white\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/pageStructure.gif\" alt=\"Toggle page structure\" border=\"0\"></a> "); 1257 if(hasSaveTemplateAccess) 1258 sb.append("<a HREF=\"javascript:saveComponentStructure('" + componentEditorUrl + "CreatePageTemplate!input.action?contentId=" + contentVO.getId() + "');\" class=\"white\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/saveComponentStructure.gif\" alt=\"Save the page as a template page\" border=\"0\"></a> "); 1259 1260 sb.append("<a HREF=\"javascript:window.open(document.location.href, 'PageComponents', '');\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/fullscreen.gif\" alt=\"Pop up in a large window\" border=\"0\"></a> </td>"); 1261 1262 sb.append(" </tr>"); 1263 sb.append("</table>"); 1264 sb.append("</div>"); 1265 1266 sb.append("<script type=\"text/javascript\">"); 1267 sb.append("var currentGroup = \"" + initialGroupName + "\";"); 1268 sb.append("</script>"); 1269 1270 String openGroupName = ""; 1271 1272 groupIterator = componentGroups.keySet().iterator(); 1273 index = 0; 1274 while(groupIterator.hasNext()) 1275 { 1276 groupName = (String )groupIterator.next(); 1277 1278 if(index == 0) 1279 { 1280 sb.append("<div id=\"" + groupName + "ComponentsBg\" class=\"componentsBackground\" style=\"zIndex:3; visibility: inherited;\">"); 1281 openGroupName = groupName; 1282 } 1283 else 1284 sb.append("<div id=\"" + groupName + "ComponentsBg\" class=\"componentsBackground\" style=\"zIndex:2; visibility: inherited;\">"); 1285 1286 sb.append("<div id=\"" + groupName + "Components\" style=\"visibility:inherit; position:absolute; top:1px; left:5px; height:50px; \">"); 1287 sb.append(" <table class=\"igtable\" style=\"width:100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">"); 1288 sb.append(" <tr class=\"igtr\">"); 1289 1291 String imageUrl = this.getRequest().getContextPath() + "/images/componentIcon.gif"; 1292 List components = (List )componentGroups.get(groupName); Iterator componentIterator = components.iterator(); 1294 int componentIndex = 0; 1295 while(componentIterator.hasNext()) 1296 { 1297 ContentVO componentContentVO = (ContentVO)componentIterator.next(); 1298 1299 sb.append(" <td class=\"igpalettetd\">"); 1303 sb.append(" <div id=\"" + componentIndex + "\" style=\"display: block; visibility: inherited;\"><nobr><img SRC=\"" + imageUrl + "\" width=\"16\" height=\"16\" border=\"0\">"); 1304 sb.append(" <span onMouseDown=\"grabIt(event);\" onmouseover=\"showDetails('" + componentContentVO.getName() + "');\" id=\""+ componentContentVO.getId() + "\" class=\"draggableItem\" nowrap=\"1\">" + ((componentContentVO.getName().length() > 22) ? componentContentVO.getName().substring(0, 17) : componentContentVO.getName()) + "...</span>"); 1305 sb.append(" </nobr></div>"); 1306 sb.append(" </td>"); 1307 1308 imageUrl = this.getRequest().getContextPath() + "/images/componentIcon.gif"; 1309 } 1310 sb.append(" <td class=\"igpalettetd\" width=\"90%\"> </td>"); 1311 1312 sb.append(" </tr>"); 1314 sb.append(" </table>"); 1315 sb.append("</div>"); 1316 1317 sb.append("</div>"); 1318 1319 sb.append("<script type=\"text/javascript\"> if (bw.bw) tabInit('" + groupName + "Components'); </script>"); 1320 1321 1322 index++; 1323 } 1324 1325 sb.append("<div id=\"statusListBg\">"); 1326 sb.append("<table class=\"igtable\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">"); 1327 sb.append("<tr class=\"igtr\">"); 1328 sb.append(" <td class=\"igpalettetd\" align=\"left\" width=\"15px\"> <a HREF=\"#\" onclick=\"moveLeft(currentGroup)\" return false\" onfocus=\"if(this.blur)this.blur()\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/arrowleft.gif\" alt=\"previous\" border=\"0\"></a></td>"); 1329 sb.append(" <td class=\"igpalettetd\" align=\"left\" width=\"95%\"><span class=\"componentsStatusText\">Details: </span><span id=\"statusText\" class=\"componentsStatusText\"> </span></td>"); 1330 sb.append(" <td class=\"igpalettetd\" align=\"right\"><a HREF=\"#\" onclick=\"moveRight(currentGroup)\" return false\" onfocus=\"if(this.blur)this.blur()\"><img SRC=\"" + this.getRequest().getContextPath() + "/images/arrowright.gif\" alt=\"next\" border=\"0\"></a> </td>"); 1331 sb.append("</tr>"); 1332 sb.append("</table>"); 1333 sb.append("</div>"); 1334 1335 sb.append(" <script type=\"text/javascript\">"); 1336 sb.append(" changeTab('" + openGroupName + "');"); 1337 1338 sb.append(" var theHandle = document.getElementById(\"paletteHandle\");"); 1339 sb.append(" var theRoot = document.getElementById(\"paletteDiv\");"); 1340 sb.append(" Drag.init(theHandle, theRoot, 0, 0, 0, 1000);"); 1341 1342 sb.append(" </script>"); 1343 1344 sb.append("</div>"); 1345 1346 componentPaletteDiv = sb.toString(); 1348 CacheController.cacheObject("componentPaletteDivCache", key, componentPaletteDiv); 1349 1350 return componentPaletteDiv; 1351 } 1352 1353 1357 1358 private Map getComponentGroups(List components, TemplateController templateController) 1359 { 1360 Map componentGroups = new HashMap (); 1361 1362 Iterator componentIterator = components.iterator(); 1363 while(componentIterator.hasNext()) 1364 { 1365 ContentVO componentContentVO = (ContentVO)componentIterator.next(); 1366 String groupName = templateController.getContentAttribute(componentContentVO.getId(), "GroupName", true); 1367 if(groupName == null || groupName.equals("")) 1368 groupName = "Other"; 1369 1370 List groupComponents = (List )componentGroups.get(groupName); 1371 if(groupComponents == null) 1372 { 1373 groupComponents = new ArrayList (); 1374 componentGroups.put(groupName, groupComponents); 1375 } 1376 1377 groupComponents.add(componentContentVO); 1378 } 1379 1380 return componentGroups; 1381 } 1382 1383 1386 1387 public List getComponentContents() throws Exception 1388 { 1389 HashMap arguments = new HashMap (); 1390 arguments.put("method", "selectListOnContentTypeName"); 1391 1392 List argumentList = new ArrayList (); 1393 HashMap argument = new HashMap (); 1394 argument.put("contentTypeDefinitionName", "HTMLTemplate"); 1395 argumentList.add(argument); 1396 arguments.put("arguments", argumentList); 1397 1398 return ContentController.getContentController().getContentVOList(arguments, getDatabase()); 1399 } 1400 1401 1404 1405 protected org.w3c.dom.Document getComponentPropertiesDocument(TemplateController templateController, Integer siteNodeId, Integer languageId, Integer contentId) throws SystemException, Exception 1406 { 1407 String cacheName = "componentEditorCache"; 1408 String cacheKey = "componentPropertiesDocument_" + siteNodeId + "_" + templateController.getLanguageId() + "_" + contentId; 1409 org.w3c.dom.Document cachedComponentPropertiesDocument = (org.w3c.dom.Document )CacheController.getCachedObject(cacheName, cacheKey); 1410 if(cachedComponentPropertiesDocument != null) 1411 return cachedComponentPropertiesDocument; 1412 1413 org.w3c.dom.Document componentPropertiesDocument = null; 1414 1415 try 1416 { 1417 String xml = this.getComponentPropertiesString(templateController, siteNodeId, languageId, contentId); 1418 if(xml != null && xml.length() > 0) 1420 { 1421 componentPropertiesDocument = XMLHelper.readDocumentFromByteArray(xml.getBytes("UTF-8")); 1422 1423 CacheController.cacheObject(cacheName, cacheKey, componentPropertiesDocument); 1424 } 1425 } 1426 catch(Exception e) 1427 { 1428 logger.error(e.getMessage(), e); 1429 throw e; 1430 } 1431 1432 return componentPropertiesDocument; 1433 } 1434 1435 1438 1439 private String getComponentPropertiesString(TemplateController templateController, Integer siteNodeId, Integer languageId, Integer contentId) throws SystemException, Exception 1440 { 1441 String cacheName = "componentEditorCache"; 1442 String cacheKey = "componentPropertiesString_" + siteNodeId + "_" + templateController.getLanguageId() + "_" + contentId; 1443 String cachedComponentPropertiesString = (String )CacheController.getCachedObject(cacheName, cacheKey); 1444 if(cachedComponentPropertiesString != null) 1445 return cachedComponentPropertiesString; 1446 1447 String componentPropertiesString = null; 1448 1449 try 1450 { 1451 Integer masterLanguageId = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(templateController.getDatabase(), siteNodeId).getId(); 1452 componentPropertiesString = templateController.getContentAttribute(contentId, masterLanguageId, "ComponentProperties", true); 1454 1455 if(componentPropertiesString == null) 1456 throw new SystemException("There was no properties assigned to this content."); 1457 1458 CacheController.cacheObject(cacheName, cacheKey, componentPropertiesString); 1459 } 1460 catch(Exception e) 1461 { 1462 logger.error(e.getMessage(), e); 1463 throw e; 1464 } 1465 1466 return componentPropertiesString; 1467 } 1468 1469 1470 1473 1474 protected org.w3c.dom.Document getComponentTasksDocument(TemplateController templateController, Integer siteNodeId, Integer languageId, Integer contentId) throws SystemException, Exception 1475 { 1476 String cacheName = "componentEditorCache"; 1477 String cacheKey = "componentTasksDocument_" + siteNodeId + "_" + templateController.getLanguageId() + "_" + contentId; 1478 org.w3c.dom.Document cachedComponentTasksDocument = (org.w3c.dom.Document )CacheController.getCachedObject(cacheName, cacheKey); 1479 if(cachedComponentTasksDocument != null) 1480 return cachedComponentTasksDocument; 1481 1482 org.w3c.dom.Document componentTasksDocument = null; 1483 1484 try 1485 { 1486 String xml = this.getComponentTasksString(templateController, siteNodeId, languageId, contentId); 1487 if(xml != null && xml.length() > 0) 1488 { 1489 componentTasksDocument = XMLHelper.readDocumentFromByteArray(xml.getBytes("UTF-8")); 1490 1491 CacheController.cacheObject(cacheName, cacheKey, componentTasksDocument); 1492 } 1493 } 1494 catch(Exception e) 1495 { 1496 logger.error(e.getMessage(), e); 1497 throw e; 1498 } 1499 1500 return componentTasksDocument; 1501 } 1502 1503 1506 1507 private String getComponentTasksString(TemplateController templateController, Integer siteNodeId, Integer languageId, Integer contentId) throws SystemException, Exception 1508 { 1509 String cacheName = "componentEditorCache"; 1510 String cacheKey = "componentTasksString_" + siteNodeId + "_" + templateController.getLanguageId() + "_" + contentId; 1511 String cachedComponentTasksString = (String )CacheController.getCachedObject(cacheName, cacheKey); 1512 if(cachedComponentTasksString != null) 1513 return cachedComponentTasksString; 1514 1515 String componentTasksString = null; 1516 1517 try 1518 { 1519 Integer masterLanguageId = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(getDatabase(), siteNodeId).getId(); 1520 componentTasksString = templateController.getContentAttribute(contentId, masterLanguageId, "ComponentTasks", true); 1521 1522 if(componentTasksString == null) 1523 throw new SystemException("There was no tasks assigned to this content."); 1524 1525 CacheController.cacheObject(cacheName, cacheKey, componentTasksString); 1526 } 1527 catch(Exception e) 1528 { 1529 logger.error(e.getMessage(), e); 1530 throw e; 1531 } 1532 1533 return componentTasksString; 1534 } 1535 1536 public Collection getComponentProperties(Integer componentId, TemplateController templateController, Integer siteNodeId, Integer languageId, Integer componentContentId) throws Exception 1537 { 1538 org.w3c.dom.Document componentPropertiesDocument = getComponentPropertiesDocument(templateController, siteNodeId, languageId, componentContentId); 1539 return getComponentProperties(componentId, componentPropertiesDocument, templateController); 1540 } 1541 1542 1545 1546 private List getComponentProperties(Integer componentId, org.w3c.dom.Document document) throws Exception 1547 { 1548 1550 List componentProperties = new ArrayList (); 1552 Timer timer = new Timer(); 1553 timer.setActive(false); 1554 1555 try 1556 { 1557 if(document != null) 1558 { 1559 1563 timer.printElapsedTime("Read document"); 1564 1565 String propertyXPath = "//property"; 1566 NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), propertyXPath); 1568 timer.printElapsedTime("Set property xpath"); 1569 for(int i=0; i < anl.getLength(); i++) 1571 { 1572 org.w3c.dom.Element binding = (org.w3c.dom.Element )anl.item(i); 1573 1574 String name = binding.getAttribute("name"); 1575 String description = binding.getAttribute("description"); 1576 String type = binding.getAttribute("type"); 1577 String allowedContentTypeNamesString = binding.getAttribute("allowedContentTypeDefinitionNames"); 1578 String visualizingAction = binding.getAttribute("visualizingAction"); 1579 String createAction = binding.getAttribute("createAction"); 1580 1583 ComponentProperty property = new ComponentProperty(); 1584 property.setComponentId(componentId); 1585 property.setName(name); 1586 property.setDescription(description); 1587 property.setType(type); 1588 property.setVisualizingAction(visualizingAction); 1589 property.setCreateAction(createAction); 1590 if(allowedContentTypeNamesString != null && allowedContentTypeNamesString.length() > 0) 1591 { 1592 String [] allowedContentTypeNamesArray = allowedContentTypeNamesString.split(","); 1593 property.setAllowedContentTypeNamesArray(allowedContentTypeNamesArray); 1594 } 1595 1596 if(type.equalsIgnoreCase(ComponentProperty.BINDING)) 1597 { 1598 String entity = binding.getAttribute("entity"); 1599 boolean isMultipleBinding = new Boolean (binding.getAttribute("multiple")).booleanValue(); 1600 1601 property.setEntityClass(entity); 1602 String value = getComponentPropertyValue(componentId, name); 1603 timer.printElapsedTime("Set property1"); 1604 1605 property.setValue(value); 1606 property.setIsMultipleBinding(isMultipleBinding); 1607 } 1608 else if(type.equalsIgnoreCase(ComponentProperty.TEXTFIELD)) 1609 { 1610 String value = getComponentPropertyValue(componentId, name); 1611 timer.printElapsedTime("Set property2"); 1612 property.setValue(value); 1614 } 1615 else if(type.equalsIgnoreCase(ComponentProperty.TEXTAREA)) 1616 { 1617 String value = getComponentPropertyValue(componentId, name); 1618 timer.printElapsedTime("Set property2"); 1619 property.setValue(value); 1621 } 1622 else if(type.equalsIgnoreCase(ComponentProperty.SELECTFIELD)) 1623 { 1624 String value = getComponentPropertyValue(componentId, name); 1625 timer.printElapsedTime("Set property2"); 1626 1627 NodeList optionList = binding.getElementsByTagName("option"); 1628 for(int j=0; j < optionList.getLength(); j++) 1629 { 1630 org.w3c.dom.Element option = (org.w3c.dom.Element )optionList.item(j); 1631 String optionName = option.getAttribute("name"); 1632 String optionValue = option.getAttribute("value"); 1633 ComponentPropertyOption cpo = new ComponentPropertyOption(); 1634 cpo.setName(optionName); 1635 cpo.setValue(optionValue); 1636 property.getOptions().add(cpo); 1637 } 1638 1639 property.setValue(value); 1641 } 1642 1643 componentProperties.add(property); 1644 } 1645 } 1646 } 1647 catch(Exception e) 1648 { 1649 logger.warn("The component with id " + componentId + " had a incorrect xml defining it's properties:" + e.getMessage(), e); 1650 } 1651 1652 return componentProperties; 1653 } 1654 1655 1656 1659 1660 private List getComponentProperties(Integer componentId, org.w3c.dom.Document document, TemplateController templateController) throws Exception 1661 { 1662 1664 List componentProperties = new ArrayList (); 1666 Timer timer = new Timer(); 1667 timer.setActive(false); 1668 1669 try 1670 { 1671 if(document != null) 1672 { 1673 1677 timer.printElapsedTime("Read document"); 1678 1679 String propertyXPath = "//property"; 1680 NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), propertyXPath); 1682 timer.printElapsedTime("Set property xpath"); 1683 for(int i=0; i < anl.getLength(); i++) 1685 { 1686 org.w3c.dom.Element binding = (org.w3c.dom.Element )anl.item(i); 1687 1688 String name = binding.getAttribute("name"); 1689 String description = binding.getAttribute("description"); 1690 String type = binding.getAttribute("type"); 1691 String allowedContentTypeNamesString = binding.getAttribute("allowedContentTypeDefinitionNames"); 1692 String visualizingAction = binding.getAttribute("visualizingAction"); 1693 String createAction = binding.getAttribute("createAction"); 1694 1697 ComponentProperty property = new ComponentProperty(); 1698 property.setComponentId(componentId); 1699 property.setName(name); 1700 property.setDescription(description); 1701 property.setType(type); 1702 property.setVisualizingAction(visualizingAction); 1703 property.setCreateAction(createAction); 1704 if(allowedContentTypeNamesString != null && allowedContentTypeNamesString.length() > 0) 1705 { 1706 String [] allowedContentTypeNamesArray = allowedContentTypeNamesString.split(","); 1707 property.setAllowedContentTypeNamesArray(allowedContentTypeNamesArray); 1708 } 1709 1710 if(type.equalsIgnoreCase(ComponentProperty.BINDING)) 1711 { 1712 String entity = binding.getAttribute("entity"); 1713 boolean isMultipleBinding = new Boolean (binding.getAttribute("multiple")).booleanValue(); 1714 1715 property.setEntityClass(entity); 1716 String value = getComponentPropertyValue(componentId, name, templateController); 1717 timer.printElapsedTime("Set property1"); 1718 1719 property.setValue(value); 1720 property.setIsMultipleBinding(isMultipleBinding); 1721 } 1722 else if(type.equalsIgnoreCase(ComponentProperty.TEXTFIELD)) 1723 { 1724 String value = getComponentPropertyValue(componentId, name, templateController); 1725 timer.printElapsedTime("Set property2"); 1726 property.setValue(value); 1728 } 1729 else if(type.equalsIgnoreCase(ComponentProperty.TEXTAREA)) 1730 { 1731 String value = getComponentPropertyValue(componentId, name, templateController); 1732 timer.printElapsedTime("Set property2"); 1733 property.setValue(value); 1735 } 1736 else if(type.equalsIgnoreCase(ComponentProperty.SELECTFIELD)) 1737 { 1738 String value = getComponentPropertyValue(componentId, name, templateController); 1739 timer.printElapsedTime("Set property2"); 1740 1741 NodeList optionList = binding.getElementsByTagName("option"); 1742 for(int j=0; j < optionList.getLength(); j++) 1743 { 1744 org.w3c.dom.Element option = (org.w3c.dom.Element )optionList.item(j); 1745 String optionName = option.getAttribute("name"); 1746 String optionValue = option.getAttribute("value"); 1747 ComponentPropertyOption cpo = new ComponentPropertyOption(); 1748 cpo.setName(optionName); 1749 cpo.setValue(optionValue); 1750 property.getOptions().add(cpo); 1751 } 1752 1753 property.setValue(value); 1755 } 1756 1757 componentProperties.add(property); 1758 } 1759 } 1760 } 1761 catch(Exception e) 1762 { 1763 logger.warn("The component with id " + componentId + " had a incorrect xml defining it's properties:" + e.getMessage(), e); 1764 } 1765 1766 return componentProperties; 1767 } 1768 1769 1772 1773 private List getComponentTasks(Integer componentId, org.w3c.dom.Document document) throws Exception 1774 { 1775 List componentTasks = new ArrayList (); 1776 Timer timer = new Timer(); 1777 timer.setActive(false); 1778 1779 try 1780 { 1781 if(document != null) 1782 { 1783 timer.printElapsedTime("Read document"); 1784 1785 String propertyXPath = "//task"; 1786 NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), propertyXPath); 1788 timer.printElapsedTime("Set property xpath"); 1789 for(int i=0; i < anl.getLength(); i++) 1790 { 1791 org.w3c.dom.Element binding = (org.w3c.dom.Element )anl.item(i); 1792 1793 String name = binding.getAttribute("name"); 1794 String view = binding.getAttribute("view"); 1795 logger.info("name:" + name); 1796 logger.info("view:" + view); 1797 1798 ComponentTask task = new ComponentTask(); 1799 task.setName(name); 1800 task.setView(view); 1801 task.setComponentId(componentId); 1802 1803 componentTasks.add(task); 1804 } 1805 } 1806 } 1807 catch(Exception e) 1808 { 1809 logger.warn("The component with id " + componentId + " had a incorrect xml defining it's properties:" + e.getMessage(), e); 1810 } 1811 1812 return componentTasks; 1813 } 1814 1815 1816 1820 1821 private String getComponentPropertyValue(Integer componentId, String name) throws Exception 1822 { 1823 String value = "Undefined"; 1824 1825 Timer timer = new Timer(); 1826 timer.setActive(false); 1827 1828 Integer siteNodeId = new Integer (this.getRequest().getParameter("siteNodeId")); 1829 Integer languageId = null; 1830 1831 if(this.getRequest().getParameter("languageId") != null && this.getRequest().getParameter("languageId").length() > 0) 1832 languageId = new Integer (this.getRequest().getParameter("languageId")); 1833 else 1836 languageId = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(getDatabase(), siteNodeId).getId(); 1837 1838 Locale locale = LanguageDeliveryController.getLanguageDeliveryController().getLocaleWithId(getDatabase(), languageId); 1839 1840 Integer contentId = new Integer (-1); 1841 if(this.getRequest().getParameter("contentId") != null && this.getRequest().getParameter("contentId").length() > 0) 1842 contentId = new Integer (this.getRequest().getParameter("contentId")); 1843 1844 NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId); 1845 1846 org.w3c.dom.Document document = getPageComponentsDocument(getDatabase(), this.getTemplateController(), siteNodeId, languageId, contentId); 1847 1848 String componentXPath = "//component[@id=" + componentId + "]/properties/property[@name='" + name + "']"; 1849 NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath); 1851 for(int i=0; i < anl.getLength(); i++) 1852 { 1853 org.w3c.dom.Element property = (org.w3c.dom.Element )anl.item(i); 1854 1855 String id = property.getAttribute("type"); 1856 String path = property.getAttribute("path"); 1857 1858 if(property.hasAttribute("path_" + locale.getLanguage())) 1859 path = property.getAttribute("path_" + locale.getLanguage()); 1860 1861 value = path; 1862 } 1863 1864 return value; 1865 } 1866 1867 1871 1872 private String getComponentPropertyValue(Integer componentId, String name, TemplateController templateController) throws Exception 1873 { 1874 String value = "Undefined"; 1875 1876 Timer timer = new Timer(); 1877 timer.setActive(false); 1878 1879 Integer languageId = null; 1880 if(this.getRequest() != null && this.getRequest().getParameter("languageId") != null && this.getRequest().getParameter("languageId").length() > 0) 1881 languageId = new Integer (this.getRequest().getParameter("languageId")); 1882 else 1883 languageId = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(templateController.getDatabase(), templateController.getSiteNodeId()).getId(); 1884 1885 Locale locale = LanguageDeliveryController.getLanguageDeliveryController().getLocaleWithId(templateController.getDatabase(), languageId); 1886 1887 Integer contentId = new Integer (-1); 1888 if(this.getRequest() != null && this.getRequest().getParameter("contentId") != null && this.getRequest().getParameter("contentId").length() > 0) 1889 contentId = new Integer (this.getRequest().getParameter("contentId")); 1890 1891 NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(templateController.getSiteNodeId(), languageId, contentId); 1892 1893 org.w3c.dom.Document document = getPageComponentsDocument(templateController.getDatabase(), templateController, templateController.getSiteNodeId(), languageId, contentId); 1894 1895 String componentXPath = "//component[@id=" + componentId + "]/properties/property[@name='" + name + "']"; 1896 NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath); 1898 for(int i=0; i < anl.getLength(); i++) 1899 { 1900 org.w3c.dom.Element property = (org.w3c.dom.Element )anl.item(i); 1901 1902 String id = property.getAttribute("type"); 1903 String path = property.getAttribute("path"); 1904 1905 if(property.hasAttribute("path_" + locale.getLanguage())) 1906 path = property.getAttribute("path_" + locale.getLanguage()); 1907 1908 value = path; 1909 } 1910 1911 return value; 1912 } 1913 1914 1915 1918 1919 private List getContentBindnings(Integer componentId) throws Exception 1920 { 1921 List contentBindings = new ArrayList (); 1922 1923 Integer siteNodeId = new Integer (this.getRequest().getParameter("siteNodeId")); 1924 Integer languageId = new Integer (this.getRequest().getParameter("languageId")); 1925 Integer contentId = new Integer (this.getRequest().getParameter("contentId")); 1926 1927 NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId); 1928 IntegrationDeliveryController integrationDeliveryController = IntegrationDeliveryController.getIntegrationDeliveryController(siteNodeId, languageId, contentId); 1929 1930 boolean USE_LANGUAGE_FALLBACK = true; 1931 boolean DO_NOT_USE_LANGUAGE_FALLBACK = false; 1932 1933 String componentXML = getPageComponentsString(getDatabase(), this.getTemplateController(), siteNodeId, languageId, contentId); 1934 1936 org.w3c.dom.Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8")); 1937 String componentXPath = "//component[@id=" + componentId + "]/bindings/binding"; 1938 NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath); 1940 for(int i=0; i < anl.getLength(); i++) 1941 { 1942 org.w3c.dom.Element binding = (org.w3c.dom.Element )anl.item(i); 1943 1946 String id = binding.getAttribute("id"); 1947 String entityClass = binding.getAttribute("entity"); 1948 String entityId = binding.getAttribute("entityId"); 1949 1953 if(entityClass.equalsIgnoreCase("Content")) 1954 { 1955 ContentVO contentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(new Integer (entityId), getDatabase()); 1956 ComponentBinding componentBinding = new ComponentBinding(); 1957 componentBinding.setId(new Integer (id)); 1958 componentBinding.setComponentId(componentId); 1959 componentBinding.setEntityClass(entityClass); 1960 componentBinding.setEntityId(new Integer (entityId)); 1961 componentBinding.setBindingPath(contentVO.getName()); 1962 1963 contentBindings.add(componentBinding); 1964 } 1965 } 1966 1967 return contentBindings; 1968 } 1969 1970 1971 private void printComponentHierarchy(List pageComponents, int level) 1972 { 1973 Iterator pageComponentIterator = pageComponents.iterator(); 1974 while(pageComponentIterator.hasNext()) 1975 { 1976 InfoGlueComponent tempComponent = (InfoGlueComponent)pageComponentIterator.next(); 1977 1978 for(int i=0; i<level; i++) 1979 logger.info(" "); 1980 1981 logger.info(" component:" + tempComponent.getName()); 1982 1983 Iterator slotIterator = tempComponent.getSlotList().iterator(); 1984 while(slotIterator.hasNext()) 1985 { 1986 Slot slot = (Slot)slotIterator.next(); 1987 1988 for(int i=0; i<level; i++) 1989 logger.info(" "); 1990 1991 logger.info(" slot for " + tempComponent.getName() + ":" + slot.getId()); 1992 printComponentHierarchy(slot.getComponents(), level + 1); 1993 } 1994 } 1995 } 1996 1997 public String getLocalizedString(Locale locale, String key) 1998 { 1999 StringManager stringManager = StringManagerFactory.getPresentationStringManager("org.infoglue.cms.applications", locale); 2000 2001 return stringManager.getString(key); 2002 } 2003 2004} | Popular Tags |