/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
* Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/
package org.infoglue.cms.applications.structuretool.actions;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.xml.transform.TransformerException;
import org.apache.log4j.Logger;
import org.infoglue.cms.applications.common.VisualFormatter;
import org.infoglue.cms.applications.common.actions.InfoGlueAbstractAction;
import org.infoglue.cms.applications.databeans.ComponentPropertyDefinition;
import org.infoglue.cms.controllers.kernel.impl.simple.CategoryController;
import org.infoglue.cms.controllers.kernel.impl.simple.ComponentController;
import org.infoglue.cms.controllers.kernel.impl.simple.ComponentPropertyDefinitionController;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentController;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentTypeDefinitionController;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentVersionController;
import org.infoglue.cms.controllers.kernel.impl.simple.DigitalAssetController;
import org.infoglue.cms.controllers.kernel.impl.simple.LanguageController;
import org.infoglue.cms.controllers.kernel.impl.simple.RepositoryController;
import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeController;
import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeStateController;
import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeVersionControllerProxy;
import org.infoglue.cms.entities.content.ContentVO;
import org.infoglue.cms.entities.content.ContentVersionVO;
import org.infoglue.cms.entities.content.DigitalAssetVO;
import org.infoglue.cms.entities.management.CategoryVO;
import org.infoglue.cms.entities.management.ContentTypeDefinitionVO;
import org.infoglue.cms.entities.management.LanguageVO;
import org.infoglue.cms.entities.structure.SiteNodeVO;
import org.infoglue.cms.entities.structure.SiteNodeVersionVO;
import org.infoglue.cms.exception.Bug;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.security.InfoGluePrincipal;
import org.infoglue.cms.util.CmsPropertyHandler;
import org.infoglue.cms.util.XMLHelper;
import org.infoglue.deliver.applications.databeans.DeliveryContext;
import org.infoglue.deliver.applications.databeans.Slot;
import org.infoglue.deliver.controllers.kernel.impl.simple.NodeDeliveryController;
import org.infoglue.deliver.controllers.kernel.impl.simple.PageEditorHelper;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.opensymphony.module.propertyset.PropertySet;
import com.opensymphony.module.propertyset.PropertySetManager;
public class ViewSiteNodePageComponentsAction extends InfoGlueAbstractAction
{
private final static Logger logger = Logger.getLogger(ViewSiteNodePageComponentsAction.class.getName());
private static final long serialVersionUID = 1L;
public static final String CATEGORY_TREE = "showCategoryTree";
public static final String CATEGORY_TREE_MULTIPLE = "showCategoryTreeForMultipleBinding";
private Integer repositoryId = null;
private Integer siteNodeId = null;
private Integer languageId = null;
private Integer contentId = null;
private String assetKey = null;
private Integer parentComponentId = null;
private Integer componentId = null;
private String componentName = null;
private Integer newComponentContentId = null;
private String propertyName = null;
private String path = null;
private String slotId = null;
private String specifyBaseTemplate = null;
private String url = null;
private Integer direction = null;
private Integer newPosition = null;
private boolean showSimple = false;
private Integer pageTemplateContentId;
private String showDecorated = "true";
private String slotPositionComponentId = null;
private Integer pagePartContentId = null;
private boolean hideComponentPropertiesOnLoad = false;
private Boolean regardAsCompatible = true;
//private Boolean recurseChildPages = false;
private List<String> erroneousSiteNodePaths = new LinkedList<String>();
private String changeMethod = "matchComponentId";
private String recursionMethod = "onlyThisPage";
LanguageVO masterLanguageVO = null;
private List repositories = null;
private String currentAction = null;
private Integer filterRepositoryId = null;
private String sortProperty = "name";
private String[] allowedContentTypeIds = null;
private String[] allowedComponentNames = null;
private String[] disallowedComponentNames = null;
private String[] allowedComponentGroupNames = null;
private boolean hasChangeComponentRecursivelyAccess;
private Boolean stateChanged = false;
// Constants are put in a map to make them accessible from the template
public static final Map<String, String> COMPONENT_CHANGE_METHODS = new HashMap<String, String>();
static {
COMPONENT_CHANGE_METHODS.put("matchId", "matchComponentId");
COMPONENT_CHANGE_METHODS.put("matchSlotname", "matchSlotName");
COMPONENT_CHANGE_METHODS.put("matchContentid", "matchComponentContentId");
}
public ViewSiteNodePageComponentsAction()
{
}
private void initialize() throws Exception
{
initialize(true);
}
private void initialize(boolean changeState) throws Exception
{
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionControllerProxy.getSiteNodeVersionControllerProxy().getACLatestActiveSiteNodeVersionVO(this.getInfoGluePrincipal(), this.siteNodeId);
logger.info("siteNodeVersionVO:" + siteNodeVersionVO.getId() + ":" + siteNodeVersionVO.getIsActive());
if(changeState && siteNodeVersionVO.getStateId().intValue() != SiteNodeVersionVO.WORKING_STATE.intValue())
{
List events = new ArrayList();
SiteNodeStateController.getController().changeState(siteNodeVersionVO.getId(), SiteNodeVersionVO.WORKING_STATE, "Edit on sight editing", true, this.getInfoGluePrincipal(), this.siteNodeId, events);
this.stateChanged = true;
}
Integer currentRepositoryId = SiteNodeController.getController().getSiteNodeVOWithId(this.siteNodeId).getRepositoryId();
this.masterLanguageVO = LanguageController.getController().getMasterLanguage(currentRepositoryId);
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(this.siteNodeId);
if(filterRepositoryId == null)
{
Map args = new HashMap();
args.put("globalKey", "infoglue");
PropertySet ps = PropertySetManager.getInstance("jdbc", args);
String defaultTemplateRepository = ps.getString("repository_" + currentRepositoryId + "_defaultTemplateRepository");
if(defaultTemplateRepository != null && !defaultTemplateRepository.equals(""))
filterRepositoryId = new Integer(defaultTemplateRepository);
else
filterRepositoryId = currentRepositoryId;
}
}
/**
* This method initializes the tree
*/
private void initializeTreeView(String currentAction) throws Exception
{
this.currentAction = currentAction;
this.repositories = RepositoryController.getController().getAuthorizedRepositoryVOList(this.getInfoGluePrincipal(), true);
if(this.repositoryId == null)
this.repositoryId = RepositoryController.getController().getFirstRepositoryVO().getRepositoryId();
}
/**
* This method which is the default one only serves to show a list
* of tasks to the user so he/she can select one to run.
*/
public String doExecute() throws Exception
{
initialize(false);
return "success";
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public String doListComponents() throws Exception
{
logger.info("queryString:" + this.getRequest().getQueryString());
initialize(false);
this.repositories = RepositoryController.getController().getAuthorizedRepositoryVOList(this.getInfoGluePrincipal(), true);
return "listComponents";
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public String doListFormComponents() throws Exception
{
logger.info("queryString:" + this.getRequest().getQueryString());
//initialize(false);
return "listFormComponents";
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public String doListComponentsForChange() throws Exception
{
logger.info("queryString:" + this.getRequest().getQueryString());
initialize(false);
this.hasChangeComponentRecursivelyAccess = this.hasAccessTo("ComponentEditor.ChangeComponentRecursively", true);
try
{
Element componentElement = getComponentElement(this.siteNodeId);
Integer contentId = new Integer(componentElement.getAttribute("contentId"));
ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentId);
LanguageVO languageVO = LanguageController.getController().getMasterLanguage(contentVO.getRepositoryId());
this.componentName = ContentController.getContentController().getContentAttribute(contentId, languageVO.getLanguageId(), "Name");
if (this.componentName == null || this.componentName.equals(""))
{
this.componentName = contentVO.getName();
}
}
catch (Exception ex)
{
logger.warn("An error occured when getting the to-be changed component's name. No name will be shown but the chnage component operation will continue. Message: " + ex.getMessage());
this.componentName = "--";
}
this.repositories = RepositoryController.getController().getAuthorizedRepositoryVOList(this.getInfoGluePrincipal(), true);
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component[@id=" + this.componentId + "]";
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
if(anl.getLength() > 0)
{
Element selectedComponent = (Element)anl.item(0);
String componentContentId = selectedComponent.getAttribute("contentId");
ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(componentContentId));
this.componentName = contentVO.getName();
}
return "listComponentsForChange";
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public String doListFormComponentsForChange() throws Exception
{
logger.info("queryString:" + this.getRequest().getQueryString());
//initialize(false);
//this.repositories = RepositoryController.getController().getAuthorizedRepositoryVOList(this.getInfoGluePrincipal(), true);
/*
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component[@id=" + this.componentId + "]";
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
if(anl.getLength() > 0)
{
Element selectedComponent = (Element)anl.item(0);
String componentContentId = selectedComponent.getAttribute("contentId");
ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(componentContentId));
this.componentName = contentVO.getName();
}
*/
return "listFormComponentsForChange";
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public String doListComponentsForPalette() throws Exception
{
initialize(false);
return "listComponentsForPalette";
}
/**
* This method shows the user a list of Contents.
*/
public String doShowContentTree() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showContentTree.action");
getHttpSession().setAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad", new Boolean(hideComponentPropertiesOnLoad));
return "showContentTree";
}
/**
* This method shows the user a list of Contents.
*/
public String doShowContentTreeV3() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showContentTreeV3.action");
getHttpSession().setAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad", new Boolean(hideComponentPropertiesOnLoad));
return "showContentTreeV3";
}
/**
* This method shows the user a interface to choose multiple contents.
*/
public String doShowContentTreeForMultipleBinding() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showContentTreeForMultipleBinding.action");
getHttpSession().setAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad", new Boolean(hideComponentPropertiesOnLoad));
return "showContentTreeForMultipleBinding";
}
/**
* This method shows the user a interface to choose multiple contents.
*/
public String doShowContentTreeForMultipleBindingV3() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showContentTreeForMultipleBindingV3.action");
getHttpSession().setAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad", new Boolean(hideComponentPropertiesOnLoad));
return "showContentTreeForMultipleBindingV3";
}
/**
* This method shows the user a interface to choose multiple contents.
*/
public String doShowContentTreeForMultipleAssetBinding() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showContentTreeForMultipleAssetBinding.action");
getHttpSession().setAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad", new Boolean(hideComponentPropertiesOnLoad));
return "showContentTreeForMultipleAssetBinding";
}
/**
* This method shows the user a list of SiteNodes.
*/
public String doShowStructureTree() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showStructureTree.action");
getHttpSession().setAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad", new Boolean(hideComponentPropertiesOnLoad));
return "showStructureTree";
}
/**
* This method shows the user a list of Contents.
*/
public String doShowStructureTreeV3() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showStructureTreeV3.action");
getHttpSession().setAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad", new Boolean(hideComponentPropertiesOnLoad));
return "showStructureTreeV3";
}
/**
* This method shows the user a interface to choose multiple sitenodes.
*/
public String doShowStructureTreeForMultipleBinding() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showStructureTreeForMultipleBinding.action");
getHttpSession().setAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad", new Boolean(hideComponentPropertiesOnLoad));
return "showStructureTreeForMultipleBinding";
}
/**
* This method shows the user a interface to choose multiple sitenodes.
*/
public String doShowStructureTreeForMultipleBindingV3() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showStructureTreeForMultipleBindingV3.action");
getHttpSession().setAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad", new Boolean(hideComponentPropertiesOnLoad));
return "showStructureTreeForMultipleBindingV3";
}
/**
* This method shows the user a list of Categories.
*/
public String doShowCategoryTree() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showCategoryTree.action");
return CATEGORY_TREE;
}
/**
* This method shows the user a list of Categories to chose multiple.
*/
public String doShowCategoryTreeForMultipleBinding() throws Exception
{
initialize(false);
initializeTreeView("ViewSiteNodePageComponents!showCategoryTreeForMultipleBinding.action");
return CATEGORY_TREE_MULTIPLE;
}
public List getRepositories()
{
return this.repositories;
}
public String getCurrentAction()
{
return this.currentAction;
}
public String getContentAttribute(Integer contentId, String attributeName) throws Exception
{
String attribute = "Undefined";
ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentId);
LanguageVO masterLanguageVO = LanguageController.getController().getMasterLanguage(SiteNodeController.getController().getSiteNodeVOWithId(siteNodeId).getRepositoryId());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), masterLanguageVO.getId());
attribute = ContentVersionController.getContentVersionController().getAttributeValue(contentVersionVO, attributeName, false);
return attribute;
}
/**
* This method adds a page template to a sitenode.
*/
public String doAddPageTemplate() throws Exception
{
logger.info("************************************************************");
logger.info("* ADDING PAGE TEMPLATE *");
logger.info("************************************************************");
logger.info("siteNodeId:" + this.siteNodeId);
logger.info("languageId:" + this.languageId);
logger.info("repositoryId:" + this.repositoryId);
logger.info("contentId:" + this.contentId);
logger.info("pageTemplateContentId:" + this.pageTemplateContentId);
logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
initialize();
Integer newComponentId = new Integer(0);
NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId);
if(this.pageTemplateContentId != null)
{
Integer languageId = LanguageController.getController().getMasterLanguage(this.repositoryId).getId();
ContentVersionVO pageTemplateContentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(this.pageTemplateContentId, languageId);
String componentXML = ContentVersionController.getContentVersionController().getAttributeValue(pageTemplateContentVersionVO.getId(), "ComponentStructure", false);
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component";
logger.info("componentXPath:" + componentXPath);
NodeList componentNodes = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
logger.info("Found componentNodes:" + componentNodes.getLength());
for(int i=0; i < componentNodes.getLength(); i++)
{
Element element = (Element)componentNodes.item(i);
String componentId = element.getAttribute("id");
String componentContentId = element.getAttribute("contentId");
logger.info("componentId:" + componentId);
logger.info("componentContentId:" + componentContentId);
ComponentController.getController().checkAndAutoCreateContents(this.siteNodeId, languageId, this.masterLanguageVO.getId(), this.assetKey, new Integer(componentId), document, new Integer(componentContentId), getInfoGluePrincipal());
componentXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
}
ContentVO pageMetaInfoContentVO = nodeDeliveryController.getBoundContent(this.getInfoGluePrincipal(), siteNodeId, languageId, true, "Meta information", DeliveryContext.getDeliveryContext());
//ContentVO templateContentVO = nodeDeliveryController.getBoundContent(siteNodeId, "Meta information");
//logger.info("templateContentVO:" + templateContentVO);
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(pageMetaInfoContentVO.getId(), this.masterLanguageVO.getId());
if(contentVersionVO == null)
{
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeId);
String versionValue = "<?xml version='1.0' encoding='UTF-8'?><article xmlns=\"x-schema:ArticleSchema.xml\"><attributes><Title><![CDATA[" + siteNodeVO.getName() + "]]></Title><NavigationTitle><![CDATA[" + siteNodeVO.getName() + "]]></NavigationTitle><NiceURIName><![CDATA[" + new VisualFormatter().replaceNiceURINonAsciiWithSpecifiedChars(siteNodeVO.getName(), CmsPropertyHandler.getNiceURIDefaultReplacementCharacter()) + "]]></NiceURIName><Description><![CDATA[" + siteNodeVO.getName() + "]]></Description><MetaInfo><![CDATA[" + siteNodeVO.getName() + "]]></MetaInfo><ComponentStructure><![CDATA[]]></ComponentStructure></attributes></article>";
contentVersionVO = new ContentVersionVO();
contentVersionVO.setVersionComment("Autogenerated version");
contentVersionVO.setVersionModifier(getInfoGluePrincipal().getName());
contentVersionVO.setVersionValue(versionValue);
contentVersionVO = ContentVersionController.getContentVersionController().create(pageMetaInfoContentVO.getId(), this.masterLanguageVO.getId(), contentVersionVO, null);
}
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", componentXML, new InfoGluePrincipal("ComponentEditor", "none", "none", "none", new ArrayList(), new ArrayList(), true, null), true);
}
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&activatedComponentId=" + newComponentId + "&showSimple=" + this.showSimple + "&stateChanged=" + this.stateChanged;
//this.getResponse().sendRedirect(url);
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
/**
* This method adds a component to the page.
*/
public String doAddComponent() throws Exception
{
logger.info("************************************************************");
logger.info("* ADDING COMPONENT *");
logger.info("************************************************************");
logger.info("siteNodeId:" + this.siteNodeId);
logger.info("languageId:" + this.languageId);
logger.info("contentId:" + this.contentId);
logger.info("queryString:" + this.getRequest().getQueryString());
logger.info("parentComponentId:" + this.parentComponentId);
logger.info("componentId:" + this.componentId);
logger.info("slotId:" + this.slotId);
logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
logger.info("hideComponentPropertiesOnLoad:" + this.hideComponentPropertiesOnLoad);
initialize();
logger.info("masterLanguageId:" + this.masterLanguageVO.getId());
Integer newComponentId = new Integer(0);
NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId);
if(this.specifyBaseTemplate.equalsIgnoreCase("true"))
{
String componentXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><components><component contentId=\"" + componentId + "\" id=\"" + newComponentId + "\" name=\"base\"><properties></properties><bindings></bindings><components></components></component></components>";
ContentVO templateContentVO = nodeDeliveryController.getBoundContent(this.getInfoGluePrincipal(), siteNodeId, languageId, true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(templateContentVO.getId(), this.masterLanguageVO.getId());
if(contentVersionVO == null)
{
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeId);
String versionValue = "<?xml version='1.0' encoding='UTF-8'?><article xmlns=\"x-schema:ArticleSchema.xml\"><attributes><Title><![CDATA[" + siteNodeVO.getName() + "]]></Title><NavigationTitle><![CDATA[" + siteNodeVO.getName() + "]]></NavigationTitle><NiceURIName><![CDATA[" + new VisualFormatter().replaceNiceURINonAsciiWithSpecifiedChars(siteNodeVO.getName(), CmsPropertyHandler.getNiceURIDefaultReplacementCharacter()) + "]]></NiceURIName><Description><![CDATA[" + siteNodeVO.getName() + "]]></Description><MetaInfo><![CDATA[" + siteNodeVO.getName() + "]]></MetaInfo><ComponentStructure><![CDATA[]]></ComponentStructure></attributes></article>";
contentVersionVO = new ContentVersionVO();
contentVersionVO.setVersionComment("Autogenerated version");
contentVersionVO.setVersionModifier(getInfoGluePrincipal().getName());
contentVersionVO.setVersionValue(versionValue);
contentVersionVO = ContentVersionController.getContentVersionController().create(templateContentVO.getId(), languageId, contentVersionVO, null);
}
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", componentXML, new InfoGluePrincipal("ComponentEditor", "none", "none", "none", new ArrayList(), new ArrayList(), true, null), true);
}
else
{
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component[@id=" + this.parentComponentId + "]/components";
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
if(anl.getLength() > 0)
{
Element component = (Element)anl.item(0);
String componentsXPath = "//component";
NodeList nodes = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentsXPath);
for(int i=0; i < nodes.getLength(); i++)
{
Element element = (Element)nodes.item(i);
if(new Integer(element.getAttribute("id")).intValue() > newComponentId.intValue())
newComponentId = new Integer(element.getAttribute("id"));
}
newComponentId = new Integer(newComponentId.intValue() + 1);
ContentVO templateContentVO = ContentController.getContentController().getContentVOWithId(this.componentId);
ContentTypeDefinitionVO contentTypeDefinitionVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(templateContentVO.getContentTypeDefinitionId());
boolean isPagePartReference = false;
if(contentTypeDefinitionVO.getName().equals("PagePartTemplate"))
isPagePartReference = true;
if(slotPositionComponentId != null && !slotPositionComponentId.equals(""))
{
NodeList childNodes = component.getChildNodes();
for(int i=0; i< childNodes.getLength(); i++)
{
Node node = childNodes.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE)
{
Element element = (Element)node;
if(element.getAttribute("id").equals(slotPositionComponentId))
{
logger.info("Inserting component before: " + element);
Element newComponent = addComponentElementBefore(component, element, new Integer(newComponentId.intValue()), this.slotId, this.componentId, isPagePartReference);
//component.insertBefore(component, element);
break;
}
}
}
}
else
{
Element newComponent = addComponentElement(component, new Integer(newComponentId.intValue()), this.slotId, this.componentId, isPagePartReference);
}
ComponentController.getController().checkAndAutoCreateContents(this.siteNodeId, languageId, this.masterLanguageVO.getId(), this.assetKey, newComponentId, document, templateContentVO.getId(), getInfoGluePrincipal());
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, this.masterLanguageVO.getId(), contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, this.masterLanguageVO.getId(), true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
logger.info("Updating ComponentStructure on " + contentVersionVO.getContentVersionId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
}
}
logger.info("newComponentId:" + newComponentId);
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + newComponentId + "&activatedComponentId=" + newComponentId + "&componentContentId=" + this.componentId + "&showSimple=" + this.showSimple + "&stateChanged=" + this.stateChanged + "&hideComponentPropertiesOnLoad=" + this.hideComponentPropertiesOnLoad;
//logger.info("this.url:" + this.url);
//this.getResponse().sendRedirect(url);
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
/**
* This method adds a component to the page.
*/
public String doAddOrReplaceComponent() throws Exception
{
logger.info("************************************************************");
logger.info("* ADDING OR REPLACING COMPONENT *");
logger.info("************************************************************");
logger.info("siteNodeId:" + this.siteNodeId);
logger.info("languageId:" + this.languageId);
logger.info("contentId:" + this.contentId);
logger.info("queryString:" + this.getRequest().getQueryString());
logger.info("parentComponentId:" + this.parentComponentId);
//logger.info("componentId:" + this.componentId);
logger.info("slotId:" + this.slotId);
logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
logger.info("pagePartContentId:" + this.pagePartContentId);
logger.info("hideComponentPropertiesOnLoad:" + this.hideComponentPropertiesOnLoad);
try
{
initialize();
logger.info("masterLanguageId:" + this.masterLanguageVO.getId());
Integer newComponentId = new Integer(0);
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component[@id=" + this.parentComponentId + "]";
Node componentNode = org.apache.xpath.XPathAPI.selectSingleNode(document.getDocumentElement(), componentXPath);
if(componentNode != null)
{
//Element componentElement = (Element)componentNode;
String componentsXPath = "//component";
NodeList nodes = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentsXPath);
for(int i=0; i < nodes.getLength(); i++)
{
Element element = (Element)nodes.item(i);
if(new Integer(element.getAttribute("id")).intValue() > newComponentId.intValue())
newComponentId = new Integer(element.getAttribute("id"));
}
newComponentId = new Integer(newComponentId.intValue() + 1);
NodeList childNodes = componentNode.getChildNodes();
logger.info("childNodes:" + childNodes.getLength());
Node child = componentNode.getFirstChild();
while (child != null)
{
logger.info("Removing:" + child);
componentNode.removeChild(child);
child = componentNode.getFirstChild();
}
logger.info("childNodes:" + childNodes.getLength());
//StringBuffer sb = new StringBuffer();
//XMLHelper.serializeDom(componentNode, sb);
//logger.info("SB:" + sb);
if(this.pagePartContentId != null)
{
ContentVersionVO pagePartContentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(this.pagePartContentId, this.masterLanguageVO.getId());
String componentStructure = ContentVersionController.getContentVersionController().getAttributeValue(pagePartContentVersionVO.getId(), "ComponentStructure", false);
componentStructure = componentStructure.replaceAll(" isInherited=\"true\"", "");
componentStructure = componentStructure.replaceAll(" pagePartTemplateContentId=\"-1\"", "");
componentStructure = componentStructure.replaceAll("<property name=\"pagePartContentId\" path=\".*?\"></property>", "");
componentStructure = componentStructure.replaceAll("<property name=\"pagePartContentId\" path=\".*?\"/>", "");
componentStructure = componentStructure.replaceAll("<properties>", "<properties><property name=\"pagePartContentId\" path=\"" + pagePartContentId + "\"/>");
logger.info("componentStructure:" + componentStructure);
Document componentStructureDocument = XMLHelper.readDocumentFromByteArray(componentStructure.getBytes("UTF-8"));
Node rootNode = componentStructureDocument.getDocumentElement();
componentNode.appendChild(document.importNode(rootNode, true));
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, this.masterLanguageVO.getId(), contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, this.masterLanguageVO.getId(), true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
}
}
logger.info("newComponentId:" + newComponentId);
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + newComponentId + "&activatedComponentId=" + newComponentId + "&componentContentId=" + this.componentId + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged + "&hideComponentPropertiesOnLoad=" + this.hideComponentPropertiesOnLoad;
//this.getResponse().sendRedirect(url);
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
catch (Exception e)
{
logger.error("Error adding/changing component:" + e.getMessage(), e);
return ERROR;
}
}
/**
* This method adds a component to the page.
*/
public String doMoveComponentToSlot() throws Exception
{
logger.info("************************************************************");
logger.info("* MOVING COMPONENT TO ANOTHER SLOT *");
logger.info("************************************************************");
logger.info("siteNodeId:" + this.siteNodeId);
logger.info("languageId:" + this.languageId);
logger.info("contentId:" + this.contentId);
logger.info("queryString:" + this.getRequest().getQueryString());
logger.info("parentComponentId:" + this.parentComponentId);
logger.info("componentId:" + this.componentId);
logger.info("slotId:" + this.slotId);
logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
logger.info("hideComponentPropertiesOnLoad:" + this.hideComponentPropertiesOnLoad);
initialize();
logger.info("masterLanguageId:" + this.masterLanguageVO.getId());
ContentVO componentContentVO = null;
if(this.specifyBaseTemplate.equalsIgnoreCase("true"))
{
throw new SystemException("Not possible to move component to base slot");
}
else
{
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component[@id=" + this.componentId + "]";
String parentComponentXPath = "//component[@id=" + this.parentComponentId + "]/components";
logger.info("componentXPath:" + componentXPath);
logger.info("parentComponentXPath:" + parentComponentXPath);
Node componentNode = org.apache.xpath.XPathAPI.selectSingleNode(document.getDocumentElement(), componentXPath);
logger.info("Found componentNode:" + componentNode);
Node parentComponentComponentsNode = org.apache.xpath.XPathAPI.selectSingleNode(document.getDocumentElement(), parentComponentXPath);
logger.info("Found parentComponentComponentsNode:" + parentComponentComponentsNode);
if(componentNode != null && parentComponentComponentsNode != null)
{
Element component = (Element)componentNode;
Element currentParentElement = (Element)componentNode.getParentNode();
Element parentComponentComponentsElement = (Element)parentComponentComponentsNode;
Element parentComponentElement = (Element)parentComponentComponentsNode.getParentNode();
Integer componentContentId = new Integer(component.getAttribute("contentId"));
Integer parentComponentContentId = new Integer(parentComponentElement.getAttribute("contentId"));
logger.info("componentContentId:" + componentContentId);
logger.info("parentComponentContentId:" + parentComponentContentId);
componentContentVO = ContentController.getContentController().getContentVOWithId(componentContentId);
PageEditorHelper peh = new PageEditorHelper();
List<Slot> slots = peh.getSlots(parentComponentContentId, languageId, this.getInfoGluePrincipal());
boolean allowed = true;
Iterator<Slot> slotsIterator = slots.iterator();
while(slotsIterator.hasNext())
{
Slot slot = slotsIterator.next();
logger.info(slot.getId() + "=" + slotId);
if(slot.getId().equals(slotId))
{
String[] allowedComponentNames = slot.getAllowedComponentsArray();
String[] disallowedComponentNames = slot.getDisallowedComponentsArray();
if(allowedComponentNames != null && allowedComponentNames.length > 0)
{
allowed = false;
for(int i = 0; i < allowedComponentNames.length; i++)
{
if(allowedComponentNames[i].equalsIgnoreCase(componentContentVO.getName()))
allowed = true;
}
}
if(disallowedComponentNames != null && disallowedComponentNames.length > 0)
{
for(int i = 0; i < disallowedComponentNames.length; i++)
{
if(disallowedComponentNames[i].equalsIgnoreCase(componentContentVO.getName()))
allowed = false;
}
}
}
break;
}
logger.info("Should the component:" + componentContentVO + " be allowed to be put in " + slotId + ":" + allowed);
logger.info("currentParentElement:" + currentParentElement.getNodeName() + ":" + currentParentElement.hashCode());
logger.info("parentComponentComponentsElement:" + parentComponentComponentsElement.getNodeName() + ":" + parentComponentComponentsElement.hashCode());
logger.info("slotPositionComponentId:" + slotPositionComponentId);
if((component.getParentNode() == parentComponentComponentsElement && slotId.equalsIgnoreCase(component.getAttribute("name"))))
{
logger.info("Yes...");
component.getParentNode().removeChild(component);
component.setAttribute("name", slotId);
logger.info("slotPositionComponentId:" + slotPositionComponentId);
if(slotPositionComponentId != null && !slotPositionComponentId.equals(""))
{
logger.info("Moving component to slot: " + slotPositionComponentId);
Element afterElement = null;
NodeList childNodes = parentComponentComponentsElement.getChildNodes();
for(int i=0; i< childNodes.getLength(); i++)
{
Node node = childNodes.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE)
{
Element element = (Element)node;
if(element.getAttribute("id").equals(slotPositionComponentId))
{
afterElement = element;
break;
}
}
}
if(afterElement != null)
{
logger.info("Inserting component before: " + afterElement);
parentComponentComponentsElement.insertBefore(component, afterElement);
}
else
{
parentComponentComponentsElement.appendChild(component);
}
}
else
{
logger.info("Appending component...");
parentComponentComponentsElement.appendChild(component);
}
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, this.masterLanguageVO.getId(), contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, this.masterLanguageVO.getId(), true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + componentId + "&componentContentId=" + componentContentVO.getId() + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged + "&hideComponentPropertiesOnLoad=" + this.hideComponentPropertiesOnLoad;
}
else if(allowed && (component.getParentNode() != parentComponentComponentsElement || !slotId.equalsIgnoreCase(component.getAttribute("name"))))
{
logger.info("Moving component...");
component.getParentNode().removeChild(component);
component.setAttribute("name", slotId);
if(slotPositionComponentId != null && !slotPositionComponentId.equals(""))
{
NodeList childNodes = parentComponentComponentsElement.getChildNodes();
for(int i=0; i< childNodes.getLength(); i++)
{
Node node = childNodes.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE)
{
Element element = (Element)node;
if(element.getAttribute("id").equals(slotPositionComponentId))
{
logger.info("Inserting component before: " + element);
parentComponentComponentsElement.insertBefore(component, element);
break;
}
}
}
}
else
{
parentComponentComponentsElement.appendChild(component);
}
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, this.masterLanguageVO.getId(), contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, this.masterLanguageVO.getId(), true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + componentId + "&componentContentId=" + componentContentVO.getId() + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged;
}
else
{
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged;
}
}
}
//this.getResponse().sendRedirect(url);
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
/**
* This method moves the component up a step if possible within the same slot.
*/
public String doMoveComponent() throws Exception
{
initialize();
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
//logger.info("componentXML:" + componentXML);
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component[@id=" + this.componentId + "]";
logger.info("componentXPath:" + componentXPath);
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
if(anl.getLength() > 0)
{
Element component = (Element)anl.item(0);
String name = component.getAttribute("name");
logger.info("id: " + component.getAttribute("id") + " - name:" + name);
//logger.info(XMLHelper.serializeDom(component, new StringBuffer()));
Node parentNode = component.getParentNode();
boolean hasChanged = false;
if(this.newPosition != null)
{
Node previousNode = null;
List<Node> siblings = new ArrayList<Node>();
NodeList nl = parentNode.getChildNodes();
Element childElement = null;
for(int i=0; i<nl.getLength(); i++)
{
if (nl.item(i).getNodeType() == Node.ELEMENT_NODE)
{
childElement = (Element)nl.item(i);
logger.info("Child:" + childElement.getAttribute("id") + ":" + childElement.getAttribute("name"));
if(childElement.getAttribute("name").equalsIgnoreCase(name) && childElement != component)
{
siblings.add(childElement);
}
}
}
logger.info("this.newPosition:" + this.newPosition);
logger.info("siblings:" + siblings.size());
if(siblings.size() > this.newPosition)
{
previousNode = siblings.get(this.newPosition);
if(previousNode != component)
{
logger.info("parentNode:" + ((Element)parentNode).getAttribute("id") + ":" + ((Element)parentNode).getAttribute("name"));
if(previousNode != null)
{
logger.info("previousNode:" + ((Element)previousNode).getAttribute("id") + ":" + ((Element)previousNode).getAttribute("name"));
parentNode.removeChild(component);
parentNode.insertBefore(component, previousNode);
hasChanged = true;
}
}
else
logger.info("Cannot move to same place...");
}
else if(siblings.size() == this.newPosition)
{
if(previousNode != component)
{
logger.info("parentNode:" + ((Element)parentNode).getAttribute("id") + ":" + ((Element)parentNode).getAttribute("name"));
parentNode.removeChild(component);
parentNode.appendChild(component);
hasChanged = true;
}
else
logger.info("Cannot move to same place...");
}
}
else if(this.direction != null && this.direction.intValue() == 0) //Up
{
Node previousNode = component.getPreviousSibling();
while(previousNode != null && previousNode.getNodeType() != Node.ELEMENT_NODE)
{
previousNode = previousNode.getPreviousSibling();
//break;
}
Element element = ((Element)previousNode);
while(element != null && !element.getAttribute("name").equalsIgnoreCase(name))
{
previousNode = previousNode.getPreviousSibling();
while(previousNode != null && previousNode.getNodeType() != Node.ELEMENT_NODE)
{
previousNode = previousNode.getPreviousSibling();
//break;
}
element = ((Element)previousNode);
}
if(previousNode != null)
{
parentNode.removeChild(component);
parentNode.insertBefore(component, previousNode);
hasChanged = true;
}
}
else if(this.direction != null && this.direction.intValue() == 1) //Down
{
Node nextNode = component.getNextSibling();
while(nextNode != null && nextNode.getNodeType() != Node.ELEMENT_NODE)
{
nextNode = nextNode.getNextSibling();
break;
}
Element element = ((Element)nextNode);
while(element != null && !element.getAttribute("name").equalsIgnoreCase(name))
{
nextNode = nextNode.getNextSibling();
element = ((Element)nextNode);
}
if(nextNode != null)
nextNode = nextNode.getNextSibling();
if(nextNode != null)
{
parentNode.removeChild(component);
parentNode.insertBefore(component, nextNode);
hasChanged = true;
}
else
{
parentNode.removeChild(component);
parentNode.appendChild(component);
hasChanged = true;
}
}
if(hasChanged)
{
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
//logger.info("modifiedXML:" + modifiedXML);
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, this.masterLanguageVO.getId(), true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
}
}
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + this.componentId + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged + "&hideComponentPropertiesOnLoad=" + this.hideComponentPropertiesOnLoad;
//this.getResponse().sendRedirect(url);
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
/**
* This method updates the given properties with new values.
*/
public String doUpdateComponentProperty() throws Exception
{
if(logger.isInfoEnabled())
{
logger.info("************************************************************");
logger.info("* doUpdateComponentProperty *");
logger.info("************************************************************");
logger.info("siteNodeId:" + this.siteNodeId);
logger.info("languageId:" + this.languageId);
logger.info("contentId:" + this.contentId);
logger.info("componentId:" + this.componentId);
logger.info("slotId:" + this.slotId);
logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
logger.info("hideComponentPropertiesOnLoad:" + this.hideComponentPropertiesOnLoad);
}
try
{
initialize();
Locale locale = LanguageController.getController().getLocaleWithId(languageId);
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
//logger.info("componentXML:" + componentXML);
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, languageId, true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String characterEncoding = this.getRequest().getCharacterEncoding();
characterEncoding= this.getResponse().getCharacterEncoding();
String componentContentId = null;
String propertyName = this.getRequest().getParameter("propertyName");
String propertyValue = "";
if(propertyName != null && !propertyName.equals(""))
{
String[] propertyValues = this.getRequest().getParameterValues(propertyName);
if(propertyValues != null && propertyValues.length == 1)
{
propertyValue = propertyValues[0];
}
else if(propertyValues != null)
{
StringBuffer sb = new StringBuffer();
for(int i=0; i<propertyValues.length;i++)
{
if(i > 0)
sb.append(",");
sb.append(propertyValues[i]);
}
propertyValue = sb.toString();
}
logger.info("propertyName:" + propertyName);
logger.info("propertyValue:" + propertyValue);
String separator = System.getProperty("line.separator");
propertyValue = propertyValue.replaceAll(separator, "igbr");
logger.info("propertyValue1:" + propertyValue);
propertyValue = PageEditorHelper.untransformAttribute(propertyValue);
logger.info("propertyValue2:" + propertyValue);
boolean keepExisting = new Boolean (this.getRequest().getParameter("keepExisting"));
if(propertyValue != null && !propertyValue.equals("") && !propertyValue.equalsIgnoreCase("undefined"))
{
String componentPropertyXPath = "//component[@id=" + this.componentId + "]/properties/property[@name='" + propertyName + "']";
//logger.info("componentPropertyXPath:" + componentPropertyXPath);
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentPropertyXPath);
if(anl.getLength() == 0)
{
String componentXPath = "//component[@id=" + this.componentId + "]/properties";
//logger.info("componentXPath:" + componentXPath);
NodeList componentNodeList = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
if(componentNodeList.getLength() > 0)
{
Element componentProperties = (Element)componentNodeList.item(0);
addPropertyElement(componentProperties, propertyName, propertyValue, "textfield", locale, keepExisting);
anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentPropertyXPath);
}
}
logger.info("anl:" + anl);
if(anl.getLength() > 0)
{
Element component = (Element)anl.item(0);
componentContentId = ((Element)component.getParentNode().getParentNode()).getAttribute("contentId");
ContentVO componentContentVO = ContentController.getContentController().getContentVOWithId(new Integer(componentContentId));
LanguageVO componentMasterLanguageVO = LanguageController.getController().getMasterLanguage(componentContentVO.getRepositoryId());
ContentVersionVO cv = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(new Integer(componentContentId), componentMasterLanguageVO.getId());
String componentProperties = ContentVersionController.getContentVersionController().getAttributeValue(cv, "ComponentProperties", false);
List componentPropertiesList = ComponentPropertyDefinitionController.getController().parseComponentPropertyDefinitions(componentProperties);
Iterator componentPropertiesListIterator = componentPropertiesList.iterator();
boolean allowLanguageVariations = true;
while(componentPropertiesListIterator.hasNext())
{
ComponentPropertyDefinition componentPropertyDefinition = (ComponentPropertyDefinition)componentPropertiesListIterator.next();
if(componentPropertyDefinition.getName().equalsIgnoreCase(propertyName))
{
allowLanguageVariations = componentPropertyDefinition.getAllowLanguageVariations();
break;
}
}
if(allowLanguageVariations)
{
logger.info("Setting a propertyValue to path_" + locale.getLanguage() + ":" + path);
component.setAttribute("path_" + locale.getLanguage(), propertyValue);
logger.info("Setting 'path_" + locale.getLanguage() + ":" + propertyValue);
}
else
{
logger.info("Setting a propertyValue to path:" + path);
component.setAttribute("path", propertyValue);
logger.info("Setting 'path:" + propertyValue);
component.removeAttribute("path_" + locale.getLanguage());
}
}
else
{
logger.warn("No property could be updated... must be wrong.");
}
}
}
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
logger.info("contentVersionVO:" + contentVersionVO.getContentVersionId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
String returnStatus = this.getRequest().getParameter("returnStatus");
if(returnStatus != null && returnStatus.equalsIgnoreCase("true"))
{
this.getResponse().setContentType("text/html");
this.getResponse().getWriter().println("<html><body>Property " + propertyName + " was set to " + propertyValue + "</body></html>");
}
else
{
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + this.componentId + (!hideComponentPropertiesOnLoad ? "&activatedComponentId=" + this.componentId : "") + "&componentContentId=" + componentContentId + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged + "&hideComponentPropertiesOnLoad=" + this.hideComponentPropertiesOnLoad;
//this.getResponse().sendRedirect(url);
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
}
return NONE;
}
catch(Exception e)
{
logger.error("Error setting property:" + e.getMessage(), e);
return ERROR;
}
}
/**
* This method updates the given properties with new values.
*/
public String doUpdateComponentProperties() throws Exception
{
if(logger.isInfoEnabled())
{
logger.info("************************************************************");
logger.info("* doUpdateComponentProperties *");
logger.info("************************************************************");
logger.info("siteNodeId:" + this.siteNodeId);
logger.info("languageId:" + this.languageId);
logger.info("contentId:" + this.contentId);
logger.info("componentId:" + this.componentId);
logger.info("slotId:" + this.slotId);
logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
logger.info("hideComponentPropertiesOnLoad:" + this.hideComponentPropertiesOnLoad);
}
try
{
initialize();
Iterator parameterNames = this.getRequest().getParameterMap().keySet().iterator();
while(parameterNames.hasNext())
{
String name = (String)parameterNames.next();
String value = (String)this.getRequest().getParameter(name);
logger.info(name + "=" + value);
}
Integer siteNodeId = new Integer(this.getRequest().getParameter("siteNodeId"));
Integer languageId = new Integer(this.getRequest().getParameter("languageId"));
Locale locale = LanguageController.getController().getLocaleWithId(languageId);
String entity = this.getRequest().getParameter("entity");
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
//logger.info("componentXML:" + componentXML);
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, languageId, true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String characterEncoding= this.getRequest().getCharacterEncoding();
characterEncoding= this.getResponse().getCharacterEncoding();
logger.info("siteNodeId:" + siteNodeId);
logger.info("languageId:" + languageId);
logger.info("entity:" + entity);
String componentContentId = null;
int propertyIndex = 0;
String propertyName = this.getRequest().getParameter(propertyIndex + "_propertyName");
boolean keepExisting = new Boolean (this.getRequest().getParameter("keepExisting"));
while(propertyName != null && !propertyName.equals(""))
{
String[] propertyValues = this.getRequest().getParameterValues(propertyName);
String propertyValue = "";
if(propertyValues != null && propertyValues.length == 1)
propertyValue = propertyValues[0];
else if(propertyValues != null)
{
StringBuffer sb = new StringBuffer();
for(int i=0; i<propertyValues.length;i++)
{
if(i > 0)
sb.append(",");
sb.append(propertyValues[i]);
}
propertyValue = sb.toString();
}
logger.info("propertyName:" + propertyName);
logger.info("propertyValue:" + propertyValue);
String separator = System.getProperty("line.separator");
propertyValue = propertyValue.replaceAll(separator, "igbr");
logger.info("propertyValue1:" + propertyValue);
propertyValue = PageEditorHelper.untransformAttribute(propertyValue);
logger.info("propertyValue2:" + propertyValue);
propertyValue = propertyValue.replaceAll("\"", """);
if(propertyValue != null && !propertyValue.equals("") && !propertyValue.equalsIgnoreCase("undefined"))
{
String componentPropertyXPath = "//component[@id=" + this.componentId + "]/properties/property[@name='" + propertyName + "']";
//logger.info("componentPropertyXPath:" + componentPropertyXPath);
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentPropertyXPath);
if(anl.getLength() == 0)
{
String componentXPath = "//component[@id=" + this.componentId + "]/properties";
//logger.info("componentXPath:" + componentXPath);
NodeList componentNodeList = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
if(componentNodeList.getLength() > 0)
{
Element componentProperties = (Element)componentNodeList.item(0);
addPropertyElement(componentProperties, propertyName, propertyValue, "textfield", locale, keepExisting);
anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentPropertyXPath);
}
}
logger.info("anl:" + anl);
if(anl.getLength() > 0)
{
Element component = (Element)anl.item(0);
componentContentId = ((Element)component.getParentNode().getParentNode()).getAttribute("contentId");
ContentVO componentContentVO = ContentController.getContentController().getContentVOWithId(new Integer(componentContentId));
LanguageVO componentMasterLanguageVO = LanguageController.getController().getMasterLanguage(componentContentVO.getRepositoryId());
ContentVersionVO cv = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(new Integer(componentContentId), componentMasterLanguageVO.getId());
String componentProperties = ContentVersionController.getContentVersionController().getAttributeValue(cv, "ComponentProperties", false);
List componentPropertiesList = ComponentPropertyDefinitionController.getController().parseComponentPropertyDefinitions(componentProperties);
Iterator componentPropertiesListIterator = componentPropertiesList.iterator();
boolean allowLanguageVariations = true;
while(componentPropertiesListIterator.hasNext())
{
ComponentPropertyDefinition componentPropertyDefinition = (ComponentPropertyDefinition)componentPropertiesListIterator.next();
if(componentPropertyDefinition.getName().equalsIgnoreCase(propertyName))
{
allowLanguageVariations = componentPropertyDefinition.getAllowLanguageVariations();
break;
}
}
if(allowLanguageVariations)
{
component.setAttribute("path_" + locale.getLanguage(), propertyValue);
logger.info("Setting 'path_" + locale.getLanguage() + ":" + propertyValue);
}
else
{
component.setAttribute("path", propertyValue);
logger.info("Setting 'path:" + propertyValue);
component.removeAttribute("path_" + locale.getLanguage());
}
}
else
{
logger.warn("No property could be updated... must be wrong.");
}
}
propertyIndex++;
propertyName = this.getRequest().getParameter(propertyIndex + "_propertyName");
}
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
logger.info("contentVersionVO:" + contentVersionVO.getContentVersionId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + this.componentId + (!hideComponentPropertiesOnLoad ? "&activatedComponentId=" + this.componentId : "") + "&componentContentId=" + componentContentId + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged + "&hideComponentPropertiesOnLoad=" + this.hideComponentPropertiesOnLoad;
//this.getResponse().sendRedirect(url);
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
catch(Exception e)
{
logger.error("Error setting property:" + e.getMessage(), e);
return ERROR;
}
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public String doDeleteComponent() throws Exception
{
initialize();
//logger.info("************************************************************");
//logger.info("* DELETING COMPONENT *");
//logger.info("************************************************************");
//logger.info("siteNodeId:" + this.siteNodeId);
//logger.info("languageId:" + this.languageId);
//logger.info("contentId:" + this.contentId);
//logger.info("componentId:" + this.componentId);
//logger.info("slotId:" + this.slotId);
//logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
logger.info("doDeleteComponent:" + this.getRequest().getQueryString());
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component[@id=" + this.componentId + "]";
//logger.info("componentXPath:" + componentXPath);
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
//logger.info("anl:" + anl.getLength());
if(anl.getLength() > 0)
{
Element component = (Element)anl.item(0);
component.getParentNode().removeChild(component);
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, languageId, true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
}
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged;
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public String doChangeComponent() throws Exception
{
initialize();
//logger.info("************************************************************");
//logger.info("* DELETING COMPONENT *");
//logger.info("************************************************************");
//logger.info("siteNodeId:" + this.siteNodeId);
//logger.info("languageId:" + this.languageId);
//logger.info("contentId:" + this.contentId);
//logger.info("componentId:" + this.componentId);
//logger.info("slotId:" + this.slotId);
//logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
logger.info("changeMethod:" + this.changeMethod);
logger.info("recursionMethod:" + this.recursionMethod);
logger.info("componentId:" + this.componentId);
logger.info("doChangeComponent:" + this.getRequest().getQueryString());
logger.info("masterLanguageId:" + this.masterLanguageVO.getId());
logger.info("hideComponentPropertiesOnLoad:" + this.hideComponentPropertiesOnLoad);
this.hasChangeComponentRecursivelyAccess = this.hasAccessTo("ComponentEditor.ChangeComponentRecursively", true);
try
{
Integer newComponentId = this.componentId;
Integer startNodeId = this.siteNodeId;
boolean recurseChildPages = false;
if(this.recursionMethod.equals("thisAndSubpages"))
recurseChildPages = true;
else if(this.recursionMethod.equals("theEntireRepository"))
{
recurseChildPages = true;
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(startNodeId);
startNodeId = SiteNodeController.getController().getRootSiteNodeVO(siteNodeVO.getRepositoryId()).getId();
}
/* The UI should not make it possible to submit requests that result in these kinds of access violations
* but we still have to protect from hacking attempts. */
if (this.changeMethod.equals(getchangeMethods().get("matchingSlotname")) && !this.hasChangeComponentRecursivelyAccess)
{
throw new SystemException("You are not allowed to perform this type of component change");
}
if (recurseChildPages && !this.hasChangeComponentRecursivelyAccess)
{
throw new SystemException("You are not allowed to perform recursive component changes");
}
if (!getchangeMethods().values().contains(this.changeMethod))
{
throw new SystemException("Unknown change method. The method was: " + this.changeMethod);
}
changeComponent(startNodeId, recurseChildPages, this.regardAsCompatible, this.changeMethod);
logger.warn("erroneousSiteNodePaths:" + erroneousSiteNodePaths);
logger.info("newComponentId:" + newComponentId);
if (erroneousSiteNodePaths.size() > 0)
{
return "errorChangeComponent";
}
else
{
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + this.componentId + "&activatedComponentId=" + newComponentId + "&showSimple=" + this.showSimple + "&hideComponentPropertiesOnLoad=" + this.hideComponentPropertiesOnLoad;
//this.getResponse().sendRedirect(url);
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
}
catch (Exception e)
{
e.printStackTrace();
return "errorChangeComponent";
}
}
private int getNumberOfComponentsInSlot(Document document, String slotName) throws SystemException
{
try
{
String xPath = "//component[@name='" + slotName + "']";
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), xPath);
return anl.getLength();
}
catch (TransformerException ex)
{
throw new SystemException("Exception when counting components in slot. Message: " + ex.getMessage());
}
}
private Element getComponentElement(Integer siteNodeId) throws SystemException, Exception
{
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
logger.info("Find slot name. componentXML:" + componentXML);
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component[@id=" + this.componentId + "]";
Node node = org.apache.xpath.XPathAPI.selectSingleNode(document.getDocumentElement(), componentXPath);
return (Element)node;
}
/**
* Retrieves the change method matching the given change method key and compares it to the
* current {@link #changeMethod}.
* @return true if the the current changeMethod value equals the change method for the given change method key
* @throws NullPointerException If there is no change method for the given key.
*/
private boolean isChangeMethod(String changeMethodKey)
{
return COMPONENT_CHANGE_METHODS.get(changeMethodKey).equals(this.changeMethod);
}
private void changeComponent(Integer siteNodeId, Boolean recursive, Boolean regardAsCompatible, String changeMethod) throws Exception
{
Element selectedComponent = getComponentElement(this.siteNodeId);
if(selectedComponent != null && this.newComponentContentId != null)
{
String slotName = selectedComponent.getAttribute("name");
String componentContentId = selectedComponent.getAttribute("contentId");
if (slotName == null || slotName.trim().equals(""))
{
throw new SystemException("Missing slot name when changing component");
}
List<Integer> erroneousSiteNodes = changeComponent(siteNodeId, slotName, new Integer(componentContentId), recursive, regardAsCompatible, changeMethod);
if (erroneousSiteNodes.size() > 0)
{
this.erroneousSiteNodePaths = SiteNodeController.getController().getErroneousSiteNodeNames(erroneousSiteNodes);
}
}
else
{
logger.warn("Could not find component in page. Page: " + siteNodeId);
throw new SystemException("Could not find the component the user requested to replace in the page.");
}
}
private List<Integer> changeComponent(Integer siteNodeId, String slotName, Integer componentContentId, Boolean recursive, Boolean regardAsCompatible, String changeMethod)
{
try
{
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
logger.info("componentXML:" + componentXML);
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
if (isChangeMethod("matchId"))
{
if (recursive)
{
logger.info("Changing component with recursion on ID. SiteNodeId: " + siteNodeId + ". Component contentId: " + componentContentId);
String xpath = "//component[@name='" + slotName + "' and @contentId='" + componentContentId + "']";
Element componentToReplace = (Element)org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), xpath).item(0);
if (componentToReplace == null)
{
logger.info("No component matched the xpath expression. SiteNode.id: " + siteNodeId + ". Xpath: " + xpath);
}
else
{
performComponentChange(componentToReplace, slotName, regardAsCompatible);
}
}
else
{
logger.info("Changing component without recursion on ID. SiteNodeId: " + siteNodeId + ". Component contentId: " + componentContentId);
String xpath = "//component[@id=" + this.componentId + "]";
Element componentToReplace = (Element)org.apache.xpath.XPathAPI.selectSingleNode(document.getDocumentElement(), xpath);
if (componentToReplace == null)
{
logger.info("No component matched the xpath expression. SiteNode.id: " + siteNodeId + ". Xpath: " + xpath);
}
else
{
performComponentChange(componentToReplace, slotName, regardAsCompatible);
}
}
}
else if (isChangeMethod("matchSlotname"))
{
logger.info("Changing component on slotname. SiteNodeId: " + siteNodeId + ". Component contentId: " + componentContentId);
String xpath = "//component[@name='" + slotName + "']";
Element componentToReplace = (Element)org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), xpath).item(0);
if (componentToReplace == null)
{
logger.info("No component matched the xpath expression. SiteNode.id: " + siteNodeId + ". Xpath: " + xpath);
}
else
{
// Safeguard for the dangerous change-case where pages could be broken if the change was made
if (getNumberOfComponentsInSlot(document, slotName) != 1)
{
logger.info("Will not change component in SiteNode because the slot contains more than one component. SiteNode.id: " + siteNodeId);
return Collections.singletonList(siteNodeId);
}
else
{
performComponentChange(componentToReplace, slotName, regardAsCompatible);
}
}
}
else if(changeMethod.equals("matchComponentContentId"))
{
logger.info("Changing component on contentId. SiteNodeId: " + siteNodeId + ". Component contentId: " + componentContentId);
NodeList componentsToReplace = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), "//component[@contentId='" + componentContentId + "']");
for(int k=0; k<componentsToReplace.getLength(); k++)
{
Element componentToReplace = (Element)componentsToReplace.item(k);
performComponentChange(componentToReplace, slotName, regardAsCompatible);
}
}
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
logger.info("modifiedXML:" + modifiedXML);
ContentVO boundContentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, this.masterLanguageVO.getId(), contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, this.masterLanguageVO.getId(), true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(boundContentVO.getId(), this.masterLanguageVO.getId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
List<Integer> erroneousSiteNodes = new LinkedList<Integer>();
if (recursive)
{
List<SiteNodeVO> childSiteNodeVOList = SiteNodeController.getController().getSiteNodeChildrenVOList(siteNodeId);
for(SiteNodeVO childSiteNodeVO : childSiteNodeVOList)
{
erroneousSiteNodes.addAll(changeComponent(childSiteNodeVO.getId(), slotName, componentContentId, recursive, regardAsCompatible, changeMethod));
}
}
return erroneousSiteNodes;
}
catch (Exception ex)
{
if (ex instanceof NullPointerException)
{
logger.warn("Error when changing component in SiteNode.", ex);
}
else
{
logger.warn("Error when changing component in SiteNode. Message: " + ex.getMessage());
}
return Collections.singletonList(siteNodeId);
}
}
private void performComponentChange(Element componentToReplace, String slotName, Boolean regardAsCompatible) throws SystemException, Bug, Exception, TransformerException
{
ContentVO contentVO = ContentController.getContentController().getContentVOWithId(this.newComponentContentId);
ContentTypeDefinitionVO contentTypeDefinitionVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(contentVO.getContentTypeDefinitionId());
boolean isPagePartReference = false;
if(contentTypeDefinitionVO.getName().equals("PagePartTemplate"))
isPagePartReference = true;
ContentVersionVO newComponentContentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(this.newComponentContentId, this.masterLanguageVO.getId());
if(newComponentContentVersionVO == null)
{
LanguageVO contentMasterLanguageVO = LanguageController.getController().getMasterLanguage(contentVO.getRepositoryId());
newComponentContentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(this.newComponentContentId, contentMasterLanguageVO.getId());
}
if(newComponentContentVersionVO != null && !regardAsCompatible)
{
String template = ContentVersionController.getContentVersionController().getAttributeValue(newComponentContentVersionVO, "Template", false);
logger.info("template:" + template);
String subComponentsXPath = "//component[@name='" + slotName + "']//component";
NodeList subComponents = org.apache.xpath.XPathAPI.selectNodeList(componentToReplace, subComponentsXPath);
logger.info("subComponents:" + subComponents.getLength());
for(int i=0; i<subComponents.getLength(); i++)
{
Element subComponent = (Element)subComponents.item(i);
if(isPagePartReference)
{
//Removing children if it was a pagePartReference
NodeList propertiesNodeList = subComponent.getElementsByTagName("properties");
if(propertiesNodeList.getLength() > 0)
{
Element propertiesElement = (Element)propertiesNodeList.item(0);
NodeList propertyNodeList = propertiesElement.getElementsByTagName("property");
for(int j=0; j<propertyNodeList.getLength(); j++)
{
Element property = (Element)propertyNodeList.item(j);
Node parentNode = property.getParentNode();
parentNode.removeChild(property);
}
}
Node parentNode = subComponent.getParentNode();
parentNode.removeChild(subComponent);
}
else
{
String slotId = subComponent.getAttribute("name");
logger.info("subComponent slotId:" + slotId);
if(template.indexOf("id=\"" + slotId + "\"") == -1)
{
logger.info("deleting subComponent as it was not part of the new template");
Node parentNode = subComponent.getParentNode();
parentNode.removeChild(subComponent);
}
}
}
}
componentToReplace.setAttribute("contentId", "" + this.newComponentContentId);
if(isPagePartReference)
componentToReplace.setAttribute("isPagePartReference", "true");
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public String doAddComponentPropertyBinding() throws Exception
{
initialize();
//logger.info("************************************************************");
//logger.info("* doAddComponentPropertyBinding *");
//logger.info("************************************************************");
//logger.info("siteNodeId:" + this.siteNodeId);
//logger.info("languageId:" + this.languageId);
//logger.info("contentId:" + this.contentId);
//logger.info("componentId:" + this.componentId);
//logger.info("slotId:" + this.slotId);
//logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
//logger.info("assetKey:" + assetKey);
Integer siteNodeId = new Integer(this.getRequest().getParameter("siteNodeId"));
Integer languageId = this.masterLanguageVO.getId();
boolean keepExisting = new Boolean (this.getRequest().getParameter("keepExisting"));
if(this.getRequest().getParameter("languageId") != null && !this.getRequest().getParameter("languageId").equals(""))
{
languageId = new Integer(this.getRequest().getParameter("languageId"));
}
Locale locale = LanguageController.getController().getLocaleWithId(languageId);
String entity = this.getRequest().getParameter("entity");
Integer entityId = new Integer(this.getRequest().getParameter("entityId"));
String propertyName = this.getRequest().getParameter("propertyName");
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentPropertyXPath = "//component[@id=" + this.componentId + "]/properties/property[@name='" + propertyName + "']";
//logger.info("componentPropertyXPath:" + componentPropertyXPath);
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentPropertyXPath);
if(anl.getLength() == 0)
{
String componentXPath = "//component[@id=" + this.componentId + "]/properties";
//logger.info("componentXPath:" + componentXPath);
NodeList componentNodeList = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
if(componentNodeList.getLength() > 0)
{
Element componentProperties = (Element)componentNodeList.item(0);
if(entity.equalsIgnoreCase("SiteNode"))
addPropertyElement(componentProperties, propertyName, path, "siteNodeBinding", locale, keepExisting);
else if(entity.equalsIgnoreCase("Content"))
addPropertyElement(componentProperties, propertyName, path, "contentBinding", locale, keepExisting);
else if(entity.equalsIgnoreCase("Category"))
addPropertyElement(componentProperties, propertyName, path, "categoryBinding", locale, keepExisting);
anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentPropertyXPath);
}
}
//logger.info("anl:" + anl);
if(anl.getLength() > 0)
{
Element component = (Element)anl.item(0);
if(entity.equalsIgnoreCase("SiteNode"))
{
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(entityId);
path = siteNodeVO.getName();
}
else if(entity.equalsIgnoreCase("Content"))
{
ContentVO contentVO = ContentController.getContentController().getContentVOWithId(entityId);
path = contentVO.getName();
}
else if(entity.equalsIgnoreCase("Category"))
{
CategoryVO categoryVO = CategoryController.getController().findById(entityId);
path = categoryVO.getDisplayName();
}
component.setAttribute("path", path);
NamedNodeMap attributes = component.getAttributes();
logger.debug("NumberOfAttributes:" + attributes.getLength() + ":" + attributes);
List removableAttributes = new ArrayList();
for(int i=0; i<attributes.getLength(); i++)
{
Node node = attributes.item(i);
logger.debug("Node:" + node.getNodeName());
if(node.getNodeName().startsWith("path_"))
{
removableAttributes.add("" + node.getNodeName());
}
}
Iterator removableAttributesIterator = removableAttributes.iterator();
while(removableAttributesIterator.hasNext())
{
String attributeName = (String)removableAttributesIterator.next();
logger.debug("Removing node:" + attributeName);
component.removeAttribute(attributeName);
}
if (!keepExisting) {
NodeList children = component.getChildNodes();
for(int i=0; i < children.getLength(); i++) {
Node node = children.item(i);
component.removeChild(node);
}
}
if(assetKey != null)
{
boolean isUTF8 = false;
boolean hasUnicodeChars = false;
if(assetKey.indexOf((char)65533) > -1)
isUTF8 = true;
for(int i=0; i<assetKey.length(); i++)
{
int c = (int)assetKey.charAt(i);
if(c > 255 && c < 65533)
hasUnicodeChars = true;
}
logger.info("isUTF8:" + isUTF8);
logger.info("hasUnicodeChars:" + hasUnicodeChars);
if(!isUTF8 && !hasUnicodeChars)
{
String fromEncoding = CmsPropertyHandler.getAssetKeyFromEncoding();
if(fromEncoding == null)
fromEncoding = "iso-8859-1";
String toEncoding = CmsPropertyHandler.getAssetKeyToEncoding();
if(toEncoding == null)
toEncoding = "utf-8";
String[] controlChars = new String[]{"�","�","�","�","�","�","�","�","�","�","�","�"};
boolean convert = true;
for(String charToTest : controlChars)
{
if(logger.isInfoEnabled())
logger.info("Index for " + charToTest + ":" + assetKey.indexOf(charToTest));
if(assetKey.indexOf(charToTest) > -1)
convert = false;
}
if(convert)
{
assetKey = new String(assetKey.getBytes(fromEncoding), toEncoding);
}
}
}
Element newComponent = addBindingElement(component, entity, entityId, assetKey);
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
//logger.info("modifiedXML:" + modifiedXML);
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, languageId, true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
}
Boolean hideComponentPropertiesOnLoad = (Boolean)getHttpSession().getAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad");
if(hideComponentPropertiesOnLoad == null)
hideComponentPropertiesOnLoad = false;
else
getHttpSession().removeAttribute("" + siteNodeId + "_hideComponentPropertiesOnLoad");
if(showDecorated == null || !showDecorated.equalsIgnoreCase("false"))
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + this.componentId + (!hideComponentPropertiesOnLoad ? "&activatedComponentId=" + this.componentId : "") + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged + "&hideComponentPropertiesOnLoad=" + this.hideComponentPropertiesOnLoad;
else
this.url = getComponentRendererUrl() + "ViewPage.action?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + this.componentId + (!hideComponentPropertiesOnLoad ? "&activatedComponentId=" + this.componentId : "") + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged + "&hideComponentPropertiesOnLoad=" + this.hideComponentPropertiesOnLoad;
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public String doAddComponentPropertyBindingWithQualifyer() throws Exception
{
initialize();
//logger.info("************************************************************");
//logger.info("* doAddComponentPropertyBindingWithQualifyer *");
//logger.info("************************************************************");
//logger.info("siteNodeId:" + this.siteNodeId);
//logger.info("languageId:" + this.languageId);
//logger.info("contentId:" + this.contentId);
//logger.info("componentId:" + this.componentId);
//logger.info("slotId:" + this.slotId);
//logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
Integer siteNodeId = new Integer(this.getRequest().getParameter("siteNodeId"));
Integer languageId = new Integer(this.getRequest().getParameter("languageId"));
Integer contentId = new Integer(this.getRequest().getParameter("contentId"));
Locale locale = LanguageController.getController().getLocaleWithId(languageId);
String qualifyerXML = this.getRequest().getParameter("qualifyerXML");
String propertyName = this.getRequest().getParameter("propertyName");
//logger.info("siteNodeId:" + siteNodeId);
//logger.info("languageId:" + languageId);
//logger.info("contentId:" + contentId);
//logger.info("qualifyerXML:" + qualifyerXML);
//logger.info("propertyName:" + propertyName);
NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId);
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
//logger.info("componentXML:" + componentXML);
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentPropertyXPath = "//component[@id=" + this.componentId + "]/properties/property[@name='" + propertyName + "']";
//logger.info("componentPropertyXPath:" + componentPropertyXPath);
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentPropertyXPath);
if(anl.getLength() > 0)
{
Node propertyNode = anl.item(0);
propertyNode.getParentNode().removeChild(propertyNode);
}
String componentXPath = "//component[@id=" + this.componentId + "]/properties";
//logger.info("componentXPath:" + componentXPath);
NodeList componentNodeList = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
if(componentNodeList.getLength() > 0)
{
Element componentProperties = (Element)componentNodeList.item(0);
addPropertyElement(componentProperties, propertyName, path, "contentBinding", locale, false);
anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentPropertyXPath);
}
//}
if(anl.getLength() > 0)
{
Element component = (Element)anl.item(0);
component.setAttribute("path", path);
component.setAttribute("path_" + locale.getLanguage(), path);
addBindingElement(component, qualifyerXML);
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, languageId, true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
}
if(showDecorated == null || showDecorated.equalsIgnoreCase("true"))
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + this.componentId + "&activatedComponentId=" + this.componentId + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged;
else
this.url = getComponentRendererUrl() + "ViewPage.action?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + this.componentId + "&activatedComponentId=" + this.componentId + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged;
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public String doDeleteComponentBinding() throws Exception
{
initialize();
//logger.info("************************************************************");
//logger.info("* doDeleteComponentBinding *");
//logger.info("************************************************************");
//logger.info("siteNodeId:" + this.siteNodeId);
//logger.info("languageId:" + this.languageId);
//logger.info("contentId:" + this.contentId);
//logger.info("componentId:" + this.componentId);
//logger.info("slotId:" + this.slotId);
//logger.info("specifyBaseTemplate:" + this.specifyBaseTemplate);
Integer siteNodeId = new Integer(this.getRequest().getParameter("siteNodeId"));
Integer languageId = new Integer(this.getRequest().getParameter("languageId"));
Integer contentId = new Integer(this.getRequest().getParameter("contentId"));
Integer bindingId = new Integer(this.getRequest().getParameter("bindingId"));
//logger.info("siteNodeId:" + siteNodeId);
//logger.info("languageId:" + languageId);
//logger.info("contentId:" + contentId);
//String templateString = getPageTemplateString(templateController, siteNodeId, languageId, contentId);
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
//logger.info("componentXML:" + componentXML);
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component[@id=" + this.componentId + "]/bindings/binding[@id=" + bindingId + "]";
//logger.info("componentXPath:" + componentXPath);
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
//logger.info("anl:" + anl.getLength());
if(anl.getLength() > 0)
{
Element component = (Element)anl.item(0);
component.getParentNode().removeChild(component);
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, languageId, true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
}
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + this.componentId + "&activatedComponentId=" + this.componentId + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged + "&hideComponentPropertiesOnLoad=" + this.hideComponentPropertiesOnLoad;
//this.getResponse().sendRedirect(url);
this.url = this.getResponse().encodeURL(url);
//this.getResponse().sendRedirect(url);
return NONE;
}
/**
* This method shows the user a list of Components(HTML Templates).
*/
public List getComponentBindings() throws Exception
{
List bindings = new ArrayList();
try
{
Integer siteNodeId = new Integer(this.getRequest().getParameter("siteNodeId"));
Integer languageId = new Integer(this.getRequest().getParameter("languageId"));
Integer contentId = new Integer(this.getRequest().getParameter("contentId"));
String propertyName = this.getRequest().getParameter("propertyName");
//logger.info("**********************************************************************************");
//logger.info("siteNodeId:" + siteNodeId);
//logger.info("languageId:" + languageId);
//logger.info("contentId:" + contentId);
//logger.info("**********************************************************************************");
//String templateString = getPageTemplateString(templateController, siteNodeId, languageId, contentId);
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
//logger.info("componentXML:" + componentXML);
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentXPath = "//component[@id=" + this.componentId + "]/properties/property[@name='" + propertyName + "']/binding";
//logger.info("componentXPath:" + componentXPath);
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
//logger.info("anl:" + anl.getLength());
for(int i=0; i<anl.getLength(); i++)
{
Element component = (Element)anl.item(i);
String entityName = component.getAttribute("entity");
String entityId = component.getAttribute("entityId");
String assetKey = component.getAttribute("assetKey");
try
{
String path = "Undefined";
if(entityName.equalsIgnoreCase("SiteNode"))
{
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(new Integer(entityId));
path = siteNodeVO.getName();
if(this.languageId != null && this.languageId > -1)
{
ContentVersionVO cvVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(siteNodeVO.getMetaInfoContentId(), this.languageId);
if(cvVO != null)
{
String navigationTitle = ContentVersionController.getContentVersionController().getAttributeValue(cvVO, "NavigationTitle", true);
if(navigationTitle != null && !navigationTitle.equals(""))
path = navigationTitle;
}
}
}
else if(entityName.equalsIgnoreCase("Content"))
{
ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(entityId));
path = contentVO.getName();
}
Map binding = new HashMap();
binding.put("entityName", entityName);
binding.put("entityId", entityId);
binding.put("assetKey", assetKey);
binding.put("path", path);
bindings.add(binding);
}
catch(Exception e)
{
logger.warn("There was " + entityName + " bound to property '" + propertyName + "' on siteNode " + siteNodeId + " which appears to have been deleted.");
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
return bindings;
}
//Nice code
/**
* This method deletes a component property value. This is to enable users to quickly remove a property value no matter what type.
*/
public String doDeleteComponentPropertyValue() throws Exception
{
initialize();
Integer siteNodeId = new Integer(this.getRequest().getParameter("siteNodeId"));
Integer languageId = new Integer(this.getRequest().getParameter("languageId"));
Integer contentId = new Integer(this.getRequest().getParameter("contentId"));
String propertyName = this.getRequest().getParameter("propertyName");
Locale locale = LanguageController.getController().getLocaleWithId(languageId);
//logger.info("siteNodeId:" + siteNodeId);
//logger.info("languageId:" + languageId);
//logger.info("contentId:" + contentId);
//logger.info("propertyName:" + propertyName);
String componentXML = getPageComponentsString(siteNodeId, this.masterLanguageVO.getId());
//logger.info("componentXML:" + componentXML);
Document document = XMLHelper.readDocumentFromByteArray(componentXML.getBytes("UTF-8"));
String componentPropertyXPath = "//component[@id=" + this.componentId + "]/properties/property[@name='" + propertyName + "']";
//logger.info("componentPropertyXPath:" + componentPropertyXPath);
NodeList anl = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentPropertyXPath);
if(anl.getLength() > 0)
{
Node propertyNode = anl.item(0);
Element propertyElement = (Element)propertyNode;
propertyElement.removeAttribute("path");
propertyElement.removeAttribute("path_" + locale.getLanguage());
if(propertyElement.getAttributes().getLength() == 0);
{
propertyNode.getParentNode().removeChild(propertyNode);
}
}
String detailSiteNodeIdPropertyXPath = "//component[@id=" + this.componentId + "]/properties/property[@name='" + propertyName + "_detailSiteNodeId']";
//logger.info("componentPropertyXPath:" + componentPropertyXPath);
NodeList anl2 = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), detailSiteNodeIdPropertyXPath);
if(anl2.getLength() > 0)
{
Node propertyNode = anl2.item(0);
Element propertyElement = (Element)propertyNode;
propertyElement.removeAttribute("path");
propertyElement.removeAttribute("path_" + locale.getLanguage());
if(propertyElement.getAttributes().getLength() == 0);
{
propertyNode.getParentNode().removeChild(propertyNode);
}
}
String modifiedXML = XMLHelper.serializeDom(document, new StringBuffer()).toString();
//logger.info("modifiedXML:" + modifiedXML);
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, languageId, true, "Meta information", DeliveryContext.getDeliveryContext());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), this.masterLanguageVO.getId());
ContentVersionController.getContentVersionController().updateAttributeValue(contentVersionVO.getContentVersionId(), "ComponentStructure", modifiedXML, this.getInfoGluePrincipal(), true);
this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + this.componentId + "&activatedComponentId=" + this.componentId + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged;
//this.getResponse().sendRedirect(url);
this.url = this.getResponse().encodeURL(url);
this.getResponse().sendRedirect(url);
return NONE;
}
/**
* This method creates a parameter for the given input type.
* This is to support form steering information later.
*/
private Element addPropertyElement(Element parent, String name, String path, String type, Locale locale, boolean keepExisting)
{
Element element = parent.getOwnerDocument().createElement("property");
element.setAttribute("name", name);
String currentPaths = element.getAttribute("path");
if(type.equalsIgnoreCase("siteNodeBinding") || type.equalsIgnoreCase("contentBinding"))
{
if (!currentPaths.equalsIgnoreCase("") && keepExisting) {
element.setAttribute("path", currentPaths + "," + path);
element.setAttribute("path_" + locale.getLanguage(), currentPaths + "," + path);
} else {
element.setAttribute("path", path);
element.setAttribute("path_" + locale.getLanguage(), path);
}
}
else
{
element.setAttribute("path_" + locale.getLanguage(), path);
}
element.setAttribute("type", type);
parent.appendChild(element);
return element;
}
/**
* This method creates a parameter for the given input type.
* This is to support form steering information later.
*/
private Element addComponentElement(Element parent, Integer id, String name, Integer contentId, boolean isPagePartReference)
{
Element element = parent.getOwnerDocument().createElement("component");
if(isPagePartReference)
element.setAttribute("isPagePartReference", "true");
element.setAttribute("id", id.toString());
element.setAttribute("contentId", contentId.toString());
element.setAttribute("name", name);
Element properties = parent.getOwnerDocument().createElement("properties");
element.appendChild(properties);
Element subComponents = parent.getOwnerDocument().createElement("components");
element.appendChild(subComponents);
parent.appendChild(element);
return element;
}
/**
* This method creates a parameter for the given input type.
* This is to support form steering information later.
*/
private Element addComponentElementBefore(Element parent, Element beforeElement, Integer id, String name, Integer contentId, boolean isPagePartReference)
{
Element element = parent.getOwnerDocument().createElement("component");
if(isPagePartReference)
element.setAttribute("isPagePartReference", "true");
element.setAttribute("id", id.toString());
element.setAttribute("contentId", contentId.toString());
element.setAttribute("name", name);
Element properties = parent.getOwnerDocument().createElement("properties");
element.appendChild(properties);
Element subComponents = parent.getOwnerDocument().createElement("components");
element.appendChild(subComponents);
parent.insertBefore(element, beforeElement);
return element;
}
/**
* This method creates a parameter for the given input type.
* This is to support form steering information later.
*/
private Element addBindingElement(Element parent, String entity, Integer entityId, String assetKey)
{
Element element = parent.getOwnerDocument().createElement("binding");
element.setAttribute("entityId", entityId.toString());
element.setAttribute("entity", entity);
if(assetKey != null && !assetKey.equals(""))
element.setAttribute("assetKey", assetKey);
parent.appendChild(element);
return element;
}
/**
* This method creates a parameter for the given input type.
* This is to support form steering information later.
*/
private void addBindingElement(Element parent, String qualifyerXML) throws Exception
{
Document document = XMLHelper.readDocumentFromByteArray(qualifyerXML.getBytes("utf-8"));
NodeList nl = document.getChildNodes().item(0).getChildNodes();
for(int i=0; i<nl.getLength(); i++)
{
Element qualifyerElement = (Element)nl.item(i);
//logger.info("qualifyerElement:" + qualifyerElement);
String entityName = qualifyerElement.getNodeName();
String assetKey = qualifyerElement.getAttribute("assetKey");
String entityId = qualifyerElement.getFirstChild().getNodeValue();
//logger.info("entityName:" + entityName);
//logger.info("entityId:" + entityId);
Element element = parent.getOwnerDocument().createElement("binding");
element.setAttribute("entityId", entityId);
element.setAttribute("entity", entityName);
element.setAttribute("assetKey", assetKey);
parent.appendChild(element);
}
}
/**
* This method returns the contents that are of contentTypeDefinition "HTMLTemplate" sorted on the property given.
*/
public List getSortedComponents(String sortProperty) throws Exception
{
List componentVOList = null;
try
{
String direction = "asc";
componentVOList = ComponentController.getController().getComponentVOList(sortProperty, direction, allowedComponentNames, disallowedComponentNames, allowedComponentGroupNames, this.getInfoGluePrincipal());
}
catch(Exception e)
{
logger.error("Error getting sorted components. Message: " + e.getMessage(), e);
}
return componentVOList;
}
/**
* This method returns the contents that are of contentTypeDefinition "HTMLTemplate" sorted on the property given.
*/
public List getSortedFormComponents(String sortProperty) throws Exception
{
List componentVOList = null;
try
{
String direction = "asc";
componentVOList = ComponentController.getController().getComponentVOList(sortProperty, direction, allowedComponentNames, disallowedComponentNames, new String[]{"UserForm"}, this.getInfoGluePrincipal());
}
catch(Exception e)
{
logger.error("Error getting sorted components. Message: " + e.getMessage(), e);
}
return componentVOList;
}
/**
* This method fetches the template-string.
*/
private String getPageComponentsString(Integer siteNodeId, Integer languageId) throws SystemException, Exception
{
String template = null;
try
{
ContentVO contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId).getBoundContent(this.getInfoGluePrincipal(), siteNodeId, languageId, true, "Meta information", DeliveryContext.getDeliveryContext());
if(contentVO == null)
throw new SystemException("There was no template bound to this page which makes it impossible to render.");
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), languageId);
if(contentVersionVO == null)
{
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeId);
LanguageVO masterLanguage = LanguageController.getController().getMasterLanguage(siteNodeVO.getRepositoryId());
contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getId(), masterLanguage.getLanguageId());
}
template = ContentVersionController.getContentVersionController().getAttributeValue(contentVersionVO.getId(), "ComponentStructure", false);
if(template == null)
throw new SystemException("There was no template bound to this page which makes it impossible to render.");
}
catch(Exception e)
{
logger.error(e.getMessage(), e);
throw e;
}
return template;
}
/**
* This method fetches an url to the asset for the component.
*/
public String getDigitalAssetUrl(Integer contentId, String key) throws Exception
{
String imageHref = null;
try
{
LanguageVO masterLanguage = LanguageController.getController().getMasterLanguage(ContentController.getContentController().getContentVOWithId(contentId).getRepositoryId());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentId, masterLanguage.getId());
if(contentVersionVO != null)
{
List digitalAssets = DigitalAssetController.getDigitalAssetVOList(contentVersionVO.getId());
Iterator i = digitalAssets.iterator();
while(i.hasNext())
{
DigitalAssetVO digitalAssetVO = (DigitalAssetVO)i.next();
if(digitalAssetVO.getAssetKey().equals(key))
{
imageHref = DigitalAssetController.getDigitalAssetUrl(digitalAssetVO.getId());
break;
}
}
}
}
catch(Exception e)
{
logger.warn("We could not get the url of the digitalAsset: " + e.getMessage(), e);
imageHref = e.getMessage();
}
return imageHref;
}
/**
* This method fetches the blob from the database and saves it on the disk.
* Then it returnes a url for it
*/
public String getDigitalAssetThumbnailUrl(Integer contentId, String key) throws Exception
{
String imageHref = null;
try
{
LanguageVO masterLanguage = LanguageController.getController().getMasterLanguage(ContentController.getContentController().getContentVOWithId(contentId).getRepositoryId());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentId, masterLanguage.getId());
if(contentVersionVO != null)
{
List digitalAssets = DigitalAssetController.getDigitalAssetVOList(contentVersionVO.getId());
Iterator i = digitalAssets.iterator();
while(i.hasNext())
{
DigitalAssetVO digitalAssetVO = (DigitalAssetVO)i.next();
if(digitalAssetVO.getAssetKey().equals(key))
{
imageHref = DigitalAssetController.getDigitalAssetThumbnailUrl(digitalAssetVO.getId());
break;
}
}
}
}
catch(Exception e)
{
logger.warn("We could not get the thumbnail url of the digitalAsset: " + e.getMessage(), e);
imageHref = e.getMessage();
}
return imageHref;
}
/**
* This method fetches the blob from the database and saves it on the disk.
* Then it returnes a url for it
*/
public String getDigitalAssetThumbnailUrl(Integer contentId) throws Exception
{
String imageHref = null;
try
{
LanguageVO masterLanguage = LanguageController.getController().getMasterLanguage(ContentController.getContentController().getContentVOWithId(contentId).getRepositoryId());
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentId, masterLanguage.getId());
if(contentVersionVO != null)
{
List digitalAssets = DigitalAssetController.getDigitalAssetVOList(contentVersionVO.getId());
Iterator i = digitalAssets.iterator();
while(i.hasNext())
{
DigitalAssetVO digitalAssetVO = (DigitalAssetVO)i.next();
imageHref = DigitalAssetController.getDigitalAssetThumbnailUrl(digitalAssetVO.getId());
break;
}
}
}
catch(Exception e)
{
logger.warn("We could not get the thumbnail url of the digitalAsset: " + e.getMessage(), e);
imageHref = e.getMessage();
}
return imageHref;
}
public Integer getContentId()
{
return contentId;
}
public void setContentId(Integer integer)
{
contentId = integer;
}
public Integer getComponentId()
{
return this.componentId;
}
public void setComponentId(Integer componentId)
{
this.componentId = componentId;
}
public Integer getParentComponentId()
{
return parentComponentId;
}
public void setParentComponentId(Integer parentComponentId)
{
this.parentComponentId = parentComponentId;
}
public Integer getLanguageId()
{
return this.languageId;
}
public Integer getSiteNodeId()
{
return this.siteNodeId;
}
public void setLanguageId(Integer languageId)
{
this.languageId = languageId;
}
public void setSiteNodeId(Integer siteNodeId)
{
this.siteNodeId = siteNodeId;
}
public String getSlotId()
{
return this.slotId;
}
public void setSlotId(String slotId)
{
this.slotId = slotId;
}
public Integer getRepositoryId()
{
return this.repositoryId;
}
public void setRepositoryId(Integer repositoryId)
{
this.repositoryId = repositoryId;
}
public Integer getFilterRepositoryId()
{
return filterRepositoryId;
}
public void setFilterRepositoryId(Integer filterRepositoryId)
{
this.filterRepositoryId = filterRepositoryId;
}
public String getSpecifyBaseTemplate()
{
return this.specifyBaseTemplate;
}
public void setSpecifyBaseTemplate(String specifyBaseTemplate)
{
this.specifyBaseTemplate = specifyBaseTemplate;
}
public String getPropertyName()
{
return this.propertyName;
}
public void setPropertyName(String propertyName)
{
this.propertyName = propertyName;
}
public String getPath()
{
return this.path;
}
public void setPath(String path)
{
this.path = path;
}
public LanguageVO getMasterLanguageVO()
{
return masterLanguageVO;
}
public String getUrl()
{
return url;
}
public String getSortProperty()
{
return sortProperty;
}
public void setSortProperty(String sortProperty)
{
this.sortProperty = sortProperty;
}
public Integer getDirection()
{
return direction;
}
public void setDirection(Integer direction)
{
this.direction = direction;
}
public String[] getAllowedContentTypeIds()
{
return allowedContentTypeIds;
}
public void setAllowedContentTypeIds(String[] allowedContentTypeIds)
{
this.allowedContentTypeIds = allowedContentTypeIds;
}
public String getAllowedContentTypeIdsAsUrlEncodedString() throws Exception
{
StringBuffer sb = new StringBuffer();
for(int i=0; i<allowedContentTypeIds.length; i++)
{
if(i > 0)
sb.append("&");
sb.append("allowedContentTypeIds=" + URLEncoder.encode(allowedContentTypeIds[i], "UTF-8"));
}
return sb.toString();
}
public boolean getShowSimple()
{
return showSimple;
}
public void setShowSimple(boolean showSimple)
{
this.showSimple = showSimple;
}
public Integer getPageTemplateContentId()
{
return pageTemplateContentId;
}
public void setPageTemplateContentId(Integer pageTemplateContentId)
{
this.pageTemplateContentId = pageTemplateContentId;
}
public String[] getAllowedComponentNames()
{
return allowedComponentNames;
}
public void setAllowedComponentNames(String[] allowedComponentNames)
{
this.allowedComponentNames = allowedComponentNames;
}
public String[] getDisallowedComponentNames()
{
return disallowedComponentNames;
}
public void setDisallowedComponentNames(String[] disallowedComponentNames)
{
this.disallowedComponentNames = disallowedComponentNames;
}
public String getAllowedComponentNamesAsUrlEncodedString() throws Exception
{
StringBuffer sb = new StringBuffer("");
if(allowedComponentNames != null)
{
for(int i=0; i<allowedComponentNames.length; i++)
{
if(i > 0)
sb.append("&");
sb.append("allowedComponentNames=" + URLEncoder.encode(allowedComponentNames[i], "UTF-8"));
}
}
return sb.toString();
}
public String getDisallowedComponentNamesAsUrlEncodedString() throws Exception
{
StringBuffer sb = new StringBuffer("");
if(disallowedComponentNames != null)
{
for(int i=0; i<disallowedComponentNames.length; i++)
{
if(i > 0)
sb.append("&");
sb.append("disallowedComponentNames=" + URLEncoder.encode(disallowedComponentNames[i], "UTF-8"));
}
}
return sb.toString();
}
public String[] getAllowedComponentGroupNames()
{
return allowedComponentNames;
}
public void setAllowedComponentGroupNames(String[] allowedComponentGroupNames)
{
this.allowedComponentGroupNames = allowedComponentGroupNames;
}
public String getAllowedComponentGroupNamesAsUrlEncodedString() throws Exception
{
StringBuffer sb = new StringBuffer("");
if(allowedComponentGroupNames != null)
{
for(int i=0; i<allowedComponentGroupNames.length; i++)
{
if(i > 0)
sb.append("&");
sb.append("allowedComponentGroupNames=" + URLEncoder.encode(allowedComponentGroupNames[i], "UTF-8"));
}
}
return sb.toString();
}
public String getAssetKey()
{
return assetKey;
}
public void setAssetKey(String assetKey)
{
this.assetKey = assetKey;
}
public void setNewComponentContentId(Integer newComponentContentId)
{
this.newComponentContentId = newComponentContentId;
}
public String getShowDecorated()
{
return showDecorated;
}
public void setShowDecorated(String showDecorated)
{
this.showDecorated = showDecorated;
}
public String getSlotPositionComponentId()
{
return slotPositionComponentId;
}
public void setSlotPositionComponentId(String slotPositionComponentId)
{
this.slotPositionComponentId = slotPositionComponentId;
}
public Integer getPagePartContentId()
{
return pagePartContentId;
}
public void setPagePartContentId(Integer pagePartContentId)
{
this.pagePartContentId = pagePartContentId;
}
public void setNewPosition(Integer newPosition)
{
this.newPosition = newPosition;
}
public boolean getHideComponentPropertiesOnLoad()
{
return hideComponentPropertiesOnLoad;
}
public void setHideComponentPropertiesOnLoad(boolean hideComponentPropertiesOnLoad)
{
this.hideComponentPropertiesOnLoad = hideComponentPropertiesOnLoad;
}
public boolean getIsPagePartTemplate(Integer contentTypeDefinitionId)
{
try
{
ContentTypeDefinitionVO ctdVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(contentTypeDefinitionId);
if(ctdVO != null && ctdVO.getName().equalsIgnoreCase("PagePartTemplate"))
return true;
else
return false;
}
catch (Exception e)
{
logger.warn("Error looking up content type:" + e.getMessage());
return false;
}
}
/**
* @return the changeMethod
*/
public String getChangeMethod() {
return changeMethod;
}
/**
* @param changeMethod the changeMethod to set
*/
public void setChangeMethod(String changeMethod) {
this.changeMethod = changeMethod;
}
/**
* @return the recursionMethod
*/
public String getRecursionMethod() {
return recursionMethod;
}
/**
* @param recursionMethod the recursionMethod to set
*/
public void setRecursionMethod(String recursionMethod) {
this.recursionMethod = recursionMethod;
}
/**
* @return the componentName
*/
public String getComponentName() {
return componentName;
}
/**
* @param componentName the componentName to set
*/
public void setComponentName(String componentName) {
this.componentName = componentName;
}
public List<String> getErroneousSiteNodePaths()
{
return erroneousSiteNodePaths;
}
public boolean getHasChangeComponentRecursivelyAccess()
{
return hasChangeComponentRecursivelyAccess;
}
public Map<String, String> getchangeMethods()
{
return COMPONENT_CHANGE_METHODS;
}
}