Package org.infoglue.cms.applications.structuretool.actions

Source Code of org.infoglue.cms.applications.structuretool.actions.ViewSiteNodePageComponentsAction

/* ===============================================================================
*
* 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));
    }
   
    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);
   
    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));
    }
    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());
      }
    }
   
    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;
    //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);

    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());
        }           
      }
     
      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;
      //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);

    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());

          this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + componentId + "&componentContentId=" + componentContentVO.getId() + "&showSimple=" + this.showSimple + "&stateChanged=" + stateChanged;
        }
        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());

          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.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.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());
      }
    }
       
    this.url = getComponentRendererUrl() + getComponentRendererAction() + "?siteNodeId=" + this.siteNodeId + "&languageId=" + this.languageId + "&contentId=" + this.contentId + "&focusElementId=" + 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 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);
    }

    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());
     
      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;
        //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);
    }

    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);
        

        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());
      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;
      //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());
    }
   
    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());

    this.hasChangeComponentRecursivelyAccess = this.hasAccessTo("ComponentEditor.ChangeComponentRecursively", true);

    try
    {
      Integer newComponentId = new Integer(0);
     
      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;
        //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());

      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());
    }
         
    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;
    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;
   
    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());
    }
         
    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());
    }
     
    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 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());

    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;
  }

}
TOP

Related Classes of org.infoglue.cms.applications.structuretool.actions.ViewSiteNodePageComponentsAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.