/* ===============================================================================
*
* 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.controllers.kernel.impl.simple;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import org.exolab.castor.jdo.Database;
import org.exolab.castor.jdo.OQLQuery;
import org.exolab.castor.jdo.ObjectNotFoundException;
import org.exolab.castor.jdo.QueryResults;
import org.infoglue.cms.applications.common.VisualFormatter;
import org.infoglue.cms.applications.databeans.ProcessBean;
import org.infoglue.cms.applications.databeans.ReferenceBean;
import org.infoglue.cms.entities.content.Content;
import org.infoglue.cms.entities.content.ContentCategory;
import org.infoglue.cms.entities.content.ContentCategoryVO;
import org.infoglue.cms.entities.content.ContentVO;
import org.infoglue.cms.entities.content.ContentVersion;
import org.infoglue.cms.entities.content.ContentVersionVO;
import org.infoglue.cms.entities.content.impl.simple.MediumContentImpl;
import org.infoglue.cms.entities.content.impl.simple.MediumContentVersionImpl;
import org.infoglue.cms.entities.content.impl.simple.SmallContentImpl;
import org.infoglue.cms.entities.kernel.BaseEntityVO;
import org.infoglue.cms.entities.management.AccessRight;
import org.infoglue.cms.entities.management.AccessRightGroup;
import org.infoglue.cms.entities.management.AccessRightRole;
import org.infoglue.cms.entities.management.AccessRightUser;
import org.infoglue.cms.entities.management.InterceptionPoint;
import org.infoglue.cms.entities.management.LanguageVO;
import org.infoglue.cms.entities.management.Repository;
import org.infoglue.cms.entities.management.RepositoryVO;
import org.infoglue.cms.entities.management.ServiceDefinition;
import org.infoglue.cms.entities.management.ServiceDefinitionVO;
import org.infoglue.cms.entities.management.SiteNodeTypeDefinition;
import org.infoglue.cms.entities.management.impl.simple.AccessRightGroupImpl;
import org.infoglue.cms.entities.management.impl.simple.AccessRightImpl;
import org.infoglue.cms.entities.management.impl.simple.AccessRightRoleImpl;
import org.infoglue.cms.entities.management.impl.simple.AccessRightUserImpl;
import org.infoglue.cms.entities.management.impl.simple.RepositoryImpl;
import org.infoglue.cms.entities.management.impl.simple.SiteNodeTypeDefinitionImpl;
import org.infoglue.cms.entities.publishing.PublicationVO;
import org.infoglue.cms.entities.structure.ServiceBindingVO;
import org.infoglue.cms.entities.structure.SiteNode;
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.entities.structure.impl.simple.MediumSiteNodeVersionImpl;
import org.infoglue.cms.entities.structure.impl.simple.PureSiteNodeImpl;
import org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl;
import org.infoglue.cms.entities.structure.impl.simple.SmallQualifyerImpl;
import org.infoglue.cms.entities.structure.impl.simple.SmallServiceBindingImpl;
import org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeImpl;
import org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeVersionImpl;
import org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl;
import org.infoglue.cms.entities.workflow.EventVO;
import org.infoglue.cms.exception.Bug;
import org.infoglue.cms.exception.ConstraintException;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.io.FileHelper;
import org.infoglue.cms.security.InfoGluePrincipal;
import org.infoglue.cms.util.CmsPropertyHandler;
import org.infoglue.cms.util.ConstraintExceptionBuffer;
import org.infoglue.cms.util.XMLHelper;
import org.infoglue.cms.util.mail.MailServiceFactory;
import org.infoglue.cms.util.sorters.ReflectionComparator;
import org.infoglue.deliver.controllers.kernel.impl.simple.LanguageDeliveryController;
import org.infoglue.deliver.controllers.kernel.impl.simple.NodeDeliveryController;
import org.infoglue.deliver.util.CacheController;
import org.infoglue.deliver.util.RequestAnalyser;
import org.infoglue.deliver.util.Timer;
import org.infoglue.deliver.util.VelocityTemplateProcessor;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import com.opensymphony.module.propertyset.PropertySet;
import com.opensymphony.module.propertyset.PropertySetManager;
public class SiteNodeController extends BaseController
{
private final static Logger logger = Logger.getLogger(SiteNodeController.class.getName());
protected static final Integer NO = new Integer(0);
protected static final Integer YES = new Integer(1);
protected static final Integer INHERITED = new Integer(2);
/**
* Factory method
*/
public static SiteNodeController getController()
{
return new SiteNodeController();
}
/**
* This method returns selected active content versions.
*/
public List<SiteNode> getSiteNodeList(Integer repositoryId, Integer minimumId, Integer limit, Database db) throws SystemException, Bug, Exception
{
List<SiteNode> siteNodeList = new ArrayList<SiteNode>();
OQLQuery oql = db.getOQLQuery( "SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeImpl sn WHERE sn.repositoryId = $1 AND sn.siteNodeId > $2 ORDER BY sn.siteNodeId LIMIT $3");
oql.bind(repositoryId);
oql.bind(minimumId);
oql.bind(limit);
QueryResults results = oql.execute(Database.READONLY);
while (results.hasMore())
{
SiteNode siteNode = (SiteNode)results.next();
siteNodeList.add(siteNode);
}
results.close();
oql.close();
return siteNodeList;
}
public SiteNodeVO getSiteNodeVOWithId(Integer siteNodeId) throws SystemException
{
SiteNodeVO siteNodeVO = null;
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
siteNodeVO = getSiteNodeVOWithId(siteNodeId, db, false);
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return siteNodeVO;
}
/**
* This method gets the siteNodeVO with the given id
*/
public SiteNodeVO getSiteNodeVOWithId(Integer siteNodeId, boolean skipCaching) throws SystemException
{
String key = "" + siteNodeId;
SiteNodeVO siteNodeVO = (SiteNodeVO)CacheController.getCachedObjectFromAdvancedCache("siteNodeCache", key);
if(siteNodeVO != null && !skipCaching)
{
return siteNodeVO;
}
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
siteNodeVO = getSiteNodeVOWithId(siteNodeId, db, skipCaching);
if(siteNodeVO != null && !skipCaching)
CacheController.cacheObjectInAdvancedCache("siteNodeCache", key, siteNodeVO);
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return siteNodeVO;
}
/**
* This method gets the siteNodeVO with the given id
*/
public SiteNodeVO getSiteNodeVOWithIdIfInCache(Integer siteNodeId, Database db) throws SystemException, Bug, Exception
{
String key = "" + siteNodeId;
SiteNodeVO siteNodeVO = (SiteNodeVO)CacheController.getCachedObjectFromAdvancedCache("siteNodeCache", key);
if(siteNodeVO != null)
{
return siteNodeVO;
}
return null;
}
/**
* This method gets the siteNodeVO with the given id
*/
public static SiteNodeVO getSiteNodeVOWithId(Integer siteNodeId, Database db) throws SystemException, Bug, Exception
{
return getSiteNodeVOWithId(siteNodeId, db, false);
}
/**
* This method gets the siteNodeVO with the given id
*/
public static SiteNodeVO getSiteNodeVOWithId(Integer siteNodeId, Database db, boolean skipCaching) throws SystemException, Bug, Exception
{
if(siteNodeId == null || siteNodeId == 0)
{
logger.info("Returned as " + siteNodeId + " was requested");
return null;
}
String key = "" + siteNodeId;
SiteNodeVO siteNodeVO = (SiteNodeVO)CacheController.getCachedObjectFromAdvancedCache("siteNodeCache", key);
if(siteNodeVO != null)
{
if(siteNodeVO.getChildCount() == null)
logger.info("Fail: a siteNodeVO was read the old way...");
//logger.info("There was an cached siteNodeVO:" + siteNodeVO);
}
else
{
StringBuffer SQL = new StringBuffer();
Timer t = new Timer();
if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true"))
{
SQL.append("CALL SQL select sn.siNoId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiNoId, sn.metaInfoContentId, sn.repositoryId, sn.siNoTypeDefId, sn.creator, (select count(*) from cmSiNo sn2 where sn2.parentSiNoId = sn.siNoId) AS childCount, snv.siNoVerId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiNo sn, cmSiNoVer snv ");
SQL.append("where ");
SQL.append("sn.siNoId = $1 ");
SQL.append("AND snv.siNoId = sn.siNoId ");
SQL.append("AND snv.siNoVerId = ( ");
SQL.append(" select max(siNoVerId) from cmSiNoVer snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siNoId = snv.siNoId AND ");
//SQL.append(" snv2.isActive = $2 AND snv2.stateId >= $3 ");
SQL.append(" snv2.stateId >= $2 ");
SQL.append(" ) ");
SQL.append("order by sn.siNoId DESC AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
else
{
SQL.append("CALL SQL select sn.siteNodeId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiteNodeId, sn.metaInfoContentId, sn.repositoryId, sn.siteNodeTypeDefinitionId, sn.creator, (select count(*) from cmSiteNode sn2 where sn2.parentSiteNodeId = sn.siteNodeId) AS childCount, snv.siteNodeVersionId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiteNode sn, cmSiteNodeVersion snv ");
SQL.append("where ");
SQL.append("sn.siteNodeId = $1 ");
SQL.append("AND snv.siteNodeId = sn.siteNodeId ");
SQL.append("AND snv.siteNodeVersionId = ( ");
SQL.append(" select max(siteNodeVersionId) from cmSiteNodeVersion snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siteNodeId = snv.siteNodeId AND ");
//SQL.append(" snv2.isActive = $2 AND snv2.stateId >= $3 ");
SQL.append(" snv2.stateId >= $2 ");
SQL.append(" ) ");
SQL.append("order by sn.siteNodeId DESC AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
//System.out.println("SQL:" + SQL);
//logger.info("SQL:" + SQL);
//logger.info("parentSiteNodeId:" + parentSiteNodeId);
//logger.info("showDeletedItems:" + showDeletedItems);
OQLQuery oql = db.getOQLQuery(SQL.toString());
oql.bind(siteNodeId);
//oql.bind(true);
oql.bind(new Integer(CmsPropertyHandler.getOperatingMode()));
QueryResults results = oql.execute(Database.READONLY);
//t.printElapsedTime("Executed query.....");
if (results.hasMore())
{
SiteNode siteNode = (SiteNode)results.next();
siteNodeVO = siteNode.getValueObject();
if(!skipCaching)
{
String siteNodeCacheKey = "" + siteNode.getValueObject().getId();
CacheController.cacheObjectInAdvancedCache("siteNodeCache", siteNodeCacheKey, siteNode.getValueObject());
}
}
else
logger.warn("SiteNode not found: " + siteNodeId);
results.close();
oql.close();
if(siteNodeVO == null)
{
logger.info("Falling back to old forgiving logic for siteNodeId: " + siteNodeId + ". It must be in trouble.");
siteNodeVO = getSiteNodeVOWithIdIfFailed(siteNodeId, db);
}
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getSmallestSiteNodeVOWithId", t.getElapsedTime());
}
if(siteNodeVO != null && siteNodeVO.getMetaInfoContentId() != null)
metaInfoSiteNodeIdMap.put(siteNodeVO.getMetaInfoContentId(), siteNodeVO.getId());
return siteNodeVO;
}
/**
* This method gets the siteNodeVO with the given id
*/
public SiteNodeVO getSiteNodeVOWithIdNoStateCheck(Integer siteNodeId, Database db) throws SystemException, Bug, Exception
{
String key = "" + siteNodeId;
SiteNodeVO siteNodeVO = (SiteNodeVO)CacheController.getCachedObjectFromAdvancedCache("siteNodeCacheWithLatestVersion", key);
if(siteNodeVO != null)
{
if(siteNodeVO.getChildCount() == null)
logger.info("Fail: a siteNodeVO was read the old way...");
//logger.info("There was an cached siteNodeVO:" + siteNodeVO);
}
else
{
StringBuffer SQL = new StringBuffer();
Timer t = new Timer();
if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true"))
{
SQL.append("CALL SQL select sn.siNoId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiNoId, sn.metaInfoContentId, sn.repositoryId, sn.siNoTypeDefId, sn.creator, (select count(*) from cmSiNo sn2 where sn2.parentSiNoId = sn.siNoId) AS childCount, snv.siNoVerId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiNo sn, cmSiNoVer snv ");
SQL.append("where ");
SQL.append("sn.siNoId = $1 ");
SQL.append("AND snv.siNoId = sn.siNoId ");
SQL.append("AND snv.siNoVerId = ( ");
SQL.append(" select max(siNoVerId) from cmSiNoVer snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siNoId = snv.siNoId");
SQL.append(" ) ");
SQL.append("order by sn.siNoId DESC AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
else
{
SQL.append("CALL SQL select sn.siteNodeId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiteNodeId, sn.metaInfoContentId, sn.repositoryId, sn.siteNodeTypeDefinitionId, sn.creator, (select count(*) from cmSiteNode sn2 where sn2.parentSiteNodeId = sn.siteNodeId) AS childCount, snv.siteNodeVersionId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiteNode sn, cmSiteNodeVersion snv ");
SQL.append("where ");
SQL.append("sn.siteNodeId = $1 ");
SQL.append("AND snv.siteNodeId = sn.siteNodeId ");
SQL.append("AND snv.siteNodeVersionId = ( ");
SQL.append(" select max(siteNodeVersionId) from cmSiteNodeVersion snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siteNodeId = snv.siteNodeId");
SQL.append(" ) ");
SQL.append("order by sn.siteNodeId DESC AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
//System.out.println("SQL:" + SQL);
//System.out.println("siteNodeId:" + siteNodeId);
//logger.info("SQL:" + SQL);
//logger.info("parentSiteNodeId:" + parentSiteNodeId);
//logger.info("showDeletedItems:" + showDeletedItems);
OQLQuery oql = db.getOQLQuery(SQL.toString());
oql.bind(siteNodeId);
QueryResults results = oql.execute(Database.READONLY);
//t.printElapsedTime("Executed query.....");
if (results.hasMore())
{
SmallestSiteNodeImpl siteNode = (SmallestSiteNodeImpl)results.next();
//System.out.println("siteNode:" + siteNode.getSiteNodeVersionId() + ":" + siteNode.getValueObject().getSiteNodeVersionId() + ":" + siteNode.getValueObject().getVersionModifier() + ":" + siteNode.getValueObject().getModifiedDateTime());
siteNodeVO = siteNode.getValueObject();
String siteNodeCacheKey = "" + siteNode.getValueObject().getId();
CacheController.cacheObjectInAdvancedCache("siteNodeCacheWithLatestVersion", siteNodeCacheKey, siteNode.getValueObject(), new String[]{CacheController.getPooledString(3, siteNode.getValueObject().getId())}, true);
}
results.close();
oql.close();
if(siteNodeVO == null)
{
logger.error("Falling back to old forgiving logic for siteNodeId: " + siteNodeId + ". It must be in trouble.");
siteNodeVO = getSiteNodeVOWithIdIfFailed(siteNodeId, db);
}
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getSmallestSiteNodeVOWithId", t.getElapsedTime());
}
return siteNodeVO;
}
public Map<Integer,SiteNodeVO> getSiteNodeVOMap(Integer[] siteNodeIds, Database db) throws SystemException, Bug, Exception
{
Timer t = new Timer();
Map<Integer,SiteNodeVO> siteNodeVOMap = new HashMap<Integer,SiteNodeVO>();
//System.out.println("siteNodeIds to fetch:" + siteNodeIds);
List<Integer> uncachedSiteNodeIds = new ArrayList<Integer>();
for(Integer siteNodeId : siteNodeIds)
{
SiteNodeVO siteNodeVO = getSiteNodeVOWithIdIfInCache(siteNodeId,db);
if(siteNodeVO != null)
{
siteNodeVOMap.put(siteNodeId, siteNodeVO);
}
else
uncachedSiteNodeIds.add(siteNodeId);
}
siteNodeIds = uncachedSiteNodeIds.toArray(new Integer[uncachedSiteNodeIds.size()]);
//System.out.println("siteNodeIds to really fetch:" + siteNodeIds);
StringBuilder variables = new StringBuilder();
for(int i=0; i<siteNodeIds.length; i++)
variables.append("$" + (i+3) + (i+1!=siteNodeIds.length ? "," : ""));
//System.out.println("siteNodeIds:" + siteNodeIds.length);
//System.out.println("variables:" + variables);
StringBuffer SQL = new StringBuffer();
if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true"))
{
SQL.append("CALL SQL select sn.siNoId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiNoId, sn.metaInfoContentId, sn.repositoryId, sn.siNoTypeDefId, sn.creator, (select count(*) from cmSiNo sn2 where sn2.parentSiNoId = sn.siNoId) AS childCount, snv.siNoVerId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiNo sn, cmSiNoVer snv ");
SQL.append("where ");
SQL.append("snv.siNoId = sn.siNoId ");
SQL.append("AND snv.siNoVerId = ( ");
SQL.append(" select max(siNoVerId) from cmSiNoVer snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siNoId = snv.siNoId AND ");
SQL.append(" snv2.isActive = $1 AND snv2.stateId >= $2 ");
SQL.append(" ) ");
SQL.append("AND sn.siNoId IN (" + variables + ") ");
SQL.append("order by sn.siNoId DESC AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
else
{
SQL.append("CALL SQL select sn.siteNodeId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiteNodeId, sn.metaInfoContentId, sn.repositoryId, sn.siteNodeTypeDefinitionId, sn.creator, (select count(*) from cmSiteNode sn2 where sn2.parentSiteNodeId = sn.siteNodeId) AS childCount, snv.siteNodeVersionId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiteNode sn, cmSiteNodeVersion snv ");
SQL.append("where ");
SQL.append("snv.siteNodeId = sn.siteNodeId ");
SQL.append("AND snv.siteNodeVersionId = ( ");
SQL.append(" select max(siteNodeVersionId) from cmSiteNodeVersion snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siteNodeId = snv.siteNodeId AND ");
SQL.append(" snv2.isActive = $1 AND snv2.stateId >= $2 ");
SQL.append(" ) ");
SQL.append("AND sn.siNoId IN (" + variables + ") ");
SQL.append("order by sn.siteNodeId DESC AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
//System.out.println("SQL:" + SQL);
//logger.info("SQL:" + SQL);
//logger.info("parentSiteNodeId:" + parentSiteNodeId);
//logger.info("showDeletedItems:" + showDeletedItems);
OQLQuery oql = db.getOQLQuery(SQL.toString());
oql.bind(true);
oql.bind(new Integer(CmsPropertyHandler.getOperatingMode()));
for(Integer entityId : siteNodeIds)
oql.bind(entityId);
QueryResults results = oql.execute(Database.READONLY);
while (results.hasMore())
{
SiteNode siteNode = (SiteNode)results.next();
SiteNodeVO siteNodeVO = siteNode.getValueObject();
siteNodeVOMap.put(siteNodeVO.getId(), siteNodeVO);
}
results.close();
oql.close();
return siteNodeVOMap;
}
/**
* This method gets the siteNodeVO with the given id
*/
public Map<Integer,SiteNodeVO> getSiteNodeVOMapWithNoStateCheck(List<Integer> siteNodeIds) throws SystemException, Bug, Exception
{
Map<Integer,SiteNodeVO> siteNodeVOMap = null;
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
siteNodeVOMap = getSiteNodeVOMapWithNoStateCheck(siteNodeIds, db);
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return siteNodeVOMap;
}
public Map<Integer,SiteNodeVO> getSiteNodeVOMapWithNoStateCheck(List<Integer> siteNodeVersionIds, Database db) throws SystemException, Bug, Exception
{
Timer t = new Timer();
Map<Integer,SiteNodeVO> siteNodeVOMap = new HashMap<Integer,SiteNodeVO>();
if(siteNodeVersionIds == null || siteNodeVersionIds.size() == 0)
return siteNodeVOMap;
//System.out.println("siteNodeVersionIds to really fetch:" + siteNodeVersionIds);
StringBuilder variables = new StringBuilder();
for(int i=0; i<siteNodeVersionIds.size(); i++)
variables.append("$" + (i+1) + (i+1!=siteNodeVersionIds.size() ? "," : ""));
//System.out.println("siteNodeIds:" + siteNodeIds.length);
//System.out.println("variables:" + variables);
StringBuffer SQL = new StringBuffer();
if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true"))
{
SQL.append("CALL SQL select sn.siNoId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiNoId, sn.metaInfoContentId, sn.repositoryId, sn.siNoTypeDefId, sn.creator, (select count(*) from cmSiNo sn2 where sn2.parentSiNoId = sn.siNoId) AS childCount, snv.siNoVerId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiNo sn, cmSiNoVer snv ");
SQL.append("where ");
SQL.append("snv.siNoId = sn.siNoId ");
SQL.append("AND snv.siNoVerId IN (" + variables + ") ");
SQL.append("order by sn.siNoId DESC AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
else
{
SQL.append("CALL SQL select sn.siteNodeId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiteNodeId, sn.metaInfoContentId, sn.repositoryId, sn.siteNodeTypeDefinitionId, sn.creator, (select count(*) from cmSiteNode sn2 where sn2.parentSiteNodeId = sn.siteNodeId) AS childCount, snv.siteNodeVersionId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiteNode sn, cmSiteNodeVersion snv ");
SQL.append("where ");
SQL.append("snv.siteNodeId = sn.siteNodeId ");
SQL.append("AND snv.siteNodeVersionId IN (" + variables + ") ");
SQL.append("order by sn.siteNodeId DESC AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
OQLQuery oql = db.getOQLQuery(SQL.toString());
for(Integer entityId : siteNodeVersionIds)
oql.bind(entityId);
QueryResults results = oql.execute(Database.READONLY);
//t.printElapsedTime("Executed query.....");
while (results.hasMore())
{
SmallestSiteNodeImpl siteNode = (SmallestSiteNodeImpl)results.next();
SiteNodeVO siteNodeVO = siteNode.getValueObject();
siteNodeVOMap.put(siteNodeVO.getSiteNodeVersionId(), siteNodeVO);
}
//t.printElapsedTime("siteNodeVOMap populated:" + siteNodeVOMap.size());
results.close();
oql.close();
return siteNodeVOMap;
}
/**
* This method gets the siteNodeVO with the given id
*/
public SiteNodeVO getSmallSiteNodeVOWithId(Integer siteNodeId, Database db) throws SystemException, Bug, Exception
{
return getSiteNodeVOWithId(siteNodeId, db); //(SiteNodeVO) getVOWithId(SmallSiteNodeImpl.class, siteNodeId, db);
}
/**
* This method gets the siteNodeVO with the given id
*/
public static SiteNodeVO getSiteNodeVOWithIdIfFailed(Integer siteNodeId, Database db) throws SystemException, Bug, Exception
{
try
{
return (SiteNodeVO) getVOWithId(SmallSiteNodeImpl.class, siteNodeId, db);
}
catch (Exception e)
{
return null;
}
}
public SiteNode getSiteNodeWithId(Integer siteNodeId, Database db) throws SystemException, Bug
{
return getSiteNodeWithId(siteNodeId, db, false);
}
public SmallSiteNodeImpl getSmallSiteNodeWithId(Integer siteNodeId, Database db) throws SystemException, Bug
{
return (SmallSiteNodeImpl) getObjectWithId(SmallSiteNodeImpl.class, siteNodeId, db);
}
public static SiteNode getSiteNodeWithId(Integer siteNodeId, Database db, boolean readOnly) throws SystemException, Bug
{
SiteNode siteNode = null;
try
{
RequestAnalyser.getRequestAnalyser().incApproximateNumberOfDatabaseQueries();
if(readOnly)
siteNode = (SiteNode)db.load(org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl.class, siteNodeId, Database.READONLY);
else
{
logger.info("Loading " + siteNodeId + " in read/write mode.");
siteNode = (SiteNode)db.load(org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl.class, siteNodeId);
}
}
catch(Exception e)
{
logger.warn("An error occurred when we tried to fetch the SiteNode. Reason:" + e.getMessage() + ". Not retrying...");
throw new SystemException("An error occurred when we tried to fetch the SiteNode. Reason:" + e.getMessage(), e);
}
finally
{
RequestAnalyser.getRequestAnalyser().decApproximateNumberOfDatabaseQueries();
}
if(siteNode == null)
{
throw new Bug("The SiteNode with id [" + siteNodeId + "] was not found in SiteNodeHelper.getSiteNodeWithId. This should never happen.");
}
return siteNode;
}
/**
* This method deletes a siteNode and also erases all the children and all versions.
*/
public void delete(Integer siteNodeId, boolean forceDelete, InfoGluePrincipal infogluePrincipal) throws ConstraintException, SystemException
{
SiteNodeVO siteNodeVO = SiteNodeControllerProxy.getController().getSiteNodeVOWithId(siteNodeId);
delete(siteNodeVO, infogluePrincipal, forceDelete);
}
/**
* This method deletes a siteNode and also erases all the children and all versions.
*/
public void delete(SiteNodeVO siteNodeVO, InfoGluePrincipal infogluePrincipal, boolean forceDelete) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
delete(siteNodeVO, db, forceDelete, infogluePrincipal);
commitTransaction(db);
}
catch(ConstraintException ce)
{
logger.warn("An error occurred so we should not complete the transaction:" + ce);
rollbackTransaction(db);
throw ce;
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
}
/**
* This method deletes a siteNode and also erases all the children and all versions.
*/
public void delete(SiteNodeVO siteNodeVO, Database db, boolean forceDelete, InfoGluePrincipal infogluePrincipal) throws ConstraintException, SystemException, Exception
{
List referenceBeanList = RegistryController.getController().getReferencingObjectsForSiteNode(siteNodeVO.getId(), -1, false, db);
if(referenceBeanList != null && referenceBeanList.size() > 0 && !forceDelete)
throw new ConstraintException("SiteNode.stateId", "3405");
List<SiteNodeVO> children = getChildSiteNodeVOList(siteNodeVO.getId(), true, db, null);
for(SiteNodeVO childSiteNode : children)
{
delete(childSiteNode, db, forceDelete, infogluePrincipal);
}
if(forceDelete || getIsDeletable(siteNodeVO, infogluePrincipal, db))
{
SiteNodeVersionController.deleteVersionsForSiteNode(siteNodeVO, db, infogluePrincipal);
//ServiceBindingController.deleteServiceBindingsReferencingSiteNode(siteNodeVO, db);
SmallSiteNodeImpl siteNode = getSmallSiteNodeWithId(siteNodeVO.getSiteNodeId(), db);
db.remove(siteNode);
}
else
{
throw new ConstraintException("SiteNodeVersion.stateId", "3400");
}
}
/**
* This method deletes a siteNode and also erases all the children and all versions.
*/
public void delete(SiteNodeVO siteNodeVO, InfoGluePrincipal infogluePrincipal) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
delete(siteNodeVO, db, infogluePrincipal);
commitTransaction(db);
}
catch(ConstraintException ce)
{
logger.info("An error occurred so we should not complete the transaction:" + ce, ce);
rollbackTransaction(db);
throw ce;
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
}
/**
* This method deletes a siteNode and also erases all the children and all versions.
*/
public void delete(SiteNodeVO siteNodeVO, Database db, InfoGluePrincipal infogluePrincipal) throws ConstraintException, SystemException, Exception
{
delete(siteNodeVO, db, false, infogluePrincipal);
}
/**
* This method returns true if the sitenode does not have any published siteNodeversions or
* are restricted in any other way.
*/
private static boolean getIsDeletable(SiteNodeVO siteNodeVO, InfoGluePrincipal infogluePrincipal, Database db) throws SystemException, Exception
{
boolean isDeletable = true;
SiteNodeVersionVO latestSiteNodeVersion = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(db, siteNodeVO.getId());
if(latestSiteNodeVersion != null && latestSiteNodeVersion.getIsProtected().equals(SiteNodeVersionVO.YES))
{
boolean hasAccess = AccessRightController.getController().getIsPrincipalAuthorized(db, infogluePrincipal, "SiteNodeVersion.DeleteSiteNode", "" + latestSiteNodeVersion.getId());
if(!hasAccess)
return false;
}
List<SiteNodeVersionVO> siteNodeVersions = SiteNodeVersionController.getController().getSiteNodeVersionVOList(db, siteNodeVO.getId());
if(siteNodeVersions != null)
{
Iterator<SiteNodeVersionVO> versionIterator = siteNodeVersions.iterator();
while (versionIterator.hasNext())
{
SiteNodeVersionVO siteNodeVersion = versionIterator.next();
if(siteNodeVersion.getStateId().intValue() == SiteNodeVersionVO.PUBLISHED_STATE.intValue() && siteNodeVersion.getIsActive().booleanValue() == true)
{
logger.warn("The siteNode had a published version so we cannot delete it..");
isDeletable = false;
break;
}
}
}
return isDeletable;
}
public SiteNodeVO create(Integer parentSiteNodeId, Integer siteNodeTypeDefinitionId, InfoGluePrincipal infoGluePrincipal, Integer repositoryId, SiteNodeVO siteNodeVO) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
SiteNode siteNode = null;
beginTransaction(db);
try
{
//Here you might want to add some validate functonality?
siteNode = create(db, parentSiteNodeId, siteNodeTypeDefinitionId, infoGluePrincipal, repositoryId, siteNodeVO);
//If any of the validations or setMethods reported an error, we throw them up now before create.
ceb.throwIfNotEmpty();
commitTransaction(db);
}
catch(ConstraintException ce)
{
logger.warn("An error occurred so we should not complete the transaction:" + ce, ce);
//rollbackTransaction(db);
throw ce;
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
//rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return siteNode.getValueObject();
}
public SiteNode create(Database db, Integer parentSiteNodeId, Integer siteNodeTypeDefinitionId, InfoGluePrincipal infoGluePrincipal, Integer repositoryId, SiteNodeVO siteNodeVO) throws SystemException, Exception
{
SiteNode siteNode = null;
logger.info("******************************************");
logger.info("parentSiteNode:" + parentSiteNodeId);
logger.info("siteNodeTypeDefinition:" + siteNodeTypeDefinitionId);
logger.info("repository:" + repositoryId);
logger.info("******************************************");
//Fetch related entities here if they should be referenced
SiteNode parentSiteNode = null;
SiteNodeTypeDefinition siteNodeTypeDefinition = null;
if(parentSiteNodeId != null && parentSiteNodeId != -1)
{
parentSiteNode = getSiteNodeWithId(parentSiteNodeId, db);
if(repositoryId == null)
repositoryId = parentSiteNode.getRepository().getRepositoryId();
}
if(siteNodeTypeDefinitionId != null)
siteNodeTypeDefinition = SiteNodeTypeDefinitionController.getController().getSiteNodeTypeDefinitionWithId(siteNodeTypeDefinitionId, db);
Repository repository = RepositoryController.getController().getRepositoryWithId(repositoryId, db);
siteNode = new SiteNodeImpl();
siteNode.setValueObject(siteNodeVO);
siteNode.setParentSiteNode((SiteNodeImpl)parentSiteNode);
siteNode.setRepository((RepositoryImpl)repository);
siteNode.setSiteNodeTypeDefinition((SiteNodeTypeDefinitionImpl)siteNodeTypeDefinition);
siteNode.setCreator(infoGluePrincipal.getName());
db.create(siteNode);
if(parentSiteNode != null)
parentSiteNode.getChildSiteNodes().add(siteNode);
//No siteNode is an island (humhum) so we also have to create an siteNodeVersion for it.
SiteNodeVersionController.createInitialSiteNodeVersion(db, siteNode, infoGluePrincipal);
return siteNode;
}
public PureSiteNodeImpl createPure(Database db, Integer parentSiteNodeId, Integer siteNodeTypeDefinitionId, InfoGluePrincipal infoGluePrincipal, Integer repositoryId, SiteNodeVO siteNodeVO, int childCount) throws SystemException, Exception
{
logger.info("******************************************");
logger.info("parentSiteNode:" + parentSiteNodeId);
logger.info("siteNodeTypeDefinition:" + siteNodeTypeDefinitionId);
logger.info("repository:" + repositoryId);
logger.info("******************************************");
if(parentSiteNodeId != null && parentSiteNodeId != -1 && repositoryId == null)
{
System.out.println("When was repo null: " + parentSiteNodeId + ":" + infoGluePrincipal.getName());
SiteNodeVO parentSiteNodeVO = getSiteNodeVOWithId(parentSiteNodeId, db);
if(parentSiteNodeVO != null && parentSiteNodeVO.getRepositoryId() != null)
repositoryId = parentSiteNodeVO.getRepositoryId();
}
PureSiteNodeImpl siteNode = new PureSiteNodeImpl();
siteNode.setValueObject(siteNodeVO);
siteNode.setParentSiteNodeId(parentSiteNodeId);
siteNode.setRepositoryId(repositoryId);
siteNode.setSiteNodeTypeDefinitionId(siteNodeTypeDefinitionId);
siteNode.setCreator(infoGluePrincipal.getName());
db.create(siteNode);
//No siteNode is an island (humhum) so we also have to create an siteNodeVersion for it.
SiteNodeVersionController.createInitialSiteNodeVersionPure(db, siteNode, infoGluePrincipal, childCount);
return siteNode;
}
/**
* This method creates a new SiteNode and an siteNodeVersion. It does not commit the transaction however.
*
* @param db
* @param parentSiteNodeId
* @param siteNodeTypeDefinitionId
* @param userName
* @param repositoryId
* @param siteNodeVO
* @return
* @throws SystemException
*/
public SiteNode createNewSiteNode(Database db, Integer parentSiteNodeId, Integer siteNodeTypeDefinitionId, InfoGluePrincipal infoGluePrincipal, Integer repositoryId, SiteNodeVO siteNodeVO) throws SystemException
{
SiteNode siteNode = null;
try
{
logger.info("******************************************");
logger.info("parentSiteNode:" + parentSiteNodeId);
logger.info("siteNodeTypeDefinition:" + siteNodeTypeDefinitionId);
logger.info("repository:" + repositoryId);
logger.info("******************************************");
//Fetch related entities here if they should be referenced
SiteNode parentSiteNode = null;
SiteNodeTypeDefinition siteNodeTypeDefinition = null;
if(parentSiteNodeId != null)
{
parentSiteNode = getSiteNodeWithId(parentSiteNodeId, db);
if(repositoryId == null)
repositoryId = parentSiteNode.getRepository().getRepositoryId();
}
if(siteNodeTypeDefinitionId != null)
siteNodeTypeDefinition = SiteNodeTypeDefinitionController.getController().getSiteNodeTypeDefinitionWithId(siteNodeTypeDefinitionId, db);
Repository repository = RepositoryController.getController().getRepositoryWithId(repositoryId, db);
siteNode = new SiteNodeImpl();
siteNode.setValueObject(siteNodeVO);
siteNode.setParentSiteNode((SiteNodeImpl)parentSiteNode);
siteNode.setRepository((RepositoryImpl)repository);
siteNode.setSiteNodeTypeDefinition((SiteNodeTypeDefinitionImpl)siteNodeTypeDefinition);
siteNode.setCreator(infoGluePrincipal.getName());
//siteNode = (SiteNode) createEntity(siteNode, db);
db.create((SiteNode)siteNode);
//No siteNode is an island (humhum) so we also have to create an siteNodeVersion for it.
SiteNodeVersion siteNodeVersion = SiteNodeVersionController.createInitialSiteNodeVersion(db, siteNode, infoGluePrincipal);
List siteNodeVersions = new ArrayList();
siteNodeVersions.add(siteNodeVersion);
siteNode.setSiteNodeVersions(siteNodeVersions);
}
catch(Exception e)
{
throw new SystemException("An error occurred when we tried to create the SiteNode in the database. Reason:" + e.getMessage(), e);
}
return siteNode;
}
/**
* This method returns the value-object of the parent of a specific siteNode.
*/
public static SiteNodeVO getParentSiteNode(Integer siteNodeId) throws SystemException, Bug
{
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
SiteNodeVO parentSiteNodeVO = null;
beginTransaction(db);
try
{
parentSiteNodeVO = getParentSiteNodeVO(siteNodeId, db);
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return parentSiteNodeVO;
}
/**
* This method returns the value-object of the parent of a specific siteNode.
*/
public static SiteNodeVO getParentSiteNodeVO(Integer siteNodeId, Database db) throws SystemException, Bug, Exception
{
SiteNodeVO parent = null;
SiteNodeVO siteNodeVO = getSiteNodeVOWithId(siteNodeId, db);
if(siteNodeVO != null && siteNodeVO.getParentSiteNodeId() != null)
parent = getSiteNodeVOWithId(siteNodeVO.getParentSiteNodeId(), db);
return parent;
}
/**
* This method returns a list of the children a siteNode has.
*/
public List getSiteNodeChildrenVOList(Integer parentSiteNodeId) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
List childrenVOList = null;
beginTransaction(db);
try
{
/*
SiteNode siteNode = getSiteNodeWithId(parentSiteNodeId, db);
Collection children = siteNode.getChildSiteNodes();
childrenVOList = SiteNodeController.toVOList(children);
*/
childrenVOList = getSiteNodeChildrenVOList(parentSiteNodeId, db);
//If any of the validations or setMethods reported an error, we throw them up now before create.
ceb.throwIfNotEmpty();
commitTransaction(db);
}
catch(ConstraintException ce)
{
logger.warn("An error occurred so we should not complete the transaction:" + ce, ce);
rollbackTransaction(db);
throw ce;
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return childrenVOList;
}
/**
* This method returns a list of the children a siteNode has.
*/
public List<SiteNodeVO> getSiteNodeChildrenVOList(Integer parentSiteNodeId, Database db) throws Exception
{
String key = "" + parentSiteNodeId;
if(logger.isInfoEnabled())
logger.info("key:" + key);
List<SiteNodeVO> childrenVOList = (List<SiteNodeVO>)CacheController.getCachedObjectFromAdvancedCache("childSiteNodesCache", key);
if(childrenVOList != null)
{
if(logger.isInfoEnabled())
logger.info("There was an cached cachedChildSiteNodeVOList:" + childrenVOList.size());
return childrenVOList;
}
childrenVOList = new ArrayList<SiteNodeVO>();
/*
StringBuffer SQL = new StringBuffer();
if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true"))
{
SQL.append("CALL SQL select sn.siNoId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.parentSiNoId, sn.metaInfoContentId, sn.repositoryId, sn.siNoTypeDefId, sn.creator, (select count(*) from cmSiNo sn2 where sn2.parentSiNoId = sn.siNoId) AS childCount, 0 as stateId, 2 as isProtected from cmSiNo sn ");
SQL.append("where sn.parentSiNoId = $1 ");
SQL.append("order by sn.siNoId AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
else
{
SQL.append("CALL SQL select sn.siteNodeId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.parentSiteNodeId, sn.metaInfoContentId, sn.repositoryId, sn.siteNodeTypeDefinitionId, sn.creator, (select count(*) from cmSiteNode sn2 where sn2.parentSiteNodeId = sn.siteNodeId) AS childCount, 0 AS stateId, 2 AS isProtected from cmSiteNode sn ");
SQL.append("where sn.parentSiteNodeId = $1 ");
SQL.append("order by sn.siteNodeId AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
*/
StringBuffer SQL = new StringBuffer();
if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true"))
{
SQL.append("CALL SQL select sn.siNoId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiNoId, sn.metaInfoContentId, sn.repositoryId, sn.siNoTypeDefId, sn.creator, (select count(*) from cmSiNo sn2 where sn2.parentSiNoId = sn.siNoId) AS childCount, snv.siNoVerId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiNo sn, cmSiNoVer snv ");
SQL.append("where ");
SQL.append("sn.parentSiNoId = $1 ");
SQL.append("AND snv.siNoId = sn.siNoId ");
SQL.append("AND snv.siNoVerId = ( ");
SQL.append(" select max(siNoVerId) from cmSiNoVer snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siNoId = snv.siNoId ");
SQL.append(" ) ");
SQL.append("order by sn.siNoId AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
else
{
SQL.append("CALL SQL select sn.siteNodeId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiteNodeId, sn.metaInfoContentId, sn.repositoryId, sn.siteNodeTypeDefinitionId, sn.creator, (select count(*) from cmSiteNode sn2 where sn2.parentSiteNodeId = sn.siteNodeId) AS childCount, snv.siteNodeVersionId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiteNode sn, cmSiteNodeVersion snv ");
SQL.append("where ");
SQL.append("sn.parentSiteNodeId = $1 ");
SQL.append("AND snv.siteNodeId = sn.siteNodeId ");
SQL.append("AND snv.siteNodeVersionId = ( ");
SQL.append(" select max(siteNodeVersionId) from cmSiteNodeVersion snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siteNodeId = snv.siteNodeId");
SQL.append(" ) ");
SQL.append("order by sn.siteNodeId AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
//OQLQuery oql = db.getOQLQuery( "SELECT s FROM org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl s WHERE s.parentSiteNode = $1 ORDER BY s.siteNodeId");
OQLQuery oql = db.getOQLQuery(SQL.toString());
oql.bind(parentSiteNodeId);
QueryResults results = oql.execute(Database.READONLY);
while (results.hasMore())
{
SiteNode siteNode = (SiteNode)results.next();
//System.out.println("SiteNode:" + siteNode.getValueObject().getModifiedDateTime());
childrenVOList.add(siteNode.getValueObject());
}
results.close();
oql.close();
CacheController.cacheObjectInAdvancedCache("childSiteNodesCache", key, childrenVOList, new String[]{CacheController.getPooledString(3, parentSiteNodeId)}, true);
return childrenVOList;
}
/**
* This method returns a list of the children a siteNode has.
*/
public List<SiteNodeVersionVO> getSiteNodeVersionVOList(boolean showDeletedItems, Integer stateId, Integer limit) throws Exception
{
List<SiteNodeVersionVO> childrenVOList = new ArrayList<SiteNodeVersionVO>();
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
childrenVOList = getSiteNodeVersionVOList(stateId, limit, db);
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e);
logger.warn("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return childrenVOList;
}
/**
* This method returns a list of the children a siteNode has.
*/
public List<SiteNodeVersionVO> getSiteNodeVersionVOList(Integer stateId, Integer limit, Database db) throws Exception
{
List<SiteNodeVersionVO> childrenVOList = new ArrayList<SiteNodeVersionVO>();
Timer t = new Timer();
StringBuffer SQL = new StringBuffer();
if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true"))
{
SQL.append("CALL SQL select * from (select snv.siNoVerId, snv.stateId, snv.verNumber, snv.modifiedDateTime, snv.verComment, snv.isCheckedOut, snv.isActive, snv.isProtected, snv.disablePageCache, snv.disableEditOnSight, snv.disableLanguages, snv.contentType, snv.pageCacheKey, snv.pageCacheTimeout, snv.disableForceIDCheck, snv.forceProtocolChange, snv.siNoId, snv.versionModifier, snv.stateId, snv.isProtected from cmSiNo sn, cmSiNoVer snv ");
SQL.append("where ");
SQL.append("snv.siNoId = sn.siNoId ");
SQL.append("AND snv.siNoVerId = ( ");
SQL.append(" select max(siNoVerId) from cmSiNoVer snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siNoId = snv.siNoId AND ");
SQL.append(" snv2.isActive = $1 AND snv2.stateId >= $2 ");
SQL.append(" ) ");
SQL.append("order by sn.siNoId DESC) where ROWNUM <= $3 AS org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeVersionImpl");
}
else
{
SQL.append("CALL SQL select snv.siteNodeVersionId, snv.stateId, snv.versionNumber, snv.modifiedDateTime, snv.versionComment, snv.isCheckedOut, snv.isActive, snv.isProtected, snv.disablePageCache, snv.disableEditOnSight, snv.disableLanguages, snv.contentType, snv.pageCacheKey, snv.pageCacheTimeout, snv.disableForceIDCheck, snv.forceProtocolChange, snv.siteNodeId, snv.versionModifier, snv.stateId, snv.isProtected from cmSiteNode sn, cmSiteNodeVersion snv ");
SQL.append("where ");
SQL.append("snv.siteNodeId = sn.siteNodeId ");
SQL.append("AND snv.siteNodeVersionId = ( ");
SQL.append(" select max(siteNodeVersionId) from cmSiteNodeVersion snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siteNodeId = snv.siteNodeId AND ");
SQL.append(" snv2.isActive = $1 AND snv2.stateId >= $2 ");
SQL.append(" ) ");
SQL.append("order by sn.siteNodeId DESC LIMIT $3 AS org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeVersionImpl");
}
//logger.info("SQL:" + SQL);
//logger.info("parentSiteNodeId:" + parentSiteNodeId);
//logger.info("showDeletedItems:" + showDeletedItems);
OQLQuery oql = db.getOQLQuery(SQL.toString());
oql.bind(true);
oql.bind(stateId);
oql.bind(limit);
QueryResults results = oql.execute(Database.READONLY);
t.printElapsedTime("Executed query.....");
while (results.hasMore())
{
SiteNodeVersion siteNodeVersion = (SiteNodeVersion)results.next();
childrenVOList.add(siteNodeVersion.getValueObject());
String key = "" + siteNodeVersion.getValueObject().getSiteNodeId();
String groupKey1 = CacheController.getPooledString(4, siteNodeVersion.getId());
String groupKey2 = CacheController.getPooledString(3, siteNodeVersion.getValueObject().getSiteNodeId());
CacheController.cacheObjectInAdvancedCache("latestSiteNodeVersionCache", key, siteNodeVersion.getValueObject(), new String[]{groupKey1.toString(), groupKey2.toString()}, true);
}
results.close();
oql.close();
t.printElapsedTime("getSiteNodeVersionVOList " + childrenVOList.size() + " took");
return childrenVOList;
}
/**
* This method returns a list of the children a siteNode has.
*/
public List<SiteNodeVO> getSiteNodeVOList(boolean showDeletedItems, Integer stateId, Integer limit) throws Exception
{
List<SiteNodeVO> childrenVOList = new ArrayList<SiteNodeVO>();
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
childrenVOList = getSiteNodeVOList(stateId, limit, db);
commitTransaction(db);
}
catch(Exception e)
{
e.printStackTrace();
logger.error("An error occurred so we should not complete the transaction:" + e);
logger.warn("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return childrenVOList;
}
/**
* This method returns a list of the children a siteNode has.
*/
public List<SiteNodeVO> getSiteNodeVOList(Integer stateId, Integer limit, Database db) throws Exception
{
List<SiteNodeVO> childrenVOList = new ArrayList<SiteNodeVO>();
StringBuffer SQL = new StringBuffer();
if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true"))
{
SQL.append("CALL SQL select * from (select sn.siNoId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiNoId, sn.metaInfoContentId, sn.repositoryId, sn.siNoTypeDefId, sn.creator, (select count(*) from cmSiNo sn2 where sn2.parentSiNoId = sn.siNoId) AS childCount, snv.siNoVerId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiNo sn, cmSiNoVer snv ");
SQL.append("where ");
SQL.append("snv.siNoId = sn.siNoId ");
SQL.append("AND snv.siNoVerId = ( ");
SQL.append(" select max(siNoVerId) from cmSiNoVer snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siNoId = snv.siNoId AND ");
SQL.append(" snv2.isActive = $1 AND snv2.stateId >= $2 ");
SQL.append(" ) ");
SQL.append("order by sn.parentSiNoId ASC, snv.sortOrder ASC, sn.name ASC, sn.siNoId DESC) where ROWNUM <= $3 AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
else
{
SQL.append("CALL SQL select sn.siteNodeId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiteNodeId, sn.metaInfoContentId, sn.repositoryId, sn.siteNodeTypeDefinitionId, sn.creator, (select count(*) from cmSiteNode sn2 where sn2.parentSiteNodeId = sn.siteNodeId) AS childCount, snv.siteNodeVersionId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiteNode sn, cmSiteNodeVersion snv ");
SQL.append("where ");
SQL.append("snv.siteNodeId = sn.siteNodeId ");
SQL.append("AND snv.siteNodeVersionId = ( ");
SQL.append(" select max(siteNodeVersionId) from cmSiteNodeVersion snv3 ");
SQL.append(" WHERE ");
SQL.append(" snv3.siteNodeId = snv.siteNodeId AND ");
SQL.append(" snv3.isActive = $1 AND snv3.stateId >= $2 ");
SQL.append(" ) ");
SQL.append("order by sn.parentSiteNodeId ASC, snv.sortOrder ASC, sn.name ASC, sn.siteNodeId DESC LIMIT $3 AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
logger.info("SQL:" + SQL);
//logger.info("parentSiteNodeId:" + parentSiteNodeId);
//logger.info("showDeletedItems:" + showDeletedItems);
OQLQuery oql = db.getOQLQuery(SQL.toString());
oql.bind(true);
oql.bind(stateId);
oql.bind(limit);
QueryResults results = oql.execute(Database.READONLY);
//t.printElapsedTime("Executed query.....");
int lastBegunParentSiteNodeId = -1;
while (results.hasMore())
{
SiteNode siteNode = (SiteNode)results.next();
childrenVOList.add(siteNode.getValueObject());
if(siteNode.getValueObject().getParentSiteNodeId() !=null && lastBegunParentSiteNodeId != siteNode.getValueObject().getParentSiteNodeId())
lastBegunParentSiteNodeId = siteNode.getValueObject().getParentSiteNodeId();
String key = "" + siteNode.getValueObject().getParentSiteNodeId();
List<SiteNodeVO> siteNodeChildrenVOList = (List<SiteNodeVO>)CacheController.getCachedObjectFromAdvancedCache("childSiteNodesCache", key);
if(siteNodeChildrenVOList == null)
{
siteNodeChildrenVOList = new ArrayList<SiteNodeVO>();
CacheController.cacheObjectInAdvancedCache("childSiteNodesCache", key, siteNodeChildrenVOList, new String[] {CacheController.getPooledString(3, siteNode.getValueObject().getParentSiteNodeId())}, true);
}
boolean contains = false;
for(SiteNodeVO existingSiteNodeVO : siteNodeChildrenVOList)
{
if(existingSiteNodeVO.getId().equals(siteNode.getValueObject().getId()))
{
contains = true;
break;
}
}
if(!contains)
{
siteNodeChildrenVOList.add(siteNode.getValueObject());
String siteNodeCacheKey = "" + siteNode.getValueObject().getId();
CacheController.cacheObjectInAdvancedCache("siteNodeCache", siteNodeCacheKey, siteNode.getValueObject());
}
}
logger.info("Clearing last node as we are probably not done with all it's children");
CacheController.clearCacheForGroup("childSiteNodesCache", CacheController.getPooledString(3, lastBegunParentSiteNodeId));
CacheController.clearCache("siteNodeCache", CacheController.getPooledString(3, lastBegunParentSiteNodeId));
results.close();
oql.close();
return childrenVOList;
}
/**
* This method returns a list of the children a siteNode has.
*/
public List getSiteNodeChildren(Integer parentSiteNodeId) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
List childrenVOList = null;
beginTransaction(db);
try
{
SiteNode siteNode = getSiteNodeWithId(parentSiteNodeId, db);
Collection children = siteNode.getChildSiteNodes();
childrenVOList = SiteNodeController.toVOList(children);
//If any of the validations or setMethods reported an error, we throw them up now before create.
ceb.throwIfNotEmpty();
commitTransaction(db);
}
catch(ConstraintException ce)
{
logger.warn("An error occurred so we should not complete the transaction:" + ce, ce);
rollbackTransaction(db);
throw ce;
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return childrenVOList;
}
/**
* This method returns a list of the children a siteNode has.
*/
/*
public List<SiteNodeVO> getChildSiteNodeVOList(Integer parentSiteNodeId, boolean showDeletedItems, Database db) throws Exception
{
return getChildSiteNodeVOList(parentSiteNodeId, showDeletedItems, db, null);
}
*/
/**
* This method returns a list of the children a siteNode has.
*/
public List<SiteNodeVO> getChildSiteNodeVOList(Integer parentSiteNodeId, boolean showDeletedItems, Database db, Integer sortLanguageId) throws Exception
{
String key = "" + parentSiteNodeId + "_" + showDeletedItems + "_" + sortLanguageId;
if(!CmsPropertyHandler.getAllowLocalizedSortAndVisibilityProperties())
key = "" + parentSiteNodeId + "_" + showDeletedItems;
if(logger.isInfoEnabled())
logger.info("key:" + key);
List<SiteNodeVO> childrenVOList = (List<SiteNodeVO>)CacheController.getCachedObjectFromAdvancedCache("childSiteNodesCache", key);
if(childrenVOList != null)
{
if(logger.isInfoEnabled())
logger.info("There was an cached cachedChildSiteNodeVOList:" + childrenVOList.size());
return childrenVOList;
}
childrenVOList = new ArrayList<SiteNodeVO>();
Timer t = new Timer();
StringBuffer SQL = new StringBuffer();
if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true"))
{
SQL.append("CALL SQL select sn.siNoId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiNoId, sn.metaInfoContentId, sn.repositoryId, sn.siNoTypeDefId, sn.creator, (select count(*) from cmSiNo sn2 where sn2.parentSiNoId = sn.siNoId) AS childCount, snv.siNoVerId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiNo sn, cmSiNoVer snv ");
SQL.append("where ");
SQL.append("sn.parentSiNoId = $1 ");
SQL.append("AND sn.isDeleted = $2 ");
SQL.append("AND snv.siNoId = sn.siNoId ");
SQL.append("AND snv.siNoVerId = ( ");
SQL.append(" select max(siNoVerId) from cmSiNoVer snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siNoId = snv.siNoId AND ");
SQL.append(" snv2.isActive = $3 AND snv2.stateId >= $4 ");
SQL.append(" ) ");
SQL.append("order by snv.sortOrder ASC, sn.name ASC, sn.siNoId DESC AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
else
{
SQL.append("CALL SQL select sn.siteNodeId, sn.name, sn.publishDateTime, sn.expireDateTime, sn.isBranch, sn.isDeleted, sn.parentSiteNodeId, sn.metaInfoContentId, sn.repositoryId, sn.siteNodeTypeDefinitionId, sn.creator, (select count(*) from cmSiteNode sn2 where sn2.parentSiteNodeId = sn.siteNodeId) AS childCount, snv.siteNodeVersionId, snv.sortOrder, snv.isHidden, snv.stateId, snv.isProtected, snv.versionModifier, snv.modifiedDateTime, 0 AS languageId, '' as attributes from cmSiteNode sn, cmSiteNodeVersion snv ");
SQL.append("where ");
SQL.append("sn.parentSiteNodeId = $1 ");
SQL.append("AND sn.isDeleted = $2 ");
SQL.append("AND snv.siteNodeId = sn.siteNodeId ");
SQL.append("AND snv.siteNodeVersionId = ( ");
SQL.append(" select max(siteNodeVersionId) from cmSiteNodeVersion snv2 ");
SQL.append(" WHERE ");
SQL.append(" snv2.siteNodeId = snv.siteNodeId AND ");
SQL.append(" snv2.isActive = $3 AND snv2.stateId >= $4 ");
SQL.append(" ) ");
SQL.append("order by snv.sortOrder ASC, sn.name ASC, sn.siteNodeId DESC AS org.infoglue.cms.entities.structure.impl.simple.SmallestSiteNodeImpl");
}
//logger.info("SQL 2:" + SQL);
//logger.info("parentSiteNodeId:" + parentSiteNodeId);
//logger.info("showDeletedItems:" + showDeletedItems);
OQLQuery oql = db.getOQLQuery(SQL.toString());
oql.bind(parentSiteNodeId);
oql.bind(showDeletedItems);
oql.bind(true);
oql.bind(0);
QueryResults results = oql.execute(Database.READONLY);
while (results.hasMore())
{
SiteNode siteNode = (SiteNode)results.next();
if(CmsPropertyHandler.getAllowLocalizedSortAndVisibilityProperties() && sortLanguageId != null)
{
//logger.info("Name:" + siteNode.getName() + ":" + siteNode.getValueObject().getStateId() + ":" + siteNode.getValueObject().getIsProtected() + ":" + siteNode.getValueObject().getIsProtected());
ContentVersionVO latestVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(siteNode.getMetaInfoContentId(), sortLanguageId, db);
if(latestVersionVO == null)
{
//LanguageVO masterLanguageVO = LanguageController.getController().getMasterLanguage(siteNode.getValueObject().getRepositoryId(), db);
//latestVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(siteNode.getMetaInfoContentId(), masterLanguageVO.getLanguageId(), db);
}
if(latestVersionVO != null)
{
String localizedIsHidden = ContentVersionController.getContentVersionController().getAttributeValue(latestVersionVO, "HideInNavigation", false);
String localizedSortOrder = ContentVersionController.getContentVersionController().getAttributeValue(latestVersionVO, "SortOrder", false);
if(localizedSortOrder == null || localizedSortOrder.equals(""))
localizedSortOrder = ContentVersionController.getContentVersionController().getAttributeValue(latestVersionVO, "sortOrder", false);
//System.out.println("localizedIsHidden:" + localizedIsHidden);
//System.out.println("localizedSortOrder:" + localizedSortOrder);
if(localizedIsHidden != null/* && !localizedIsHidden.equals("")*/)
{
if(localizedIsHidden.equals("true"))
siteNode.getValueObject().setLocalizedIsHidden(true);
else
siteNode.getValueObject().setLocalizedIsHidden(false);
}
if(localizedSortOrder != null && !localizedSortOrder.equals(""))
{
try
{
siteNode.getValueObject().setLocalizedSortOrder(new Integer(localizedSortOrder));
}
catch(Exception e)
{
logger.warn("The sitenode " + siteNode.getName() + " (ID: " + siteNode.getId() + ") had a bad localizedSortOrder:" + localizedSortOrder + ". Error:" + e.getMessage());
}
}
else
siteNode.getValueObject().setLocalizedSortOrder(new Integer(100));
}
else
siteNode.getValueObject().setLocalizedSortOrder(new Integer(100));
}
childrenVOList.add(siteNode.getValueObject());
}
results.close();
oql.close();
if(CmsPropertyHandler.getAllowLocalizedSortAndVisibilityProperties())
Collections.sort(childrenVOList, new ReflectionComparator("sortOrder"));
CacheController.cacheObjectInAdvancedCache("childSiteNodesCache", key, childrenVOList, new String[]{CacheController.getPooledString(3, parentSiteNodeId)}, true);
return childrenVOList;
}
/**
* This method is sort of a sql-query-like method where you can send in arguments in form of a list
* of things that should match. The input is a Hashmap with a method and a List of HashMaps.
*/
public List getSiteNodeVOList(HashMap argumentHashMap) throws SystemException, Bug
{
List siteNodes = null;
String method = (String)argumentHashMap.get("method");
logger.info("method:" + method);
if(method.equalsIgnoreCase("selectSiteNodeListOnIdList"))
{
siteNodes = new ArrayList();
List arguments = (List)argumentHashMap.get("arguments");
logger.info("Arguments:" + arguments.size());
Iterator argumentIterator = arguments.iterator();
while(argumentIterator.hasNext())
{
HashMap argument = (HashMap)argumentIterator.next();
logger.info("argument:" + argument.size());
Iterator iterator = argument.keySet().iterator();
while ( iterator.hasNext() )
logger.info( " " + iterator.next() );
Integer siteNodeId = new Integer((String)argument.get("siteNodeId"));
logger.info("Getting the siteNode with Id:" + siteNodeId);
siteNodes.add(getSiteNodeVOWithId(siteNodeId));
}
}
return siteNodes;
}
/**
* This method is sort of a sql-query-like method where you can send in arguments in form of a list
* of things that should match. The input is a Hashmap with a method and a List of HashMaps.
*/
public List getSiteNodeVOList(HashMap argumentHashMap, Database db) throws SystemException, Bug, Exception
{
List siteNodes = null;
String method = (String)argumentHashMap.get("method");
logger.info("method:" + method);
if(method.equalsIgnoreCase("selectSiteNodeListOnIdList"))
{
siteNodes = new ArrayList();
List arguments = (List)argumentHashMap.get("arguments");
logger.info("Arguments:" + arguments.size());
Iterator argumentIterator = arguments.iterator();
while(argumentIterator.hasNext())
{
HashMap argument = (HashMap)argumentIterator.next();
logger.info("argument:" + argument.size());
Iterator iterator = argument.keySet().iterator();
while ( iterator.hasNext() )
logger.info( " " + iterator.next() );
Integer siteNodeId = new Integer((String)argument.get("siteNodeId"));
logger.info("Getting the siteNode with Id:" + siteNodeId);
siteNodes.add(getSiteNodeVOWithId(siteNodeId, db));
}
}
return siteNodes;
}
/**
* This method fetches the root siteNode for a particular repository.
*/
public SiteNodeVO getRootSiteNodeVO(Integer repositoryId) throws ConstraintException, SystemException
{
String key = "rootSiteNode_" + repositoryId;
SiteNodeVO cachedRootNodeVO = (SiteNodeVO)CacheController.getCachedObject("repositoryRootNodesCache", key);
if(cachedRootNodeVO != null)
{
if(logger.isInfoEnabled())
logger.info("There was an cachedRootNodeVO:" + cachedRootNodeVO);
return cachedRootNodeVO;
}
Database db = CastorDatabaseService.getDatabase();
SiteNodeVO siteNodeVO = null;
beginTransaction(db);
try
{
siteNodeVO = getRootSiteNodeVO(repositoryId, db);
if(siteNodeVO != null)
CacheController.cacheObject("repositoryRootNodesCache", key, siteNodeVO);
else
logger.warn("repositoryId:" + repositoryId + " had no root");
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return siteNodeVO;
}
/**
* This method fetches the root siteNode for a particular repository within a certain transaction.
*/
public SiteNodeVO getRootSiteNodeVO(Integer repositoryId, Database db) throws ConstraintException, SystemException, Exception
{
SiteNodeVO siteNodeVO = null;
OQLQuery oql = db.getOQLQuery( "SELECT s FROM org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeImpl s WHERE is_undefined(s.parentSiteNode) AND s.repositoryId = $1");
oql.bind(repositoryId);
QueryResults results = oql.execute(Database.READONLY);
if (results.hasMore())
{
SiteNode siteNode = (SiteNode)results.next();
siteNodeVO = siteNode.getValueObject();
}
results.close();
oql.close();
return siteNodeVO;
}
/**
* This method fetches the root siteNode for a particular repository within a certain transaction.
*/
public SiteNode getRootSiteNode(Integer repositoryId, Database db) throws ConstraintException, SystemException, Exception
{
SiteNode siteNode = null;
OQLQuery oql = db.getOQLQuery( "SELECT s FROM org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl s WHERE is_undefined(s.parentSiteNode) AND s.repository.repositoryId = $1");
oql.bind(repositoryId);
QueryResults results = oql.execute();
this.logger.info("Fetching entity in read/write mode" + repositoryId);
if (results.hasMore())
{
siteNode = (SiteNode)results.next();
}
results.close();
oql.close();
return siteNode;
}
/**
* This method moves a siteNode after first making a couple of controls that the move is valid.
*/
public void moveSiteNode(SiteNodeVO siteNodeVO, Integer newParentSiteNodeId, InfoGluePrincipal principal) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
SiteNode siteNode = null;
SiteNode newParentSiteNode = null;
SiteNode oldParentSiteNode = null;
Map<String,String> pageUrls = new HashMap<String, String>();
beginTransaction(db);
try
{
//Validation that checks the entire object
siteNodeVO.validate();
if(newParentSiteNodeId == null)
{
logger.warn("You must specify the new parent-siteNode......");
throw new ConstraintException("SiteNode.parentSiteNodeId", "3403");
}
if(siteNodeVO.getId().intValue() == newParentSiteNodeId.intValue())
{
logger.warn("You cannot have the siteNode as it's own parent......");
throw new ConstraintException("SiteNode.parentSiteNodeId", "3401");
}
siteNode = getSiteNodeWithId(siteNodeVO.getSiteNodeId(), db);
oldParentSiteNode = siteNode.getParentSiteNode();
newParentSiteNode = getSiteNodeWithId(newParentSiteNodeId, db);
if(oldParentSiteNode.getId().intValue() == newParentSiteNodeId.intValue())
{
logger.warn("You cannot specify the same node as it originally was located in......");
throw new ConstraintException("SiteNode.parentSiteNodeId", "3404");
}
SiteNode tempSiteNode = newParentSiteNode.getParentSiteNode();
while(tempSiteNode != null)
{
if(tempSiteNode.getId().intValue() == siteNode.getId().intValue())
{
logger.warn("You cannot move the node to a child under it......");
throw new ConstraintException("SiteNode.parentSiteNodeId", "3402");
}
tempSiteNode = tempSiteNode.getParentSiteNode();
}
pageUrls = RedirectController.getController().getNiceURIMapBeforeMove(db, siteNodeVO.getRepositoryId(), siteNodeVO.getSiteNodeId(), principal);
logger.info("Setting the new Parent siteNode:" + siteNode.getSiteNodeId() + " " + newParentSiteNode.getSiteNodeId());
siteNode.setParentSiteNode((SiteNodeImpl)newParentSiteNode);
changeRepositoryRecursive(siteNode, newParentSiteNode.getRepository(), principal, db);
//siteNode.setRepository(newParentSiteNode.getRepository());
newParentSiteNode.getChildSiteNodes().add(siteNode);
oldParentSiteNode.getChildSiteNodes().remove(siteNode);
try
{
SiteNodeVersionVO publishedVersion = SiteNodeVersionController.getController().getLatestPublishedSiteNodeVersionVO(siteNode.getId(), db);
SiteNodeVersionVO publishedVersionNewParent = SiteNodeVersionController.getController().getLatestPublishedSiteNodeVersionVO(newParentSiteNode.getId(), db);
SiteNodeVersionVO publishedVersionOldParent = SiteNodeVersionController.getController().getLatestPublishedSiteNodeVersionVO(oldParentSiteNode.getId(), db);
List<EventVO> events = new ArrayList<EventVO>();
logger.info("publishedVersion:" + publishedVersion);
if(publishedVersion != null)
{
EventVO eventVO = new EventVO();
eventVO.setDescription("Moved page");
eventVO.setEntityClass(SiteNodeVersion.class.getName());
eventVO.setEntityId(publishedVersion.getId());
eventVO.setName(siteNode.getName());
eventVO.setTypeId(EventVO.MOVED);
eventVO = EventController.create(eventVO, newParentSiteNode.getRepository().getId(), principal);
events.add(eventVO);
}
logger.info("publishedVersionOldParent:" + publishedVersionOldParent);
if(publishedVersionNewParent != null)
{
EventVO eventVO = new EventVO();
eventVO.setDescription("New parent page");
eventVO.setEntityClass(SiteNodeVersion.class.getName());
eventVO.setEntityId(publishedVersionNewParent.getId());
eventVO.setName(newParentSiteNode.getName());
eventVO.setTypeId(EventVO.PUBLISH);
eventVO = EventController.create(eventVO, newParentSiteNode.getRepository().getId(), principal);
events.add(eventVO);
}
logger.info("publishedVersionOldParent:" + publishedVersionOldParent);
if(publishedVersionOldParent != null)
{
EventVO eventVO = new EventVO();
eventVO.setDescription("Move page");
eventVO.setEntityClass(SiteNodeVersion.class.getName());
eventVO.setEntityId(publishedVersionOldParent.getId());
eventVO.setName(oldParentSiteNode.getName());
eventVO.setTypeId(EventVO.PUBLISH);
eventVO = EventController.create(eventVO, oldParentSiteNode.getRepository().getId(), principal);
events.add(eventVO);
}
/*
EventVO eventVO = new EventVO();
eventVO.setDescription("Moved page");
eventVO.setEntityClass(SiteNodeVersion.class.getName());
eventVO.setEntityId(publishedVersion.getId());
eventVO.setName(siteNode.getName());
eventVO.setTypeId(EventVO.MOVED);
eventVO = EventController.create(eventVO, siteNode.getRepository().getId(), principal);
events.add(eventVO);
*/
logger.info("events:" + events.size());
if(events != null && events.size() > 0)
{
//Create publication if nodes has published version
PublicationVO publicationVO = new PublicationVO();
publicationVO.setName("Move of page - auto publication");
publicationVO.setDescription("System did an automatic publication");
publicationVO.setPublisher(principal.getName());
publicationVO.setRepositoryId(newParentSiteNode.getRepository().getId());
publicationVO = PublicationController.getController().createAndPublish(publicationVO, events, false, principal);
}
}
catch (Exception e)
{
logger.error("Error publishing move:" + e.getMessage(), e);
}
// If any of the validations or setMethods reported an error, we throw them up now before create.
ceb.throwIfNotEmpty();
commitTransaction(db);
}
catch(ConstraintException ce)
{
logger.warn("An error occurred so we should not complete the transaction:" + ce, ce);
rollbackTransaction(db);
throw ce;
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
if (pageUrls.size() > 0)
{
Database redirectDb = null;
try
{
redirectDb = CastorDatabaseService.getDatabase();
beginTransaction(redirectDb);
RedirectController.getController().createSystemRedirect(pageUrls, siteNodeVO.getRepositoryId(), siteNodeVO.getSiteNodeId(), principal, redirectDb);
commitTransaction(redirectDb);
}
catch (Throwable tr)
{
rollbackTransaction(redirectDb);
logger.error("An error occured when creating system redirect. Messge: " + tr.getMessage());
logger.warn("An error occured when creating system redirect.", tr);
}
}
}
/**
* Recursively sets the sitenodes repositoryId.
* @param sitenode
* @param newRepository
*/
private void changeRepositoryRecursive(SiteNode siteNode, Repository newRepository, InfoGluePrincipal principal, Database db) throws Exception
{
if(siteNode.getRepository().getId().intValue() != newRepository.getId().intValue())
{
Integer metaInfoContentId = siteNode.getMetaInfoContentId();
MediumContentImpl metaInfoContent = (MediumContentImpl)ContentController.getContentController().getMediumContentWithId(metaInfoContentId, db);
//String previousPath = ContentController.getContentController().getContentPath(metaInfoContentId, db);
String siteNodePath = SiteNodeController.getController().getSiteNodePath(siteNode.getId(), db);
logger.info("siteNodePath:" + siteNodePath);
if(siteNodePath.indexOf("/", 2) > -1)
siteNodePath = siteNodePath.substring(siteNodePath.indexOf("/", 2));
logger.info("siteNodePath:" + siteNodePath);
ContentVO newParentContent = ContentController.getContentController().getContentVOWithPath(newRepository.getId(), "Meta info folder" + siteNodePath, true, principal, db);
if(metaInfoContent != null && newParentContent != null)
{
logger.info("Moving:" + metaInfoContent.getName() + " to " + newParentContent.getName());
//newParentContent.getChildren().add(metaInfoContent);
//Content previousParentContent = metaInfoContent.getParentContent();
metaInfoContent.setParentContentId(newParentContent.getId());
//previousParentContent.getChildren().remove(metaInfoContent);
LanguageVO oldMasterLanguage = LanguageController.getController().getMasterLanguage(metaInfoContent.getRepositoryId(), db);
LanguageVO newMasterLanguage = LanguageController.getController().getMasterLanguage(newParentContent.getRepositoryId(), db);
ContentVersionVO oldMasterContentVersionVO = ContentVersionController.getContentVersionController().getLatestContentVersionVO(metaInfoContent.getId(), oldMasterLanguage.getId(), db);
ContentVersionVO newMasterContentVersionVO = ContentVersionController.getContentVersionController().getLatestContentVersionVO(metaInfoContent.getId(), newMasterLanguage.getId(), db);
if(oldMasterContentVersionVO != null && newMasterContentVersionVO == null)
{
ContentVersionController.getContentVersionController().create(metaInfoContentId, newMasterLanguage.getId(), oldMasterContentVersionVO, null, db);
}
else if(oldMasterContentVersionVO != null && newMasterContentVersionVO != null)
{
String oldComponentStructure = ContentVersionController.getContentVersionController().getAttributeValue(oldMasterContentVersionVO, "ComponentStructure", false);
String newComponentStructure = ContentVersionController.getContentVersionController().getAttributeValue(newMasterContentVersionVO, "ComponentStructure", false);
if(oldComponentStructure != null && !oldComponentStructure.equals("") && (newComponentStructure == null || newComponentStructure.equals("")))
{
ContentVersionController.getContentVersionController().updateAttributeValue(newMasterContentVersionVO.getId(), "ComponentStructure", oldComponentStructure, principal, true);
}
}
metaInfoContent.setRepositoryId(newParentContent.getRepositoryId());
//changeRepositoryRecursiveForContent(metaInfoContent, newRepository);
}
siteNode.setRepository((RepositoryImpl)newRepository);
Iterator ChildSiteNodesIterator = siteNode.getChildSiteNodes().iterator();
while(ChildSiteNodesIterator.hasNext())
{
SiteNode childSiteNode = (SiteNode)ChildSiteNodesIterator.next();
changeRepositoryRecursive(childSiteNode, newRepository, principal, db);
}
}
}
/**
* Recursively sets the sitenodes repositoryId.
* @param sitenode
* @param newRepository
*/
private void changeRepositoryRecursiveForContent(Content content, Repository newRepository)
{
if(content.getRepository() == null || content.getRepository().getId().intValue() != newRepository.getId().intValue())
{
content.setRepository((RepositoryImpl)newRepository);
if(content.getChildren() != null)
{
Iterator childContentsIterator = content.getChildren().iterator();
while(childContentsIterator.hasNext())
{
Content childContent = (Content)childContentsIterator.next();
changeRepositoryRecursiveForContent(childContent, newRepository);
}
}
}
}
/**
* This is a method that gives the user back an newly initialized ValueObject for this entity that the controller
* is handling.
*/
public BaseEntityVO getNewVO()
{
return new SiteNodeVO();
}
/**
* This method returns a list of all siteNodes in a repository.
*/
public List<SiteNodeVO> getRepositorySiteNodeVOList(Integer repositoryId, Database db) throws SystemException, Exception
{
List<SiteNodeVO> siteNodes = new ArrayList<SiteNodeVO>();
OQLQuery oql = db.getOQLQuery("SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeImpl sn WHERE sn.repositoryId = $1 ORDER BY sn.siteNodeId");
oql.bind(repositoryId);
QueryResults results = oql.execute(Database.READONLY);
while(results.hasMore())
{
SiteNode siteNode = (SiteNodeImpl)results.next();
siteNodes.add(siteNode.getValueObject());
}
results.close();
oql.close();
return siteNodes;
}
/**
* This method returns a list of all siteNodes in a repository.
*/
public List getRepositorySiteNodes(Integer repositoryId, Database db) throws SystemException, Exception
{
List siteNodes = new ArrayList();
OQLQuery oql = db.getOQLQuery("SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl sn WHERE sn.repository.repositoryId = $1 ORDER BY sn.siteNodeId");
oql.bind(repositoryId);
QueryResults results = oql.execute();
while(results.hasMore())
{
SiteNode siteNode = (SiteNodeImpl)results.next();
siteNodes.add(siteNode);
}
results.close();
oql.close();
return siteNodes;
}
/**
* This method returns a list of all siteNodes in a repository.
*/
public List getRepositorySiteNodesReadOnly(Integer repositoryId, Database db) throws SystemException, Exception
{
List siteNodes = new ArrayList();
OQLQuery oql = db.getOQLQuery("SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl sn WHERE sn.repository.repositoryId = $1");
oql.bind(repositoryId);
QueryResults results = oql.execute(Database.READONLY);
while(results.hasMore())
{
SiteNode siteNode = (SiteNodeImpl)results.next();
siteNodes.add(siteNode);
}
results.close();
oql.close();
return siteNodes;
}
/**
* This method creates a meta info content for the new sitenode.
*
* @param db
* @param path
* @param newSiteNode
* @throws SystemException
* @throws Bug
* @throws Exception
* @throws ConstraintException
*/
public MediumContentImpl createSiteNodeMetaInfoContent(Database db, SiteNodeVO newSiteNode, Integer repositoryId, InfoGluePrincipal principal, Integer pageTemplateContentId, List<ContentVersion> newContentVersions) throws SystemException, Bug, Exception, ConstraintException
{
return createSiteNodeMetaInfoContent(db, newSiteNode, null, repositoryId, principal, pageTemplateContentId, newContentVersions, false, null, null);
}
public MediumContentImpl createSiteNodeMetaInfoContent(Database db, SiteNodeVO newSiteNode, Integer repositoryId, InfoGluePrincipal principal, Integer pageTemplateContentId, List<ContentVersion> newContentVersions, boolean checkIfMetaInfoIsBroken) throws SystemException, Bug, Exception, ConstraintException
{
return createSiteNodeMetaInfoContent(db, newSiteNode, null, repositoryId, principal, pageTemplateContentId, newContentVersions, checkIfMetaInfoIsBroken, null, null);
}
public MediumContentImpl createSiteNodeMetaInfoContent(Database db, SiteNodeVO newSiteNode, Map<String,String> metaAttributes, Integer repositoryId, InfoGluePrincipal principal, Integer pageTemplateContentId, List<ContentVersion> newContentVersions, boolean checkIfMetaInfoIsBroken) throws SystemException, Bug, Exception, ConstraintException
{
return createSiteNodeMetaInfoContent(db, newSiteNode, metaAttributes, repositoryId, principal, pageTemplateContentId, newContentVersions, checkIfMetaInfoIsBroken, null, null);
}
public MediumContentImpl createSiteNodeMetaInfoContent(Database db, SiteNodeVO newSiteNode, Map<String,String> metaAttributes, Integer repositoryId, InfoGluePrincipal principal, Integer pageTemplateContentId, List<ContentVersion> newContentVersions, boolean checkIfMetaInfoIsBroken, ContentVO oldMetaInfoContentVO, String navigationTitleSuffix) throws SystemException, Bug, Exception, ConstraintException
{
Timer t = new Timer();
MediumContentImpl content = null;
String basePath = "Meta info folder";
String path = "";
//SiteNode parentSiteNode = newSiteNode.getParentSiteNode();
Integer parentSiteNodeId = newSiteNode.getParentSiteNodeId();
while(parentSiteNodeId != null)
{
SiteNodeVO parentSiteNode = getSmallSiteNodeVOWithId(parentSiteNodeId, db);
path = "/" + parentSiteNode.getName() + path;
parentSiteNodeId = parentSiteNode.getParentSiteNodeId();
//parentSiteNode = parentSiteNode.getParentSiteNode();
}
path = basePath + path;
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Getting path", t.getElapsedTime());
LanguageVO masterLanguage = LanguageController.getController().getMasterLanguage(repositoryId, db);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getLatestSiteNodeVersionVO", t.getElapsedTime());
Integer metaInfoContentTypeDefinitionId = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithName("Meta info", db).getId();
Integer availableServiceBindingId = AvailableServiceBindingController.getController().getAvailableServiceBindingVOWithName("Meta information", db).getId();
List serviceDefinitions = AvailableServiceBindingController.getController().getServiceDefinitionVOList(db, availableServiceBindingId);
if(serviceDefinitions == null || serviceDefinitions.size() == 0)
{
ServiceDefinition serviceDefinition = ServiceDefinitionController.getController().getServiceDefinitionWithName("Core content service", db, false);
String[] values = {serviceDefinition.getId().toString()};
AvailableServiceBindingController.getController().update(availableServiceBindingId, values, db);
}
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getAvailableServiceBindingVOWithName", t.getElapsedTime());
ContentVO rootContent = ContentControllerProxy.getController().getRootContentVO(db, repositoryId, principal.getName(), true);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getRootContentVO", t.getElapsedTime());
if(rootContent != null)
{
ContentVO parentFolderContent = ContentController.getContentController().getContentVOWithPath(repositoryId, path, true, principal, db);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getContentVOWithPath", t.getElapsedTime());
ContentVO contentVO = new ContentVO();
contentVO.setCreatorName(principal.getName());
contentVO.setIsBranch(new Boolean(false));
contentVO.setName(newSiteNode.getName() + " Metainfo");
contentVO.setRepositoryId(repositoryId);
content = ContentControllerProxy.getController().create(db, parentFolderContent.getId(), metaInfoContentTypeDefinitionId, repositoryId, contentVO);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("content.create", t.getElapsedTime());
newSiteNode.setMetaInfoContentId(contentVO.getId());
LanguageVO masterLanguageVO = LanguageController.getController().getMasterLanguage(repositoryId, db);
String componentStructure = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><components></components>";
if(pageTemplateContentId != null)
{
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(pageTemplateContentId, masterLanguageVO.getId(), db);
componentStructure = ContentVersionController.getContentVersionController().getAttributeValue(contentVersionVO, "ComponentStructure", false);
Document document = XMLHelper.readDocumentFromByteArray(componentStructure.getBytes("UTF-8"));
String componentXPath = "//component";
NodeList componentNodes = org.apache.xpath.XPathAPI.selectNodeList(document.getDocumentElement(), componentXPath);
for(int i=0; i < componentNodes.getLength(); i++)
{
Element element = (Element)componentNodes.item(i);
String componentId = element.getAttribute("id");
String componentContentId = element.getAttribute("contentId");
ComponentController.getController().checkAndAutoCreateContents(db, newSiteNode.getId(), masterLanguageVO.getId(), masterLanguageVO.getId(), null, new Integer(componentId), document, new Integer(componentContentId), principal);
componentStructure = XMLHelper.serializeDom(document, new StringBuffer()).toString();
}
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("meta info create 1", t.getElapsedTime());
}
List<LanguageVO> languageVOList = RepositoryLanguageController.getController().getLanguageVOListForRepositoryId(repositoryId, db);
for(LanguageVO languageVO : languageVOList)
{
//Create initial content version also... in languageVO
String versionValue = "<?xml version='1.0' encoding='UTF-8'?><article xmlns=\"x-schema:ArticleSchema.xml\"><attributes>";
if(metaAttributes == null || !metaAttributes.containsKey(languageVO.getLanguageCode() + "_Title"))
versionValue += "<Title><![CDATA[" + newSiteNode.getName() + "]]></Title>";
if(metaAttributes == null || !metaAttributes.containsKey(languageVO.getLanguageCode() + "_NavigationTitle"))
versionValue += "<NavigationTitle><![CDATA[" + newSiteNode.getName() + "]]></NavigationTitle>";
if(metaAttributes == null || !metaAttributes.containsKey(languageVO.getLanguageCode() + "_NiceURIName"))
versionValue += "<NiceURIName><![CDATA[" + new VisualFormatter().replaceNiceURINonAsciiWithSpecifiedChars(newSiteNode.getName(), CmsPropertyHandler.getNiceURIDefaultReplacementCharacter()) + "]]></NiceURIName>";
if(metaAttributes == null || !metaAttributes.containsKey(languageVO.getLanguageCode() + "_Description"))
versionValue += "<Description><![CDATA[" + newSiteNode.getName() + "]]></Description>";
if(metaAttributes == null || !metaAttributes.containsKey(languageVO.getLanguageCode() + "_MetaInfo"))
versionValue += "<MetaInfo><![CDATA[" + newSiteNode.getName() + "]]></MetaInfo>";
boolean saveVersion = false;
boolean realValue = false;
if(metaAttributes != null)
{
for(String metaAttributeName : metaAttributes.keySet())
{
if(metaAttributeName.startsWith(languageVO.getLanguageCode() + "_"))
{
versionValue += "<" + metaAttributeName.replaceFirst(languageVO.getLanguageCode() + "_", "") + "><![CDATA[" + metaAttributes.get(metaAttributeName) + "]]></" + metaAttributeName.replaceFirst(languageVO.getLanguageCode() + "_", "") + ">";
saveVersion = true;
realValue = true;
}
}
}
if(!realValue) //No other values
versionValue = "<?xml version='1.0' encoding='UTF-8'?><article xmlns=\"x-schema:ArticleSchema.xml\"><attributes>";
if(languageVO.getId().equals(masterLanguageVO.getId()))
{
versionValue += "<ComponentStructure><![CDATA[" + componentStructure + "]]></ComponentStructure>";
saveVersion = true;
}
versionValue += "</attributes></article>";
if(saveVersion)
{
ContentVersionVO contentVersionVO = new ContentVersionVO();
contentVersionVO.setVersionComment("Autogenerated version");
contentVersionVO.setVersionModifier(principal.getName());
contentVersionVO.setVersionValue(versionValue);
//ContentVersionController.getContentVersionController().create(contentVO.getId(), masterLanguage.getId(), contentVersionVO, null, db);
MediumContentVersionImpl contentVersionImpl = ContentVersionController.getContentVersionController().createMedium(contentVO.getId(), languageVO.getId(), contentVersionVO, db);
if(newContentVersions != null)
newContentVersions.add(contentVersionImpl);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("meta info create 2", t.getElapsedTime());
}
}
LanguageVO localMasterLanguageVO = getInitialLanguageVO(db, parentFolderContent.getId(), repositoryId);
//Also created a version in the local master language for this part of the site if any
/*
if(localMasterLanguageVO.getId().intValue() != masterLanguage.getId().intValue())
{
String versionValueLocalMaster = "<?xml version='1.0' encoding='UTF-8'?><article xmlns=\"x-schema:ArticleSchema.xml\"><attributes><Title><![CDATA[" + newSiteNode.getName() + "]]></Title><NavigationTitle><![CDATA[" + newSiteNode.getName() + "]]></NavigationTitle><NiceURIName><![CDATA[" + new VisualFormatter().replaceNiceURINonAsciiWithSpecifiedChars(newSiteNode.getName(), CmsPropertyHandler.getNiceURIDefaultReplacementCharacter()) + "]]></NiceURIName><Description><![CDATA[" + newSiteNode.getName() + "]]></Description><MetaInfo><![CDATA[" + newSiteNode.getName() + "]]></MetaInfo><ComponentStructure><![CDATA[]]></ComponentStructure></attributes></article>";
ContentVersionVO contentVersionVOLocalMaster = new ContentVersionVO();
contentVersionVOLocalMaster.setVersionComment("Autogenerated version");
contentVersionVOLocalMaster.setVersionModifier(principal.getName());
contentVersionVOLocalMaster.setVersionValue(versionValueLocalMaster);
//ContentVersionController.getContentVersionController().create(contentVO.getId(), localMasterLanguageVO.getId(), contentVersionVOLocalMaster, null, db);
MediumContentVersionImpl contentVersionImplLocal = ContentVersionController.getContentVersionController().createMedium(contentVO.getId(), localMasterLanguageVO.getId(), contentVersionVOLocalMaster, db);
if(newContentVersions != null)
newContentVersions.add(contentVersionImplLocal);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("meta info create 3", t.getElapsedTime());
}
*/
// If there is an old meta info content this is a copy action and we should take appropriate actions
if (oldMetaInfoContentVO != null)
{
List<ContentVersionVO> contentVersions = ContentVersionController.getContentVersionController().getContentVersionVOList(oldMetaInfoContentVO.getId(), db);
if (logger.isDebugEnabled())
{
StringBuilder sb = new StringBuilder();
sb.append("Copying ContentVersions to new Meta info. Old Content.id: " + oldMetaInfoContentVO.getContentId());
sb.append("\n\tNumber of contentVersions: " + contentVersions.size());
sb.append("\n\tSite master language.id: " + masterLanguage.getId());
sb.append("\n\tParent folder master language: " + localMasterLanguageVO.getId());
logger.debug(sb);
}
else
{
logger.info("Copying ContentVersions to new Meta info. Old Content.id: " + oldMetaInfoContentVO.getContentId());
}
for(ContentVersionVO cv : contentVersions)
{
logger.debug("cv " + cv.getLanguageId() + ":" + cv.getId());
if(!cv.getLanguageId().equals(masterLanguage.getId()) && !cv.getLanguageId().equals(localMasterLanguageVO.getId()))
{
logger.info("Should create version for content <" + contentVO.getId() + "> with language.id " + cv.getLanguageId());
String versionValueOtherVersion = cv.getVersionValue();
ContentVersionVO contentVersionVOLocalMaster = new ContentVersionVO();
contentVersionVOLocalMaster.setVersionComment("Autogenerated version");
contentVersionVOLocalMaster.setVersionModifier(principal.getName());
contentVersionVOLocalMaster.setVersionValue(versionValueOtherVersion);
MediumContentVersionImpl contentVersionImplLocal = ContentVersionController.getContentVersionController().createMedium(contentVO.getId(), cv.getLanguageId(), contentVersionVOLocalMaster, db);
if(newContentVersions != null)
newContentVersions.add(contentVersionImplLocal);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("meta info create 4", t.getElapsedTime());
}
}
logger.info("Transforming NavigationTitle for copied Meta info. Content.id " + contentVO.getId());
List<ContentVersionVO> newContentsVersions = ContentVersionController.getContentVersionController().getContentVersionVOList(contentVO.getId(), db);
Pattern navigationTransformPattern = Pattern.compile(Pattern.quote("<NavigationTitle><![CDATA[") + "(.+?)" + Pattern.quote("]]></NavigationTitle>"));
for (ContentVersionVO contentVersionVO : newContentsVersions)
{
String versionValue = contentVersionVO.getVersionValue();
Matcher matcher = navigationTransformPattern.matcher(versionValue);
versionValue = matcher.replaceFirst(Matcher.quoteReplacement("<NavigationTitle><![CDATA[") + "$1" + navigationTitleSuffix + Matcher.quoteReplacement("]]></NavigationTitle>"));
contentVersionVO.setVersionValue(versionValue);
if (logger.isTraceEnabled())
{
logger.trace("Version value after copy transformation (ContentVersion.id: " + contentVersionVO.getContentVersionId() + "). VersionValue: " + contentVersionVO.getVersionValue());
}
//ContentVersionController.getContentVersionController().update(contentVO.getId(), contentVersionVO.getLanguageId(), contentVersionVO, db);
ContentVersionController.getContentVersionController().update(contentVO.getId(), contentVersionVO.getLanguageId(), contentVersionVO, null, true, db, false);
}
}
ServiceBindingVO serviceBindingVO = new ServiceBindingVO();
serviceBindingVO.setName(newSiteNode.getName() + " Metainfo");
serviceBindingVO.setPath("/None specified/");
String qualifyerXML = "<?xml version='1.0' encoding='UTF-8'?><qualifyer><contentId>" + contentVO.getId() + "</contentId></qualifyer>";
//ServiceBindingController.getController().create(db, serviceBindingVO, qualifyerXML, availableServiceBindingId, siteNodeVersionVO.getId(), singleServiceDefinitionVO.getId());
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("meta info service bind", t.getElapsedTime());
if(checkIfMetaInfoIsBroken)
SiteNodeController.getController().update(newSiteNode, db);
}
return content;
}
public LanguageVO getInitialLanguageVO(Database db, Integer contentId, Integer repositoryId) throws Exception
{
Map args = new HashMap();
args.put("globalKey", "infoglue");
PropertySet ps = PropertySetManager.getInstance("jdbc", args);
String initialLanguageId = ps.getString("content_" + contentId + "_initialLanguageId");
ContentVO content = ContentController.getContentController().getContentVOWithId(contentId, db);
ContentVO parentContent = ContentController.getContentController().getContentVOWithId(content.getParentContentId(), db);
while((initialLanguageId == null || initialLanguageId.equalsIgnoreCase("-1")) && parentContent != null)
{
initialLanguageId = ps.getString("content_" + parentContent.getId() + "_initialLanguageId");
if(parentContent.getParentContentId() != null)
parentContent = ContentController.getContentController().getContentVOWithId(parentContent.getParentContentId(), db);
else
parentContent = null;
//parentContent = parentContent.getParentContent();
}
if(initialLanguageId != null && !initialLanguageId.equals("") && !initialLanguageId.equals("-1"))
return LanguageController.getController().getLanguageVOWithId(new Integer(initialLanguageId), db);
else
return LanguageController.getController().getMasterLanguage(repositoryId, db);
}
/**
* Recursive methods to get all sitenodes under the specific sitenode.
*/
public List getSiteNodeVOWithParentRecursive(Integer siteNodeId, ProcessBean processBean) throws ConstraintException, SystemException
{
return getSiteNodeVOWithParentRecursive(siteNodeId, processBean, new ArrayList());
}
private List getSiteNodeVOWithParentRecursive(Integer siteNodeId, ProcessBean processBean, List resultList) throws ConstraintException, SystemException
{
// Get the versions of this content.
resultList.add(getSiteNodeVOWithId(siteNodeId));
// Get the children of this content and do the recursion
List childSiteNodeList = SiteNodeController.getController().getSiteNodeChildrenVOList(siteNodeId);
Iterator cit = childSiteNodeList.iterator();
while (cit.hasNext())
{
SiteNodeVO siteNodeVO = (SiteNodeVO) cit.next();
if (resultList.size() % 50 == 0)
processBean.updateProcess("Found " + resultList.size() + " pages so far...");
getSiteNodeVOWithParentRecursive(siteNodeVO.getId(), processBean, resultList);
}
return resultList;
}
public void setMetaInfoContentId(Integer siteNodeId, Integer metaInfoContentId) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
beginTransaction(db);
try
{
setMetaInfoContentId(siteNodeId, metaInfoContentId, db);
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
}
public void setMetaInfoContentId(Integer siteNodeId, Integer metaInfoContentId, Database db) throws ConstraintException, SystemException
{
SiteNode siteNode = getSiteNodeWithId(siteNodeId, db);
siteNode.setMetaInfoContentId(metaInfoContentId);
}
public List getSiteNodeVOListWithoutMetaInfoContentId() throws ConstraintException, SystemException
{
List siteNodeVOList = new ArrayList();
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
beginTransaction(db);
try
{
List siteNodes = getSiteNodesWithoutMetaInfoContentId(db);
siteNodeVOList = toVOList(siteNodes);
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return siteNodeVOList;
}
public List getSiteNodesWithoutMetaInfoContentId(Database db) throws ConstraintException, SystemException, Exception
{
List siteNodes = new ArrayList();
OQLQuery oql = db.getOQLQuery("SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl sn WHERE sn.metaInfoContentId = $1 ORDER BY sn.siteNodeId");
oql.bind(new Integer(-1));
QueryResults results = oql.execute();
while(results.hasMore())
{
SiteNode siteNode = (SiteNodeImpl)results.next();
siteNodes.add(siteNode);
}
results.close();
oql.close();
return siteNodes;
}
public List getSiteNodeVOListWithMetaInfoContentId() throws ConstraintException, SystemException
{
List siteNodeVOList = new ArrayList();
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
beginTransaction(db);
try
{
List siteNodes = getSiteNodeVOListWithMetaInfoContentId(db);
siteNodeVOList = toVOList(siteNodes);
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return siteNodeVOList;
}
public List getSiteNodeVOListWithMetaInfoContentId(Database db) throws ConstraintException, SystemException, Exception
{
List siteNodes = new ArrayList();
OQLQuery oql = db.getOQLQuery("SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeImpl sn WHERE sn.metaInfoContentId > $1 ORDER BY sn.siteNodeId");
oql.bind(new Integer(0));
QueryResults results = oql.execute();
while(results.hasMore())
{
SiteNode siteNode = (SiteNode)results.next();
siteNodes.add(siteNode);
}
results.close();
oql.close();
return siteNodes;
}
public SiteNodeVO getSiteNodeVOWithMetaInfoContentId(Integer contentId) throws ConstraintException, SystemException
{
SiteNodeVO siteNodeVO = null;
Integer cachedSiteNodeId = metaInfoSiteNodeIdMap.get(contentId);
if(cachedSiteNodeId != null)
{
siteNodeVO = getSiteNodeVOWithId(cachedSiteNodeId, false);
}
else
{
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
beginTransaction(db);
try
{
siteNodeVO = getSiteNodeVOWithMetaInfoContentId(db, contentId);
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
}
return siteNodeVO;
}
private static Map<Integer,Integer> metaInfoSiteNodeIdMap = new ConcurrentHashMap<Integer,Integer>();
public SiteNodeVO getSiteNodeVOWithMetaInfoContentId(Database db, Integer contentId) throws ConstraintException, SystemException, Exception
{
SiteNodeVO siteNodeVO = null;
Integer cachedSiteNodeId = metaInfoSiteNodeIdMap.get(contentId);
if(cachedSiteNodeId != null)
{
siteNodeVO = getSiteNodeVOWithId(cachedSiteNodeId, db);
}
else
{
//logger.error("Asking for heavy lookup on meta info content id:" + contentId);
//Thread.dumpStack();
//System.out.println("Asking for mapping:" + contentId);
OQLQuery oql = db.getOQLQuery("SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeImpl sn WHERE sn.metaInfoContentId = $1 ORDER BY sn.siteNodeId");
oql.bind(contentId);
QueryResults results = oql.execute(Database.READONLY);
if(results.hasMore())
{
SmallSiteNodeImpl siteNode = (SmallSiteNodeImpl)results.next();
siteNodeVO = siteNode.getValueObject();
logger.info("Caching " + siteNodeVO.getId() + " on " + contentId);
metaInfoSiteNodeIdMap.put(contentId, siteNodeVO.getId());
}
results.close();
oql.close();
}
return siteNodeVO;
}
/*
public SiteNode getSiteNodeWithMetaInfoContentId(Database db, Integer contentId) throws ConstraintException, SystemException, Exception
{
SiteNode siteNode = null;
OQLQuery oql = db.getOQLQuery("SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl sn WHERE sn.metaInfoContentId = $1 ORDER BY sn.siteNodeId");
oql.bind(contentId);
QueryResults results = oql.execute();
if(results.hasMore())
{
siteNode = (SiteNodeImpl)results.next();
}
results.close();
oql.close();
return siteNode;
}
*/
/**
* This method returns true if the if the siteNode in question is protected.
*/
public Integer getProtectedSiteNodeVersionId(Integer siteNodeId)
{
Integer protectedSiteNodeVersionId = null;
try
{
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(siteNodeId);
if(siteNodeVersionVO.getIsProtected() != null)
{
if(siteNodeVersionVO.getIsProtected().intValue() == NO.intValue())
protectedSiteNodeVersionId = null;
else if(siteNodeVersionVO.getIsProtected().intValue() == YES.intValue())
protectedSiteNodeVersionId = siteNodeVersionVO.getId();
else if(siteNodeVersionVO.getIsProtected().intValue() == SiteNodeVersionVO.YES_WITH_INHERIT_FALLBACK.intValue())
protectedSiteNodeVersionId = siteNodeVersionVO.getId();
else if(siteNodeVersionVO.getIsProtected().intValue() == INHERITED.intValue())
{
SiteNodeVO parentSiteNodeVO = getParentSiteNode(siteNodeId);
if(parentSiteNodeVO != null)
protectedSiteNodeVersionId = getProtectedSiteNodeVersionId(parentSiteNodeVO.getId());
}
}
}
catch(Exception e)
{
logger.warn("An error occurred trying to get which (if any) site node is protected:" + e.getMessage(), e);
}
return protectedSiteNodeVersionId;
}
/**
* This method returns true if the if the siteNode in question is protected.
*/
public Integer getProtectedSiteNodeVersionId(Integer siteNodeId, Database db)
{
Integer protectedSiteNodeVersionId = null;
try
{
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(db, siteNodeId);
if(siteNodeVersionVO.getIsProtected() != null)
{
if(siteNodeVersionVO.getIsProtected().intValue() == NO.intValue())
protectedSiteNodeVersionId = null;
else if(siteNodeVersionVO.getIsProtected().intValue() == YES.intValue())
protectedSiteNodeVersionId = siteNodeVersionVO.getId();
else if(siteNodeVersionVO.getIsProtected().intValue() == SiteNodeVersionVO.YES_WITH_INHERIT_FALLBACK.intValue())
protectedSiteNodeVersionId = siteNodeVersionVO.getId();
else if(siteNodeVersionVO.getIsProtected().intValue() == INHERITED.intValue())
{
SiteNodeVO parentSiteNodeVO = getParentSiteNodeVO(siteNodeId, db);
if(parentSiteNodeVO != null)
protectedSiteNodeVersionId = getProtectedSiteNodeVersionId(parentSiteNodeVO.getId(), db);
}
}
}
catch(Exception e)
{
logger.warn("An error occurred trying to get which (if any) site node is protected:" + e.getMessage(), e);
}
return protectedSiteNodeVersionId;
}
public String getSiteNodeIdPath(Integer siteNodeId) throws Exception
{
StringBuffer sb = new StringBuffer();
SiteNodeVO siteNodeVO = getSiteNodeVOWithId(siteNodeId);
sb.insert(0, siteNodeVO.getId());
while(siteNodeVO != null && siteNodeVO.getParentSiteNodeId() != null)
{
sb.insert(0, siteNodeVO.getParentSiteNodeId() + ",");
if(siteNodeVO.getParentSiteNodeId() != null)
siteNodeVO = getSiteNodeVOWithId(siteNodeVO.getParentSiteNodeId());
else
siteNodeVO = null;
}
return sb.toString();
}
public String getSiteNodePath(Integer siteNodeId, Database db) throws Exception
{
return getSiteNodePath(siteNodeId, true, false, db);
}
public String getSiteNodePath(Integer siteNodeId, boolean includeRootSiteNode, boolean includeRepositoryName) throws ConstraintException, SystemException
{
String path = "";
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
beginTransaction(db);
try
{
path = getSiteNodePath(siteNodeId, includeRootSiteNode, includeRepositoryName, db);
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return path;
}
public String getSiteNodePath(Integer siteNodeId, boolean includeRootSiteNode, boolean includeRepositoryName, Database db) throws Exception
{
SiteNodeVO siteNodeVO = getSiteNodeVOWithId(siteNodeId, db);
if (siteNodeVO != null)
{
return getSiteNodePath(siteNodeVO, includeRootSiteNode, includeRepositoryName, db);
}
else
{
logger.warn("Tried to compute path for SiteNode but did not find the SiteNode. SiteNode.id: " + siteNodeId);
return "";
}
}
public String getSiteNodePath(SiteNodeVO siteNodeVO, boolean includeRootSiteNode, boolean includeRepositoryName, Database db) throws Exception
{
StringBuffer sb = new StringBuffer();
RepositoryVO repositoryVO = RepositoryController.getController().getRepositoryVOWithId(siteNodeVO.getRepositoryId(), db);
while(siteNodeVO != null)
{
if (includeRootSiteNode || siteNodeVO.getParentSiteNodeId() != null)
{
sb.insert(0, "/" + siteNodeVO.getName());
}
if(siteNodeVO.getParentSiteNodeId() != null)
siteNodeVO = getSiteNodeVOWithId(siteNodeVO.getParentSiteNodeId(), db);
else
siteNodeVO = null;
}
if (includeRepositoryName)
{
if(repositoryVO != null)
sb.insert(0, repositoryVO.getName() + "/");
}
return sb.toString().replaceAll("//", "/");
}
/**
* This method are here to return all content versions that are x number of versions behind the current active version. This is for cleanup purposes.
*
* @param numberOfVersionsToKeep
* @return
* @throws SystemException
*/
public int cleanSiteNodeVersions(int numberOfVersionsToKeep, boolean keepOnlyOldPublishedVersions, long minimumTimeBetweenVersionsDuringClean, boolean deleteVersions) throws SystemException, Exception
{
if(numberOfVersionsToKeep > 10)
numberOfVersionsToKeep = 10;
int cleanedVersions = 0;
int batchLimit = 20;
Map<Integer,Integer> siteNodeIdMap = getSiteNodeIdVersionCountMap(numberOfVersionsToKeep);
if(!deleteVersions)
{
for(Integer siteNodeId : siteNodeIdMap.keySet())
{
Integer versionCount = siteNodeIdMap.get(siteNodeId);
int additions = versionCount - numberOfVersionsToKeep;
//System.out.println("additions " + siteNodeId + ": " + additions + "/" + versionCount + "/" + numberOfVersionsToKeep);
cleanedVersions = cleanedVersions + additions;
}
}
else
{
List<SiteNodeVersionVO> siteNodeVersionVOList = getSiteNodeVersionVOList(numberOfVersionsToKeep, keepOnlyOldPublishedVersions, minimumTimeBetweenVersionsDuringClean);
//System.out.println("Deleting " + siteNodeVersionVOList.size() + " versions");
int maxIndex = (siteNodeVersionVOList.size() > batchLimit ? batchLimit : siteNodeVersionVOList.size());
List partList = siteNodeVersionVOList.subList(0, maxIndex);
while(partList.size() > 0)
{
if(deleteVersions)
cleanVersions(numberOfVersionsToKeep, partList);
cleanedVersions = cleanedVersions + partList.size();
logger.info("Cleaned " + cleanedVersions + " of " + siteNodeVersionVOList.size());
partList.clear();
maxIndex = (siteNodeVersionVOList.size() > batchLimit ? batchLimit : siteNodeVersionVOList.size());
partList = siteNodeVersionVOList.subList(0, maxIndex);
}
}
return cleanedVersions;
}
public Map<Integer,Integer> getSiteNodeIdVersionCountMap(int numberOfVersionsToKeep) throws SystemException
{
Map<Integer,Integer> result = new HashMap<Integer,Integer>();
/*
if(true)
{
result.put(582178, 10);
result.put(625088, 15);
result.put(582177, 9);
return result;
}
*/
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
StringBuilder sql = new StringBuilder();
if(CmsPropertyHandler.getUseShortTableNames().equals("true"))
sql.append("select siNoId as siteNodeId, versionCount from ( select snv.siNoId, count(*) as versionCount from cmSiNoVer snv group by snv.siNoId order by versionCount desc ) res where versionCount > " + numberOfVersionsToKeep);
else
sql.append("select siteNodeId, versionCount from ( select snv.siteNodeId, count(*) as versionCount from cmSiteNodeVersion snv group by snv.siteNodeId order by versionCount desc ) res where versionCount > " + numberOfVersionsToKeep);
Connection conn = (Connection) db.getJdbcConnection();
PreparedStatement psmt = conn.prepareStatement(sql.toString());
int totalVersions = 0;
ResultSet rs = psmt.executeQuery();
while(rs.next())
{
Integer siteNodeId = new Integer(rs.getString("siteNodeId"));
Integer count = new Integer(rs.getString("versionCount"));
totalVersions = totalVersions + (count-numberOfVersionsToKeep);
result.put(siteNodeId, count);
if(totalVersions > 500)
break;
}
rs.close();
psmt.close();
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
logger.warn("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return result;
}
public List<SiteNodeVersionVO> getSiteNodeVersionVOList(int numberOfVersionsToKeep, boolean keepOnlyOldPublishedVersions, long minimumTimeBetweenVersionsDuringClean) throws SystemException, Bug, Exception
{
Map<Integer,Integer> siteNodeIdMap = getSiteNodeIdVersionCountMap(numberOfVersionsToKeep);
//System.out.println("contentVOList:" + contentVOList.size());
List<SiteNodeVersionVO> siteNodeVersionVOList = new ArrayList<SiteNodeVersionVO>();
if(siteNodeIdMap == null || siteNodeIdMap.size() == 0)
return siteNodeVersionVOList;
List<Integer> siteNodeIdList = new ArrayList<Integer>();
siteNodeIdList.addAll(siteNodeIdMap.keySet());
int slotSize = 500;
while(siteNodeIdList.size() > 0)
{
List<Integer> subList = new ArrayList<Integer>();
if(siteNodeIdList.size() > slotSize)
{
subList = siteNodeIdList.subList(0, slotSize);
siteNodeIdList = siteNodeIdList.subList(slotSize, siteNodeIdList.size()-1);
}
else
{
subList.addAll(siteNodeIdList);
siteNodeIdList.clear();
}
if(subList.size() > 0)
{
siteNodeVersionVOList.addAll(getSiteNodeVersionVOListImpl(subList, numberOfVersionsToKeep, keepOnlyOldPublishedVersions, minimumTimeBetweenVersionsDuringClean));
}
}
return siteNodeVersionVOList;
}
/**
* This method are here to return all content versions that are x number of versions behind the current active version. This is for cleanup purposes.
*
* @param numberOfVersionsToKeep
* @return
* @throws SystemException
*/
public List<SiteNodeVersionVO> getSiteNodeVersionVOListImpl(List<Integer> siteNodeIdList, int numberOfVersionsToKeep, boolean keepOnlyOldPublishedVersions, long minimumTimeBetweenVersionsDuringClean) throws SystemException
{
logger.info("numberOfVersionsToKeep:" + numberOfVersionsToKeep);
Database db = CastorDatabaseService.getDatabase();
List<SiteNodeVersionVO> siteNodeVersionsIdList = new ArrayList();
beginTransaction(db);
try
{
StringBuilder variables = new StringBuilder();
for(int i=0; i<siteNodeIdList.size(); i++)
variables.append("$" + (i+1) + (i+1!=siteNodeIdList.size() ? "," : ""));
OQLQuery oql = db.getOQLQuery("SELECT snv FROM org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeVersionImpl snv WHERE snv.siteNodeId IN LIST (" + variables + ") ORDER BY snv.siteNodeId, snv.siteNodeVersionId desc");
for(Integer siteNodeId : siteNodeIdList)
oql.bind(siteNodeId);
QueryResults results = oql.execute(Database.READONLY);
int numberOfLaterVersions = 0;
Integer previousSiteNodeId = null;
Date previousDate = null;
long difference = -1;
List keptSiteNodeVersionVOList = new ArrayList();
List potentialSiteNodeVersionVOList = new ArrayList();
List versionInitialSuggestions = new ArrayList();
List versionNonPublishedSuggestions = new ArrayList();
while (results.hasMore())
{
SmallSiteNodeVersionImpl version = (SmallSiteNodeVersionImpl)results.next();
if(previousSiteNodeId != null && previousSiteNodeId.intValue() != version.getSiteNodeId().intValue())
{
logger.info("previousSiteNodeId:" + previousSiteNodeId);
if(minimumTimeBetweenVersionsDuringClean != -1 && versionInitialSuggestions.size() > numberOfVersionsToKeep)
{
Iterator potentialSiteNodeVersionVOListIterator = potentialSiteNodeVersionVOList.iterator();
while(potentialSiteNodeVersionVOListIterator.hasNext())
{
SiteNodeVersionVO potentialSiteNodeVersionVO = (SiteNodeVersionVO)potentialSiteNodeVersionVOListIterator.next();
SiteNodeVersionVO firstInitialSuggestedSiteNodeVersionVO = null;
Iterator versionInitialSuggestionsIterator = versionInitialSuggestions.iterator();
while(versionInitialSuggestionsIterator.hasNext())
{
SiteNodeVersionVO initialSuggestedSiteNodeVersionVO = (SiteNodeVersionVO)versionInitialSuggestionsIterator.next();
if(initialSuggestedSiteNodeVersionVO.getStateId().equals(ContentVersionVO.PUBLISHED_STATE))
{
firstInitialSuggestedSiteNodeVersionVO = initialSuggestedSiteNodeVersionVO;
break;
}
}
if(firstInitialSuggestedSiteNodeVersionVO != null)
{
keptSiteNodeVersionVOList.remove(potentialSiteNodeVersionVO);
keptSiteNodeVersionVOList.add(firstInitialSuggestedSiteNodeVersionVO);
versionInitialSuggestions.remove(firstInitialSuggestedSiteNodeVersionVO);
versionInitialSuggestions.add(potentialSiteNodeVersionVO);
}
}
}
siteNodeVersionsIdList.addAll(versionNonPublishedSuggestions);
siteNodeVersionsIdList.addAll(versionInitialSuggestions);
potentialSiteNodeVersionVOList.clear();
versionInitialSuggestions.clear();
versionNonPublishedSuggestions.clear();
keptSiteNodeVersionVOList.clear();
numberOfLaterVersions = 0;
previousDate = null;
difference = -1;
potentialSiteNodeVersionVOList = new ArrayList();
}
else if(previousDate != null)
{
difference = previousDate.getTime() - version.getModifiedDateTime().getTime();
}
if(numberOfLaterVersions > numberOfVersionsToKeep || (keepOnlyOldPublishedVersions && numberOfLaterVersions > 0 && !version.getStateId().equals(ContentVersionVO.PUBLISHED_STATE)))
{
if(version.getStateId().equals(ContentVersionVO.PUBLISHED_STATE))
{
versionInitialSuggestions.add(version.getValueObject());
}
else
{
versionNonPublishedSuggestions.add(version.getValueObject());
}
}
else if(previousDate != null && difference != -1 && difference < minimumTimeBetweenVersionsDuringClean)
{
keptSiteNodeVersionVOList.add(version.getValueObject());
potentialSiteNodeVersionVOList.add(version.getValueObject());
numberOfLaterVersions++;
}
else
{
keptSiteNodeVersionVOList.add(version.getValueObject());
previousDate = version.getModifiedDateTime();
numberOfLaterVersions++;
}
previousSiteNodeId = version.getSiteNodeId();
}
results.close();
oql.close();
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return siteNodeVersionsIdList;
}
/**
* Cleans the list of versions - even published ones. Use with care only for cleanup purposes.
*
* @param numberOfVersionsToKeep
* @param contentVersionVOList
* @throws SystemException
*/
private void cleanVersions(int numberOfVersionsToKeep, List siteNodeVersionVOList) throws SystemException
{
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
Iterator<SiteNodeVersionVO> siteNodeVersionVOListIterator = siteNodeVersionVOList.iterator();
while(siteNodeVersionVOListIterator.hasNext())
{
SiteNodeVersionVO siteNodeVersionVO = siteNodeVersionVOListIterator.next();
//SiteNodeVersion siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionWithId(siteNodeVersionVO.getId(), db);
MediumSiteNodeVersionImpl siteNodeVersion = SiteNodeVersionController.getController().getMediumSiteNodeVersionWithId(siteNodeVersionVO.getId(), db);
logger.info("Deleting the siteNodeVersion " + siteNodeVersion.getId() + " on siteNode " + siteNodeVersion.getSiteNodeId());
delete(siteNodeVersion, db, true);
}
commitTransaction(db);
Thread.sleep(1000);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
finally
{
closeDatabase(db);
}
}
/**
* This method deletes an contentversion and notifies the owning content.
*/
public void delete(SiteNodeVersion siteNodeVersion, Database db, boolean forceDelete) throws ConstraintException, SystemException, Exception
{
if (!forceDelete && siteNodeVersion.getStateId().intValue() == ContentVersionVO.PUBLISHED_STATE.intValue() && siteNodeVersion.getIsActive().booleanValue() == true)
{
throw new ConstraintException("SiteNodeVersion.stateId", "3300", siteNodeVersion.getOwningSiteNode().getName());
}
ServiceBindingController.deleteServiceBindingsReferencingSiteNodeVersion(siteNodeVersion, db);
SiteNodeStateController.getController().deleteAccessRights("SiteNodeVersion", siteNodeVersion.getId(), db);
SiteNode siteNode = siteNodeVersion.getOwningSiteNode();
if(siteNode != null)
siteNode.getSiteNodeVersions().remove(siteNodeVersion);
db.remove(siteNodeVersion);
}
public void delete(MediumSiteNodeVersionImpl siteNodeVersion, Database db, boolean forceDelete) throws ConstraintException, SystemException, Exception
{
if (!forceDelete && siteNodeVersion.getStateId().intValue() == ContentVersionVO.PUBLISHED_STATE.intValue() && siteNodeVersion.getIsActive().booleanValue() == true)
{
SiteNodeVO snVO = getSiteNodeVOWithId(siteNodeVersion.getSiteNodeId(), db);
throw new ConstraintException("SiteNodeVersion.stateId", "3300", snVO.getName());
}
Collection serviceBindnings = siteNodeVersion.getServiceBindings();
Iterator serviceBindningsIterator = serviceBindnings.iterator();
while(serviceBindningsIterator.hasNext())
{
SmallServiceBindingImpl serviceBinding = (SmallServiceBindingImpl)serviceBindningsIterator.next();
//logger.info("serviceBinding:" + serviceBinding.getServiceBindingId());
Collection qualifyers = serviceBinding.getBindingQualifyers();
Iterator qualifyersIterator = qualifyers.iterator();
while(qualifyersIterator.hasNext())
{
SmallQualifyerImpl qualifyer = (SmallQualifyerImpl)qualifyersIterator.next();
qualifyersIterator.remove();
serviceBinding.getBindingQualifyers().remove(qualifyer);
}
db.remove(serviceBinding);
}
//ServiceBindingController.deleteServiceBindingsReferencingSiteNodeVersion(siteNodeVersion, db);
SiteNodeStateController.getController().deleteAccessRights("SiteNodeVersion", siteNodeVersion.getId(), db);
db.remove(siteNodeVersion);
}
//Copy logic
/**
* This method copies a siteNode after first making a couple of controls that the move is valid.
*/
public void copySiteNode(SiteNodeVO siteNodeVO, Integer newParentSiteNodeId, InfoGluePrincipal principal, ProcessBean processBean) throws ConstraintException, SystemException
{
Timer t = new Timer();
logger.info("siteNodeVO:" + siteNodeVO);
logger.info("newParentSiteNodeId:" + newParentSiteNodeId);
logger.info("principal:" + principal);
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
beginTransaction(db);
try
{
//Validation that checks the entire object
siteNodeVO.validate();
if(newParentSiteNodeId == null)
{
logger.warn("You must specify the new parent-siteNode......");
throw new ConstraintException("SiteNode.parentSiteNodeId", "3403");
}
/*
if(siteNodeVO.getId().intValue() == newParentSiteNodeId.intValue())
{
logger.warn("You cannot have the siteNode as it's own parent......");
throw new ConstraintException("SiteNode.parentSiteNodeId", "3401");
}
*/
SiteNodeVO siteNode = getSiteNodeVOWithId(siteNodeVO.getSiteNodeId(), db);
SiteNodeVO oldParentSiteNode = getSiteNodeVOWithId(siteNodeVO.getParentSiteNodeId(), db); //siteNode.getParentSiteNode();
SiteNodeVO newParentSiteNode = getSiteNodeVOWithId(newParentSiteNodeId, db);
SiteNodeVO tempSiteNode = getSiteNodeVOWithId(newParentSiteNode.getParentSiteNodeId(), db); //siteNode.getParentSiteNode();
//SiteNode tempSiteNode = newParentSiteNode.getParentSiteNode();
while(tempSiteNode != null)
{
if(tempSiteNode.getId().intValue() == siteNode.getId().intValue())
{
logger.warn("You cannot move the node to a child under it......");
throw new ConstraintException("SiteNode.parentSiteNodeId", "3402");
}
tempSiteNode = getSiteNodeVOWithId(tempSiteNode.getParentSiteNodeId(), db); //siteNode.getParentSiteNode();
//tempSiteNode = tempSiteNode.getParentSiteNode();
}
processBean.updateProcess("Checked for constraints");
Map args = new HashMap();
args.put("globalKey", "infoglue");
PropertySet ps = PropertySetManager.getInstance("jdbc", args);
Collection keys = ps.getKeys();
logger.info("keys:" + keys.size());
processBean.updateProcess("Propertyset fetched...");
Map<Integer,Integer> siteNodeIdsMapping = new HashMap<Integer,Integer>();
Map<Integer,Integer> contentIdsMapping = new HashMap<Integer,Integer>();
Set<Integer> siteNodeIdsToCopy = new HashSet<Integer>();
Set<Integer> contentIdsToCopy = new HashSet<Integer>();
List<ContentVersion> newCreatedContentVersions = new ArrayList<ContentVersion>();
String newNameSuffix = getNewNameSuffixForCopy(principal, db, newParentSiteNode);
copySiteNodeRecursive(siteNode, newParentSiteNode, principal, siteNodeIdsMapping, contentIdsMapping, contentIdsToCopy, newCreatedContentVersions, newNameSuffix, db, processBean, new HashMap<String,String>());
//After this all sitenodes main should be copied but then we have to round up some related nodes later
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("copySiteNodeRecursive", t.getElapsedTime());
processBean.updateProcess("Now we search for related contents to copy");
//Now let's go through all contents
for(ContentVersion version : newCreatedContentVersions)
{
getRelatedEntities(newParentSiteNode, principal, version.getVersionValue(), siteNodeVO.getRepositoryId(), newParentSiteNode.getRepositoryId(), siteNodeIdsMapping, contentIdsMapping, siteNodeIdsToCopy, contentIdsToCopy, newCreatedContentVersions, 0, 3, newNameSuffix, db, processBean, new HashMap<String,String>());
//getContentRelationsChain(siteNodesIdsMapping, contentIdsMapping, newParentSiteNode.getRepository().getId(), oldSiteNodeVO.getRepositoryId(), principal, versions, 0, 3, db);
}
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getRelatedEntities", t.getElapsedTime());
processBean.updateProcess("Copying " + contentIdsToCopy.size() + " contents");
//After this all related sitenodes should have been created and all related contents accounted for
copyContents(newParentSiteNode, principal, contentIdsToCopy, siteNodeVO.getRepositoryId(), newParentSiteNode.getRepositoryId(), contentIdsMapping, newCreatedContentVersions, db, ps, new HashMap());
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("copyContents", t.getElapsedTime());
processBean.updateProcess("Remapping relations");
rewireBindingsAndRelations(siteNodeIdsMapping, contentIdsMapping, newCreatedContentVersions, db);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("rewireBindingsAndRelations", t.getElapsedTime());
//If any of the validations or setMethods reported an error, we throw them up now before create.
ceb.throwIfNotEmpty();
commitTransaction(db);
}
catch(ConstraintException ce)
{
logger.warn("An error occurred so we should not complete the transaction:" + ce, ce);
rollbackTransaction(db);
throw ce;
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
}
private String getNewNameSuffixForCopy(InfoGluePrincipal principal, Database db, SiteNodeVO newParentSiteNode) throws SystemException, Exception
{
LanguageVO newParentLanguageVO = null;
List<LanguageVO> siteNodeLanguages = LanguageDeliveryController.getLanguageDeliveryController().getLanguagesForSiteNode(db, newParentSiteNode.getSiteNodeId(), principal);
if (logger.isDebugEnabled())
{
logger.debug("Available sitenode languages for new parent sitenode (used for new name suffix). siteNodeLanguages: " + siteNodeLanguages);
}
if (siteNodeLanguages != null && siteNodeLanguages.size() > 0)
{
newParentLanguageVO = siteNodeLanguages.get(0);
}
if (newParentLanguageVO == null)
{
newParentLanguageVO = LanguageController.getController().getMasterLanguage(newParentSiteNode.getSiteNodeId(), db);
}
if (newParentLanguageVO != null)
{
return LabelController.getController(newParentLanguageVO.getLocale()).getString("tool.structuretool.importPage.suffix");
}
logger.debug("Did not find a name suffix for copied sitenodes. SiteNode: " + newParentSiteNode.getSiteNodeId());
return "";
}
private void copySiteNodeRecursive(SiteNodeVO siteNode, SiteNodeVO newParentSiteNode, InfoGluePrincipal principal, Map<Integer,Integer> siteNodesIdsMapping, Map<Integer,Integer> contentIdsMapping, Set<Integer> contentIdsToCopy, List<ContentVersion> newCreatedContentVersions, String newNameSuffix, Database db, ProcessBean processBean, Map<String,String> replaceMap) throws Exception
{
VisualFormatter visualFormatter = new VisualFormatter();
processBean.updateLastDescription("Copied " + siteNodesIdsMapping.size() + "...");
Timer t = new Timer();
if(siteNodesIdsMapping.containsKey(siteNode.getId()))
{
logger.warn("Returning as this sitenode has allready been copied... no recusion please");
return;
}
SiteNodeVO oldSiteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNode.getId(), db);
if(oldSiteNodeVO.getMetaInfoContentId() == null || oldSiteNodeVO.getMetaInfoContentId().intValue() == -1)
{
logger.warn("The page " + oldSiteNodeVO.getName() + " had a missing meta info");
return;
}
ContentVO oldMetaInfoContentVO = ContentController.getContentController().getContentVOWithId(oldSiteNodeVO.getMetaInfoContentId(), db);
LanguageVO masterLanguage = LanguageController.getController().getMasterLanguage(siteNode.getRepositoryId(), db);
ContentVersionVO oldCVVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(oldMetaInfoContentVO.getId(), masterLanguage.getId(), db);
if(oldCVVO == null)
logger.warn("No meta info version on: " + oldSiteNodeVO.getName() + ":" + oldMetaInfoContentVO.getId());
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getLatestActiveContentVersionVO", t.getElapsedTime());
SiteNodeVO newSiteNodeVO = new SiteNodeVO();
newSiteNodeVO.setName(visualFormatter.replaceAccordingToMappings(replaceMap, oldSiteNodeVO.getName()));
//newSiteNodeVO.setName(oldSiteNodeVO.getName() + newNameSuffix);
newSiteNodeVO.setIsBranch(oldSiteNodeVO.getIsBranch());
newSiteNodeVO.setCreatorName(oldSiteNodeVO.getCreatorName());
newSiteNodeVO.setExpireDateTime(oldSiteNodeVO.getExpireDateTime());
newSiteNodeVO.setIsProtected(oldSiteNodeVO.getIsProtected());
//newSiteNodeVO.setPublishDateTime(oldSiteNodeVO.getPublishDateTime()); //This should reflect the date of the copy instead.
newSiteNodeVO.setStateId(oldSiteNodeVO.getStateId());
SiteNodeVO newSiteNode = SiteNodeControllerProxy.getSiteNodeControllerProxy().acCreatePure(principal, newParentSiteNode.getId(), siteNode.getSiteNodeTypeDefinitionId(), newParentSiteNode.getRepositoryId(), newSiteNodeVO, 0, db).getValueObject();
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("acCreate", t.getElapsedTime());
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(db, oldSiteNodeVO.getId());
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getLatestActiveSiteNodeVersionVO", t.getElapsedTime());
if(siteNodeVersionVO != null)
{
Integer oldSiteNodeVersionId = siteNodeVersionVO.getId();
SiteNodeVersionVO newSiteNodeVersionVO = new SiteNodeVersionVO();
newSiteNodeVersionVO.setContentType(siteNodeVersionVO.getContentType());
newSiteNodeVersionVO.setPageCacheKey(siteNodeVersionVO.getPageCacheKey());
newSiteNodeVersionVO.setPageCacheTimeout(siteNodeVersionVO.getPageCacheTimeout());
newSiteNodeVersionVO.setDisableEditOnSight(siteNodeVersionVO.getDisableEditOnSight());
newSiteNodeVersionVO.setDisableLanguages(siteNodeVersionVO.getDisableLanguages());
newSiteNodeVersionVO.setDisablePageCache(siteNodeVersionVO.getDisablePageCache());
newSiteNodeVersionVO.setDisableForceIdentityCheck(siteNodeVersionVO.getDisableForceIdentityCheck());
newSiteNodeVersionVO.setForceProtocolChange(siteNodeVersionVO.getForceProtocolChange());
newSiteNodeVersionVO.setIsProtected(siteNodeVersionVO.getIsProtected());
newSiteNodeVersionVO.setVersionModifier(principal.getName());
newSiteNodeVersionVO.setStateId(0);
newSiteNodeVersionVO.setIsActive(true);
newSiteNodeVersionVO.setModifiedDateTime(new Date()/*siteNodeVersionVO.getModifiedDateTime()*/);
newSiteNodeVersionVO.setIsHidden(siteNodeVersionVO.getIsHidden());
newSiteNodeVersionVO.setSortOrder(siteNodeVersionVO.getSortOrder());
SiteNodeVersionVO siteNodeVersion = SiteNodeVersionController.getController().createSmall(newSiteNode.getId(), principal, newSiteNodeVersionVO, db).getValueObject();
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("createSmall", t.getElapsedTime());
Map args = new HashMap();
args.put("globalKey", "infoglue");
PropertySet ps = PropertySetManager.getInstance("jdbc", args);
String disabledLanguagesString = ps.getString("siteNode_" + oldSiteNodeVO.getId() + "_disabledLanguages");
String enabledLanguagesString = ps.getString("siteNode_" + oldSiteNodeVO.getId() + "_enabledLanguages");
logger.info("disabledLanguagesString:" + disabledLanguagesString);
logger.info("enabledLanguagesString:" + enabledLanguagesString);
if(disabledLanguagesString != null && !disabledLanguagesString.equals(""))
ps.setString("siteNode_" + newSiteNode.getId() + "_disabledLanguages", disabledLanguagesString);
if(enabledLanguagesString != null && !enabledLanguagesString.equals(""))
ps.setString("siteNode_" + newSiteNode.getId() + "_enabledLanguages", enabledLanguagesString);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("ps", t.getElapsedTime());
//Copy all access rights...
SiteNodeStateController.getController().copyAccessRights("SiteNodeVersion", oldSiteNodeVersionId, siteNodeVersion.getId(), replaceMap, db);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("copyAccessRights", t.getElapsedTime());
//t.printElapsedTime("copy access");
}
//ContentVersion newCV = null;
List<ContentVersion> newContentVersions = new ArrayList<ContentVersion>();
Content newMetaInfoContent = SiteNodeController.getController().createSiteNodeMetaInfoContent(db, newSiteNode, null, newParentSiteNode.getRepositoryId(), principal, null, newContentVersions, false, oldMetaInfoContentVO, newNameSuffix);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("createSiteNodeMetaInfoContent", t.getElapsedTime());
//ContentVersionVO newCV = ContentVersionController.getContentVersionController().getLatestActiveContentVersion(newMetaInfoContent.getId(), masterLanguage.getId(), db);
//t.printElapsedTime("newCV:" + newCV);
logger.info("Adding content version " + newContentVersions.size());
newCreatedContentVersions.addAll(newContentVersions);
logger.info("Mapping siteNode " + oldSiteNodeVO.getId() + " to " + newSiteNode.getId());
siteNodesIdsMapping.put(oldSiteNodeVO.getId(), newSiteNode.getId());
if(oldCVVO != null)
{
String versionValue = oldCVVO.getVersionValue();
if(newContentVersions.size() > 0)
{
ContentVersion newCV = newContentVersions.get(0);
versionValue = versionValue.replaceFirst(Pattern.quote("<NavigationTitle><![CDATA[") + "(.+?)" + Pattern.quote("]]></NavigationTitle>"), Matcher.quoteReplacement("<NavigationTitle><![CDATA[") + "$1" + newNameSuffix + Matcher.quoteReplacement("]]></NavigationTitle>"));
newCV.getValueObject().setVersionValue(versionValue);
}
}
for(SiteNodeVO childNode : (Collection<SiteNodeVO>)getChildSiteNodeVOList(siteNode.getId(), false, db, null))
{
copySiteNodeRecursive(childNode, newSiteNode, principal, siteNodesIdsMapping, contentIdsMapping, contentIdsToCopy, newCreatedContentVersions, newNameSuffix, db, processBean, replaceMap);
}
}
private void getRelatedEntities(SiteNodeVO newParentSiteNode, InfoGluePrincipal principal, String versionValue, Integer oldRepositoryId, Integer newRepositoryId, Map<Integer,Integer> siteNodeIdsMapping, Map<Integer,Integer> contentIdsMapping, Set<Integer> siteNodeIdsToCopy, Set<Integer> contentIdsToCopy, List<ContentVersion> versions, int depth, int maxDepth, String newNameSuffix, Database db, ProcessBean processBean, Map<String,String> replaceMap) throws Exception
{
if(depth > maxDepth)
return;
Set<Integer> relatedSiteNodeIds = new HashSet<Integer>();
Set<Integer> relatedContentIds = RegistryController.getController().getComponents(versionValue);
RegistryController.getController().getComponentBindings(versionValue, relatedSiteNodeIds, relatedContentIds);
logger.info("Searching for related sitenodes");
RegistryController.getController().getInlineSiteNodes(versionValue, relatedSiteNodeIds, relatedContentIds);
logger.info("Searching for related contents");
RegistryController.getController().getInlineContents(versionValue, relatedSiteNodeIds, relatedContentIds);
contentIdsToCopy.addAll(relatedContentIds);
siteNodeIdsToCopy.addAll(relatedSiteNodeIds);
logger.info("A relatedSiteNodeIds:" + relatedSiteNodeIds.size());
logger.info("A relatedContentIds:" + relatedContentIds.size());
Iterator relatedContentIdsIterator = relatedContentIds.iterator();
while(relatedContentIdsIterator.hasNext())
{
Integer contentId = (Integer)relatedContentIdsIterator.next();
logger.info("contentId:" + contentId);
try
{
ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentId, db);
if(contentVO != null)
{
logger.info("The contentVO 1: " + contentVO.getName() + " from repo " + contentVO.getRepositoryId());
if(contentVO.getRepositoryId().intValue() == oldRepositoryId.intValue())
{
logger.info("The related content was in the old repo as well - let's copy that as well");
/*
if(contentIdsToCopy.contains(contentId))
{
logger.warn("Allready transferred content so skipping:" + contentVO.getName());
continue;
}
*/
List<ContentVersionVO> latestContentVersionVOListAllLanguages = ContentVersionController.getContentVersionController().getLatestContentVersionVOListPerLanguage(contentId, db);
for(ContentVersionVO contentVersionVO : latestContentVersionVOListAllLanguages)
{
getRelatedEntities(newParentSiteNode, principal, contentVersionVO.getVersionValue(), oldRepositoryId, newRepositoryId, siteNodeIdsMapping, contentIdsMapping, siteNodeIdsToCopy, contentIdsToCopy, versions, depth+1, maxDepth, newNameSuffix, db, processBean, replaceMap);
}
}
else
logger.info("The related content was outside the old repo so we skip it");
}
else
logger.warn("The related content was not found");
}
catch (SystemException e)
{
logger.warn("Error getting related content:" + e.getMessage(), e);
}
}
Iterator relatedSiteNodeIdsIterator = relatedSiteNodeIds.iterator();
while(relatedSiteNodeIdsIterator.hasNext())
{
Integer siteNodeId = (Integer)relatedSiteNodeIdsIterator.next();
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeId, db);
if(siteNodeVO != null)
{
logger.info("siteNodeVO: " + siteNodeVO + " for " + siteNodeId);
logger.info("The siteNodeVO: " + siteNodeVO.getName() + " from repo " + siteNodeVO.getRepositoryId());
if(siteNodeVO.getRepositoryId().intValue() == oldRepositoryId.intValue())
{
logger.info("The related siteNode was in the old repo as well - let's copy that as well - hope we don't get recursive on our ass");
if(siteNodeIdsToCopy.contains(siteNodeId))
{
logger.info("Allready transferred siteNode so skipping:" + siteNodeVO.getName());
continue;
}
SiteNodeVO siteNode = getSiteNodeVOWithId(siteNodeVO.getSiteNodeId(), db);
SiteNodeVO oldParentSiteNode = getSiteNodeVOWithId(siteNode.getParentSiteNodeId(), db);
//SiteNode oldParentSiteNode = siteNode.getParentSiteNode();
copySiteNodeRecursive(siteNode, newParentSiteNode, principal, siteNodeIdsMapping, contentIdsMapping, contentIdsToCopy, versions, newNameSuffix, db, processBean, replaceMap);
}
else
logger.info("The related content was outside the old repo so we skip it");
}
else
logger.warn("Skipping related sitenode as it was missing.");
}
}
private void copyContents(SiteNodeVO newParentSiteNode, InfoGluePrincipal principal, Set<Integer> contentIdsToCopy, /*String versionValue, */Integer oldRepositoryId, Integer newRepositoryId, Map<Integer,Integer> contentIdsMapping, List<ContentVersion> versions, Database db, PropertySet ps, Map<String,String> replaceMap) throws Exception
{
copyContents(newParentSiteNode, principal, contentIdsToCopy, oldRepositoryId, newRepositoryId, contentIdsMapping, versions, true, "false", null, db, ps, replaceMap);
}
private void copyContents(SiteNodeVO newParentSiteNode, InfoGluePrincipal principal, Set<Integer> contentIdsToCopy, /*String versionValue, */Integer oldRepositoryId, Integer newRepositoryId, Map<Integer,Integer> contentIdsMapping, List<ContentVersion> versions, boolean includeRootContentInPath, String onlyLatestVersions, ProcessBean processBean, Database db, PropertySet ps, Map<String,String> replaceMap) throws Exception
{
VisualFormatter visualFormatter = new VisualFormatter();
logger.info("contentIdsToCopy:" + contentIdsToCopy.size());
int totalCount = 0;
int count = 0;
for(Integer contentId : contentIdsToCopy)
{
if(count > 100)
{
count = 0;
if(processBean != null)
processBean.updateProcess("Copied " + totalCount + " contents so far.");
db.commit();
db.begin();
}
count++;
totalCount++;
logger.info("contentId:" + contentId);
try
{
ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentId, db);
if(contentVO != null && newRepositoryId.intValue() != contentVO.getRepositoryId().intValue())
{
logger.info("The contentVO: " + contentVO.getName() + " from repo " + contentVO.getRepositoryId() + " ctd:" + contentVO.getContentTypeDefinitionId());
if(contentVO.getRepositoryId().intValue() == oldRepositoryId.intValue())
{
logger.info("The related content was in the old repo as well - let's copy that as well");
if(contentIdsMapping.containsKey(contentId))
{
logger.info("Allready transferred content so skipping:" + contentVO.getName());
continue;
}
ContentVO copiedContent = null;
if(contentVO.getParentContentId() == null)
{
ContentVO rootContentNewRepo = ContentController.getContentController().getWritableRootContentVO(db, newRepositoryId, principal.getName(), false);
if(rootContentNewRepo != null)
{
ContentController.getContentController().copyContentProperties(ps, contentVO.getId(), rootContentNewRepo.getId());
copiedContent = rootContentNewRepo;
}
}
else
{
String path = ContentController.getContentController().getContentPath(contentId, includeRootContentInPath, false, db);
logger.info("path:" + path);
path = visualFormatter.replaceAccordingToMappings(replaceMap, path);
logger.info("path:" + path);
copiedContent = ContentController.getContentController().getContentVOWithPath(newRepositoryId, path, true, !contentVO.getIsBranch(), principal, db);
}
logger.info("Mapping content " + contentVO.getId() + " to " + copiedContent.getId());
contentIdsMapping.put(contentVO.getId(), copiedContent.getId());
copiedContent.setName(visualFormatter.replaceAccordingToMappings(replaceMap, contentVO.getName()));
copiedContent.setExpireDateTime(contentVO.getExpireDateTime());
copiedContent.setIsBranch(contentVO.getIsBranch());
copiedContent.setIsProtected(contentVO.getIsProtected());
//copiedContent.setPublishDateTime(contentVO.getPublishDateTime()); /Should be repo copy date
copiedContent.setCreatorName(principal.getName());
copiedContent.setContentTypeDefinitionId(contentVO.getContentTypeDefinitionId());
if(contentVO.getIsBranch())
{
ContentController.getContentController().copyContentProperties(ps, contentVO.getId(), copiedContent.getId());
}
SiteNodeStateController.getController().copyAccessRights("Content", contentVO.getId(), copiedContent.getId(), replaceMap, db);
Map<Integer,Integer> assetIdMap = new HashMap<Integer,Integer>();
//Map<Integer,Integer> assetIdMap = new HashMap<Integer,Integer>();
//ContentVersionController.getContentVersionController().getLatestContentVersionVOListPerLanguage(contentIds, db);
Collection<ContentVersionVO> contentVersionVOList = ContentVersionController.getContentVersionController().getContentVersionVOList(contentVO.getId());
if(onlyLatestVersions.equals("true"))
{
Map<Integer,ContentVersionVO> latestVersions = new HashMap<Integer,ContentVersionVO>();
for(ContentVersionVO contentVersionVO : contentVersionVOList)
{
if(contentVersionVO.getIsActive() && contentVersionVO.getLanguageId() != null)
{
if(!latestVersions.containsKey(contentVersionVO.getLanguageId()) || latestVersions.get(contentVersionVO.getLanguageId()).getId() < contentVersionVO.getId())
{
latestVersions.put(contentVersionVO.getLanguageId(), contentVersionVO);
}
}
}
contentVersionVOList.clear();
for(Integer key : latestVersions.keySet())
contentVersionVOList.add(latestVersions.get(key));
}
for(ContentVersionVO contentVersionVO : contentVersionVOList)
{
logger.info("contentVersionVO:" + contentVersionVO.getId());
Integer oldContentVersionId = contentVersionVO.getId();
logger.info("oldContentVersionId:" + oldContentVersionId);
//List assets = DigitalAssetController.getDigitalAssetVOList(contentVersionVO.getId());
List<ContentCategory> contentCategories = ContentCategoryController.getController().findByContentVersionReadOnly(contentVersionVO.getId(), db);
//logger.info("assets:" + assets);
logger.info("contentCategories:" + contentCategories);
//ContentTypeDefinition ctd = ContentTypeDefinitionController.getController().getContentTypeDefinitionWithId(contentVO.getContentTypeDefinitionId(), db);
contentVersionVO.setStateId(0);
ContentVersionVO newContentVersionVO = new ContentVersionVO();
newContentVersionVO.setStateId(0);
newContentVersionVO.setVersionModifier(contentVersionVO.getVersionModifier());
newContentVersionVO.setModifiedDateTime(new Date()/*contentVersionVO.getModifiedDateTime()*/);
newContentVersionVO.setVersionValue(contentVersionVO.getVersionValue());
ContentVersion contentVersion = ContentVersionController.getContentVersionController().createMedium(copiedContent.getId(), contentVersionVO.getLanguageId(), contentVersionVO, db);
//contentVersion.getOwningContent().setContentTypeDefinition((ContentTypeDefinitionImpl)ctd);
logger.info("contentVO.getId():" + contentVO.getId() + "");
logger.info("Adding content version " + contentVersion);
versions.add(contentVersion);
DigitalAssetController.getController().createByCopy(oldContentVersionId, (MediumContentVersionImpl)contentVersion, assetIdMap, db);
for(ContentCategory cc : contentCategories)
{
ContentCategoryVO contentCategoryVO = new ContentCategoryVO();
contentCategoryVO.setAttributeName(cc.getAttributeName());
ContentCategoryController.getController().createMediumWithDatabase(contentCategoryVO, cc.getCategory(), contentVersion, db);
}
logger.info("Created contentVersion:" + contentVersion);
}
}
else
logger.info("The related content was outside the old repo so we skip it");
}
else
{
logger.info("The related content was not found or the content was in the same repo so we reuse the old one");
}
}
catch (SystemException e)
{
logger.warn("Error getting related content:" + e.getMessage(), e);
}
}
}
/**
* This method copies a siteNode after first making a couple of controls that the move is valid.
*/
private Map<String,InterceptionPoint> interceptionPoints = new HashMap<String,InterceptionPoint>();
public void copyAccessRights(Database db, String oldParameter, String newParameter, String interceptionPointName) throws Exception
{
InterceptionPoint interceptionPoint = interceptionPoints.get(interceptionPointName);
if(interceptionPoint == null)
{
interceptionPoint = InterceptionPointController.getController().getInterceptionPointWithName(interceptionPointName, db);
interceptionPoints.put(interceptionPointName, interceptionPoint);
}
List<AccessRight> accessRights = AccessRightController.getController().getAccessRightListOnlyReadOnly(interceptionPoint.getId(), oldParameter, db);
for(AccessRight accessRight : accessRights)
{
AccessRightImpl arImpl = new AccessRightImpl();
arImpl.setInterceptionPoint(interceptionPoint);
arImpl.setParameters(newParameter);
db.create(arImpl);
Iterator accessRightRoleIterator = accessRight.getRoles().iterator();
while(accessRightRoleIterator.hasNext())
{
AccessRightRole accessRightRole = (AccessRightRole)accessRightRoleIterator.next();
AccessRightRoleImpl arrImpl = new AccessRightRoleImpl();
arrImpl.setAccessRight(arImpl);
arrImpl.setRoleName(accessRightRole.getRoleName());
arImpl.getRoles().add(arrImpl);
db.create(arrImpl);
}
Iterator accessRightGroupIterator = accessRight.getGroups().iterator();
while(accessRightGroupIterator.hasNext())
{
AccessRightGroup accessRightGroup = (AccessRightGroup)accessRightGroupIterator.next();
AccessRightGroupImpl argImpl = new AccessRightGroupImpl();
argImpl.setAccessRight(arImpl);
argImpl.setGroupName(accessRightGroup.getGroupName());
arImpl.getGroups().add(argImpl);
db.create(argImpl);
}
Iterator accessRightUserIterator = accessRight.getUsers().iterator();
while(accessRightUserIterator.hasNext())
{
AccessRightUser accessRightUser = (AccessRightUser)accessRightUserIterator.next();
AccessRightUserImpl aruImpl = new AccessRightUserImpl();
aruImpl.setAccessRight(arImpl);
aruImpl.setUserName(accessRightUser.getUserName());
arImpl.getUsers().add(aruImpl);
db.create(aruImpl);
}
}
}
private void rewireBindingsAndRelations(Map<Integer,Integer> siteNodesIdsMapping, Map<Integer,Integer> contentIdsMapping, List<ContentVersion> versions, Database db)
{
for(ContentVersion version : versions)
{
logger.info("Rewiring version:" + version.getId() + ":" + version.getVersionValue());
String contentVersionValue = version.getVersionValue();
contentVersionValue = contentVersionValue.replaceAll("contentId=\"", "contentId=\"oldContentId_");
contentVersionValue = contentVersionValue.replaceAll("\\?contentId=", "\\?contentId=oldContentId_");
contentVersionValue = contentVersionValue.replaceAll("getInlineAssetUrl\\(", "getInlineAssetUrl\\(oldContentId_");
contentVersionValue = contentVersionValue.replaceAll("languageId,", "languageId,oldContentId_");
contentVersionValue = contentVersionValue.replaceAll("entity=\"Content\" entityId=\"", "entity=\"Content\" entityId=\"oldContentId_");
//contentVersionValue = contentVersionValue.replaceAll("entity='Content'><id>", "entity='Content'><id>oldContentId_");
contentVersionValue = contentVersionValue.replaceAll("siteNodeId=\"", "siteNodeId=\"oldSiteNodeId_");
contentVersionValue = contentVersionValue.replaceAll("detailSiteNodeId=\"", "detailSiteNodeId=\"oldSiteNodeId_");
contentVersionValue = contentVersionValue.replaceAll("getPageUrl\\((\\d)", "getPageUrl\\(oldSiteNodeId_$1");
contentVersionValue = contentVersionValue.replaceAll("entity=\"SiteNode\" entityId=\"", "entity=\"SiteNode\" entityId=\"oldSiteNodeId_");
Iterator<Integer> contentIdMapIterator = contentIdsMapping.keySet().iterator();
while (contentIdMapIterator.hasNext())
{
Integer oldContentId = contentIdMapIterator.next();
Integer newContentId = contentIdsMapping.get(oldContentId);
logger.info("Replacing all:" + oldContentId + " with " + newContentId);
contentVersionValue = contentVersionValue.replaceAll("contentId=\"oldContentId_" + oldContentId + "\"", "contentId=\"" + newContentId + "\"");
contentVersionValue = contentVersionValue.replaceAll("\\?contentId=oldContentId_" + oldContentId + "&", "\\?contentId=" + newContentId + "&");
contentVersionValue = contentVersionValue.replaceAll("getInlineAssetUrl\\(oldContentId_" + oldContentId + ",", "getInlineAssetUrl\\(" + newContentId + ",");
contentVersionValue = contentVersionValue.replaceAll("languageId,oldContentId_" + oldContentId + "\\)", "languageId," + newContentId + "\\)");
contentVersionValue = contentVersionValue.replaceAll("entity=\"Content\" entityId=\"oldContentId_" + oldContentId + "\"", "entity=\"Content\" entityId=\"" + newContentId + "\"");
contentVersionValue = contentVersionValue.replaceAll("<id>oldContentId_" + oldContentId + "</id>", "<id>" + newContentId + "</id>");
}
Iterator<Integer> siteNodeIdMapIterator = siteNodesIdsMapping.keySet().iterator();
while (siteNodeIdMapIterator.hasNext())
{
Integer oldSiteNodeId = siteNodeIdMapIterator.next();
Integer newSiteNodeId = siteNodesIdsMapping.get(oldSiteNodeId);
logger.info("Replacing all:" + oldSiteNodeId + " with " + newSiteNodeId);
contentVersionValue = contentVersionValue.replaceAll("siteNodeId=\"oldSiteNodeId_" + oldSiteNodeId + "\"", "siteNodeId=\"" + newSiteNodeId + "\"");
contentVersionValue = contentVersionValue.replaceAll("detailSiteNodeId=\"oldSiteNodeId_" + oldSiteNodeId + "\"", "detailSiteNodeId=\"" + newSiteNodeId + "\"");
contentVersionValue = contentVersionValue.replaceAll("getPageUrl\\(oldSiteNodeId_" + oldSiteNodeId + ",", "getPageUrl\\(" + newSiteNodeId + ",");
contentVersionValue = contentVersionValue.replaceAll("entity=\"SiteNode\" entityId=\"oldSiteNodeId_" + oldSiteNodeId + "\"", "entity=\"SiteNode\" entityId=\"" + newSiteNodeId + "\"");
contentVersionValue = contentVersionValue.replaceAll("<id>oldSiteNodeId_" + oldSiteNodeId + "</id>", "<id>" + newSiteNodeId + "</id>");
}
//Now replace all occurrances of old as they are stuff not moved and should be restored.
contentVersionValue = contentVersionValue.replaceAll("oldContentId_", "");
contentVersionValue = contentVersionValue.replaceAll("oldSiteNodeId_", "");
version.setVersionValue(contentVersionValue);
}
}
private void rewireBindingsAndRelationsInTransaction(Map<Integer,Integer> siteNodesIdsMapping, Map<Integer,Integer> contentIdsMapping, List<ContentVersion> versions, Map<String,String> replaceMap, Database db) throws SystemException, Bug
{
for(ContentVersion version : versions)
{
logger.info("Rewiring version:" + version.getId() + ":" + version.getVersionValue());
String contentVersionValue = version.getVersionValue();
boolean modified = false;
if(replaceMap != null)
{
int hashBefore = contentVersionValue.hashCode();
Iterator<String> replaceMapIterator = replaceMap.keySet().iterator();
while(replaceMapIterator.hasNext())
{
String key = replaceMapIterator.next();
String value = (String)replaceMap.get(key);
contentVersionValue = contentVersionValue.replaceAll(key, value);
}
if(contentVersionValue.hashCode() != hashBefore)
modified = true;
}
if(!modified &&
!contentVersionValue.contains("contentId") &&
!contentVersionValue.contains("getInlineAssetUrl") &&
!contentVersionValue.contains("languageId") &&
!contentVersionValue.contains("entity") &&
!contentVersionValue.contains("siteNodeId") &&
!contentVersionValue.contains("siteNodeId") &&
!contentVersionValue.contains("getPageUrl"))
continue;
if(contentVersionValue.contains("contentId=\""))
contentVersionValue = contentVersionValue.replaceAll("contentId=\"", "contentId=\"oldContentId_");
if(contentVersionValue.contains("?contentId="))
contentVersionValue = contentVersionValue.replaceAll("\\?contentId=", "\\?contentId=oldContentId_");
if(contentVersionValue.contains("getInlineAssetUrl"))
contentVersionValue = contentVersionValue.replaceAll("getInlineAssetUrl\\(", "getInlineAssetUrl\\(oldContentId_");
if(contentVersionValue.contains("languageId,"))
contentVersionValue = contentVersionValue.replaceAll("languageId,", "languageId,oldContentId_");
if(contentVersionValue.contains("entity="))
contentVersionValue = contentVersionValue.replaceAll("entity=\"Content\" entityId=\"", "entity=\"Content\" entityId=\"oldContentId_");
//if(contentVersionValue.contains("entity="))
//contentVersionValue = contentVersionValue.replaceAll("entity='Content'><id>", "entity='Content'><id>oldContentId_");
if(contentVersionValue.contains("siteNodeId="))
contentVersionValue = contentVersionValue.replaceAll("siteNodeId=\"", "siteNodeId=\"oldSiteNodeId_");
if(contentVersionValue.contains("detailSiteNodeId="))
contentVersionValue = contentVersionValue.replaceAll("detailSiteNodeId=\"", "detailSiteNodeId=\"oldSiteNodeId_");
if(contentVersionValue.contains("getPageUrl"))
contentVersionValue = contentVersionValue.replaceAll("getPageUrl\\((\\d)", "getPageUrl\\(oldSiteNodeId_$1");
if(contentVersionValue.contains("entity="))
contentVersionValue = contentVersionValue.replaceAll("entity=\"SiteNode\" entityId=\"", "entity=\"SiteNode\" entityId=\"oldSiteNodeId_");
Iterator<Integer> contentIdMapIterator = contentIdsMapping.keySet().iterator();
while (contentIdMapIterator.hasNext())
{
Integer oldContentId = contentIdMapIterator.next();
Integer newContentId = contentIdsMapping.get(oldContentId);
logger.info("Replacing all:" + oldContentId + " with " + newContentId);
if(contentVersionValue.contains("contentId=\""))
contentVersionValue = contentVersionValue.replaceAll("contentId=\"oldContentId_" + oldContentId + "\"", "contentId=\"" + newContentId + "\"");
if(contentVersionValue.contains("?contentId=oldContentId"))
contentVersionValue = contentVersionValue.replaceAll("\\?contentId=oldContentId_" + oldContentId + "&", "\\?contentId=" + newContentId + "&");
if(contentVersionValue.contains("getInlineAssetUrl"))
contentVersionValue = contentVersionValue.replaceAll("getInlineAssetUrl\\(oldContentId_" + oldContentId + ",", "getInlineAssetUrl\\(" + newContentId + ",");
if(contentVersionValue.contains("languageId,oldContentId_"))
contentVersionValue = contentVersionValue.replaceAll("languageId,oldContentId_" + oldContentId + "\\)", "languageId," + newContentId + "\\)");
if(contentVersionValue.contains("entity="))
contentVersionValue = contentVersionValue.replaceAll("entity=\"Content\" entityId=\"oldContentId_" + oldContentId + "\"", "entity=\"Content\" entityId=\"" + newContentId + "\"");
if(contentVersionValue.contains("<id>oldContentId_"))
contentVersionValue = contentVersionValue.replaceAll("<id>oldContentId_" + oldContentId + "</id>", "<id>" + newContentId + "</id>");
}
Iterator<Integer> siteNodeIdMapIterator = siteNodesIdsMapping.keySet().iterator();
while (siteNodeIdMapIterator.hasNext())
{
Integer oldSiteNodeId = siteNodeIdMapIterator.next();
Integer newSiteNodeId = siteNodesIdsMapping.get(oldSiteNodeId);
logger.info("Replacing all:" + oldSiteNodeId + " with " + newSiteNodeId);
if(contentVersionValue.contains("siteNodeId="))
contentVersionValue = contentVersionValue.replaceAll("siteNodeId=\"oldSiteNodeId_" + oldSiteNodeId + "\"", "siteNodeId=\"" + newSiteNodeId + "\"");
if(contentVersionValue.contains("detailSiteNodeId="))
contentVersionValue = contentVersionValue.replaceAll("detailSiteNodeId=\"oldSiteNodeId_" + oldSiteNodeId + "\"", "detailSiteNodeId=\"" + newSiteNodeId + "\"");
if(contentVersionValue.contains("getPageUrl"))
contentVersionValue = contentVersionValue.replaceAll("getPageUrl\\(oldSiteNodeId_" + oldSiteNodeId + ",", "getPageUrl\\(" + newSiteNodeId + ",");
if(contentVersionValue.contains("entity="))
contentVersionValue = contentVersionValue.replaceAll("entity=\"SiteNode\" entityId=\"oldSiteNodeId_" + oldSiteNodeId + "\"", "entity=\"SiteNode\" entityId=\"" + newSiteNodeId + "\"");
if(contentVersionValue.contains("<id>oldSiteNodeId_"))
contentVersionValue = contentVersionValue.replaceAll("<id>oldSiteNodeId_" + oldSiteNodeId + "</id>", "<id>" + newSiteNodeId + "</id>");
}
//Now replace all occurrances of old as they are stuff not moved and should be restored.
if(contentVersionValue.contains("oldContentId_"))
contentVersionValue = contentVersionValue.replaceAll("oldContentId_", "");
if(contentVersionValue.contains("oldSiteNodeId_"))
contentVersionValue = contentVersionValue.replaceAll("oldSiteNodeId_", "");
version.setVersionValue(contentVersionValue);
ContentVersionController.getContentVersionController().getMediumContentVersionWithId(version.getId(), db).setVersionValue(contentVersionValue);
}
}
public void markForDeletion(SiteNodeVO siteNodeVO, InfoGluePrincipal infogluePrincipal) throws ConstraintException, SystemException
{
markForDeletion(siteNodeVO, infogluePrincipal, false);
}
public void markForDeletion(SiteNodeVO siteNodeVO, InfoGluePrincipal infogluePrincipal, boolean forceDelete) throws ConstraintException, SystemException
{
Map<SiteNodeVO, List<ReferenceBean>> contactPersons = new HashMap<SiteNodeVO, List<ReferenceBean>>();
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
markForDeletion(siteNodeVO, db, forceDelete, infogluePrincipal, contactPersons, ProcessBean.createProcessBean("Dummy", "DeleteContent"));
commitTransaction(db);
}
catch(ConstraintException ce)
{
logger.warn("An error occurred so we should not complete the transaction:" + ce, ce);
rollbackTransaction(db);
throw ce;
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
logger.info("Number of people:" + contactPersons.size());
if (contactPersons.size() > 0)
{
logger.info("Will notifiy people about SiteNode removals. Number of nodes: " + contactPersons.size());
Database contactDb = CastorDatabaseService.getDatabase();
try
{
beginTransaction(contactDb);
notifyContactPersonsForSiteNode(contactPersons, contactDb);
commitTransaction(contactDb);
}
catch(Exception ex)
{
rollbackTransaction(contactDb);
logger.error("An error occurred so we should not contact people about SiteNode removal. Message: " + ex.getMessage());
logger.warn("An error occurred so we should not contact people about SiteNode removal.", ex);
throw new SystemException(ex.getMessage());
}
}
}
public void markForDeletion(SiteNodeVO siteNodeVO, Database db, boolean forceDelete, InfoGluePrincipal infogluePrincipal, ProcessBean processBean) throws ConstraintException, SystemException, Exception
{
markForDeletion(siteNodeVO, db, forceDelete, infogluePrincipal, new HashMap<SiteNodeVO, List<ReferenceBean>>(), processBean);
}
public void markForDeletion(SiteNodeVO siteNodeVO, Database db, InfoGluePrincipal infogluePrincipal, ProcessBean processBean) throws ConstraintException, SystemException, Exception
{
markForDeletion(siteNodeVO, db, false, infogluePrincipal, new HashMap<SiteNodeVO, List<ReferenceBean>>(), processBean);
}
/**
* This method deletes a siteNode and also erases all the children and all versions.
*/
public void markForDeletion(SiteNodeVO siteNodeVO, Database db, boolean forceDelete, InfoGluePrincipal infogluePrincipal, Map<SiteNodeVO, List<ReferenceBean>> contactPersons, ProcessBean processBean) throws ConstraintException, SystemException, Exception
{
boolean notifyResponsibleOnReferenceChange = CmsPropertyHandler.getNotifyResponsibleOnReferenceChange();
List<Integer> siteNodeIds = getSiteNodeIdsForAllChildren(siteNodeVO.getId(), db);
siteNodeIds.add(siteNodeVO.getId());
if(logger.isDebugEnabled())
logger.info("siteNodeIds:" + siteNodeIds.size());
processBean.updateProcess("Moving " + siteNodeIds.size() + " pages to trashcan");
int i = 0;
for(Integer childSiteNodeId : siteNodeIds)
{
i++;
if(i % 1000 == 0)
{
processBean.updateProcess("Moved " + i + " pages to trashcan");
}
try
{
SmallSiteNodeImpl siteNode = getSmallSiteNodeWithId(childSiteNodeId, db);
if(logger.isDebugEnabled())
logger.info("Marking " + siteNode.getName() + " for delete");
List<ReferenceBean> referenceBeanList = RegistryController.getController().getReferencingObjectsForSiteNode(siteNode.getId(), -1, CmsPropertyHandler.getOnlyShowReferenceIfLatestVersion(), true, db);
if(referenceBeanList != null && referenceBeanList.size() > 0 && !forceDelete)
throw new ConstraintException("SiteNode.stateId", "3405", "<br/><br/>" + siteNode.getName() + " (" + siteNode.getId() + ")");
boolean isDeletable = true;
if(!forceDelete)
isDeletable = getIsDeletable(siteNode.getValueObject(), infogluePrincipal, db);
if(forceDelete || isDeletable)
{
siteNode.setIsDeleted(true);
boolean clean = true;
if (notifyResponsibleOnReferenceChange)
{
clean = false;
}
List<ReferenceBean> contactList = RegistryController.getController().deleteAllForSiteNode(siteNode.getSiteNodeId(), infogluePrincipal, clean, CmsPropertyHandler.getOnlyShowReferenceIfLatestVersion(), true, db);
if (notifyResponsibleOnReferenceChange)
{
if (contactList != null)
{
logger.info("Found " + contactList.size() + " people to notify about SiteNode removal. SiteNode.id: " + siteNode.getSiteNodeId());
contactPersons.put(siteNode.getValueObject(), contactList);
}
}
}
else
{
throw new ConstraintException("SiteNodeVersion.stateId", "3400");
}
}
catch(SystemException e)
{
e.printStackTrace();
logger.warn("Problem marking content: " + childSiteNodeId + " as deleted. Message: " + e.getMessage(), e);
}
}
}
/**
* This method deletes a siteNode and also erases all the children and all versions.
*/
public void checkReferences(SiteNodeVO siteNodeVO, Database db, InfoGluePrincipal infogluePrincipal, Map<SiteNodeVO, List<ReferenceBean>> refBeansMap) throws ConstraintException, SystemException, Exception
{
List<Integer> siteNodeIds = getSiteNodeIdsForAllChildren(siteNodeVO.getId(), db);
siteNodeIds.add(siteNodeVO.getId());
int i = 0;
for(Integer childSiteNodeId : siteNodeIds)
{
i++;
try
{
SmallSiteNodeImpl siteNode = getSmallSiteNodeWithId(childSiteNodeId, db);
List<ReferenceBean> referenceBeanList = RegistryController.getController().getReferencingObjectsForSiteNode(siteNode.getId(), -1, false, false, true, db);
if (referenceBeanList != null && referenceBeanList.size() > 0)
{
refBeansMap.put(siteNode.getValueObject(), referenceBeanList);
}
}
catch(SystemException e)
{
logger.warn("Problem checking content: " + childSiteNodeId + " for references. Message: " + e.getMessage(), e);
}
}
}
/**
* This method restores a siteNode.
*/
public void restoreSiteNode(Integer siteNodeId, InfoGluePrincipal infogluePrincipal) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
SmallSiteNodeImpl siteNode = getSmallSiteNodeWithId(siteNodeId, db);
//SiteNode siteNode = getSiteNodeWithId(siteNodeId, db);
siteNode.setIsDeleted(false);
if(siteNode.getParentSiteNodeId() != null)
{
SmallSiteNodeImpl parentSiteNode = getSmallSiteNodeWithId(siteNode.getParentSiteNodeId(), db);
while(parentSiteNode != null && parentSiteNode.getIsDeleted())
{
parentSiteNode.setIsDeleted(false);
parentSiteNode = getSmallSiteNodeWithId(siteNode.getParentSiteNodeId(), db);
}
}
commitTransaction(db);
}
catch(Exception e)
{
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
}
/**
* Returns a repository list marked for deletion.
* @param infoGluePrincipal
*/
public List<SiteNodeVO> getSiteNodeVOListMarkedForDeletion(Integer repositoryId, InfoGluePrincipal infoGluePrincipal, List<RepositoryVO> excludeReposVOList) throws SystemException, Bug
{
Database db = CastorDatabaseService.getDatabase();
List<SiteNodeVO> siteNodeVOListMarkedForDeletion = new ArrayList<SiteNodeVO>();
try
{
beginTransaction(db);
int startIndex = 2;
if(repositoryId != null && repositoryId != -1)
startIndex++;
StringBuffer excludeReposWithIdSQL = new StringBuffer("");
if(excludeReposVOList != null && excludeReposVOList.size() > 0)
{
excludeReposWithIdSQL.append(" AND NOT (sn.repositoryId IN LIST (");
for(int i=0; i<excludeReposVOList.size(); i++)
excludeReposWithIdSQL.append("" + (i>0 ? "," : "") + "$"+(startIndex+i));
excludeReposWithIdSQL.append("))");
}
String sql = "SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeImpl sn WHERE sn.isDeleted = $1 " + excludeReposWithIdSQL + " ORDER BY sn.siteNodeId";
if(repositoryId != null && repositoryId != -1)
sql = "SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeImpl sn WHERE sn.isDeleted = $1 AND sn.repositoryId = $2 " + excludeReposWithIdSQL + " ORDER BY sn.siteNodeId";
OQLQuery oql = db.getOQLQuery(sql);
oql.bind(true);
if(repositoryId != null && repositoryId != -1)
oql.bind(repositoryId);
for(RepositoryVO excludedRepoVO : excludeReposVOList)
oql.bind(excludedRepoVO.getId());
QueryResults results = oql.execute(Database.READONLY);
while(results.hasMore())
{
SmallSiteNodeImpl siteNode = (SmallSiteNodeImpl)results.next();
Integer siteNodeRepositoryId = siteNode.getValueObject().getRepositoryId();
RepositoryVO repositoryVO = null;
try
{
repositoryVO = RepositoryController.getController().getRepositoryVOWithId(siteNodeRepositoryId, db);
}
catch(Exception e)
{
logger.warn("There was a repo referenced that is allready deleted. Skipping rights deletion.");
}
Integer siteNodeId = siteNode.getId();
if((AccessRightController.getController().getIsPrincipalAuthorized(db, infoGluePrincipal, "Repository.Read", siteNodeRepositoryId.toString()) && AccessRightController.getController().getIsPrincipalAuthorized(db, infoGluePrincipal, "Repository.Write", siteNodeRepositoryId.toString()))
&& (AccessRightController.getController().getIsPrincipalAuthorized(db, infoGluePrincipal, "SiteNodeVersion.Read", siteNodeId.toString()) && AccessRightController.getController().getIsPrincipalAuthorized(db, infoGluePrincipal, "SiteNodeVersion.Write", siteNodeId.toString())))
{
if(repositoryVO != null)
siteNode.getValueObject().getExtraProperties().put("repositoryMarkedForDeletion", repositoryVO.getIsDeleted());
siteNodeVOListMarkedForDeletion.add(siteNode.getValueObject());
}
}
results.close();
oql.close();
commitTransaction(db);
}
catch ( Exception e)
{
throw new SystemException("An error occurred when we tried to fetch a list of deleted pages. Reason:" + e.getMessage(), e);
}
return siteNodeVOListMarkedForDeletion;
}
/**
* Returns a repository list marked for deletion.
*/
public Set<SiteNodeVO> getSiteNodeVOListLastModifiedByPincipal(InfoGluePrincipal principal) throws SystemException, Bug
{
Database db = CastorDatabaseService.getDatabase();
Set<SiteNodeVO> siteNodeVOList = new HashSet<SiteNodeVO>();
try
{
beginTransaction(db);
OQLQuery oql = db.getOQLQuery("SELECT snv FROM org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeVersionImpl snv WHERE snv.versionModifier = $1 ORDER BY snv.modifiedDateTime DESC LIMIT $2");
oql.bind(principal.getName());
oql.bind(30);
QueryResults results = oql.execute(Database.READONLY);
while(results.hasMore())
{
SiteNodeVersion siteNodeVersion = (SiteNodeVersion)results.next();
SiteNodeVO siteNodeVO = getSiteNodeVOWithId(siteNodeVersion.getValueObject().getSiteNodeId(), db);
siteNodeVOList.add(siteNodeVO);
}
results.close();
oql.close();
commitTransaction(db);
}
catch ( Exception e)
{
throw new SystemException("An error occurred when we tried to fetch a list pages last modified by the user. Reason:" + e.getMessage(), e);
}
return siteNodeVOList;
}
public List<SiteNodeVO> getUpcomingExpiringSiteNodes(int numberOfWeeks) throws Exception
{
List<SiteNodeVO> siteNodeVOList = new ArrayList<SiteNodeVO>();
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
beginTransaction(db);
try
{
OQLQuery oql = db.getOQLQuery("SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeImpl sn WHERE " +
"sn.expireDateTime > $1 AND sn.expireDateTime < $2 AND sn.publishDateTime < $3 ORDER BY sn.siteNodeId");
Calendar now = Calendar.getInstance();
Date currentDate = now.getTime();
oql.bind(currentDate);
now.add(Calendar.DAY_OF_YEAR, numberOfWeeks);
Date futureDate = now.getTime();
oql.bind(futureDate);
oql.bind(currentDate);
QueryResults results = oql.execute(Database.READONLY);
while(results.hasMore())
{
SiteNode siteNode = (SiteNodeImpl)results.next();
siteNodeVOList.add(siteNode.getValueObject());
}
results.close();
oql.close();
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction: " + e.getMessage());
logger.warn("An error occurred so we should not complete the transaction: " + e.getMessage(), e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return siteNodeVOList;
}
public List<SiteNodeVO> getUpcomingExpiringSiteNodes(int numberOfDays, InfoGluePrincipal principal) throws Exception
{
List<SiteNodeVO> siteNodeVOList = new ArrayList<SiteNodeVO>();
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
beginTransaction(db);
try
{
OQLQuery oql = db.getOQLQuery("SELECT sn FROM org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl sn WHERE " +
"sn.expireDateTime > $1 AND sn.expireDateTime < $2 AND sn.publishDateTime < $3 AND sn.siteNodeVersions.versionModifier = $4");
Calendar now = Calendar.getInstance();
Date currentDate = now.getTime();
oql.bind(currentDate);
now.add(Calendar.DAY_OF_YEAR, numberOfDays);
Date futureDate = now.getTime();
oql.bind(futureDate);
oql.bind(currentDate);
oql.bind(principal.getName());
QueryResults results = oql.execute(Database.READONLY);
while(results.hasMore())
{
SiteNode siteNode = (SiteNodeImpl)results.next();
siteNodeVOList.add(siteNode.getValueObject());
}
results.close();
oql.close();
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return siteNodeVOList;
}
public void changeSiteNodeSortOrder(Integer siteNodeId, Integer beforeSiteNodeId, String direction, InfoGluePrincipal infoGluePrincipal, Integer sortLanguageId) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
SiteNodeVO siteNodeVO = getSiteNodeVOWithId(siteNodeId, db);
//Fixes a nice ordered list
List<SiteNodeVO> childrenVOList = SiteNodeController.getController().getChildSiteNodeVOList(siteNodeVO.getParentSiteNodeId(), false, db, sortLanguageId);
Iterator<SiteNodeVO> childrenVOListIterator = childrenVOList.iterator();
int index = 0;
while(childrenVOListIterator.hasNext())
{
SiteNodeVO childSiteNodeVO = childrenVOListIterator.next();
SiteNodeVersion latestChildSiteNodeVersion = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersion(db, childSiteNodeVO.getId());
logger.info("latestChildSiteNodeVersion.getSortOrder():" + latestChildSiteNodeVersion.getSortOrder() + "=" + index);
if(latestChildSiteNodeVersion.getSortOrder() != index)
{
latestChildSiteNodeVersion = SiteNodeStateController.getController().updateStateId(latestChildSiteNodeVersion, SiteNodeVersionVO.WORKING_STATE, "Changed sortOrder", infoGluePrincipal, db);
//Integer currentSortOrder = latestChildSiteNodeVersion.getSortOrder();
//logger.info("currentSortOrder:" + currentSortOrder + " on " + childSiteNodeVO.getName());
//if(currentSortOrder != 100)
//{
logger.info("Setting sort order to:" + index + " on " + latestChildSiteNodeVersion.getId());
latestChildSiteNodeVersion.setSortOrder(index);
if(CmsPropertyHandler.getAllowLocalizedSortAndVisibilityProperties())
{
ContentVersionVO cvVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(childSiteNodeVO.getMetaInfoContentId(), sortLanguageId, db);
if(cvVO != null)
{
ContentVersionController.getContentVersionController().updateAttributeValue(cvVO.getContentVersionId(), "SortOrder", "" + index, infoGluePrincipal, db, true);
ContentVersionController.getContentVersionController().updateAttributeValue(cvVO.getContentVersionId(), "sortOrder", "" + index, infoGluePrincipal, db, true);
}
}
//}
}
index++;
}
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
beginTransaction(db);
try
{
if(beforeSiteNodeId == null && direction == null)
{
logger.warn("You must specify the either new location with beforeSiteNodeId or sortDirection");
throw new ConstraintException("SiteNode.parentSiteNodeId", "3403"); //TODO
}
//logger.info("siteNodeId:" + siteNodeId);
//logger.info("beforeSiteNodeId:" + beforeSiteNodeId);
//logger.info("direction:" + direction);
if(beforeSiteNodeId != null)
{
Integer oldSortOrder = 0;
Integer newSortOrder = 0;
SiteNodeVO siteNodeVO = getSiteNodeVOWithId(siteNodeId, db);
SiteNodeVO beforeSiteNodeVO = getSiteNodeVOWithId(beforeSiteNodeId, db);
if(beforeSiteNodeVO.getParentSiteNodeId().intValue() != siteNodeVO.getParentSiteNodeId().intValue())
{
logger.info("Was new parent - let's fix that as well");
}
else
{
logger.info("Parent was the same...");
List<SiteNodeVO> newChildSiteNodeList = new ArrayList<SiteNodeVO>();
int insertPosition = 0;
List<SiteNodeVO> childrenVOList = SiteNodeController.getController().getChildSiteNodeVOList(siteNodeVO.getParentSiteNodeId(), false, db, sortLanguageId);
Iterator<SiteNodeVO> childrenVOListIterator = childrenVOList.iterator();
while(childrenVOListIterator.hasNext())
{
SiteNodeVO childSiteNodeVO = childrenVOListIterator.next();
if(childSiteNodeVO.getSiteNodeId().equals(beforeSiteNodeId))
{
insertPosition = newChildSiteNodeList.size();
}
if(!childSiteNodeVO.getSiteNodeId().equals(siteNodeId))
{
newChildSiteNodeList.add(childSiteNodeVO);
}
}
newChildSiteNodeList.add(insertPosition, siteNodeVO);
Iterator<SiteNodeVO> newChildSiteNodeListIterator = newChildSiteNodeList.iterator();
int i=0;
int highestSortOrder = 0;
while(newChildSiteNodeListIterator.hasNext())
{
logger.info("i:" + i);
logger.info("highestSortOrder:" + highestSortOrder);
SiteNodeVO orderedSiteNodeVO = newChildSiteNodeListIterator.next();
List events = new ArrayList();
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(db, orderedSiteNodeVO.getId());
Integer localizedSortOrder = 100;
if(CmsPropertyHandler.getAllowLocalizedSortAndVisibilityProperties())
{
ContentVersionVO cvVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(orderedSiteNodeVO.getMetaInfoContentId(), sortLanguageId, db);
if(cvVO != null)
{
String localizedSortOrderString = ContentVersionController.getContentVersionController().getAttributeValue(cvVO.getId(), "SortOrder", false);
if(localizedSortOrderString == null || localizedSortOrderString.equals(""))
localizedSortOrderString = ContentVersionController.getContentVersionController().getAttributeValue(cvVO.getId(), "sortOrder", false);
if(localizedSortOrderString != null && !localizedSortOrderString.equals(""))
localizedSortOrder = new Integer(localizedSortOrderString);
}
}
//if(siteNodeVersionVO.getSortOrder() < highestSortOrder || localizedSortOrder < highestSortOrder)
if(siteNodeVersionVO.getSortOrder() < highestSortOrder || localizedSortOrder < highestSortOrder || i != localizedSortOrder)
{
if(!siteNodeVersionVO.getStateId().equals(SiteNodeVersionVO.WORKING_STATE))
{
siteNodeVersionVO = SiteNodeStateController.getController().changeState(siteNodeVersionVO.getId(), SiteNodeVersionVO.WORKING_STATE, "Changed sortOrder", false, infoGluePrincipal, siteNodeVersionVO.getSiteNodeId(), events);
}
siteNodeVersionVO.setSortOrder(i);
if(CmsPropertyHandler.getAllowLocalizedSortAndVisibilityProperties())
{
ContentVersionVO cvVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(orderedSiteNodeVO.getMetaInfoContentId(), sortLanguageId, db);
if(cvVO != null)
{
ContentVersionController.getContentVersionController().updateAttributeValue(cvVO.getContentVersionId(), "SortOrder", "" + i, infoGluePrincipal, db, true);
ContentVersionController.getContentVersionController().updateAttributeValue(cvVO.getContentVersionId(), "sortOrder", "" + i, infoGluePrincipal, db, true);
}
}
SiteNodeVersionController.getController().update(siteNodeVersionVO);
}
else
logger.info("No action - sort order was ok");
/*
if(CmsPropertyHandler.getAllowLocalizedSortAndVisibilityProperties())
{
if(localizedSortOrder < 100 && localizedSortOrder > highestSortOrder)
highestSortOrder = localizedSortOrder;
if(highestSortOrder > i)
i = highestSortOrder;
}
else
{
highestSortOrder = siteNodeVersionVO.getSortOrder();
if(highestSortOrder > i)
i = highestSortOrder;
}
*/
i++;
}
}
}
else if(direction.equalsIgnoreCase("up") || direction.equalsIgnoreCase("down"))
{
Integer oldSortOrder = 0;
Integer newSortOrder = 0;
SiteNodeVO siteNodeVO = getSiteNodeVOWithId(siteNodeId, db);
SiteNodeVersion latestSiteNodeVersion = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersion(db, siteNodeId);
if(latestSiteNodeVersion != null)
{
oldSortOrder = latestSiteNodeVersion.getSortOrder();
if(direction.equalsIgnoreCase("up"))
newSortOrder = oldSortOrder - 1;
else if(direction.equalsIgnoreCase("down"))
newSortOrder = oldSortOrder + 1;
}
logger.info("OldSortOrder:" + oldSortOrder);
List<SiteNodeVO> childrenVOList = SiteNodeController.getController().getChildSiteNodeVOList(siteNodeVO.getParentSiteNodeId(), false, db, sortLanguageId);
Iterator<SiteNodeVO> childrenVOListIterator = childrenVOList.iterator();
while(childrenVOListIterator.hasNext())
{
SiteNodeVO childSiteNodeVO = childrenVOListIterator.next();
logger.info("childSiteNodeVO:" + childSiteNodeVO.getId() + ":" + childSiteNodeVO.getSortOrder());
SiteNodeVersion latestChildSiteNodeVersion = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersion(db, childSiteNodeVO.getId());
//logger.info("latestChildSiteNodeVersion:" + latestChildSiteNodeVersion.getId());
Integer currentSortOrder = latestChildSiteNodeVersion.getSortOrder();
logger.info("currentSortOrder:" + currentSortOrder);
if(currentSortOrder.equals(oldSortOrder))
{
latestChildSiteNodeVersion = SiteNodeStateController.getController().updateStateId(latestChildSiteNodeVersion, SiteNodeVersionVO.WORKING_STATE, "Changed sortOrder", infoGluePrincipal, db);
latestChildSiteNodeVersion.setSortOrder(newSortOrder);
//logger.info("Changed sort order on:" + latestChildSiteNodeVersion.getId() + " into " + newSortOrder);
if(CmsPropertyHandler.getAllowLocalizedSortAndVisibilityProperties())
{
ContentVersionVO cvVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(childSiteNodeVO.getMetaInfoContentId(), sortLanguageId, db);
if(cvVO != null)
{
ContentVersionController.getContentVersionController().updateAttributeValue(cvVO.getContentVersionId(), "SortOrder", "" + newSortOrder, infoGluePrincipal, db, true);
ContentVersionController.getContentVersionController().updateAttributeValue(cvVO.getContentVersionId(), "sortOrder", "" + newSortOrder, infoGluePrincipal, db, true);
}
}
}
else if(currentSortOrder.equals(newSortOrder))
{
latestChildSiteNodeVersion = SiteNodeStateController.getController().updateStateId(latestChildSiteNodeVersion, SiteNodeVersionVO.WORKING_STATE, "Changed sortOrder", infoGluePrincipal, db);
latestChildSiteNodeVersion.setSortOrder(oldSortOrder);
//logger.info("Changed sort order on:" + latestChildSiteNodeVersion.getId() + " into " + oldSortOrder);
if(CmsPropertyHandler.getAllowLocalizedSortAndVisibilityProperties())
{
ContentVersionVO cvVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(childSiteNodeVO.getMetaInfoContentId(), sortLanguageId, db);
if(cvVO != null)
{
ContentVersionController.getContentVersionController().updateAttributeValue(cvVO.getContentVersionId(), "SortOrder", "" + oldSortOrder, infoGluePrincipal, db, true);
ContentVersionController.getContentVersionController().updateAttributeValue(cvVO.getContentVersionId(), "sortOrder", "" + oldSortOrder, infoGluePrincipal, db, true);
}
}
}
}
}
//If any of the validations or setMethods reported an error, we throw them up now before create.
ceb.throwIfNotEmpty();
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
}
public SiteNodeVO update(SiteNodeVO siteNodeVO, Database db) throws ConstraintException, SystemException
{
SiteNode siteNode = (SiteNode)getObjectWithId(SiteNodeImpl.class, siteNodeVO.getId(), db);
siteNode.setVO(siteNodeVO);
return siteNode.getValueObject();
}
/**
* This method moves a siteNode after first making a couple of controls that the move is valid.
*/
public void toggleSiteNodeHidden(Integer siteNodeId, InfoGluePrincipal infoGluePrincipal, Integer sortLanguageId) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
if(CmsPropertyHandler.getAllowLocalizedSortAndVisibilityProperties())
{
beginTransaction(db);
try
{
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeId, db);
ContentVersionVO cvVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(siteNodeVO.getMetaInfoContentId(), sortLanguageId, db);
if(cvVO != null)
{
String hideInNavigation = ContentVersionController.getContentVersionController().getAttributeValue(cvVO, "HideInNavigation", false);
//System.out.println("hideInNavigation:" + hideInNavigation + " on " + sortLanguageId + "/" + cvVO.getContentVersionId());
if(hideInNavigation == null || hideInNavigation.equals("") || hideInNavigation.equalsIgnoreCase("false"))
ContentVersionController.getContentVersionController().updateAttributeValue(cvVO.getContentVersionId(), "HideInNavigation", "" + true, infoGluePrincipal, db);
else
ContentVersionController.getContentVersionController().updateAttributeValue(cvVO.getContentVersionId(), "HideInNavigation", "" + false, infoGluePrincipal, db);
}
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
}
db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
SiteNodeVersion latestSiteNodeVersion = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersion(db, siteNodeId);
//logger.info("latestSiteNodeVersion:" + latestSiteNodeVersion);
if(latestSiteNodeVersion != null)
{
latestSiteNodeVersion = SiteNodeStateController.getController().updateStateId(latestSiteNodeVersion, SiteNodeVersionVO.WORKING_STATE, "Changed hidden", infoGluePrincipal, db);
if(latestSiteNodeVersion.getIsHidden())
latestSiteNodeVersion.setIsHidden(false);
else
latestSiteNodeVersion.setIsHidden(true);
}
ceb.throwIfNotEmpty();
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
}
public void updateSiteNodeTypeDefinition(Integer siteNodeId, Integer siteNodeTypeDefinitionId) throws ConstraintException, SystemException, Exception
{
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
SiteNode siteNode = getSiteNodeWithId(siteNodeId, db);
SiteNodeTypeDefinition sntd = SiteNodeTypeDefinitionController.getController().getSiteNodeTypeDefinitionWithId(siteNodeTypeDefinitionId, db);
if(siteNode != null && sntd != null)
siteNode.setSiteNodeTypeDefinition((SiteNodeTypeDefinitionImpl)sntd);
commitTransaction(db);
Thread.sleep(1000);
}
catch(Exception e)
{
logger.error("An error occurred so we should not completes the transaction:" + e, e);
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
finally
{
closeDatabase(db);
}
}
private Map<String, List<ReferenceBean>> groupByContactPerson(List<ReferenceBean> contactPersons)
{
Map<String, List<ReferenceBean>> result = new HashMap<String, List<ReferenceBean>>();
for (ReferenceBean referenceBean : contactPersons)
{
if (referenceBean.getContactPersonEmail() == null || referenceBean.getContactPersonEmail().equals(""))
{
continue;
}
List<ReferenceBean> personsList = result.get(referenceBean.getContactPersonEmail());
if (personsList == null)
{
personsList = new ArrayList<ReferenceBean>();
result.put(referenceBean.getContactPersonEmail(), personsList);
}
personsList.add(referenceBean);
}
return result;
}
private Map<String, Map<SiteNodeVO, List<ReferenceBean>>> groupByContactPerson(Map<SiteNodeVO, List<ReferenceBean>> contactPersons)
{
Map<String, Map<SiteNodeVO, List<ReferenceBean>>> result = new HashMap<String, Map<SiteNodeVO, List<ReferenceBean>>>();
for (Map.Entry<SiteNodeVO, List<ReferenceBean>> entry : contactPersons.entrySet())
{
SiteNodeVO siteNodeVO = entry.getKey();
Map<String, List<ReferenceBean>> referencesByContact = groupByContactPerson(entry.getValue());
for (Map.Entry<String, List<ReferenceBean>> contactsForSiteNode : referencesByContact.entrySet())
{
String contactPerson = contactsForSiteNode.getKey();
Map<SiteNodeVO, List<ReferenceBean>> value = result.get(contactPerson);
if (value == null)
{
value = new HashMap<SiteNodeVO, List<ReferenceBean>>();
result.put(contactPerson, value);
}
value.put(siteNodeVO, contactsForSiteNode.getValue());
}
}
return result;
}
private void notifyContactPersonsForSiteNode(SiteNodeVO siteNodeVO, List<ReferenceBean> contacts, Database db) throws SystemException, Exception
{
notifyContactPersonsForSiteNode(Collections.singletonMap(siteNodeVO, contacts), db);
}
private void notifyContactPersonsForSiteNode(Map<SiteNodeVO, List<ReferenceBean>> contacts, Database db) throws SystemException, Exception
{
Map<String, Map<SiteNodeVO, List<ReferenceBean>>> contactMap = groupByContactPerson(contacts);
if (logger.isInfoEnabled())
{
logger.info("Will notify people about registry change. " + contactMap);
}
String registryContactMailLanguage = CmsPropertyHandler.getRegistryContactMailLanguage();
Locale locale = new Locale(registryContactMailLanguage);
LabelController lc = LabelController.getController(locale);
try
{
String from = CmsPropertyHandler.getSystemEmailSender();
String subject = getLocalizedString(locale, "tool.structuretool.registry.notificationEmail.subject");
// This loop iterate once for each contact person
for (Map.Entry<String, Map<SiteNodeVO, List<ReferenceBean>>> entry : contactMap.entrySet())
{
String contactPersonEmail = entry.getKey();
Map<String,Object> parameters = new HashMap<String,Object>();
Set<SiteNodeVO> siteNodesForPerson = entry.getValue().keySet();
Map<SiteNodeVO, List<ReferenceBean>> affectedNodes = entry.getValue();
parameters.put("removedSiteNodes", siteNodesForPerson);
parameters.put("baseURL", CmsPropertyHandler.getCmsFullBaseUrl());
parameters.put("db", db);
parameters.put("this", this);
parameters.put("ui", lc);
Map<String, Map<String, List<ReferenceBean>>> nodes = new HashMap<String, Map<String,List<ReferenceBean>>>();
boolean hasInformation = false;
for (Map.Entry<SiteNodeVO, List<ReferenceBean>> affectedNode : affectedNodes.entrySet())
{
String removedSiteNodePath = getSiteNodePath(affectedNode.getKey(), false, true, db);
List<ReferenceBean> affectedContents = new LinkedList<ReferenceBean>();
List<ReferenceBean> affectedSiteNodes = new LinkedList<ReferenceBean>();
for (ReferenceBean reference : affectedNode.getValue())
{
if (reference.getReferencingCompletingObject().getClass().getName().indexOf("Content") != -1)
{
affectedContents.add(reference);
}
else
{
affectedSiteNodes.add(reference);
}
}
Map<String, List<ReferenceBean>> nodeMap = new HashMap<String, List<ReferenceBean>>();
nodeMap.put("content", affectedContents);
nodeMap.put("siteNode", affectedSiteNodes);
hasInformation = hasInformation || !affectedContents.isEmpty() || !affectedSiteNodes.isEmpty();
nodes.put(removedSiteNodePath, nodeMap);
} // end loop: one SiteNode for one contact person
parameters.put("affectedNodes", nodes);
if (hasInformation)
{
logger.debug("Sending notification email to: " + contactPersonEmail);
String emailTemplate = getDeleteNotificationEmailTemplate();
if (logger.isTraceEnabled())
{
logger.trace("Generating delete notification email with parameters: " + parameters);
}
String email = generateEmailBodyForDeleteNotification(emailTemplate, parameters);
MailServiceFactory.getService().sendEmail("text/html", from, contactPersonEmail, null, null, null, null, subject, email, "utf-8");
}
else
{
logger.warn("No Contents or SiteNodes were found for the given person. This is very strange. Contact person: " + contactPersonEmail + ", SiteNode.ids: " + contacts.keySet());
}
} // end-loop: contact person
}
catch (Exception ex)
{
logger.error("Failed to generate email for contact person notfication. Message: " + ex.getMessage() + ". Type: " + ex.getClass());
logger.warn("Failed to generate email for contact person notfication.", ex);
throw ex;
}
}
private String generateEmailBodyForDeleteNotification(String template, Map<String, Object> parameters) throws Exception
{
StringWriter tempString = new StringWriter();
PrintWriter pw = new PrintWriter(tempString);
new VelocityTemplateProcessor().renderTemplate(parameters, pw, template, true);
String email = tempString.toString();
return email;
}
private String getDeleteNotificationEmailTemplate() throws Exception
{
String template;
String contentType = CmsPropertyHandler.getMailContentType();
if(contentType == null || contentType.length() == 0)
{
contentType = "text/html";
}
if(contentType.equalsIgnoreCase("text/plain"))
{
template = FileHelper.getFileAsString(new File(CmsPropertyHandler.getContextRootPath() + "cms/structuretool/deletedEntityNotification_plain.vm"));
}
else
{
template = FileHelper.getFileAsString(new File(CmsPropertyHandler.getContextRootPath() + "cms/structuretool/deletedEntityNotification_html.vm"));
}
return template;
}
public List<String> getErroneousSiteNodeNames(List<Integer> erroneousSiteNodeIds) throws Exception, SystemException
{
Database db = CastorDatabaseService.getDatabase();
List<String> erroneousSiteNodePaths = new ArrayList<String>();
try
{
beginTransaction(db);
for (Integer siteNodeId : erroneousSiteNodeIds)
{
try
{
erroneousSiteNodePaths.add(SiteNodeController.getController().getSiteNodePath(siteNodeId, false, false, db));
erroneousSiteNodePaths.add(SiteNodeController.getController().getSiteNodePath(siteNodeId, db));
}
catch (Exception e)
{
erroneousSiteNodePaths.add("Failed to compute SiteNode path for erroneous SiteNode with id: " + siteNodeId);
}
}
commitTransaction(db);
}
catch (Exception e)
{
e.printStackTrace();
rollbackTransaction(db);
throw new SystemException("Error getting faulty paths: " + e.getMessage(), e);
}
return erroneousSiteNodePaths;
}
public boolean getDoesSiteNodeExist(Integer siteNodeId) throws Exception
{
boolean exists = true;
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
db.load(SmallSiteNodeImpl.class, siteNodeId, Database.READONLY);
commitTransaction(db);
}
catch(ObjectNotFoundException onfe)
{
exists = false;
if(logger.isInfoEnabled())
logger.info("An error occurred so we should not complete the transaction:" + onfe, onfe);
rollbackTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
rollbackTransaction(db);
}
return exists;
}
/**
* This method returns a list of all languages available on the current site/repository.
*/
public Boolean getIsLanguageAvailable(Integer siteNodeId, Integer languageId, Database db, InfoGluePrincipal principal)
{
if(languageId == null)
return true;
Boolean isLanguageAvailable = false;
try
{
List<LanguageVO> availableLanguages = LanguageDeliveryController.getLanguageDeliveryController().getLanguagesForSiteNode(db, siteNodeId, principal);
logger.info("languageId:" + languageId);
for(LanguageVO language : availableLanguages)
{
logger.info("language.getId():" + language.getId());
if(language.getId().equals(languageId))
{
isLanguageAvailable = true;
break;
}
}
}
catch(Exception e)
{
logger.error("An error occurred trying to get all available languages:" + e.getMessage(), e);
}
return isLanguageAvailable;
}
//Copy logic
public void copyRepository(RepositoryVO oldRepositoryVO, RepositoryVO repositoryVO, InfoGluePrincipal principal, String onlyLatestVersions, String standardReplacement, Map<String,String> replaceMap, ProcessBean processBean, Database db, PropertySet ps) throws ConstraintException, SystemException, Exception
{
Timer t = new Timer();
logger.info("repositoryVO:" + repositoryVO);
logger.info("principal:" + principal);
logger.info("oldRepositoryVO:" + oldRepositoryVO);
SiteNodeVO siteNode = SiteNodeController.getController().getRootSiteNodeVO(oldRepositoryVO.getId(), db);
logger.info("siteNode:" + siteNode);
SiteNodeVO newParentSiteNode = new SiteNodeVO();
newParentSiteNode.setRepositoryId(repositoryVO.getId());
processBean.updateProcess("Checked for constraints");
Map<Integer,Integer> siteNodeIdsMapping = new HashMap<Integer,Integer>();
Map<Integer,Integer> contentIdsMapping = new HashMap<Integer,Integer>();
Set<Integer> siteNodeIdsToCopy = new HashSet<Integer>();
Set<Integer> contentIdsToCopy = new HashSet<Integer>();
List<ContentVersion> newCreatedContentVersions = new ArrayList<ContentVersion>();
String newNameSuffix = ""; //getNewNameSuffixForCopy(principal, db, newParentSiteNode);
copySiteNodeRecursive(siteNode, newParentSiteNode, principal, siteNodeIdsMapping, contentIdsMapping, contentIdsToCopy, newCreatedContentVersions, newNameSuffix, db, processBean, replaceMap);
//After this all sitenodes main should be copied but then we have to round up some related nodes later
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("copySiteNodeRecursive", t.getElapsedTime());
db.commit();
db.begin();
processBean.updateProcess("Now we search for related contents to copy");
//Now let's go through all contents
for(ContentVersion version : newCreatedContentVersions)
{
getRelatedEntities(newParentSiteNode, principal, version.getVersionValue(), oldRepositoryVO.getId(), newParentSiteNode.getRepositoryId(), siteNodeIdsMapping, contentIdsMapping, siteNodeIdsToCopy, contentIdsToCopy, newCreatedContentVersions, 0, 3, newNameSuffix, db, processBean, replaceMap);
//getContentRelationsChain(siteNodesIdsMapping, contentIdsMapping, newParentSiteNode.getRepository().getId(), oldSiteNodeVO.getRepositoryId(), principal, versions, 0, 3, db);
}
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getRelatedEntities", t.getElapsedTime());
processBean.updateProcess("Copying " + contentIdsToCopy.size() + " contents");
db.commit();
db.begin();
List<ContentVO> contentVOListForRepository = ContentController.getContentController().getRepositoryContentVOList(oldRepositoryVO.getId(), db);
for(ContentVO contentVO : contentVOListForRepository)
{
contentIdsToCopy.add(contentVO.getId());
}
processBean.updateProcess("Analyzed all contents to copy. Was " + contentIdsToCopy.size());
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("fetched all repository contents", t.getElapsedTime());
db.commit();
db.begin();
//After this all related sitenodes should have been created and all related contents accounted for
copyContents(newParentSiteNode, principal, contentIdsToCopy, oldRepositoryVO.getId(), newParentSiteNode.getRepositoryId(), contentIdsMapping, newCreatedContentVersions, false, onlyLatestVersions, processBean, db, ps, replaceMap);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("copyContents", t.getElapsedTime());
db.commit();
db.begin();
processBean.updateProcess("Remapping relations");
rewireBindingsAndRelationsInTransaction(siteNodeIdsMapping, contentIdsMapping, newCreatedContentVersions, replaceMap, db);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("rewireBindingsAndRelations", t.getElapsedTime());
}
public List<LanguageVO> getEnabledLanguageVOListForSiteNode(Integer siteNodeId) throws SystemException, Exception
{
SiteNodeVersionVO siteNodeVersionVO = getInheritedLanguageSitenodeVersionVO(siteNodeId);
logger.info("Disabled languages for siteNodeVersion:" + siteNodeVersionVO.getDisableLanguages());
logger.info("The chosen sitenodeId:" + siteNodeVersionVO.getSiteNodeId());
List<LanguageVO> enabledPageLanguages = new ArrayList<LanguageVO>();
Map args = new HashMap();
args.put("globalKey", "infoglue");
PropertySet ps = PropertySetManager.getInstance("jdbc", args);
String enabledLanguages = ps.getString("siteNode_" + siteNodeVersionVO.getSiteNodeId() + "_enabledLanguages");
if(enabledLanguages != null)
{
SiteNodeVO siteNodeVO = getSiteNodeVOWithId(siteNodeVersionVO.getSiteNodeId());
String[] enabledLanguageIdStringList = enabledLanguages.split(",");
//System.out.println("Enabled siteNodeVO.getRepositoryId() siteNodeId:" + siteNodeVO.getRepositoryId());
List<LanguageVO> repositoryLanguageVOList = LanguageController.getController().getLanguageVOList(siteNodeVO.getRepositoryId());
//System.out.println("Enabled repositoryLanguageVOList siteNodeId:" + repositoryLanguageVOList);
Integer enabledLanguageId = null;
LanguageVO enabledLanguageVO;
if (enabledLanguageIdStringList[0].equalsIgnoreCase(""))
{
enabledPageLanguages.addAll(repositoryLanguageVOList);
}
else
{
for (String enabledLanguageIdString : enabledLanguageIdStringList)
{
//System.out.println("Enabled enabledLanguageIdString:" + enabledLanguageIdString);
enabledLanguageId = Integer.parseInt(enabledLanguageIdString);
enabledLanguageVO = (LanguageVO) LanguageController.getController().getLanguageVOWithId(enabledLanguageId);
enabledPageLanguages.add(enabledLanguageVO);
}
}
}
else if(siteNodeVersionVO != null && siteNodeVersionVO.getDisableLanguages() == 2) //
{
SiteNodeVO siteNodeVO = getSiteNodeVOWithId(siteNodeVersionVO.getSiteNodeId());
enabledPageLanguages = LanguageController.getController().getLanguageVOList(siteNodeVO.getRepositoryId());
}
return enabledPageLanguages;
}
public SiteNodeVersionVO getInheritedLanguageSitenodeVersionVO(Integer siteNodeId) throws SystemException, Exception
{
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(siteNodeId);
SiteNodeVO parentSiteNodeVO = null;
/*recursiv search for enabled languages*/
while (siteNodeVersionVO != null && siteNodeVersionVO.getDisableLanguages() == 2)
{
parentSiteNodeVO = getParentSiteNode(siteNodeVersionVO.getSiteNodeId());
if(parentSiteNodeVO == null)
break;
siteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(parentSiteNodeVO.getId());
}
/*
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(siteNodeId);
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeVersionVO.getSiteNodeId());
while (siteNodeVersionVO != null && siteNodeVersionVO.getDisableLanguages() == 2) {
siteNodeVO = getParentSiteNode(siteNodeVO.getSiteNodeId());
siteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(siteNodeVO.getId());
}
*/
return siteNodeVersionVO;
}
public String getInheritedLanguageSiteNodePath(Integer siteNodeId) throws SystemException, Exception
{
SiteNodeVersionVO siteNodeVersionVO = getInheritedLanguageSitenodeVersionVO(siteNodeId);
String path = SiteNodeController.getController().getSiteNodePath(siteNodeVersionVO.getSiteNodeId(), true, false);
return path;
}
public List<LanguageVO> getDisabledLanguageVOListForSiteNode(Integer siteNodeId) throws SystemException, Exception
{
List<LanguageVO> enabledLanguageVOList = getEnabledLanguageVOListForSiteNode(siteNodeId);
SiteNodeVO siteNodeVO = getSiteNodeVOWithId(siteNodeId);
List<LanguageVO> repositoryLanguageVOList = LanguageController.getController().getLanguageVOList(siteNodeVO.getRepositoryId());
List<LanguageVO> filteredRepositoryLanguageVOList = new ArrayList<LanguageVO>();
filteredRepositoryLanguageVOList.addAll(repositoryLanguageVOList);
filteredRepositoryLanguageVOList.removeAll(enabledLanguageVOList);
return filteredRepositoryLanguageVOList;
}
public SiteNodeVO getBaseForLanguageSiteNodeVO(Integer siteNodeId, Database db) throws Bug, Exception
{
SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeId, db);
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(db, siteNodeVO.getSiteNodeId());
while(siteNodeVO != null && siteNodeVersionVO.getDisableLanguages() == 2)
{
if(siteNodeVO != null && siteNodeVO.getParentSiteNodeId() != null) {
siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeVO.getParentSiteNodeId(), db);
if(siteNodeVO != null)
{
siteNodeVersionVO = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(db, siteNodeVO.getSiteNodeId());
}
}
else
{
siteNodeVO = null;
}
}
return siteNodeVO;
}
public List<Integer> getSiteNodeIdsForAllChildren(Integer siteNodeId, Database db) throws Exception
{
List<Integer> childIds = new ArrayList<Integer>();
List<SiteNodeVO> childSiteNodes = getChildSiteNodeVOList(siteNodeId, false, db, null);
for(SiteNodeVO child : childSiteNodes)
{
childIds.addAll(getSiteNodeIdsForAllChildren(child.getId(), db));
childIds.add(child.getId());
}
return childIds;
}
}