/* ===============================================================================
*
* 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.contenttool.actions;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentVersionController;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentVersionControllerProxy;
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.SiteNodeVersionController;
import org.infoglue.cms.entities.content.ContentVersionVO;
import org.infoglue.cms.entities.structure.SiteNodeVO;
import org.infoglue.cms.entities.structure.SiteNodeVersion;
import org.infoglue.cms.entities.structure.SiteNodeVersionVO;
import org.infoglue.cms.exception.Bug;
import org.infoglue.cms.exception.ConstraintException;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.util.CmsPropertyHandler;
import org.infoglue.cms.util.ConstraintExceptionBuffer;
import org.infoglue.cms.util.XMLHelper;
import com.thoughtworks.xstream.XStream;
/**
* This is the action-class for UpdateContentVersionVersion
*
* @author Mattias Bogeblad
*/
public class UpdateContentVersionAction extends ViewContentVersionAction
{
private static final long serialVersionUID = 1L;
public final static Logger logger = Logger.getLogger(UpdateContentVersionAction.class.getName());
private ContentVersionVO contentVersionVO;
private Integer contentId;
private Integer languageId;
private Integer contentVersionId;
private Integer currentEditorId;
private String attributeName;
private long oldModifiedDateTime = -1;
private boolean concurrentModification = false;
private String saveAndExitURL = null;
private String extraClasses;
//Set to true if version was a state change
private Boolean stateChanged = false;
private ConstraintExceptionBuffer ceb;
public UpdateContentVersionAction()
{
this(new ContentVersionVO());
}
public UpdateContentVersionAction(ContentVersionVO contentVersionVO)
{
this.contentVersionVO = contentVersionVO;
this.ceb = new ConstraintExceptionBuffer();
}
public String doExecute() throws Exception
{
super.initialize(this.contentVersionId, this.contentId, this.languageId);
ceb.throwIfNotEmpty();
ContentVersionVO currentContentVersionVO = null;
if(this.contentVersionVO.getId() != null)
{
currentContentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(this.contentVersionVO.getId());
}
if(currentContentVersionVO != null)
{
logger.info("oldModifiedDateTime:" + oldModifiedDateTime);
logger.info("modifiedDateTime2:" + currentContentVersionVO.getModifiedDateTime().getTime());
}
if(currentContentVersionVO == null || this.oldModifiedDateTime == currentContentVersionVO.getModifiedDateTime().getTime())
{
this.contentVersionVO.setVersionModifier(this.getInfoGluePrincipal().getName());
try
{
this.contentVersionVO = ContentVersionControllerProxy.getController().acUpdate(this.getInfoGluePrincipal(), this.contentId, this.languageId, this.contentVersionVO);
this.contentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(this.contentVersionVO.getId());
this.oldModifiedDateTime = this.contentVersionVO.getModifiedDateTime().getTime();
}
catch(ConstraintException ce)
{
super.contentVersionVO = this.contentVersionVO;
throw ce;
}
}
else
{
this.contentVersionVO.setVersionModifier(this.getInfoGluePrincipal().getName());
super.contentVersionVO = this.contentVersionVO;
/*
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
ceb.add(new ConstraintException("ContentVersion.concurrentModification", "3306"));
ceb.throwIfNotEmpty();
*/
concurrentModification = true;
}
if(currentContentVersionVO == null || (this.contentVersionVO != null && currentContentVersionVO.getStateId().intValue() != this.contentVersionVO.getStateId().intValue()))
stateChanged = true;
return "success";
}
public String doV3() throws Exception
{
doExecute();
return "successV3";
}
public String doUpdateVersionValue() throws Exception
{
super.initialize(this.contentVersionId, this.contentId, this.languageId);
ceb.throwIfNotEmpty();
ContentVersionVO currentContentVersionVO = null;
if(this.contentVersionVO.getId() != null)
{
currentContentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(this.contentVersionVO.getId());
}
if(currentContentVersionVO != null)
{
logger.info("oldModifiedDateTime:" + oldModifiedDateTime);
logger.info("modifiedDateTime2:" + currentContentVersionVO.getModifiedDateTime().getTime());
}
this.contentVersionVO.setVersionModifier(this.getInfoGluePrincipal().getName());
try
{
this.contentVersionVO = ContentVersionControllerProxy.getController().acUpdate(this.getInfoGluePrincipal(), this.contentId, this.languageId, this.contentVersionVO);
//this.contentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(this.contentVersionVO.getId());
//this.oldModifiedDateTime = this.contentVersionVO.getModifiedDateTime().getTime();
oldModifiedDateTime = this.contentVersionVO.getModifiedDateTime().getTime();
}
catch(ConstraintException ce)
{
super.contentVersionVO = this.contentVersionVO;
throw ce;
}
currentEditorId = new Integer(1);
concurrentModification = false;
return "success";
}
public String doRevertToVersion() throws Exception
{
String contentVersionIdParameter = getRequest().getParameter("contentVersionId");
ContentVersionVO contentVersionVOToRevertTo = ContentVersionController.getContentVersionController().getContentVersionVOWithId(new Integer(contentVersionIdParameter));
this.contentId = contentVersionVOToRevertTo.getContentId();
this.languageId = contentVersionVOToRevertTo.getLanguageId();
contentVersionVOToRevertTo.setVersionModifier(this.getInfoGluePrincipal().getName());
contentVersionVOToRevertTo.setModifiedDateTime(new Date());
contentVersionVOToRevertTo.setStateId(ContentVersionVO.WORKING_STATE);
ContentVersionController.getContentVersionController().create(contentVersionVOToRevertTo.getContentId(), contentVersionVOToRevertTo.getLanguageId(), contentVersionVOToRevertTo, contentVersionVOToRevertTo.getId(), true, false);
return "successVersionReverted";
}
public String doUpdateVersionXMLV3() throws Exception
{
doUpdateVersionValue();
return "successXMLV3";
}
public String doStandalone() throws Exception
{
super.initialize(this.contentVersionId, this.contentId, this.languageId);
ceb.throwIfNotEmpty();
if(this.attributeName == null)
this.attributeName = "";
if(this.currentEditorId == null)
this.currentEditorId = 1;
try
{
this.contentVersionVO.setVersionModifier(this.getInfoGluePrincipal().getName());
this.contentVersionVO = ContentVersionControllerProxy.getController().acUpdate(this.getInfoGluePrincipal(), this.contentId, this.languageId, this.contentVersionVO);
this.contentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(this.contentVersionVO.getId());
this.getHttpSession().removeAttribute("CreateContentWizardInfoBean");
logger.info("this.getSiteNodeId():" + this.getSiteNodeId());
if(this.getSiteNodeId() != null && this.contentTypeDefinitionVO.getName().equalsIgnoreCase("Meta info"))
{
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(this.getSiteNodeId());
if(siteNodeVersionVO == null || siteNodeVersionVO.getStateId().intValue() > SiteNodeVersionVO.WORKING_STATE)
{
logger.info("siteNodeVersionVO: " + siteNodeVersionVO.getId());
SiteNodeVersionVO newSiteNodeVersion = SiteNodeStateController.getController().changeState(siteNodeVersionVO.getId(), SiteNodeVersionVO.WORKING_STATE, "New version", false, null, this.getInfoGluePrincipal(), this.getSiteNodeId(), new ArrayList());
logger.info("newSiteNodeVersion: " + newSiteNodeVersion.getId());
logger.info("Created new site node version:" + newSiteNodeVersion);
}
}
}
catch(ConstraintException ce)
{
super.contentVersionVO = this.contentVersionVO;
if (CmsPropertyHandler.getContentVersionEditorFlavour().equalsIgnoreCase("v3TabbedLanguages"))
{
ce.setResult("inputVersionEditor");
}
else
{
ce.setResult("inputStandalone");
}
throw ce;
}
return "standalone";
}
public String doStandaloneXML() throws Exception
{
try
{
String xmlResult = null;
getResponse().setContentType("text/xml; charset=UTF-8");
getResponse().setHeader("Cache-Control","no-cache");
getResponse().setHeader("Pragma","no-cache");
getResponse().setDateHeader ("Expires", 0);
PrintWriter out = getResponse().getWriter();
XMLWriter xmlWriter = new XMLWriter(out);
XStream xStream = new XStream();
xStream.omitField(contentVersionVO.getClass(),"versionValue");
/*
logger.info("contentVersionId:" + this.contentVersionId);
logger.info("contentId:" + this.contentId);
logger.info("languageId:" + this.languageId);
logger.info("this.contentVersionVO:" + this.contentVersionVO);
*/
ceb.throwIfNotEmpty();
if(this.attributeName == null)
this.attributeName = "";
if(this.currentEditorId == null)
this.currentEditorId = 1;
try
{
this.contentVersionVO.setVersionModifier(this.getInfoGluePrincipal().getName());
this.contentVersionVO = ContentVersionControllerProxy.getController().acUpdate(this.getInfoGluePrincipal(), this.contentId, this.languageId, this.contentVersionVO);
this.contentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(this.contentVersionVO.getId());
xmlResult = xStream.toXML(this.contentVersionVO);
}
catch(ConstraintException ce)
{
super.contentVersionVO = this.contentVersionVO;
xmlResult = xStream.toXML(ce);
}
//logger.info("xmlResult:" + xmlResult);
/*
* Output
*/
xmlWriter.write(DocumentHelper.parseText(xmlResult));
xmlWriter.flush();
}
catch (Exception e)
{
logger.warn("Error in UpdateContentVersion.doStandaloneXML: " + e.getMessage());
if(logger.isInfoEnabled())
logger.info("Error in UpdateContentVersion.doStandaloneXML: " + e.getMessage(), e);
}
return NONE;
}
public String doSaveAndExit() throws Exception
{
doExecute();
return "saveAndExit";
}
public String doSaveAndExitStandalone() throws Exception
{
try
{
doExecute();
}
catch(ConstraintException ce)
{
super.contentVersionVO = this.contentVersionVO;
ce.setResult("inputStandalone");
throw ce;
}
return "saveAndExitStandalone";
}
public String doSaveAndExitInline() throws Exception
{
try
{
doExecute();
}
catch(ConstraintException ce)
{
super.contentVersionVO = this.contentVersionVO;
ce.setResult("inputStandalone");
throw ce;
}
return "saveAndExitInline";
}
public String doBackground() throws Exception
{
doExecute();
return "background";
}
public String doXml() throws IOException, SystemException, Bug, DocumentException
{
try
{
String xmlResult = null;
getResponse().setContentType("text/xml; charset=UTF-8");
getResponse().setHeader("Cache-Control","no-cache");
getResponse().setHeader("Pragma","no-cache");
getResponse().setDateHeader ("Expires", 0);
PrintWriter out = getResponse().getWriter();
XMLWriter xmlWriter = new XMLWriter(out);
XStream xStream = new XStream();
xStream.omitField(contentVersionVO.getClass(),"versionValue");
// super.initialize(this.contentVersionId, this.contentId, this.languageId);
ContentVersionVO currentContentVersionVO = null;
ContentVersionVO activeContentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentId, languageId);
/*
* Are we trying to update the active version?
*/
if(activeContentVersionVO.getContentVersionId().equals(this.contentVersionVO.getContentVersionId()))
{
if(this.contentVersionVO.getId() != null)
{
currentContentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(this.contentVersionVO.getId());
}
if(currentContentVersionVO == null || this.oldModifiedDateTime == currentContentVersionVO.getModifiedDateTime().getTime())
{
this.contentVersionVO.setVersionModifier(this.getInfoGluePrincipal().getName());
try
{
if(activeContentVersionVO.getStateId().equals(ContentVersionVO.WORKING_STATE))
{
this.contentVersionVO = ContentVersionControllerProxy.getController().acUpdate(this.getInfoGluePrincipal(), this.contentId, this.languageId, this.contentVersionVO);
this.contentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(this.contentVersionVO.getId());
this.oldModifiedDateTime = this.contentVersionVO.getModifiedDateTime().getTime();
xmlResult = xStream.toXML(contentVersionVO);
}
else
{
xmlResult = "<invalidstate/>";
}
}
catch(ConstraintException ce)
{
ce.printStackTrace();
xmlResult = xStream.toXML(ce);
}
catch (Exception e)
{
e.printStackTrace();
xmlResult = xStream.toXML(e);
}
}
else
{
this.contentVersionVO.setVersionModifier(this.getInfoGluePrincipal().getName());
super.contentVersionVO = this.contentVersionVO;
concurrentModification = true;
xmlResult = "<concurrentmodification/>";
}
}
else
{
/*
* Not updating active version
*/
xmlResult = "<invalidversion/>";
}
/*
* Output
*/
xmlWriter.write(DocumentHelper.parseText(xmlResult));
xmlWriter.flush();
}
catch (Exception e)
{
e.printStackTrace();
}
return NONE;
}
public void setContentVersionId(Integer contentVersionId)
{
this.contentVersionVO.setContentVersionId(contentVersionId);
}
public java.lang.Integer getContentVersionId()
{
return this.contentVersionVO.getContentVersionId();
}
public void setStateId(Integer stateId)
{
this.contentVersionVO.setStateId(stateId);
}
public java.lang.Integer getStateId()
{
return this.contentVersionVO.getStateId();
}
public void setContentId(Integer contentId)
{
this.contentId = contentId;
}
public java.lang.Integer getContentId()
{
return this.contentId;
}
public void setLanguageId(Integer languageId)
{
this.languageId = languageId;
}
public java.lang.Integer getLanguageId()
{
return this.languageId;
}
public java.lang.String getVersionValue()
{
return this.contentVersionVO.getVersionValue();
}
public void setVersionValue(java.lang.String versionValue) throws Exception
{
if (logger.isDebugEnabled())
{
logger.debug("VersionValue before processing: " + versionValue);
}
try
{
if(versionValue != null)
{
String versionValueTest = new String(versionValue.getBytes("iso-8859-1"));
if(!versionValue.contains("\u00E5") &&
!versionValue.contains("\u00E4") &&
!versionValue.contains("\u00F6") &&
!versionValue.contains("\u00C5") &&
!versionValue.contains("\u00C4") &&
!versionValue.contains("\u00D6"))
{
if(versionValueTest.contains("\u00E5") ||
versionValueTest.contains("\u00E4") ||
versionValueTest.contains("\u00F6") ||
versionValueTest.contains("\u00C5") ||
versionValueTest.contains("\u00C4") ||
versionValueTest.contains("\u00D6"))
{
versionValue = versionValueTest;
}
}
versionValue = XMLHelper.stripInvalidXmlCharacters(versionValue);
}
}
catch (Exception e)
{
logger.error("Error: " + e.getMessage());
}
try
{
SAXReader reader = new SAXReader(false);
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Document document = reader.read(new java.io.ByteArrayInputStream(versionValue.getBytes("UTF-8")));
if(document == null)
throw new Exception("Faulty dom... must be corrupt");
int preTemplateElements = 0;
int preTemplateStart = versionValue.indexOf("<PreTemplate>");
while(preTemplateStart > -1)
{
preTemplateElements++;
preTemplateStart = versionValue.indexOf("<PreTemplate>", preTemplateStart + 10);
}
if(preTemplateElements > 1)
{
logger.warn("Duplicate fields from eclipse editor");
versionValue = versionValue.replaceAll("<PreTemplate></PreTemplate>", "");
versionValue = versionValue.replaceAll("<PreTemplate><!\\[CDATA\\[]]></PreTemplate>", "");
versionValue = versionValue.replaceAll("<ComponentTasks></ComponentTasks>", "");
versionValue = versionValue.replaceAll("<ComponentTasks><!\\[CDATA\\[]]></ComponentTasks>", "");
versionValue = versionValue.replaceAll("<Description></Description>", "");
versionValue = versionValue.replaceAll("<Description><!\\[CDATA\\[]]></Description>", "");
versionValue = versionValue.replaceAll("<RelatedComponents></RelatedComponents>", "");
versionValue = versionValue.replaceAll("<RelatedComponents><!\\[CDATA\\[]]></RelatedComponents>", "");
}
}
catch (Exception e)
{
logger.error("Faulty XML from Eclipse plugin.. not accepting", e);
logger.warn(versionValue);
logger.info("VersionValue:" + versionValue);
throw new Exception("Faulty XML from Eclipse plugin.. not accepting");
}
if (logger.isDebugEnabled())
{
logger.debug("VersionValue after processing: " + versionValue);
}
this.contentVersionVO.setVersionValue(versionValue);
}
public Integer getCurrentEditorId()
{
return currentEditorId;
}
public void setCurrentEditorId(Integer integer)
{
currentEditorId = integer;
}
public String getAttributeName()
{
return this.attributeName;
}
public String getVersionComment()
{
return this.contentVersionVO.getVersionComment();
}
public void setAttributeName(String attributeName)
{
this.attributeName = attributeName;
}
public long getOldModifiedDateTime()
{
return oldModifiedDateTime;
}
public void setExtraClasses(String extraClasses)
{
this.extraClasses = extraClasses;
}
public String getExtraClasses()
{
return extraClasses;
}
public void setOldModifiedDateTime(long oldModifiedDateTime)
{
this.oldModifiedDateTime = oldModifiedDateTime;
}
public boolean getConcurrentModification()
{
return concurrentModification;
}
public String getSaveAndExitURL()
{
return saveAndExitURL;
}
public void setSaveAndExitURL(String saveAndExitURL)
{
this.saveAndExitURL = saveAndExitURL;
if(this.saveAndExitURL != null && this.saveAndExitURL.indexOf("%3D") == -1)
{
try
{
this.saveAndExitURL = URLEncoder.encode(saveAndExitURL, "UTF-8");
}
catch (UnsupportedEncodingException e)
{
}
}
}
public Boolean getStateChanged()
{
return this.stateChanged;
}
}