/* =============================================================================== * * 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.InputStream; import java.io.StringReader; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Arrays; 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.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.xerces.parsers.DOMParser; import org.exolab.castor.jdo.Database; import org.exolab.castor.jdo.OQLQuery; import org.exolab.castor.jdo.QueryResults; import org.infoglue.cms.applications.common.VisualFormatter; import org.infoglue.cms.applications.databeans.OptimizationBeanList; import org.infoglue.cms.applications.databeans.ProcessBean; import org.infoglue.cms.entities.content.Content; 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.DigitalAsset; import org.infoglue.cms.entities.content.DigitalAssetVO; import org.infoglue.cms.entities.content.SmallestContentVersionVO; import org.infoglue.cms.entities.content.impl.simple.ContentImpl; import org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl; import org.infoglue.cms.entities.content.impl.simple.ExportContentVersionImpl; import org.infoglue.cms.entities.content.impl.simple.IndexFriendlyContentVersionImpl; import org.infoglue.cms.entities.content.impl.simple.MediumContentVersionImpl; import org.infoglue.cms.entities.content.impl.simple.MediumDigitalAssetImpl; import org.infoglue.cms.entities.content.impl.simple.SmallContentImpl; import org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl; import org.infoglue.cms.entities.content.impl.simple.SmallDigitalAssetImpl; import org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl; import org.infoglue.cms.entities.kernel.BaseEntityVO; import org.infoglue.cms.entities.management.ContentTypeDefinitionVO; import org.infoglue.cms.entities.management.GeneralOQLResult; import org.infoglue.cms.entities.management.Language; import org.infoglue.cms.entities.management.LanguageVO; import org.infoglue.cms.entities.management.RegistryVO; import org.infoglue.cms.entities.management.impl.simple.LanguageImpl; import org.infoglue.cms.entities.publishing.PublicationVO; 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.SiteNodeVersionImpl; 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.security.InfoGluePrincipal; import org.infoglue.cms.util.CmsPropertyHandler; import org.infoglue.cms.util.ConstraintExceptionBuffer; import org.infoglue.cms.util.DateHelper; import org.infoglue.deliver.applications.databeans.DeliveryContext; import org.infoglue.deliver.util.CacheController; import org.infoglue.deliver.util.NullObject; import org.infoglue.deliver.util.RequestAnalyser; import org.infoglue.deliver.util.Timer; import org.w3c.dom.CDATASection; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; /** * @author Mattias Bogeblad * */ public class ContentVersionController extends BaseController { private final static Logger logger = Logger.getLogger(ContentVersionController.class.getName()); private final static VisualFormatter vf = new VisualFormatter(); private static final ContentCategoryController contentCategoryController = ContentCategoryController.getController(); private static final ContentVersionController contentVersionController = new ContentVersionController(); private static final RegistryController registryController = RegistryController.getController(); private static Map<Integer, Integer> contentMap = new ConcurrentHashMap<Integer, Integer>(); /** * Factory method to get object */ public static ContentVersionController getContentVersionController() { return contentVersionController; } public Integer getContentIdForContentVersion(Integer contentVersionId) throws SystemException, Bug { Integer contentId = (Integer)contentMap.get(contentVersionId); if(contentId == null) { ContentVersionVO ContentVersionVO = getContentVersionVOWithId(contentVersionId); //ContentVersionVO ContentVersionVO = (ContentVersionVO) getVOWithId(ContentVersionImpl.class, contentVersionId); contentId = ContentVersionVO.getContentId(); contentMap.put(contentVersionId, contentId); } return contentId; } public Integer getContentIdForContentVersion(Integer contentVersionId, Database db) throws SystemException, Bug { Integer contentId = (Integer)contentMap.get(contentVersionId); if(contentId == null) { ContentVersionVO ContentVersionVO = getSmallContentVersionVOWithId(contentVersionId, db); //ContentVersionVO ContentVersionVO = (ContentVersionVO) getVOWithId(ContentVersionImpl.class, contentVersionId, db); contentId = ContentVersionVO.getContentId(); contentMap.put(contentVersionId, contentId); } return contentId; } public ContentVersionVO getFullContentVersionVOWithId(Integer contentVersionId) throws SystemException, Bug { return (ContentVersionVO) getVOWithId(ContentVersionImpl.class, contentVersionId); } public ContentVersionVO getFullContentVersionVOWithId(Integer contentVersionId, Database db) throws SystemException, Bug { return (ContentVersionVO) getVOWithId(ContentVersionImpl.class, contentVersionId, db); } public ContentVersionVO getContentVersionVOWithId(Integer contentVersionId) throws SystemException, Bug { return (ContentVersionVO) getVOWithId(SmallContentVersionImpl.class, contentVersionId); } public ContentVersionVO getLocklessContentVersionVOWithId(Integer contentVersionId) throws SystemException, Bug { return (ContentVersionVO) getVOWithIdLockless(SmallContentVersionImpl.class, "contentVersionId", contentVersionId); } public ContentVersionVO getContentVersionVOWithId(Integer contentVersionId, Database db) throws SystemException, Bug { return (ContentVersionVO) getVOWithId(SmallContentVersionImpl.class, contentVersionId, db); } public ContentVersion getContentVersionWithId(Integer contentVersionId, Database db) throws SystemException, Bug { return (ContentVersion) getObjectWithId(ContentVersionImpl.class, contentVersionId, db); } public MediumContentVersionImpl getMediumContentVersionWithId(Integer contentVersionId, Database db) throws SystemException, Bug { return (MediumContentVersionImpl) getObjectWithId(MediumContentVersionImpl.class, contentVersionId, db); } public MediumContentVersionImpl getReadOnlyMediumContentVersionWithId(Integer contentVersionId, Database db) throws SystemException, Bug { return (MediumContentVersionImpl) getObjectWithIdAsReadOnly(MediumContentVersionImpl.class, contentVersionId, db); } public ContentVersion getReadOnlyContentVersionWithId(Integer contentVersionId, Database db) throws SystemException, Bug { return (ContentVersion) getObjectWithIdAsReadOnly(ContentVersionImpl.class, contentVersionId, db); } public SmallestContentVersionVO getSmallestContentVersionVOWithId(Integer contentVersionId, Database db) throws SystemException, Bug { return (SmallestContentVersionVO) getVOWithId(SmallestContentVersionImpl.class, contentVersionId, db); } /** * This method gets the siteNodeVO with the given id */ public ContentVersionVO getSmallContentVersionVOWithId(Integer contentVersionId, Database db) throws SystemException, Bug { String key = "" + contentVersionId; ContentVersionVO contentVersionVO = (ContentVersionVO)CacheController.getCachedObjectFromAdvancedCache("contentVersionCache", key); if(contentVersionVO == null) { contentVersionVO = (ContentVersionVO)getVOWithId(SmallContentVersionImpl.class, contentVersionId, db); if(contentVersionVO != null) CacheController.cacheObjectInAdvancedCache("contentVersionCache", key, contentVersionVO); } return contentVersionVO; } public List getContentVersionVOList() throws SystemException, Bug { return getAllVOObjects(SmallContentVersionImpl.class, "contentVersionId"); } /** * Recursive methods to get all contentVersions of a given state under the specified parent content. */ public List<ContentVersionVO> getContentVersionVOListWithParentRecursive(Integer contentId, Integer stateId, boolean mustBeFirst) throws ConstraintException, SystemException { return getLatestContentVersionVOListWithParent(contentId, stateId, new ArrayList<ContentVersionVO>(), mustBeFirst); } private List<ContentVersionVO> getLatestContentVersionVOListWithParent(Integer contentId, Integer stateId, List<ContentVersionVO> resultList, boolean mustBeFirst) throws ConstraintException, SystemException { // Get the versions of this content. resultList.addAll(getLatestContentVersionVOListWithParent(contentId, stateId, mustBeFirst)); // Get the children of this content and do the recursion List childContentList = ContentController.getContentController().getContentChildrenVOList(contentId); Iterator cit = childContentList.iterator(); while (cit.hasNext()) { ContentVO contentVO = (ContentVO) cit.next(); getLatestContentVersionVOListWithParent(contentVO.getId(), stateId, resultList, mustBeFirst); } return resultList; } /** * Recursive methods to get all contentVersions of a given state under the specified parent content. */ public List<ContentVersionVO> getContentVersionVOWithParentRecursiveAndRelated(Integer contentId, Integer stateId, boolean mustBeFirst) throws ConstraintException, SystemException { List<ContentVersionVO> contentVersionVOList = new ArrayList<ContentVersionVO>(); Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { contentVersionVOList = getContentVersionVOListWithParentRecursiveAndRelated(contentId, stateId, new ArrayList(), new ArrayList(), db, mustBeFirst); //contentVersionVOList = toVOList(contentVersionList); 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 contentVersionVOList; } private List<ContentVersionVO> getContentVersionVOListWithParentRecursiveAndRelated(Integer contentId, Integer stateId, List<ContentVersionVO> resultList, List checkedContents, Database db, boolean mustBeFirst) throws ConstraintException, SystemException, Exception { checkedContents.add(contentId); // Get the versions of this content. List<ContentVersionVO> contentVersions = getLatestContentVersionVOListWithParent(contentId, stateId, db, mustBeFirst); resultList.addAll(contentVersions); Iterator<ContentVersionVO> contentVersionsIterator = contentVersions.iterator(); while(contentVersionsIterator.hasNext()) { ContentVersionVO contentVersion = contentVersionsIterator.next(); List relatedEntities = RegistryController.getController().getMatchingRegistryVOListForReferencingEntity(ContentVersion.class.getName(), contentVersion.getId().toString(), db); Iterator relatedEntitiesIterator = relatedEntities.iterator(); while(relatedEntitiesIterator.hasNext()) { RegistryVO registryVO = (RegistryVO)relatedEntitiesIterator.next(); logger.info("registryVO:" + registryVO.getEntityName() + ":" + registryVO.getEntityId()); if(registryVO.getEntityName().equals(Content.class.getName()) && !checkedContents.contains(new Integer(registryVO.getEntityId()))) { List<ContentVersionVO> relatedContentVersions = getLatestContentVersionVOListWithParent(new Integer(registryVO.getEntityId()), stateId, db, mustBeFirst); resultList.addAll(relatedContentVersions); checkedContents.add(new Integer(registryVO.getEntityId())); } } } // Get the children of this content and do the recursion List childContentList = ContentController.getContentController().getContentChildrenVOList(contentId); Iterator cit = childContentList.iterator(); while (cit.hasNext()) { ContentVO contentVO = (ContentVO) cit.next(); getContentVersionVOListWithParentRecursiveAndRelated(contentVO.getId(), stateId, resultList, checkedContents, db, mustBeFirst); } return resultList; } public List getContentVersionVOWithParent(Integer contentId) throws SystemException, Bug { List resultList = new ArrayList(); Database db = CastorDatabaseService.getDatabase(); ContentVersionVO contentVersionVO = null; beginTransaction(db); try { List contentVersions = getContentVersionWithParent(contentId, db); resultList = toVOList(contentVersions); 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 resultList; } public List getContentVersionWithParent(Integer contentId, Database db) throws SystemException, Bug, Exception { ArrayList resultList = new ArrayList(); ContentVersionVO contentVersionVO = null; OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl cv WHERE cv.owningContent.contentId = $1 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); resultList.add(contentVersion); } results.close(); oql.close(); return resultList; } /** * This method returns a list of active contentversions, and only one / language in the specified state * * @param contentId The content to look for versions in * @param stateId The state of the versions * @return A list of the latest versions matching the given state * @throws SystemException * @throws Bug */ public List<ContentVersionVO> getLatestContentVersionVOListWithParent(Integer contentId, Integer stateId, boolean mustBeFirst) throws SystemException, Bug { List<ContentVersionVO> resultList = new ArrayList<ContentVersionVO>(); Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { resultList = getLatestContentVersionVOListWithParent(contentId, stateId, db, mustBeFirst); //resultList = toVOList(resultList); 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 resultList; } /** * This method returns a list of active contentversions, and only one / language in the specified state * * @param contentId The content to look for versions in * @param stateId The state of the versions * @return A list of the latest versions matching the given state * @throws SystemException * @throws Bug */ public List<ContentVersionVO> getLatestContentVersionVOListWithParent(Integer contentId, Integer stateId, Database db, boolean mustBeFirst) throws SystemException, Bug, Exception { ArrayList<ContentVersionVO> resultList = new ArrayList<ContentVersionVO>(); ArrayList<Integer> langCheck = new ArrayList<Integer>(); OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId = $1 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); // oql.bind(stateId); QueryResults results = oql.execute(Database.READONLY); // New improved while (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); logger.info("contentVersion found: " + contentVersion.getId()); if(contentVersion.getIsActive().booleanValue()) { if((contentVersion.getStateId().compareTo(stateId)==0) && (!langCheck.contains(contentVersion.getLanguageId()))) { resultList.add(contentVersion.getValueObject()); logger.info("contentVersion added: " + contentVersion.getId()); langCheck.add(contentVersion.getLanguageId()); } if(mustBeFirst) langCheck.add(contentVersion.getLanguageId()); } } results.close(); oql.close(); return resultList; } /** * This method returns the latest contentVersion there is for the given content if it is active and is the latest made. */ public List<ContentVersionVO> getLatestActiveContentVersionVOIfInState(Integer contentId, Integer stateId, Database db) throws SystemException, Exception { List<ContentVersionVO> resultList = new ArrayList<ContentVersionVO>(); Map lastLanguageVersions = new HashMap(); Map languageVersions = new HashMap(); //TODO - fix Content content = ContentController.getContentController().getContentWithId(contentId, db); Collection contentVersions = content.getContentVersions(); Iterator versionIterator = contentVersions.iterator(); while(versionIterator.hasNext()) { ContentVersion contentVersionCandidate = (ContentVersion)versionIterator.next(); ContentVersion lastVersionInThatLanguage = (ContentVersion)lastLanguageVersions.get(contentVersionCandidate.getLanguage().getId()); if(lastVersionInThatLanguage == null || (lastVersionInThatLanguage.getId().intValue() < contentVersionCandidate.getId().intValue() && contentVersionCandidate.getIsActive().booleanValue())) lastLanguageVersions.put(contentVersionCandidate.getLanguage().getId(), contentVersionCandidate); if(contentVersionCandidate.getIsActive().booleanValue() && contentVersionCandidate.getStateId().intValue() == stateId.intValue()) { if(contentVersionCandidate.getOwningContent().getContentId().intValue() == content.getId().intValue()) { ContentVersion versionInThatLanguage = (ContentVersion)languageVersions.get(contentVersionCandidate.getLanguage().getId()); if(versionInThatLanguage == null || versionInThatLanguage.getContentVersionId().intValue() < contentVersionCandidate.getId().intValue()) { languageVersions.put(contentVersionCandidate.getLanguage().getId(), contentVersionCandidate); } } } } logger.info("Found languageVersions:" + languageVersions.size()); logger.info("Found lastLanguageVersions:" + lastLanguageVersions.size()); Iterator i = languageVersions.values().iterator(); while(i.hasNext()) { ContentVersion contentVersion = (ContentVersion)i.next(); ContentVersion lastVersionInThatLanguage = (ContentVersion)lastLanguageVersions.get(contentVersion.getLanguage().getId()); logger.info("contentVersion:" + contentVersion.getId()); logger.info("lastVersionInThatLanguage:" + lastVersionInThatLanguage.getId()); if(contentVersion == lastVersionInThatLanguage) resultList.add(contentVersion.getValueObject()); } return resultList; } /** * This method returns the latest active content version. */ public ContentVersionVO getLatestActiveContentVersionVO(Integer contentId, Integer languageId) throws SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); ContentVersionVO contentVersionVO = null; beginTransaction(db); try { contentVersionVO = getLatestActiveContentVersionVO(contentId, languageId, db); rollbackTransaction(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 contentVersionVO; } /** * This method returns the latest active content version. */ public ContentVersionVO getLatestActiveContentVersionVO(Integer contentId) throws SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); ContentVersionVO contentVersionVO = null; beginTransaction(db); try { contentVersionVO = getLatestActiveContentVersionVO(contentId, db); rollbackTransaction(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 contentVersionVO; } /** * This method returns the latest active content version. */ public ContentVersionVO getLatestActiveContentVersionVO(Integer contentId, Integer languageId, Integer stateId) throws SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); ContentVersionVO contentVersionVO = null; beginTransaction(db); try { contentVersionVO = getLatestActiveContentVersionVO(contentId, languageId, stateId, db); rollbackTransaction(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 contentVersionVO; } /** * This method returns the latest active content version. */ public ContentVersionVO getLatestActiveContentVersionVO(Integer contentId, Integer languageId, Integer stateId, Database db) throws SystemException, Bug, Exception { Timer t = new Timer(); ContentVersionVO contentVersionVO = null; String versionKey = "" + contentId + "_" + languageId + "_" + stateId + "_contentVersionVO"; Object object = CacheController.getCachedObjectFromAdvancedCache("contentVersionCache", versionKey); if(object instanceof NullObject) { logger.info("There was an cached contentVersionVO but it was null:" + object); } else if(object != null) { if(object instanceof SmallestContentVersionVO) { logger.warn("Object was instanceof SmallestContentVersionVO for key:" + versionKey); contentVersionVO = (ContentVersionVO)getVOWithId(SmallContentVersionImpl.class, ((SmallestContentVersionVO)object).getId(), db); CacheController.cacheObjectInAdvancedCache("contentVersionCache", versionKey, contentVersionVO, new String[]{CacheController.getPooledString(2, contentVersionVO.getId()), CacheController.getPooledString(1, contentVersionVO.getContentId())}, true); } else { contentVersionVO = (ContentVersionVO)object; } } else { OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId = $1 AND cv.languageId = $2 AND cv.stateId >= $3 AND cv.isActive = $4 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); oql.bind(stateId); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); contentVersionVO = contentVersion.getValueObject(); CacheController.cacheObjectInAdvancedCache("contentVersionCache", versionKey, contentVersionVO, new String[]{CacheController.getPooledString(2, contentVersionVO.getId()), CacheController.getPooledString(1, contentVersionVO.getContentId())}, true); } /* ContentVersion contentVersion = getLatestActiveContentVersionReadOnly(contentId, languageId, stateId, db); if(contentVersion != null) contentVersionVO = contentVersion.getValueObject(); */ } RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getLatestActiveContentVersionVO new", t.getElapsedTime()); return contentVersionVO; } /** * This method returns the latest active content version. */ public ContentVersionVO getLatestActiveContentVersionVOInState(Integer contentId, Integer stateId, Database db) throws SystemException, Bug, Exception { ContentVersionVO contentVersionVO = null; OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId = $1 AND cv.stateId = $2 AND cv.isActive = $3 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(stateId); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); contentVersionVO = contentVersion.getValueObject(); } return contentVersionVO; } /** * This method returns the latest active content version. */ public ContentVersionVO getLatestActiveContentVersionVO(Integer contentId, Database db) throws SystemException, Bug, Exception { ContentVersionVO contentVersionVO = null; OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId = $1 AND cv.isActive = $2 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); contentVersionVO = contentVersion.getValueObject(); } results.close(); oql.close(); return contentVersionVO; } /** * This method returns the latest active content version. */ public ContentVersionVO getLatestActiveContentVersionVO(Integer contentId, Integer languageId, Database db) throws SystemException, Bug, Exception { String contentVersionKey = "contentVersionVO_" + contentId + "_" + languageId + "_active"; ContentVersionVO contentVersionVO = (ContentVersionVO)CacheController.getCachedObjectFromAdvancedCache("contentVersionCache", contentVersionKey); if(contentVersionVO != null) { //logger.info("There was an cached contentVersionVO:" + contentVersionVO.getContentVersionId()); } else { if(logger.isInfoEnabled()) logger.info("Querying for contentVersionVO:" + contentVersionKey); //ContentVersionVO contentVersionVO = null; OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId = $1 AND cv.languageId = $2 AND cv.isActive = $3 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); contentVersionVO = contentVersion.getValueObject(); if(contentVersionVO != null) { CacheController.cacheObjectInAdvancedCache("contentVersionCache", contentVersionKey, contentVersionVO, new String[]{CacheController.getPooledString(2, contentVersionVO.getId()), CacheController.getPooledString(1, contentVersionVO.getContentId())}, true); } } results.close(); oql.close(); } return contentVersionVO; } /** * This method returns the latest active content version. */ public List<ContentVersionVO> getContentVersionVOList(Integer contentId) throws SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); List<ContentVersionVO> contentVersionVOList = new ArrayList<ContentVersionVO>(); beginTransaction(db); try { contentVersionVOList = getContentVersionVOList(contentId, db); rollbackTransaction(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 contentVersionVOList; } /** * This method returns the latest active content version. */ public List<ContentVersionVO> getContentVersionVOList(Integer contentId, Database db) throws SystemException, Bug, Exception { List<ContentVersionVO> contentVersionVOList = new ArrayList<ContentVersionVO>(); OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId = $1 AND cv.isActive = $2 ORDER BY cv.contentVersionId"); oql.bind(contentId); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); contentVersionVOList.add(contentVersion.getValueObject()); } results.close(); oql.close(); return contentVersionVOList; } /** * This method returns the latest active content version. */ public List<MediumContentVersionImpl> getMediumContentVersionList(Integer contentId, Integer languageId, Database db) throws SystemException, Bug, Exception { List<MediumContentVersionImpl> contentVersionList = new ArrayList<MediumContentVersionImpl>(); OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.MediumContentVersionImpl cv WHERE cv.contentId = $1 AND cv.languageId = $2 ORDER BY cv.contentVersionId"); oql.bind(contentId); oql.bind(languageId); QueryResults results = oql.execute(); while (results.hasMore()) { MediumContentVersionImpl contentVersion = (MediumContentVersionImpl)results.next(); contentVersionList.add(contentVersion); } results.close(); oql.close(); return contentVersionList; } /** * This method returns the latest active content version. */ public List<MediumContentVersionImpl> getMediumContentVersionList(Integer contentId, Database db) throws SystemException, Bug, Exception { List<MediumContentVersionImpl> contentVersionList = new ArrayList<MediumContentVersionImpl>(); OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.MediumContentVersionImpl cv WHERE cv.contentId = $1 ORDER BY cv.contentVersionId"); oql.bind(contentId); QueryResults results = oql.execute(); while (results.hasMore()) { MediumContentVersionImpl contentVersion = (MediumContentVersionImpl)results.next(); contentVersionList.add(contentVersion); } results.close(); oql.close(); return contentVersionList; } /** * This method returns the latest active content version. */ public List<Integer> getLatestContentVersionIdsPerLanguage(Integer contentId, Integer stateId, Database db) throws SystemException, Bug, Exception { List<Integer> contentVersionIdList = new ArrayList<Integer>(); StringBuilder sb = new StringBuilder(); if(CmsPropertyHandler.getUseShortTableNames().equals("true")) { sb.append("select max(cv.contVerId) AS id, stateId as column1Value, languageId as column2Value, '' as column3Value, '' as column4Value, '' as column5Value, '' as column6Value, '' as column7Value from cmContVer cv where cv.contId = $1 AND cv.isActive = $2 group by cv.languageId, cv.stateId "); } else { sb.append("select max(cv.contentVersionId) AS id, stateId as column1Value, languageId as column2Value, '' as column3Value, '' as column4Value, '' as column5Value, '' as column6Value, '' as column7Value from cmContentVersion cv where cv.contentId = $1 AND cv.isActive = $2 group by cv.languageId, cv.stateId "); } OQLQuery oql = db.getOQLQuery("CALL SQL " + sb.toString() + "AS org.infoglue.cms.entities.management.GeneralOQLResult"); oql.bind(contentId); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { GeneralOQLResult resultBean = (GeneralOQLResult)results.next(); Integer versionStateId = new Integer(resultBean.getValue1()); if(resultBean.getId() != null && resultBean.getValue1() != null && versionStateId.equals(stateId)) contentVersionIdList.add(resultBean.getId()); } results.close(); oql.close(); return contentVersionIdList; } public List<ContentVersionVO> getLatestContentVersionVOListPerLanguage(Integer contentId, Database db) throws SystemException, Bug, Exception { return getLatestContentVersionVOListPerLanguage(contentId, true, db); } /** * This method returns the latest active content version. */ public List<ContentVersionVO> getLatestContentVersionVOListPerLanguage(Integer contentId, boolean showDeletedFiles, Database db) throws SystemException, Bug, Exception { Set<Integer> contentIds = new HashSet<Integer>(); contentIds.add(contentId); return getLatestContentVersionVOListPerLanguage(contentIds, showDeletedFiles, db); } public List<ContentVersionVO> getLatestContentVersionVOListPerLanguage(Set<Integer> contentIds/*, Integer stateId*/, Database db) throws SystemException, Bug, Exception { return getLatestContentVersionVOListPerLanguage(contentIds, true, db); } /** * This method returns the latest active content version. */ public List<ContentVersionVO> getLatestContentVersionVOListPerLanguage(Set<Integer> contentIds/*, Integer stateId*/, boolean showDeletedItems, Database db) throws SystemException, Bug, Exception { List<ContentVersionVO> contentVersionIdSet = new ArrayList<ContentVersionVO>(); if(contentIds == null || contentIds.size() == 0) return contentVersionIdSet; List contentVersionVOListSubList = new ArrayList(); contentVersionVOListSubList.addAll(contentIds); int slotSize = 500; if(contentVersionVOListSubList.size() > 0) { List<Integer> subList = new ArrayList(contentVersionVOListSubList); if(contentVersionVOListSubList.size() > slotSize) subList = contentVersionVOListSubList.subList(0, slotSize); while(subList != null && subList.size() > 0) { contentVersionIdSet.addAll(getLatestContentVersionIdsPerLanguageImpl(subList, showDeletedItems, db)); contentVersionVOListSubList = contentVersionVOListSubList.subList(subList.size(), contentVersionVOListSubList.size()); subList = new ArrayList(contentVersionVOListSubList); if(contentVersionVOListSubList.size() > slotSize) subList = contentVersionVOListSubList.subList(0, slotSize); } } return contentVersionIdSet; } public List<ContentVersionVO> getLatestContentVersionIdsPerLanguageImpl(List<Integer> contentIds, Database db) throws SystemException, Bug, Exception { return getLatestContentVersionIdsPerLanguageImpl(contentIds, true, db); } public List<ContentVersionVO> getLatestContentVersionIdsPerLanguageImpl(List<Integer> contentIds, boolean showDeletedItems, Database db) throws SystemException, Bug, Exception { List<ContentVersionVO> contentVersionIdSet = new ArrayList<ContentVersionVO>(); if(contentIds == null || contentIds.size() == 0) return contentVersionIdSet; List<String> contentHandled = new ArrayList<String>(); StringBuilder variables = new StringBuilder(); for(int i=0; i<contentIds.size(); i++) variables.append("?" + (i+1!=contentIds.size() ? "," : "")); String showDeletedItemsWhereClause = ""; if (!showDeletedItems) { showDeletedItemsWhereClause = " AND c.isDeleted != 1 "; } StringBuilder sb = new StringBuilder(); if(CmsPropertyHandler.getUseShortTableNames().equals("true")) { sb.append("select max(cv.contVerId) AS id, cv.contId as column1Value, cv.stateId as column2Value, cv.languageId as column3Value, c.repositoryId as column4Value, c.contentTypeDefId as column5Value, max(cv.versionModifier) as column6Value, max(cv.modifiedDateTime) as column7Value from cmContVer cv, cmCont c where cv.isActive = 1 AND c.contId = cv.contId " + showDeletedItemsWhereClause + "AND cv.contId IN (" + variables + ") group by cv.contId, cv.languageId, cv.stateId, c.repositoryId, c.contentTypeDefId order by ID desc "); } else { sb.append("select max(cv.contentVersionId) AS id, cv.contentId as column1Value, cv.stateId as column2Value, cv.languageId as column3Value, c.repositoryId as column4Value, c.contentTypeDefinitionId as column5Value, max(cv.versionModifier) as column6Value, max(cv.modifiedDateTime) as column7Value from cmContentVersion cv, cmContent c where cv.isActive = 1 AND c.contentId = cv.contentId " + showDeletedItemsWhereClause + "AND cv.contentId IN (" + variables + ") group by cv.contentId, cv.languageId, cv.stateId, c.repositoryId, c.contentTypeDefinitionId order by ID desc "); } Connection conn = (Connection) db.getJdbcConnection(); PreparedStatement psmt = conn.prepareStatement(sb.toString()); int i=1; for(Integer entityId : contentIds) { psmt.setInt(i, entityId); i++; } ResultSet rs = psmt.executeQuery(); while(rs.next()) { Integer id = new Integer(rs.getString(1)); Integer contentId = new Integer(rs.getString(2)); Integer versionStateId = new Integer(rs.getString(3)); Integer languageId = new Integer(rs.getString(4)); Integer repositoryId = new Integer(rs.getString(5)); Integer contentTypeDefinitionId = null; if(rs.getString(6) != null && !rs.getString(6).equals("")) contentTypeDefinitionId = new Integer(rs.getString(6)); String versionModifier = rs.getString(7); String modifiedDateTime = rs.getString(8); if(id != null && contentId != null && !contentHandled.contains(contentId + "_" + languageId)) { ContentVersionVO cv = new ContentVersionVO(); cv.setContentId(contentId); cv.setLanguageId(languageId); cv.setStateId(versionStateId); cv.setContentVersionId(id); cv.setRepositoryId(repositoryId); if(contentTypeDefinitionId != null) cv.setContentTypeDefinitionId(contentTypeDefinitionId); cv.setVersionModifier(versionModifier); cv.setModifiedDateTime(vf.parseDate(modifiedDateTime, "yyyy-MM-dd HH:mm:ss")); contentVersionIdSet.add(cv); contentHandled.add(contentId + "_" + languageId); } } rs.close(); psmt.close(); return contentVersionIdSet; } /** * This method returns selected active content versions. */ public List<ExportContentVersionImpl> getContentVersionList(Integer repositoryId, Integer minimumId, Integer limit, Boolean onlyPublishedVersions, Database db) throws SystemException, Bug, Exception { List<ExportContentVersionImpl> contentVersionList = new ArrayList<ExportContentVersionImpl>(); OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ExportContentVersionImpl cv WHERE cv.owningContent.repositoryId = $1 AND cv.isActive = $2 AND cv.contentVersionId > $3 " + (onlyPublishedVersions ? " AND cv.stateId = 3 " : "") + " ORDER BY cv.contentVersionId LIMIT $4"); oql.bind(repositoryId); oql.bind(true); oql.bind(minimumId); oql.bind(limit); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { ExportContentVersionImpl contentVersion = (ExportContentVersionImpl)results.next(); contentVersionList.add(contentVersion); } results.close(); oql.close(); return contentVersionList; } /** * This method returns the latest active content version. */ public ContentVersion getLatestActiveContentVersion(Integer contentId, Integer languageId, Database db) throws SystemException, Bug, Exception { ContentVersion contentVersion = null; Content content = ContentController.getContentController().getReadOnlyContentWithId(contentId, db); Collection contentVersions = content.getContentVersions(); if(logger.isInfoEnabled()) { logger.info("contentId:" + contentId); logger.info("languageId:" + languageId); logger.info("content:" + content.getName()); logger.info("contentVersions:" + contentVersions.size()); } Iterator i = contentVersions.iterator(); while(i.hasNext()) { ContentVersion currentContentVersion = (ContentVersion)i.next(); if(logger.isInfoEnabled()) logger.info("found one candidate:" + currentContentVersion.getValueObject()); if(contentVersion == null || (currentContentVersion.getId().intValue() > contentVersion.getId().intValue())) { if(logger.isInfoEnabled()) { logger.info("currentContentVersion:" + currentContentVersion.getIsActive()); logger.info("currentContentVersion:" + currentContentVersion.getLanguage().getId()); } if(currentContentVersion.getIsActive().booleanValue() && currentContentVersion.getLanguage().getId().intValue() == languageId.intValue()) contentVersion = currentContentVersion; } } return contentVersion; } /** * This method returns the latest active content version. */ public ContentVersion getLatestActiveMediumContentVersion(Integer contentId, Integer languageId, Database db) throws SystemException, Bug, Exception { ContentVersion contentVersion = null; Content content = ContentController.getContentController().getMediumContentWithId(contentId, db); Collection contentVersions = content.getContentVersions(); if(logger.isInfoEnabled()) { logger.info("contentId:" + contentId); logger.info("languageId:" + languageId); logger.info("content:" + content.getName()); logger.info("contentVersions:" + contentVersions.size()); } Iterator i = contentVersions.iterator(); while(i.hasNext()) { ContentVersion currentContentVersion = (ContentVersion)i.next(); if(logger.isInfoEnabled()) logger.info("found one candidate:" + currentContentVersion.getValueObject()); if(contentVersion == null || (currentContentVersion.getId().intValue() > contentVersion.getId().intValue())) { if(logger.isInfoEnabled()) { logger.info("currentContentVersion:" + currentContentVersion.getIsActive()); logger.info("currentContentVersion:" + currentContentVersion.getLanguage().getId()); } if(currentContentVersion.getIsActive().booleanValue() && currentContentVersion.getValueObject().getLanguageId().intValue() == languageId.intValue()) contentVersion = currentContentVersion; } } return contentVersion; } /** * This method returns the latest active content version. */ public ContentVersion getLatestActiveContentVersionReadOnly(Integer contentId, Integer languageId, Database db) throws SystemException, Bug { ContentVersion contentVersion = null; Content content = ContentController.getContentController().getReadOnlyMediumContentWithId(contentId, db); Collection contentVersions = content.getContentVersions(); if(logger.isInfoEnabled()) { logger.info("contentId:" + contentId); logger.info("languageId:" + languageId); logger.info("content:" + content.getName()); logger.info("contentVersions:" + contentVersions.size()); } Iterator i = contentVersions.iterator(); while(i.hasNext()) { ContentVersion currentContentVersion = (ContentVersion)i.next(); if(logger.isInfoEnabled()) logger.info("found one candidate:" + currentContentVersion.getValueObject()); if(contentVersion == null || (currentContentVersion.getId().intValue() > contentVersion.getId().intValue())) { if(logger.isInfoEnabled()) { logger.info("currentContentVersion:" + currentContentVersion.getIsActive()); logger.info("currentContentVersion:" + currentContentVersion.getLanguage().getId()); } if(currentContentVersion.getIsActive().booleanValue() && currentContentVersion.getLanguage().getId().intValue() == languageId.intValue()) contentVersion = currentContentVersion; } } return contentVersion; } /** * This method returns the latest active content version in a certain version. */ public ContentVersion getLatestActiveContentVersionReadOnly(Integer contentId, Integer languageId, Integer stateId, Database db) throws SystemException, Bug { Timer t = new Timer(); ContentVersion contentVersion = null; Content content = ContentController.getContentController().getReadOnlyMediumContentWithId(contentId, db); Collection contentVersions = content.getContentVersions(); if(logger.isInfoEnabled()) { logger.info("contentId:" + contentId); logger.info("languageId:" + languageId); logger.info("content:" + content.getName()); logger.info("contentVersions:" + contentVersions.size()); } Iterator i = contentVersions.iterator(); while(i.hasNext()) { ContentVersion currentContentVersion = (ContentVersion)i.next(); if(logger.isInfoEnabled()) logger.info("found one candidate:" + currentContentVersion.getValueObject()); if(contentVersion == null || (currentContentVersion.getId().intValue() > contentVersion.getId().intValue())) { if(logger.isInfoEnabled()) { logger.info("currentContentVersion:" + currentContentVersion.getIsActive()); logger.info("currentContentVersion:" + currentContentVersion.getLanguage().getId()); } if(currentContentVersion.getIsActive().booleanValue() && currentContentVersion.getLanguage().getId().intValue() == languageId.intValue() && currentContentVersion.getStateId() >= stateId) contentVersion = currentContentVersion; } } RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getLatestActiveContentVersionReadOnly", t.getElapsedTime()); return contentVersion; } public ContentVersionVO getLatestContentVersionVO(Integer contentId, Integer languageId) throws SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); ContentVersionVO contentVersionVO = null; beginTransaction(db); try { contentVersionVO = getLatestContentVersionVO(contentId, languageId, 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 contentVersionVO; } public ContentVersionVO getLatestContentVersionVO(Integer contentId, Integer languageId, Database db) throws SystemException, Bug, Exception { String contentVersionKey = "contentVersionVO_" + contentId + "_" + languageId; ContentVersionVO contentVersionVO = (ContentVersionVO)CacheController.getCachedObjectFromAdvancedCache("contentVersionCache", contentVersionKey); if(contentVersionVO != null) { //logger.info("There was an cached contentVersionVO:" + contentVersionVO.getContentVersionId()); } else { if(logger.isInfoEnabled()) logger.info("Querying for contentVersionVO:" + contentVersionKey); OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId = $1 AND cv.languageId = $2 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); contentVersionVO = contentVersion.getValueObject(); if(contentVersionVO != null) { CacheController.cacheObjectInAdvancedCache("contentVersionCache", contentVersionKey, contentVersionVO, new String[]{CacheController.getPooledString(2, contentVersionVO.getId()), CacheController.getPooledString(1, contentVersionVO.getContentId())}, true); } } results.close(); oql.close(); } return contentVersionVO; } public ContentVersion getContentVersionWithId(Integer contentVersionId) throws SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); ContentVersion contentVersion = null; beginTransaction(db); try { contentVersion = getContentVersionWithId(contentVersionId, 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 contentVersion; } public ContentVersion getLatestContentVersion(Integer contentId, Integer languageId, Database db) throws SystemException, Bug, Exception { ContentVersion contentVersion = null; OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl cv WHERE cv.owningContent.contentId = $1 AND cv.language.languageId = $2 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); QueryResults results = oql.execute(); if (results.hasMore()) { contentVersion = (ContentVersion)results.next(); } results.close(); oql.close(); return contentVersion; } public ContentVersionVO getLatestContentVersionVO(Integer languageId, Database db) throws SystemException, Bug, Exception { SmallContentVersionImpl contentVersion = null; OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.languageId = $1 ORDER BY cv.contentVersionId desc"); oql.bind(languageId); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { contentVersion = (SmallContentVersionImpl)results.next(); } results.close(); oql.close(); return (contentVersion != null ? contentVersion.getValueObject() : null); } /** * This method created a new contentVersion in the database. */ public ContentVersionVO create(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, Integer oldContentVersionId) throws ConstraintException, SystemException { return create(contentId, languageId, contentVersionVO, oldContentVersionId, true, true); } /** * This method created a new contentVersion in the database. It also updates the owning content * so it recognises the change. */ public MediumContentVersionImpl create(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, Integer oldContentVersionId, Database db) throws ConstraintException, SystemException, Exception { return create(contentId, languageId, contentVersionVO, oldContentVersionId, true, true, null, db); } /** * This method created a new contentVersion in the database. */ public ContentVersionVO create(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, Integer oldContentVersionId, boolean allowBrokenAssets, boolean duplicateAssets) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); MediumContentVersionImpl contentVersion = null; beginTransaction(db); try { contentVersion = create(contentId, languageId, contentVersionVO, oldContentVersionId, allowBrokenAssets, duplicateAssets, null, 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 contentVersion.getValueObject(); } /** * This method created a new contentVersion in the database. It also updates the owning content * so it recognises the change. */ /* public ContentVersion create(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, Integer oldContentVersionId, boolean allowBrokenAssets, boolean duplicateAssets, Database db) throws ConstraintException, SystemException, Exception { return create(contentId, languageId, contentVersionVO, oldContentVersionId, allowBrokenAssets, duplicateAssets, null, db); } public ContentVersion create(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, Integer oldContentVersionId, boolean allowBrokenAssets, boolean duplicateAssets, Integer excludedAssetId, Database db) throws ConstraintException, SystemException, Exception { Content content = ContentController.getContentController().getContentWithId(contentId, db); Language language = LanguageController.getController().getLanguageWithId(languageId, db); return create(content, language, contentVersionVO, oldContentVersionId, allowBrokenAssets, duplicateAssets, excludedAssetId, db); } */ /** * This method created a new contentVersion in the database. It also updates the owning content * so it recognises the change. */ /* public ContentVersion create(Content content, Language language, ContentVersionVO contentVersionVO, Integer oldContentVersionId, Database db) throws ConstraintException, SystemException, Exception { return create(content, language, contentVersionVO, oldContentVersionId, true, db); } */ public MediumContentVersionImpl create(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, Integer oldContentVersionId, boolean allowBrokenAssets, boolean duplicateAssets, Integer excludedAssetId, Database db) throws ConstraintException, SystemException, Exception { Timer t = new Timer(); MediumContentVersionImpl contentVersion = new MediumContentVersionImpl(); contentVersion.setValueObject(contentVersionVO); contentVersion.getValueObject().setLanguageId(languageId); contentVersion.getValueObject().setContentId(contentId); RequestAnalyser.getRequestAnalyser().registerComponentStatistics("create 2", t.getElapsedTime()); db.create(contentVersion); RequestAnalyser.getRequestAnalyser().registerComponentStatistics("create 3.0", t.getElapsedTime()); //content.getContentVersions().add(contentVersion); if(oldContentVersionId != null && oldContentVersionId.intValue() != -1) copyDigitalAssets(getMediumContentVersionWithId(oldContentVersionId, db), contentVersion, allowBrokenAssets, duplicateAssets, excludedAssetId, db); return contentVersion; } public MediumContentVersionImpl createMedium(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, Database db) throws ConstraintException, SystemException, Exception { MediumContentVersionImpl contentVersion = new MediumContentVersionImpl(); contentVersion.setValueObject(contentVersionVO); contentVersion.getValueObject().setLanguageId(languageId); contentVersion.getValueObject().setContentId(contentId); db.create(contentVersion); return contentVersion; } public MediumContentVersionImpl createMedium(MediumContentVersionImpl oldContentVersion, Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, Integer oldContentVersionId, boolean hasAssets, boolean allowBrokenAssets, boolean duplicateAssets, Integer excludedAssetId, Database db) throws ConstraintException, SystemException, Exception { Timer t = new Timer(); MediumContentVersionImpl contentVersion = new MediumContentVersionImpl(); contentVersion.setValueObject(contentVersionVO); contentVersion.getValueObject().setLanguageId(languageId); contentVersion.getValueObject().setContentId(contentId); RequestAnalyser.getRequestAnalyser().registerComponentStatistics("create 2", t.getElapsedTime()); db.create(contentVersion); RequestAnalyser.getRequestAnalyser().registerComponentStatistics("create 3.1", t.getElapsedTime()); if(oldContentVersionId != null && oldContentVersionId.intValue() != -1 && hasAssets) copyDigitalAssets(oldContentVersion, contentVersion, allowBrokenAssets, duplicateAssets, excludedAssetId, db); return contentVersion; } /** * This method deletes an contentversion and notifies the owning content. */ public void delete(ContentVersionVO contentVersionVO) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { delete(contentVersionVO, 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()); } } /** * This method deletes an contentversion and notifies the owning content. */ public void delete(ContentVersionVO contentVersionVO, Database db) throws ConstraintException, SystemException, Exception { ContentVersion contentVersion = getContentVersionWithId(contentVersionVO.getContentVersionId(), db); delete(contentVersion, db, false); } /** * This method deletes an contentversion and notifies the owning content. */ public void delete(ContentVersion contentVersion, Database db) throws ConstraintException, SystemException, Exception { delete(contentVersion, db, false); } /** * This method deletes an contentversion and notifies the owning content. */ public void delete(ContentVersion contentVersion, Database db, boolean forceDelete) throws ConstraintException, SystemException, Exception { if (!forceDelete && contentVersion.getStateId().intValue() == ContentVersionVO.PUBLISHED_STATE.intValue() && contentVersion.getIsActive().booleanValue() == true) { throw new ConstraintException("ContentVersion.stateId", "3300", contentVersion.getOwningContent().getName()); } contentCategoryController.deleteByContentVersion(contentVersion, db); DigitalAssetController.getController().deleteByContentVersion(contentVersion, db); Content content = contentVersion.getOwningContent(); if(content != null) content.getContentVersions().remove(contentVersion); db.remove(contentVersion); } /** * This method deletes an contentversion and notifies the owning content. */ public void delete(MediumContentVersionImpl contentVersion, Database db, boolean forceDelete) throws ConstraintException, SystemException, Exception { if (!forceDelete && contentVersion.getStateId().intValue() == ContentVersionVO.PUBLISHED_STATE.intValue() && contentVersion.getIsActive().booleanValue() == true) { throw new ConstraintException("ContentVersion.stateId", "3300", contentVersion.getOwningContent().getName()); } contentCategoryController.deleteByContentVersion(contentVersion, db); DigitalAssetController.getController().deleteByContentVersion(contentVersion, db); //System.out.println("Removing:" + contentVersion.getId()); db.remove(contentVersion); } /** * This method deletes all contentVersions for the content sent in. * The contentVersion is related to digital assets but we don't remove the asset itself in case * other versions or contents reference the same asset. */ public void deleteVersionsForContent(ContentVO content, Database db, InfoGluePrincipal principal) throws ConstraintException, SystemException, Bug, Exception { deleteVersionsForContent(content, db, false, principal); } /** * This method deletes all contentVersions for the content sent in. * The contentVersion is related to digital assets but we don't remove the asset itself in case * other versions or contents reference the same asset. */ public void deleteVersionsForContent(ContentVO contentVO, Database db, boolean forceDelete, InfoGluePrincipal infogluePrincipal) throws ConstraintException, SystemException, Bug, Exception { if(forceDelete) { List contentVersionsVOList = ContentVersionController.getContentVersionController().getPublishedActiveContentVersionVOList(contentVO.getContentId(), db); List events = new ArrayList(); Iterator it = contentVersionsVOList.iterator(); while(it.hasNext()) { ContentVersionVO contentVersionVO = (ContentVersionVO)it.next(); EventVO eventVO = new EventVO(); eventVO.setDescription("Unpublished before forced deletion"); eventVO.setEntityClass(ContentVersion.class.getName()); eventVO.setEntityId(contentVersionVO.getContentVersionId()); eventVO.setName(contentVersionVO.getContentName() + "(" + contentVersionVO.getLanguageName() + ")"); eventVO.setTypeId(EventVO.UNPUBLISH_LATEST); eventVO = EventController.create(eventVO, contentVO.getRepositoryId(), infogluePrincipal); events.add(eventVO); } PublicationVO publicationVO = new PublicationVO(); publicationVO.setName("Direct publication by " + infogluePrincipal.getName()); publicationVO.setDescription("Unpublished all versions before forced deletion"); //publicationVO.setPublisher(this.getInfoGluePrincipal().getName()); publicationVO.setRepositoryId(contentVO.getRepositoryId()); publicationVO = PublicationController.getController().createAndPublish(publicationVO, events, true, infogluePrincipal, db, true); } //TEST List<MediumContentVersionImpl> versions = getMediumContentVersionList(contentVO.getId(), db); for(MediumContentVersionImpl version : versions) { Collection<MediumDigitalAssetImpl> digitalAssetList = (Collection<MediumDigitalAssetImpl>)version.getDigitalAssets(); for(MediumDigitalAssetImpl asset : digitalAssetList) { db.remove(asset); } delete(version, db, forceDelete); } } /** * This method deletes a digitalAsset. */ public void deleteDigitalAsset(Integer contentId, Integer languageId, String assetKey) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { ContentVersionVO contentVersionVO = this.getLatestActiveContentVersionVO(contentId, languageId, db); ContentVersion contentVersion = getContentVersionWithId(contentVersionVO.getId(), db); Collection digitalAssets = contentVersion.getDigitalAssets(); Iterator assetIterator = digitalAssets.iterator(); while(assetIterator.hasNext()) { DigitalAsset currentDigitalAsset = (DigitalAsset)assetIterator.next(); if(currentDigitalAsset.getAssetKey().equals(assetKey)) { currentDigitalAsset.getContentVersions().remove(contentVersion); assetIterator.remove(); if(currentDigitalAsset.getContentVersions().size() == 0) db.remove(currentDigitalAsset); break; } } 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()); } } /** * This method updates a digitalAsset. */ public void createOrUpdateDigitalAsset(DigitalAssetVO assetVO, InputStream is, Integer contentVersionId, InfoGluePrincipal principal) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { MediumContentVersionImpl contentVersion = this.getMediumContentVersionWithId(contentVersionId, db); boolean foundExistingAsset = false; Collection digitalAssets = contentVersion.getDigitalAssets(); Iterator assetIterator = digitalAssets.iterator(); while(assetIterator.hasNext()) { DigitalAsset currentDigitalAsset = (DigitalAsset)assetIterator.next(); if(currentDigitalAsset.getAssetKey().equals(assetVO.getAssetKey())) { assetVO.setDigitalAssetId(currentDigitalAsset.getId()); DigitalAssetController.update(assetVO, is, db); foundExistingAsset = true; break; } } if(!foundExistingAsset) DigitalAssetController.create(assetVO, is, contentVersion, 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()); } } /** * This method updates the contentversion. * @throws Exception */ public ContentVersionVO update(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, Database db) throws Exception { return update(contentId, languageId, contentVersionVO, null, false, db, false); } public ContentVersionVO update(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO) throws ConstraintException, SystemException { return update(contentId, languageId, contentVersionVO, null, false); } public ContentVersionVO update(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, InfoGluePrincipal principal) throws ConstraintException, SystemException { return update(contentId, languageId, contentVersionVO, principal, false); } public ContentVersionVO update(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, InfoGluePrincipal principal, boolean skipValidate) throws ConstraintException, SystemException { // Timer t = new Timer(); ContentVersionVO updatedContentVersionVO; Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { updatedContentVersionVO = update(contentId, languageId, contentVersionVO, principal, skipValidate, db, false); commitRegistryAwareTransaction(db); } catch(ConstraintException ce) { logger.info("Validation error:" + ce, ce); rollbackTransaction(db); throw ce; } 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 updatedContentVersionVO; //(ContentVersionVO) updateEntity(ContentVersionImpl.class, realContentVersionVO); } public ContentVersionVO update(Integer contentId, Integer languageId, ContentVersionVO contentVersionVO, InfoGluePrincipal principal, boolean skipValidate, Database db, boolean skipSiteNodeVersionUpdate) throws Exception { ContentVersionVO updatedContentVersionVO; ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentId, db); ContentTypeDefinitionVO contentTypeDefinitionVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(contentVO.getContentTypeDefinitionId(), db); String languageCode = null; if(principal != null && principal.getName() != null) languageCode = CmsPropertyHandler.getPreferredLanguageCode(principal.getName()); if (logger.isDebugEnabled()) { logger.debug("VerisonValue before validateAdvanced: " + contentVersionVO.getVersionValue()); } ConstraintExceptionBuffer ceb = contentVersionVO.validateAdvanced(contentTypeDefinitionVO, languageCode); logger.info("Skipping validate:" + skipValidate); if(!skipValidate) ceb.throwIfNotEmpty(); MediumContentVersionImpl contentVersion = null; Integer contentVersionIdToUpdate = contentVersionVO.getId(); contentVersionVO.setModifiedDateTime(new Date()); if(contentVersionVO.getId() == null) { logger.info("Creating the entity because there was no version at all for: " + contentId + " " + languageId); contentVersion = createMedium(contentId, languageId, contentVersionVO, db); } else { ContentVersionVO oldContentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(contentVersionVO.getId(), db); ContentVersionVO latestContentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(oldContentVersionVO.getContentId(), oldContentVersionVO.getLanguageId(), db); if(!oldContentVersionVO.getStateId().equals(ContentVersionVO.WORKING_STATE) && !latestContentVersionVO.getStateId().equals(ContentVersionVO.WORKING_STATE)) { List<EventVO> events = new ArrayList<EventVO>(); contentVersion = ContentStateController.changeState(oldContentVersionVO.getId(), contentVO, ContentVersionVO.WORKING_STATE, (contentVersionVO.getVersionComment().equals("No comment") ? "new working version" : contentVersionVO.getVersionComment()), false, null, principal, oldContentVersionVO.getContentId(), db, events); contentVersion.setVersionValue(contentVersionVO.getVersionValue()); /* List<String> changedAttributes = getChangedAttributeNames(oldContentVersionVO, contentVersionVO); System.out.println("changedAttributes in contentversioncontroller:" + changedAttributes); Map extraInfoMap = new HashMap(); String csList = StringUtils.join(changedAttributes.toArray(), ","); extraInfoMap.put("changedAttributeNames", csList); CacheController.setExtraInfo(ContentVersionImpl.class.getName(), contentVersion.getId().toString(), extraInfoMap); */ } else { if(latestContentVersionVO.getStateId().equals(ContentVersionVO.WORKING_STATE)) { oldContentVersionVO = contentVersionVO; contentVersionIdToUpdate = latestContentVersionVO.getId(); } List<String> changedAttributes = getChangedAttributeNames(oldContentVersionVO, contentVersionVO); Map<String,String> extraInfoMap = new HashMap<String,String>(); String csList = StringUtils.join(changedAttributes.toArray(), ","); //logger.info("csList:" + csList); extraInfoMap.put("changedAttributeNames", csList); CacheController.setExtraInfo(ContentVersionImpl.class.getName(), contentVersionVO.getId().toString(), extraInfoMap); contentVersion = ContentVersionController.getContentVersionController().getMediumContentVersionWithId(contentVersionIdToUpdate, db); //contentVersionVO.setModifiedDateTime(DateHelper.getSecondPreciseDate()); Integer existingContentId = contentVersion.getValueObject().getContentId(); contentVersionVO.setContentId(existingContentId); contentVersionVO.setLanguageId(contentVersion.getValueObject().getLanguageId()); contentVersion.setValueObject(contentVersionVO); contentVersion.setContentVersionId(contentVersionIdToUpdate); contentVersion.setStateId(ContentVersionVO.WORKING_STATE); } } SiteNodeVersionVO latestSiteNodeVersionVO = null; if(principal != null && contentTypeDefinitionVO.getName().equalsIgnoreCase("Meta info") && !skipSiteNodeVersionUpdate) { SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithMetaInfoContentId(db, contentId); //SiteNode siteNode = SiteNodeController.getController().getSiteNodeWithMetaInfoContentId(db, contentId); if(siteNodeVO.getMetaInfoContentId() != null && siteNodeVO.getMetaInfoContentId().equals(contentId)) { latestSiteNodeVersionVO = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(db, siteNodeVO.getId()); latestSiteNodeVersionVO.setVersionModifier(contentVersionVO.getVersionModifier()); latestSiteNodeVersionVO.setModifiedDateTime(DateHelper.getSecondPreciseDate()); SiteNodeVersionControllerProxy.getSiteNodeVersionControllerProxy().acUpdate(principal, latestSiteNodeVersionVO, db); Map extraInfoMap = new HashMap(); extraInfoMap.put("skipSiteNodeVersionUpdate", "true"); // extraInfoMap.put("contentId", ""+contentVO.getId()); // extraInfoMap.put("parentContentId", ""+contentVO.getParentContentId()); // extraInfoMap.put("repositoryId", ""+contentVO.getRepositoryId()); CacheController.setExtraInfo(SiteNodeVersionImpl.class.getName(), latestSiteNodeVersionVO.getId().toString(), extraInfoMap); } } registryController.updateContentVersionThreaded(contentVersion.getValueObject(), latestSiteNodeVersionVO); updatedContentVersionVO = contentVersion.getValueObject(); return updatedContentVersionVO; } /** * This method updates the contentversion. */ public ContentVersionVO update(Integer contentVersionId, ContentVersionVO contentVersionVO) throws ConstraintException, SystemException { return update(contentVersionId, contentVersionVO, null); } public ContentVersionVO update(Integer contentVersionId, ContentVersionVO contentVersionVO, InfoGluePrincipal principal) throws ConstraintException, SystemException { ContentVersionVO updatedContentVersionVO = null; Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { updatedContentVersionVO = update(contentVersionId, contentVersionVO, principal, db); commitRegistryAwareTransaction(db); } catch(ConstraintException ce) { logger.info("Validation error:" + ce, ce); rollbackTransaction(db); throw ce; } 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 updatedContentVersionVO; } public ContentVersionVO update(Integer contentVersionId, ContentVersionVO contentVersionVO, InfoGluePrincipal principal, Database db) throws Exception { ContentVersion contentVersion = getMediumContentVersionWithId(contentVersionId, db); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentVersion.getValueObject().getContentId(), db); ContentTypeDefinitionVO contentTypeDefinitionVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(contentVO.getContentTypeDefinitionId(), db); contentVersion.setValueObject(contentVersionVO); contentVersion.getValueObject().setContentId(contentVO.getContentId()); SiteNodeVersion latestSiteNodeVersion = null; if(principal != null && contentTypeDefinitionVO.getName().equalsIgnoreCase("Meta info")) { SiteNodeVO siteNode = SiteNodeController.getController().getSiteNodeVOWithMetaInfoContentId(db, contentVO.getContentId()); if(siteNode.getMetaInfoContentId() != null && siteNode.getMetaInfoContentId().equals(contentVO.getContentId())) { latestSiteNodeVersion = SiteNodeVersionController.getController().getLatestMediumSiteNodeVersion(db, siteNode.getId(), false); latestSiteNodeVersion.setVersionModifier(contentVersionVO.getVersionModifier()); latestSiteNodeVersion.setModifiedDateTime(DateHelper.getSecondPreciseDate()); SiteNodeVersionControllerProxy.getSiteNodeVersionControllerProxy().acUpdate(principal, latestSiteNodeVersion.getValueObject(), db); } } registryController.updateContentVersionThreaded(contentVersion.getValueObject(), latestSiteNodeVersion == null ? null : latestSiteNodeVersion.getValueObject()); return contentVersion.getValueObject(); } public List getPublishedActiveContentVersionVOList(Integer contentId) throws SystemException, Bug, Exception { List contentVersionVOList = new ArrayList(); Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl cv WHERE cv.owningContent.contentId = $1 AND cv.stateId = $2 AND cv.isActive = $3 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(ContentVersionVO.PUBLISHED_STATE); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); contentVersionVOList.add(contentVersion.getValueObject()); } results.close(); oql.close(); 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 contentVersionVOList; } public List<SmallestContentVersionVO> getPublishedActiveContentVersionVOList(List<Integer> contentIds, Database db) throws SystemException, Bug, Exception { List<SmallestContentVersionVO> contentVersionIdSet = new ArrayList<SmallestContentVersionVO>(); if(contentIds == null || contentIds.size() == 0) return contentVersionIdSet; List contentVersionVOListSubList = new ArrayList(); contentVersionVOListSubList.addAll(contentIds); int slotSize = 500; if(contentVersionVOListSubList.size() > 0) { List<Integer> subList = new ArrayList(contentVersionVOListSubList); if(contentVersionVOListSubList.size() > slotSize) subList = contentVersionVOListSubList.subList(0, slotSize); while(subList != null && subList.size() > 0) { contentVersionIdSet.addAll(getPublishedActiveContentVersionVOListBatch(subList, db)); contentVersionVOListSubList = contentVersionVOListSubList.subList(subList.size(), contentVersionVOListSubList.size()); subList = new ArrayList(contentVersionVOListSubList); if(contentVersionVOListSubList.size() > slotSize) subList = contentVersionVOListSubList.subList(0, slotSize); } } return contentVersionIdSet; } public List<SmallestContentVersionVO> getPublishedActiveContentVersionVOListBatch(List<Integer> contentIds, Database db) throws SystemException, Bug, Exception { List<SmallestContentVersionVO> contentVersionVOList = new ArrayList<SmallestContentVersionVO>(); if(contentIds == null || contentIds.size() == 0) return contentVersionVOList; List<String> contentHandled = new ArrayList<String>(); StringBuilder variables = new StringBuilder(); for(int i=0; i<contentIds.size(); i++) variables.append("$" + (i+3) + (i+1!=contentIds.size() ? "," : "")); //System.out.println("siteNodeIds:" + siteNodeIds.length); //System.out.println("variables:" + variables); StringBuffer SQL = new StringBuffer(); OQLQuery oql = db.getOQLQuery("CALL SQL select cv.contentVersionId, cv.stateId, cv.modifiedDateTime, cv.versionComment, cv.isCheckedOut, cv.isActive, cv.contentId, cv.languageId, cv.versionModifier FROM cmContentVersion cv where cv.isActive = $1 AND cv.stateId = $2 AND cv.contentId IN (" + variables + ") AS org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl"); if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true")) oql = db.getOQLQuery("CALL SQL select cv.contVerId, cv.stateId, cv.modifiedDateTime, cv.verComment, cv.isCheckedOut, cv.isActive, cv.contId, cv.languageId, cv.versionModifier FROM cmContVer cv where cv.isActive = $1 AND cv.stateId = $2 AND cv.contId IN (" + variables + ") AS org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl"); //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(ContentVersionVO.PUBLISHED_STATE); for(Integer entityId : contentIds) oql.bind(entityId); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { SmallestContentVersionImpl contentVersion = (SmallestContentVersionImpl)results.next(); contentVersionVOList.add(contentVersion.getValueObject()); } results.close(); oql.close(); return contentVersionVOList; } public List getPublishedActiveContentVersionVOList(Integer contentId, Database db) throws SystemException, Bug, Exception { List contentVersionVOList = new ArrayList(); OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId = $1 AND cv.stateId = $2 AND cv.isActive = $3 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(ContentVersionVO.PUBLISHED_STATE); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { SmallContentVersionImpl contentVersion = (SmallContentVersionImpl)results.next(); contentVersionVOList.add(contentVersion.getValueObject()); } results.close(); oql.close(); return contentVersionVOList; } public ContentVersionVO getLatestPublishedContentVersionVO(Integer contentId) throws SystemException, Bug, Exception { ContentVersionVO contentVersionVO = null; Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId = $1 AND cv.stateId = $2 AND cv.isActive = $3 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(ContentVersionVO.PUBLISHED_STATE); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { SmallContentVersionImpl contentVersion = (SmallContentVersionImpl)results.next(); contentVersionVO = contentVersion.getValueObject(); } results.close(); oql.close(); 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 contentVersionVO; } public ContentVersion getLatestPublishedContentVersion(Integer contentId) throws SystemException, Bug, Exception { ContentVersion contentVersion = null; Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl cv WHERE cv.owningContent.contentId = $1 AND cv.stateId = $2 AND cv.isActive = $3 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(ContentVersionVO.PUBLISHED_STATE); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { contentVersion = (ContentVersion)results.next(); } results.close(); oql.close(); 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 contentVersion; } public ContentVersion getLatestPublishedContentVersion(Integer contentId, Integer languageId) throws SystemException, Bug, Exception { ContentVersion contentVersion = null; Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl cv WHERE cv.owningContent.contentId = $1 AND cv.language.languageId = $2 AND cv.stateId = $3 AND cv.isActive = $4 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); oql.bind(ContentVersionVO.PUBLISHED_STATE); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { contentVersion = (ContentVersion)results.next(); } results.close(); oql.close(); 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 contentVersion; } public ContentVersion getLatestPublishedContentVersion(Integer contentId, Integer languageId, Database db) throws SystemException, Bug, Exception { ContentVersion contentVersion = null; OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl cv WHERE cv.owningContent.contentId = $1 AND cv.language.languageId = $2 AND cv.stateId = $3 AND cv.isActive = $4 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); oql.bind(ContentVersionVO.PUBLISHED_STATE); oql.bind(true); QueryResults results = oql.execute(); this.logger.info("Fetching entity in read/write mode"); if (results.hasMore()) { contentVersion = (ContentVersion)results.next(); } results.close(); oql.close(); return contentVersion; } /** * This method returns the version previous to the one sent in. */ public ContentVersionVO getPreviousContentVersionVO(Integer contentId, Integer languageId, Integer contentVersionId) throws SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); ContentVersionVO contentVersionVO = null; beginTransaction(db); try { OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl cv WHERE cv.owningContent.contentId = $1 AND cv.language.languageId = $2 AND cv.contentVersionId < $3 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); oql.bind(contentVersionId); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); logger.info("found one:" + contentVersion.getValueObject()); contentVersionVO = contentVersion.getValueObject(); } results.close(); oql.close(); 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 contentVersionVO; } /** * This method returns the version previous to the one sent in. */ public ContentVersionVO getPreviousActiveContentVersionVO(Integer contentId, Integer languageId, Integer contentVersionId, Database db) throws SystemException, Bug, Exception { ContentVersionVO contentVersionVO = null; OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl cv WHERE cv.owningContent.contentId = $1 AND cv.language.languageId = $2 AND cv.isActive = $3 AND cv.contentVersionId < $4 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); oql.bind(new Boolean(true)); oql.bind(contentVersionId); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); logger.info("found one:" + contentVersion.getValueObject()); contentVersionVO = contentVersion.getValueObject(); } results.close(); oql.close(); return contentVersionVO; } public ContentVersionVO getSecondLatestActiveContentVersionVO(Integer contentId, Integer languageId, boolean isActive, Database db) throws SystemException, Bug, Exception { ContentVersionVO contentVersionVO = null; OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId = $1 AND cv.languageId = $2 AND cv.isActive = $3 AND cv.stateId >= $4 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); oql.bind(new Boolean(true)); oql.bind(CmsPropertyHandler.getOperatingMode()); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { results.next(); logger.debug("found first latest content version"); if (results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); if (logger.isInfoEnabled()) { logger.info("found second latest content version:" + contentVersion.getValueObject()); } contentVersionVO = contentVersion.getValueObject(); } } results.close(); oql.close(); return contentVersionVO; } /** * This method deletes the relation to a digital asset - not the asset itself. */ public ContentVersionVO deleteDigitalAssetRelation(Integer contentVersionId, Integer digitalAssetId, InfoGluePrincipal principal) throws SystemException, Bug { ContentVersionVO editedContentVersionVO = null; Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { ContentVersion contentVersion = null; ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(contentVersionId, db); DigitalAssetVO digitalAssetVO = DigitalAssetController.getController().getDigitalAssetVOWithId(digitalAssetId, db); if(!contentVersionVO.getStateId().equals(ContentVersionVO.WORKING_STATE)) { List events = new ArrayList(); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentVersionVO.getContentId(), db); contentVersion = ContentStateController.changeState(contentVersionVO.getId(), contentVO, ContentVersionVO.WORKING_STATE, "new working version", false, null, principal, contentVersionVO.getContentId(), db, events, digitalAssetId); //digitalAssetVO = DigitalAssetController.getController().getLatestDigitalAssetVO(contentVersion.getId(), digitalAssetVO.getAssetKey(), db); } else { contentVersion = ContentVersionController.getContentVersionController().getContentVersionWithId(contentVersionVO.getId(), db); DigitalAsset digitalAsset = DigitalAssetController.getDigitalAssetWithId(digitalAssetVO.getId(), db); contentVersion.getDigitalAssets().remove(digitalAsset); digitalAsset.getContentVersions().remove(contentVersion); logger.info("digitalAsset size after:" + digitalAsset.getContentVersions().size()); if(digitalAsset.getContentVersions().size() == 0) db.remove(digitalAsset); } editedContentVersionVO = contentVersion.getValueObject(); /* DigitalAsset digitalAsset = DigitalAssetController.getDigitalAssetWithId(digitalAssetVO.getId(), db); contentVersion.getDigitalAssets().remove(digitalAsset); digitalAsset.getContentVersions().remove(contentVersion); logger.info("digitalAsset size after:" + digitalAsset.getContentVersions().size()); if(digitalAsset.getContentVersions().size() == 0) db.remove(digitalAsset); */ 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 editedContentVersionVO; } /** * This method deletes the relation to a digital asset - not the asset itself. */ public void deleteDigitalAssetRelation(Integer contentVersionId, DigitalAsset digitalAsset, Database db) throws SystemException, Bug { ContentVersion contentVersion = getContentVersionWithId(contentVersionId, db); contentVersion.getDigitalAssets().remove(digitalAsset); digitalAsset.getContentVersions().remove(contentVersion); } /** * This method assigns the same digital assets the old content-version has. * It's ofcourse important that noone deletes the digital asset itself for then it's lost to everyone. */ /* public void copyDigitalAssets(ContentVersion originalContentVersion, ContentVersion newContentVersion, Database db) throws ConstraintException, SystemException, Exception { copyDigitalAssets(originalContentVersion, newContentVersion, true, db); } */ public void copyDigitalAssets(MediumContentVersionImpl originalContentVersion, MediumContentVersionImpl newContentVersion, boolean allowBrokenAssets, boolean duplicateAssets, Integer excludedAssetId, Database db) throws ConstraintException, SystemException, Exception { Collection digitalAssets = originalContentVersion.getDigitalAssets(); if(!duplicateAssets) { Iterator digitalAssetsIterator = digitalAssets.iterator(); while(digitalAssetsIterator.hasNext()) { DigitalAsset digitalAsset = (DigitalAsset)digitalAssetsIterator.next(); logger.info("Make copy of reference to digitalAssets " + digitalAsset.getAssetKey()); if(excludedAssetId == null || !digitalAsset.getId().equals(excludedAssetId)) { newContentVersion.getDigitalAssets().add(digitalAsset); digitalAsset.getContentVersions().add(newContentVersion); } else { logger.info("Not copying the excluded asset:" + digitalAsset.getId()); } } } else { Iterator digitalAssetsIterator = digitalAssets.iterator(); while(digitalAssetsIterator.hasNext()) { DigitalAsset digitalAsset = (DigitalAsset)digitalAssetsIterator.next(); if(excludedAssetId == null || !digitalAsset.getId().equals(excludedAssetId)) { logger.info("Copying digitalAssets " + digitalAsset.getAssetKey()); DigitalAssetVO digitalAssetVO = digitalAsset.getValueObject(); InputStream is = DigitalAssetController.getController().getAssetInputStream(digitalAsset, true); if(is == null && !allowBrokenAssets) throw new ConstraintException("DigitalAsset.assetBlob", "3308", "Broken asset found on content '" + originalContentVersion.getValueObject().getContentName() + "' with id " + originalContentVersion.getValueObject().getContentId()); try { synchronized (is) { DigitalAssetController.create(digitalAssetVO, is, newContentVersion, db); } } catch (Exception e) { e.printStackTrace(); } finally { if(is != null) is.close(); } } else { logger.info("Not copying the excluded asset:" + digitalAsset.getId()); } logger.info("digitalAssets:" + digitalAssets.size()); } } } public DigitalAssetVO copyDigitalAssetAndRemoveOldReference(MediumContentVersionImpl contentVersion, DigitalAsset digitalAsset, boolean allowBrokenAssets, Database db) throws ConstraintException, SystemException, Exception { logger.info("Copying digitalAsset " + digitalAsset.getAssetKey()); DigitalAssetVO digitalAssetVO = digitalAsset.getValueObject(); InputStream is = DigitalAssetController.getController().getAssetInputStream(digitalAsset, true); if(is == null && !allowBrokenAssets) throw new ConstraintException("DigitalAsset.assetBlob", "3308", "Broken asset found on content '" + contentVersion.getValueObject().getContentName() + "' with id " + contentVersion.getValueObject().getContentId()); try { synchronized (is) { digitalAssetVO = DigitalAssetController.create(digitalAssetVO, is, contentVersion, db); contentVersion.getDigitalAssets().remove(digitalAsset); digitalAsset.getContentVersions().remove(contentVersion); } } catch (Exception e) { e.printStackTrace(); } finally { if(is != null) is.close(); } logger.info("digitalAssetVO:" + digitalAssetVO); return digitalAssetVO; } /** * This method fetches a value from the xml that is the contentVersions Value. If the * contentVersioVO is null the contentVersion has not been created yet and no values are present. */ public String getAttributeValue(Integer contentVersionId, String attributeName, boolean escapeHTML) throws SystemException { String value = ""; ContentVersionVO contentVersionVO = getContentVersionVOWithId(contentVersionId); if(contentVersionVO != null) { try { logger.info("attributeName:" + attributeName); logger.info("VersionValue:" + contentVersionVO.getVersionValue()); value = getAttributeValue(contentVersionVO, attributeName, escapeHTML); } catch (Exception e) { e.printStackTrace(); } } //logger.info("value:" + value); return value; } /** * Returns an attribute value from the ContentVersionVO * * @param contentVersionVO The version on which to find the value * @param attributeName THe name of the attribute whose value is wanted * @param escapeHTML A boolean indicating if the result should be escaped * @return The String vlaue of the attribute, or blank if it doe snot exist. */ public String getAttributeValue(ContentVersionVO contentVersionVO, String attributeName, boolean escapeHTML) { String value = ""; String xml = contentVersionVO.getVersionValue(); int startTagIndex = xml.indexOf("<" + attributeName + ">"); int endTagIndex = xml.indexOf("]]></" + attributeName + ">"); if(startTagIndex > 0 && startTagIndex < xml.length() && endTagIndex > startTagIndex && endTagIndex < xml.length()) { value = xml.substring(startTagIndex + attributeName.length() + 11, endTagIndex); if(escapeHTML) value = new VisualFormatter().escapeHTML(value); } return value; } /** * Returns an attribute value from the ContentVersionVO * * @param contentVersionVO The version on which to find the value * @param attributeName THe name of the attribute whose value is wanted * @param escapeHTML A boolean indicating if the result should be escaped * @return The String vlaue of the attribute, or blank if it doe snot exist. */ public List<String> getChangedAttributeNames(ContentVersionVO contentVersionVO1, ContentVersionVO contentVersionVO2) { List<String> changes = new ArrayList<String>(); try { String xml = contentVersionVO1.getVersionValue(); int attributesStartTagIndex = xml.indexOf("<attributes>"); int attributesStopTagIndex = xml.lastIndexOf("</attributes>"); String attributes = xml.substring(attributesStartTagIndex+12, attributesStopTagIndex); //logger.info("attributes1:" + attributes); int loop = 0; int startTagIndex = attributes.indexOf("<"); while(startTagIndex > -1 && loop < 50) { String attributeName = attributes.substring(startTagIndex + 1, attributes.indexOf(">",startTagIndex+1)); int endTagEndIndex = attributes.indexOf("</" + attributeName + ">", startTagIndex); String value1 = getAttributeValue(contentVersionVO1, attributeName, false); String value2 = getAttributeValue(contentVersionVO2, attributeName, false); //logger.info("value1:" + value1); //logger.info("value2:" + value2); if(!value1.equals(value2)) changes.add(attributeName); startTagIndex = attributes.indexOf("<", endTagEndIndex + 1); loop++; } } catch (Exception e) { e.printStackTrace(); } return changes; } /** * Returns an attribute value from the ContentVersionVO * * @param contentVersionVO The version on which to find the value * @param attributeName THe name of the attribute whose value is wanted * @param escapeHTML A boolean indicating if the result should be escaped * @return The String vlaue of the attribute, or blank if it doe snot exist. */ public List<String> getAttributeNames(ContentVersionVO contentVersionVO1) { List<String> attributeNames = new ArrayList<String>(); if(contentVersionVO1 == null) return attributeNames; try { String xml = contentVersionVO1.getVersionValue(); int attributesStartTagIndex = xml.indexOf("<attributes>"); int attributesStopTagIndex = xml.indexOf("</attributes>"); String attributes = xml.substring(attributesStartTagIndex+12, attributesStopTagIndex); //logger.info("attributes1:" + attributes); int startTagIndex = attributes.indexOf("<"); while(startTagIndex > -1) { String attributeName = attributes.substring(startTagIndex + 1, attributes.indexOf(">",startTagIndex+1)); int endTagEndIndex = attributes.indexOf("</" + attributeName + ">", startTagIndex); attributeNames.add(attributeName); startTagIndex = attributes.indexOf("<", endTagEndIndex + 1); } } catch (Exception e) { e.printStackTrace(); } return attributeNames; } /** * This method fetches a value from the xml that is the contentVersions Value. If the * contentVersioVO is null the contentVersion has not been created yet and no values are present. */ public void updateAttributeValue(Integer contentVersionId, String attributeName, String attributeValue, InfoGluePrincipal infogluePrincipal) throws SystemException, Bug { updateAttributeValue(contentVersionId, attributeName, attributeValue, infogluePrincipal, false); } /** * This method fetches a value from the xml that is the contentVersions Value. If the * contentVersioVO is null the contentVersion has not been created yet and no values are present. */ public void updateAttributeValue(Integer contentVersionId, String attributeName, String attributeValue, InfoGluePrincipal infogluePrincipal, Database db) throws SystemException, Bug { updateAttributeValue(contentVersionId, attributeName, attributeValue, infogluePrincipal, true, db, false); } /** * This method fetches a value from the xml that is the contentVersions Value. If the * contentVersioVO is null the contentVersion has not been created yet and no values are present. */ public void updateAttributeValue(Integer contentVersionId, String attributeName, String attributeValue, InfoGluePrincipal infogluePrincipal, Database db, boolean skipSiteNodeVersionUpdate) throws SystemException, Bug { updateAttributeValue(contentVersionId, attributeName, attributeValue, infogluePrincipal, true, db, skipSiteNodeVersionUpdate); } /** * This method fetches a value from the xml that is the contentVersions Value. If the * contentVersioVO is null the contentVersion has not been created yet and no values are present. */ public void updateAttributeValue(Integer contentVersionId, String attributeName, String attributeValue, InfoGluePrincipal infogluePrincipal, boolean skipValidate) throws SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); updateAttributeValue(contentVersionId, attributeName, attributeValue, infogluePrincipal, skipValidate, db, false); commitRegistryAwareTransaction(db); //commitTransaction(db); } catch (Exception ex) { rollbackTransaction(db); logger.error("Error when updating content attribute value. Message: " + ex.getMessage()); logger.error("Error when updating content attribute value.", ex); } } public void updateAttributeValue(Integer contentVersionId, String attributeName, String attributeValue, InfoGluePrincipal infogluePrincipal, boolean skipValidate, Database db, boolean skipSiteNodeVersionUpdate) throws SystemException, Bug { ContentVersionVO contentVersionVO = null; try { contentVersionVO = getContentVersionVOWithId(contentVersionId); } catch(Exception e) { logger.warn("Problem finding version: " + e.getMessage() + " - skipping - was probably deleted"); } if(contentVersionVO != null) { try { InputSource inputSource = new InputSource(new StringReader(contentVersionVO.getVersionValue())); DOMParser parser = new DOMParser(); parser.parse(inputSource); Document document = parser.getDocument(); NodeList nl = document.getDocumentElement().getChildNodes(); Node attributesNode = nl.item(0); boolean existed = false; nl = attributesNode.getChildNodes(); for(int i=0; i<nl.getLength(); i++) { Node n = nl.item(i); if(n.getNodeName().equalsIgnoreCase(attributeName)) { if(n.getFirstChild() != null && n.getFirstChild().getNodeValue() != null) { n.getFirstChild().setNodeValue(attributeValue); existed = true; break; } else { CDATASection cdata = document.createCDATASection(attributeValue); n.appendChild(cdata); existed = true; break; } } } if(existed == false) { org.w3c.dom.Element attributeElement = document.createElement(attributeName); attributesNode.appendChild(attributeElement); CDATASection cdata = document.createCDATASection(attributeValue); attributeElement.appendChild(cdata); } StringBuffer sb = new StringBuffer(); org.infoglue.cms.util.XMLHelper.serializeDom(document.getDocumentElement(), sb); logger.info("sb:" + sb); contentVersionVO.setVersionValue(sb.toString()); contentVersionVO.setVersionModifier(infogluePrincipal.getName()); update(contentVersionVO.getContentId(), contentVersionVO.getLanguageId(), contentVersionVO, infogluePrincipal, skipValidate, db, skipSiteNodeVersionUpdate); } catch(Exception e) { logger.error("Error updating version value: " + e.getMessage(), e); } } } /** * 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 ContentVersionVO(); } /** * Calls {@link #getContentAndAffectedItemsRecursive(Integer, Integer, List, List, boolean, boolean, ProcessBean, boolean) with * <code>showDeletedItems</code> set to true */ public void getContentAndAffectedItemsRecursive(Integer contentId, Integer stateId, List<SiteNodeVersionVO> siteNodeVersionVOList, List<ContentVersionVO> contentVersionVOList, boolean mustBeFirst, boolean includeMetaInfo, ProcessBean processBean) throws ConstraintException, SystemException { getContentAndAffectedItemsRecursive(contentId, stateId, siteNodeVersionVOList, contentVersionVOList, mustBeFirst, includeMetaInfo, processBean, true); } /** * Recursive methods to get all contentVersions of a given state under the specified parent content. */ public void getContentAndAffectedItemsRecursive(Integer contentId, Integer stateId, List<SiteNodeVersionVO> siteNodeVersionVOList, List<ContentVersionVO> contentVersionVOList, boolean mustBeFirst, boolean includeMetaInfo, ProcessBean processBean, boolean showDeletedItems) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { ContentVO content = ContentController.getContentController().getContentVOWithId(contentId, db); processBean.updateProcess("Searching for items to publish"); getContentAndAffectedItemsRecursive(content, stateId, new ArrayList(), new ArrayList(), db, siteNodeVersionVOList, contentVersionVOList, mustBeFirst, includeMetaInfo, processBean, showDeletedItems); 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()); } } private void getContentAndAffectedItemsRecursive(ContentVO contentVO, Integer stateId, List checkedSiteNodes, List checkedContents, Database db, List<SiteNodeVersionVO> siteNodeVersionVOList, List<ContentVersionVO> contentVersionVOList, boolean mustBeFirst, boolean includeMetaInfo, ProcessBean processBean, boolean showDeletedItems) throws ConstraintException, SystemException, Exception { //checkedSiteNodes.add(content.getId()); checkedContents.add(contentVO.getId()); List<ContentVersionVO> contentVersions = ContentVersionController.getContentVersionController().getLatestContentVersionVOListPerLanguage(contentVO.getId(), showDeletedItems, db); //List contentVersions = getLatestContentVersionWithParent(contentVO.getId(), stateId, db, mustBeFirst); Iterator<ContentVersionVO> contentVersionsIterator = contentVersions.iterator(); while(contentVersionsIterator.hasNext()) { ContentVersionVO contentVersion = contentVersionsIterator.next(); ContentTypeDefinitionVO contentTypeDefinitionVO = null; if(contentVO.getContentTypeDefinitionId() != null) { try { contentTypeDefinitionVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(contentVO.getContentTypeDefinitionId(), db); } catch (Exception e) { logger.error("No existing content type for: " + ContentController.getContentController().getContentPath(contentVO.getId()) + ":" + contentVO.getId()); } } if(includeMetaInfo || (!includeMetaInfo && (contentTypeDefinitionVO == null || !contentTypeDefinitionVO.getName().equalsIgnoreCase("Meta info")))) { if(contentVersion.getStateId().equals(ContentVersionVO.WORKING_STATE)) contentVersionVOList.add(contentVersion); } List relatedEntities = RegistryController.getController().getMatchingRegistryVOListForReferencingEntity(ContentVersion.class.getName(), contentVersion.getId().toString(), db); Iterator relatedEntitiesIterator = relatedEntities.iterator(); while(relatedEntitiesIterator.hasNext()) { RegistryVO registryVO = (RegistryVO)relatedEntitiesIterator.next(); logger.info("registryVO:" + registryVO.getEntityName() + ":" + registryVO.getEntityId()); if(registryVO.getEntityName().equals(SiteNode.class.getName()) && !checkedSiteNodes.contains(new Integer(registryVO.getEntityId()))) { try { SiteNodeVO relatedSiteNode = SiteNodeController.getController().getSiteNodeVOWithId(new Integer(registryVO.getEntityId()), db); if (!relatedSiteNode.getIsDeleted()) { SiteNodeVersionVO relatedSiteNodeVersion = SiteNodeVersionController.getController().getLatestSiteNodeVersionVO(db, new Integer(registryVO.getEntityId())); if(relatedSiteNodeVersion != null && contentVO.getRepositoryId().intValue() == relatedSiteNode.getRepositoryId().intValue()) { if(relatedSiteNodeVersion.getStateId().equals(SiteNodeVersionVO.WORKING_STATE)) siteNodeVersionVOList.add(relatedSiteNodeVersion); } } else if (logger.isDebugEnabled()) { logger.debug("SiteNode excluded from list because it is deleted. SiteNode.id: " + registryVO.getEntityId()); } } catch(Exception e) { logger.warn("The related siteNode with id:" + registryVO.getEntityId() + " could not be loaded.", e); } checkedSiteNodes.add(new Integer(registryVO.getEntityId())); } else if(registryVO.getEntityName().equals(Content.class.getName()) && !checkedContents.contains(new Integer(registryVO.getEntityId()))) { try { ContentVO relatedContentVO = ContentController.getContentController().getContentVOWithId(new Integer(registryVO.getEntityId()), db); ContentTypeDefinitionVO relatedContentTypeDefinitionVO = null; if(relatedContentVO.getContentTypeDefinitionId() != null) relatedContentTypeDefinitionVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(relatedContentVO.getContentTypeDefinitionId(), db); if(includeMetaInfo || (!includeMetaInfo && (relatedContentTypeDefinitionVO == null || !relatedContentTypeDefinitionVO.getName().equalsIgnoreCase("Meta info")))) { List<ContentVersionVO> relatedContentVersions = ContentVersionController.getContentVersionController().getLatestContentVersionVOListPerLanguage(relatedContentVO.getId(), db); //List<ContentVersionVO> relatedContentVersions = ContentVersionController.getContentVersionController().getLatestContentVersionIdsPerLanguage(relatedContentVO.getId(), stateId, db); //List<ContentVersionVO> relatedContentVersions = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVOIfInState(relatedContentVO.getId(), stateId, db); logger.info("relatedContentVersions:" + relatedContentVersions.size()); Iterator<ContentVersionVO> relatedContentVersionsIterator = relatedContentVersions.iterator(); while(relatedContentVersionsIterator.hasNext()) { ContentVersionVO relatedContentVersion = relatedContentVersionsIterator.next(); //ContentVO contentVO = ContentController.getContentController().getContentVOWithId(relatedContentVersion.getContentId(), db); if(relatedContentVersion != null && contentVO.getRepositoryId().intValue() == relatedContentVO.getRepositoryId().intValue()) { if(relatedContentVersion.getStateId().equals(ContentVersionVO.WORKING_STATE)) contentVersionVOList.add(relatedContentVersion); } } } } catch(Exception e) { logger.warn("The related content with id:" + registryVO.getEntityId() + " could not be loaded.", e); } checkedContents.add(new Integer(registryVO.getEntityId())); } } } // Get the children of this content and do the recursion List<ContentVO> childContentVOList = ContentController.getContentController().getContentChildrenVOList(contentVO.getId(), null, db); //Collection childContentList = content.getChildren(); Iterator<ContentVO> cit = childContentVOList.iterator(); while (cit.hasNext()) { if (contentVersionVOList.size() % 10 == 0 || siteNodeVersionVOList.size() % 10 == 0) { processBean.updateLastDescription("Found " + contentVersionVOList.size() + " contents and " + siteNodeVersionVOList.size() + " pages so far..."); } ContentVO citContent = cit.next(); getContentAndAffectedItemsRecursive(citContent, stateId, checkedSiteNodes, checkedContents, db, siteNodeVersionVOList, contentVersionVOList, mustBeFirst, includeMetaInfo, processBean, showDeletedItems); } } /** * 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 cleanContentVersions(int numberOfVersionsToKeep, boolean keepOnlyOldPublishedVersions, long minimumTimeBetweenVersionsDuringClean, boolean deleteVersions, Integer contentTypeDefinitionId) throws SystemException, Exception { int cleanedVersions = 0; int batchLimit = 20; List languageVOList = LanguageController.getController().getLanguageVOList(); Iterator<LanguageVO> languageVOListIterator = languageVOList.iterator(); while(languageVOListIterator.hasNext()) { LanguageVO languageVO = languageVOListIterator.next(); Map<Integer,Integer> contentIdMap = getContentIdVersionCountMap(languageVO.getId(), numberOfVersionsToKeep, contentTypeDefinitionId); if(!deleteVersions) { for(Integer contentId : contentIdMap.keySet()) { Integer versionCount = contentIdMap.get(contentId); int additions = versionCount - numberOfVersionsToKeep; //System.out.println("additions " + contentId + ": " + additions + "/" + versionCount + "/" + numberOfVersionsToKeep); cleanedVersions = cleanedVersions + additions; } } else { List<SmallestContentVersionVO> contentVersionVOList = getSmallestContentVersionVOList(languageVO.getId(), numberOfVersionsToKeep, keepOnlyOldPublishedVersions, minimumTimeBetweenVersionsDuringClean, contentTypeDefinitionId); logger.info("Deleting " + contentVersionVOList.size() + " versions for language " + languageVO.getName()); int maxIndex = (contentVersionVOList.size() > batchLimit ? batchLimit : contentVersionVOList.size()); List partList = contentVersionVOList.subList(0, maxIndex); while(partList.size() > 0) { if(deleteVersions) cleanVersions(numberOfVersionsToKeep, partList); cleanedVersions = cleanedVersions + partList.size(); logger.info("Cleaned " + cleanedVersions + " of " + contentVersionVOList.size()); partList.clear(); maxIndex = (contentVersionVOList.size() > batchLimit ? batchLimit : contentVersionVOList.size()); partList = contentVersionVOList.subList(0, maxIndex); } } } return cleanedVersions; } /** * 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 cleanContentVersions(ContentVO contentVO, boolean recurse, int numberOfVersionsToKeep, boolean keepOnlyOldPublishedVersions, long minimumTimeBetweenVersionsDuringClean, boolean deleteVersions) throws SystemException, Exception { int cleanedVersions = 0; int batchLimit = 20; List languageVOList = LanguageController.getController().getLanguageVOList(); Iterator<LanguageVO> languageVOListIterator = languageVOList.iterator(); while(languageVOListIterator.hasNext()) { LanguageVO languageVO = languageVOListIterator.next(); List<Integer> contentIds = new ArrayList<Integer>(); contentIds.add(contentVO.getId()); if(recurse) { contentIds.addAll(ContentController.getContentController().getContentIdsForAllChildren(contentVO.getId())); } List<SmallestContentVersionVO> contentVersionVOList = getSmallestContentVersionVOListImpl(contentIds, languageVO.getId(), numberOfVersionsToKeep, keepOnlyOldPublishedVersions, minimumTimeBetweenVersionsDuringClean); //System.out.println("Deleting " + contentVersionVOList.size() + " versions for language " + languageVO.getName()); int maxIndex = (contentVersionVOList.size() > batchLimit ? batchLimit : contentVersionVOList.size()); List partList = contentVersionVOList.subList(0, maxIndex); while(partList.size() > 0) { if(deleteVersions) { cleanVersions(numberOfVersionsToKeep, partList); } cleanedVersions = cleanedVersions + partList.size(); //System.out.println("Cleaned " + cleanedVersions + " of " + contentVersionVOList.size()); partList.clear(); maxIndex = (contentVersionVOList.size() > batchLimit ? batchLimit : contentVersionVOList.size()); partList = contentVersionVOList.subList(0, maxIndex); } } return cleanedVersions; } /** * 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<SmallestContentVersionVO> contentVersionVOList) throws SystemException { Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { Iterator<SmallestContentVersionVO> contentVersionVOIdListIterator = contentVersionVOList.iterator(); while(contentVersionVOIdListIterator.hasNext()) { SmallestContentVersionVO contentVersionVO = contentVersionVOIdListIterator.next(); //ContentVersion contentVersion = getContentVersionWithId(contentVersionVO.getContentVersionId(), db); MediumContentVersionImpl contentVersion = getMediumContentVersionWithId(contentVersionVO.getContentVersionId(), db); logger.info("Deleting the contentVersion " + contentVersion.getId() + " on content " + contentVersion.getOwningContent()); delete(contentVersion, db, true); } commitRegistryAwareTransaction(db); Thread.sleep(1000); } 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()); } finally { closeDatabase(db); } } /** * 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<SmallestContentVersionVO> getSmallestContentVersionVOList(Integer contentId) throws SystemException { Database db = CastorDatabaseService.getDatabase(); List<SmallestContentVersionVO> contentVersionsIdList = new ArrayList(); beginTransaction(db); try { contentVersionsIdList = getSmallestContentVersionVOList(contentId, 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 contentVersionsIdList; } public List<SmallestContentVersionVO> getSmallestContentVersionVOList(Integer contentId, Database db) throws SystemException, Exception { List<SmallestContentVersionVO> contentVersionsIdList = new ArrayList(); OQLQuery oql = db.getOQLQuery("SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl cv WHERE cv.contentId = $1 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { SmallestContentVersionImpl version = (SmallestContentVersionImpl)results.next(); contentVersionsIdList.add(version.getValueObject()); } results.close(); oql.close(); return contentVersionsIdList; } public Map<Integer,Integer> getContentIdVersionCountMap(Integer languageId, int numberOfVersionsToKeep, Integer contentTypeDefinitionId) throws SystemException { Map<Integer,Integer> result = new HashMap<Integer,Integer>(); Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { StringBuilder sql = new StringBuilder(); if(contentTypeDefinitionId == null) { if(CmsPropertyHandler.getUseShortTableNames().equals("true")) sql.append("select contId as contentId, versionCount from ( select cv.contId, count(*) as versionCount from cmContVer cv where cv.languageId = " + languageId + " group by cv.contId order by versionCount desc ) res where versionCount > " + numberOfVersionsToKeep); else sql.append("select contentId, versionCount from ( select cv.contentId, count(*) as versionCount from cmContentVersion cv where cv.languageId = " + languageId + " group by cv.contentId order by versionCount desc ) res where versionCount > " + numberOfVersionsToKeep); } else { if(CmsPropertyHandler.getUseShortTableNames().equals("true")) sql.append("select contId as contentId, versionCount from ( select cv.contId, count(*) as versionCount from cmContVer cv, cmCont c where c.contId = cv.contId AND c.contentTypeDefId = " + contentTypeDefinitionId + " AND cv.languageId = " + languageId + " group by cv.contId order by versionCount desc ) res where versionCount > " + numberOfVersionsToKeep); else sql.append("select contentId, versionCount from ( select cv.contentId, count(*) as versionCount from cmContentVersion cv, cmContent c where c.contentId = cv.contentId AND c.contentTypeDefinitionId = " + contentTypeDefinitionId + " AND cv.languageId = " + languageId + " group by cv.contentId 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 contentId = new Integer(rs.getString("contentId")); Integer count = new Integer(rs.getString("versionCount")); totalVersions = totalVersions + (count-numberOfVersionsToKeep); result.put(contentId, 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; } /** * 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<SmallestContentVersionVO> getSmallestContentVersionVOList(Integer languageId, int numberOfVersionsToKeep, boolean keepOnlyOldPublishedVersions, long minimumTimeBetweenVersionsDuringClean, Integer contentTypeDefinitionId) throws SystemException, Bug, Exception { Map<Integer,Integer> contentIdMap = getContentIdVersionCountMap(languageId, numberOfVersionsToKeep, contentTypeDefinitionId); //System.out.println("contentVOList:" + contentIdMap.size()); List<SmallestContentVersionVO> contentVersionVOList = new ArrayList<SmallestContentVersionVO>(); if(contentIdMap == null || contentIdMap.size() == 0) return contentVersionVOList; List<Integer> contentIdList = new ArrayList<Integer>(); contentIdList.addAll(contentIdMap.keySet()); int slotSize = 100; while(contentIdList.size() > 0) { List<Integer> subList = new ArrayList<Integer>(); if(contentIdList.size() > slotSize) { subList = contentIdList.subList(0, slotSize); contentIdList = contentIdList.subList(slotSize, contentIdList.size()-1); } else { subList.addAll(contentIdList); contentIdList.clear(); } if(subList.size() > 0) { contentVersionVOList.addAll(getSmallestContentVersionVOListImpl(subList, languageId, numberOfVersionsToKeep, keepOnlyOldPublishedVersions, minimumTimeBetweenVersionsDuringClean)); } } //System.out.println("contentVOList:" + contentVersionVOList.size()); return contentVersionVOList; } /** * 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<SmallestContentVersionVO> getSmallestContentVersionVOListImpl(List<Integer> contentIdList, Integer languageId, int numberOfVersionsToKeep, boolean keepOnlyOldPublishedVersions, long minimumTimeBetweenVersionsDuringClean) throws SystemException { //System.out.println("numberOfVersionsToKeep:" + numberOfVersionsToKeep); Database db = CastorDatabaseService.getDatabase(); List<SmallestContentVersionVO> contentVersionsIdList = new ArrayList(); beginTransaction(db); try { StringBuilder variables = new StringBuilder(); for(int i=0; i<contentIdList.size(); i++) variables.append("$" + (i+2) + (i+1!=contentIdList.size() ? "," : "")); String SQL = "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl cv WHERE cv.languageId = $1 AND cv.contentId IN LIST (" + variables + ") ORDER BY cv.contentId, cv.contentVersionId desc"; //System.out.println("SQL:" + SQL); OQLQuery oql = db.getOQLQuery(SQL); oql.bind(languageId); for(Integer contentId : contentIdList) { oql.bind(contentId); //System.out.println("contentId:" + contentId); } QueryResults results = oql.execute(Database.READONLY); int numberOfLaterVersions = 0; Integer previousContentId = null; Date previousDate = null; long difference = -1; List<SmallestContentVersionVO> keptContentVersionVOList = new ArrayList<SmallestContentVersionVO>(); List<SmallestContentVersionVO> potentialContentVersionVOList = new ArrayList<SmallestContentVersionVO>(); List<SmallestContentVersionVO> versionInitialSuggestions = new ArrayList<SmallestContentVersionVO>(); List<SmallestContentVersionVO> versionNonPublishedSuggestions = new ArrayList<SmallestContentVersionVO>(); while (results.hasMore()) { SmallestContentVersionImpl version = (SmallestContentVersionImpl)results.next(); if(previousContentId != null && previousContentId.intValue() != version.getContentId().intValue()) { if(minimumTimeBetweenVersionsDuringClean != -1 && versionInitialSuggestions.size() >= numberOfVersionsToKeep) { Iterator potentialContentVersionVOListIterator = potentialContentVersionVOList.iterator(); while(potentialContentVersionVOListIterator.hasNext()) { SmallestContentVersionVO potentialContentVersionVO = (SmallestContentVersionVO)potentialContentVersionVOListIterator.next(); SmallestContentVersionVO firstInitialSuggestedContentVersionVO = null; Iterator versionInitialSuggestionsIterator = versionInitialSuggestions.iterator(); while(versionInitialSuggestionsIterator.hasNext()) { SmallestContentVersionVO initialSuggestedContentVersionVO = (SmallestContentVersionVO)versionInitialSuggestionsIterator.next(); if(initialSuggestedContentVersionVO.getStateId().equals(ContentVersionVO.PUBLISHED_STATE)) { firstInitialSuggestedContentVersionVO = initialSuggestedContentVersionVO; break; } } if(firstInitialSuggestedContentVersionVO != null) { keptContentVersionVOList.remove(potentialContentVersionVO); keptContentVersionVOList.add(firstInitialSuggestedContentVersionVO); versionInitialSuggestions.remove(firstInitialSuggestedContentVersionVO); versionInitialSuggestions.add(potentialContentVersionVO); } } } //System.out.println("versionNonPublishedSuggestions:" + versionNonPublishedSuggestions.size()); //System.out.println("versionInitialSuggestions:" + versionInitialSuggestions.size()); contentVersionsIdList.addAll(versionNonPublishedSuggestions); contentVersionsIdList.addAll(versionInitialSuggestions); potentialContentVersionVOList.clear(); versionInitialSuggestions.clear(); versionNonPublishedSuggestions.clear(); keptContentVersionVOList.clear(); numberOfLaterVersions = 0; previousDate = null; difference = -1; potentialContentVersionVOList = 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) { keptContentVersionVOList.add(version.getValueObject()); potentialContentVersionVOList.add(version.getValueObject()); numberOfLaterVersions++; } else { keptContentVersionVOList.add(version.getValueObject()); previousDate = version.getModifiedDateTime(); numberOfLaterVersions++; } previousContentId = version.getContentId(); } if(minimumTimeBetweenVersionsDuringClean != -1 && versionInitialSuggestions.size() >= numberOfVersionsToKeep) { //System.out.println("Inside again...."); //System.out.println("potentialContentVersionVOList:" + potentialContentVersionVOList.size()); Iterator potentialContentVersionVOListIterator = potentialContentVersionVOList.iterator(); while(potentialContentVersionVOListIterator.hasNext()) { SmallestContentVersionVO potentialContentVersionVO = (SmallestContentVersionVO)potentialContentVersionVOListIterator.next(); SmallestContentVersionVO firstInitialSuggestedContentVersionVO = null; Iterator versionInitialSuggestionsIterator = versionInitialSuggestions.iterator(); while(versionInitialSuggestionsIterator.hasNext()) { SmallestContentVersionVO initialSuggestedContentVersionVO = (SmallestContentVersionVO)versionInitialSuggestionsIterator.next(); if(initialSuggestedContentVersionVO.getStateId().equals(ContentVersionVO.PUBLISHED_STATE)) { firstInitialSuggestedContentVersionVO = initialSuggestedContentVersionVO; //System.out.println("Breaking..."); break; } } if(firstInitialSuggestedContentVersionVO != null) { keptContentVersionVOList.remove(potentialContentVersionVO); keptContentVersionVOList.add(firstInitialSuggestedContentVersionVO); versionInitialSuggestions.remove(firstInitialSuggestedContentVersionVO); versionInitialSuggestions.add(potentialContentVersionVO); } } } //System.out.println("versionNonPublishedSuggestions:" + versionNonPublishedSuggestions.size()); //System.out.println("versionInitialSuggestions:" + versionInitialSuggestions.size()); contentVersionsIdList.addAll(versionNonPublishedSuggestions); contentVersionsIdList.addAll(versionInitialSuggestions); results.close(); oql.close(); 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 contentVersionsIdList; } /** * This method are here to return all content versions that have somewhat heavy digitalAssets * and are x number of versions behind the current active version. This is for archiving purposes. * * @param numberOfVersionsToKeep * @param assetSizeLimit * @return * @throws SystemException */ public OptimizationBeanList getHeavyContentVersions(int numberOfVersionsToKeep, int assetSizeLimit, int assetNumberLimit) throws SystemException { Database db = CastorDatabaseService.getDatabase(); OptimizationBeanList optimizationBeanList = new OptimizationBeanList(); beginTransaction(db); try { //OQLQuery oql = db.getOQLQuery( "SELECT da FROM org.infoglue.cms.entities.content.impl.simple.DigitalAssetImpl da WHERE da.assetFileSize >= $1 ORDER BY da.digitalAssetId asc"); OQLQuery oql = db.getOQLQuery( "SELECT da FROM org.infoglue.cms.entities.content.impl.simple.MediumDigitalAssetImpl da WHERE da.assetFileSize >= $1 ORDER BY da.digitalAssetId asc"); oql.bind(assetSizeLimit); QueryResults results = oql.execute(Database.READONLY); int i = 0; while (results.hasMore() && i < assetNumberLimit) { boolean keep = true; MediumDigitalAssetImpl digitalAsset = (MediumDigitalAssetImpl)results.next(); if(digitalAsset.getAssetKey().equals("portletentityregistry.xml")) keep = false; Collection contentVersions = digitalAsset.getContentVersions(); Iterator contentVersionsIterator = contentVersions.iterator(); ContentVersion contentVersion = null; while(contentVersionsIterator.hasNext()) { contentVersion = (ContentVersion)contentVersionsIterator.next(); if(!isOldVersion(contentVersion, numberOfVersionsToKeep)) keep = false; } if(contentVersion != null && keep) { if(contentVersion.getOwningContent() != null) { String contentPath = ContentController.getContentController().getContentPath(contentVersion.getOwningContent().getId(), true, true); optimizationBeanList.addDigitalAsset(digitalAsset); optimizationBeanList.addEventVersions(toVOList(contentVersions)); optimizationBeanList.setContentPath(digitalAsset.getId(), contentPath); i++; } else { logger.error("ContentVersion with id:" + contentVersion.getId() + " had no ownningcontent"); } } } results.close(); oql.close(); 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 optimizationBeanList; } /** * This method are here to return all content versions that have somewhat heavy digitalAssets * and are x number of versions behind the current active version. This is for archiving purposes. * * @param numberOfVersionsToKeep * @param assetSizeLimit * @return * @throws SystemException */ public OptimizationBeanList getAssetsPossibleToArchive(int numberOfVersionsToKeep, int assetSizeLimit, int assetNumberLimit) throws SystemException { Database db = CastorDatabaseService.getDatabase(); OptimizationBeanList optimizationBeanList = new OptimizationBeanList(); beginTransaction(db); try { OQLQuery oql = db.getOQLQuery( "SELECT da FROM org.infoglue.cms.entities.content.impl.simple.SmallDigitalAssetImpl da WHERE da.assetFileSize >= $1 ORDER BY da.digitalAssetId asc LIMIT $2"); oql.bind(assetSizeLimit); oql.bind(assetNumberLimit); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { boolean keep = true; SmallDigitalAssetImpl digitalAsset = (SmallDigitalAssetImpl)results.next(); if(digitalAsset.getAssetKey().equals("portletentityregistry.xml")) keep = false; List<SmallestContentVersionVO> contentVersions = DigitalAssetController.getController().getContentVersionVOListConnectedToAssetWithId(digitalAsset.getId()); //Collection contentVersions = digitalAsset.getContentVersions(); Iterator<SmallestContentVersionVO> contentVersionsIterator = contentVersions.iterator(); SmallestContentVersionVO contentVersionVO = null; while(contentVersionsIterator.hasNext()) { contentVersionVO = contentVersionsIterator.next(); if(!isOldVersion(contentVersionVO, numberOfVersionsToKeep, db)) keep = false; } if(contentVersionVO != null && keep) { if(contentVersionVO.getContentId() != null) { String contentPath = ContentController.getContentController().getContentPath(contentVersionVO.getContentId(), true, true, db); optimizationBeanList.addDigitalAsset(digitalAsset); optimizationBeanList.addEventVersions(contentVersions); optimizationBeanList.setContentPath(digitalAsset.getId(), contentPath); } else { logger.error("ContentVersion with id:" + contentVersionVO.getId() + " had no ownningcontent"); } } } results.close(); oql.close(); 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 optimizationBeanList; } private boolean isOldVersion(ContentVersion contentVersion, int minNewerVersions) { Integer contentVersionId = contentVersion.getValueObject().getId(); Integer language = contentVersion.getValueObject().getLanguageId(); boolean isOldVersion = false; int numberOfNewerVersions = 0; Content content = contentVersion.getOwningContent(); Collection contentVersions = content.getContentVersions(); Iterator contentVersionsIterator = contentVersions.iterator(); while(contentVersionsIterator.hasNext()) { ContentVersion currentContentVersion = (ContentVersion)contentVersionsIterator.next(); if(currentContentVersion.getValueObject().getLanguageId().intValue() == language.intValue()) { if(currentContentVersion.getValueObject().getId().intValue() > contentVersionId.intValue()) { numberOfNewerVersions++; } } } return numberOfNewerVersions >= minNewerVersions; } private boolean isOldVersion(SmallestContentVersionVO contentVersionVO, int minNewerVersions, Database db) throws SystemException, Bug, Exception { Integer contentVersionId = contentVersionVO.getId(); Integer language = contentVersionVO.getLanguageId(); boolean isOldVersion = false; int numberOfNewerVersions = 0; Collection<ContentVersionVO> contentVersions = ContentVersionController.getContentVersionController().getContentVersionVOList(contentVersionVO.getContentId(), db); Iterator<ContentVersionVO> contentVersionsIterator = contentVersions.iterator(); while(contentVersionsIterator.hasNext()) { ContentVersionVO currentContentVersionVO = contentVersionsIterator.next(); if(currentContentVersionVO.getLanguageId().intValue() == language.intValue()) { if(currentContentVersionVO.getId().intValue() > contentVersionId.intValue()) { numberOfNewerVersions++; } } } return numberOfNewerVersions >= minNewerVersions; } /** * This method changes the language of a version. * * @param contentVersionId * @param languageId * @throws Exception */ public void changeVersionLanguage(Integer contentVersionId, Integer languageId) throws Exception { Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { ContentVersion contentVersion = this.getContentVersionWithId(contentVersionId, db); Language language = LanguageController.getController().getLanguageWithId(languageId, db); contentVersion.setLanguage((LanguageImpl)language); 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()); } } /** * * @param contentId a valid ContentId * @param languageId a valid languagId * @param db a db transaction * @return a List of contentVersion depending on parent and language id, if none found an empty List is returned. * @throws SystemException if an error occures. * @throws Bug if an error occures. * @throws Exception if an error occures. */ public List<ContentVersionVO> getContentVersionsWithParentAndLanguage(final Integer contentId, final Integer languageId, final Database db) throws SystemException, Bug, Exception { final List<ContentVersion> resultList = new ArrayList<ContentVersion>(); final OQLQuery oql = db.getOQLQuery("SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl cv WHERE cv.owningContent.contentId = $1 and cv.language.languageId = $2 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); final QueryResults results = oql.execute(); while (results.hasMore()) { final ContentVersion contentVersion = (ContentVersion) results.next(); resultList.add(contentVersion); } results.close(); oql.close(); return toVOList(resultList); } /** * Get a list of lates n contentVersions where the isActive equals true. * * @param contentId a valid contentId. * @param languageId a valid languageId. * @param hitSize the number of contentversions to be retrieved. * @param db a db transaction * @return returns a empty list if none found. The list is ordered by latest contentVersionId. * @throws Exception if an error occurres. */ @SuppressWarnings("unchecked") public List<ContentVersionVO> getLatestActiveContentVersionsForHitSize(final Integer contentId, final Integer languageId, final int hitSize, final Database db) throws Exception { if (hitSize == 0) { throw new SystemException("Illegal argument supplied, argument <hitSize> must be greater then zero."); } final List<ContentVersion> contentVersionList = new ArrayList<ContentVersion>(); final OQLQuery oql = db.getOQLQuery("SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl cv WHERE cv.owningContent.contentId = $1 AND cv.language.languageId = $2 AND cv.isActive = $3 ORDER BY cv.contentVersionId desc"); oql.bind(contentId); oql.bind(languageId); oql.bind(true); final QueryResults results = oql.execute(Database.READONLY); int cnt = 0; while (results.hasMore() && ++cnt <= hitSize) { contentVersionList.add((ContentVersion) results.next()); } results.close(); oql.close(); return toVOList(contentVersionList); } /** * Forces a delete of a specified contentVersion. * @param contentVersionVO a valid object. * @throws SystemException if an error occurres. */ public void forceDelete(final ContentVersionVO contentVersionVO) throws SystemException { final Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { final ContentVersion contentVersion = getContentVersionWithId(contentVersionVO.getContentVersionId(), db); contentCategoryController.deleteByContentVersion(contentVersion, db); final Content content = contentVersion.getOwningContent(); if (content != null) { content.getContentVersions().remove(contentVersion); } db.remove(contentVersion); 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()); } } /** * This method deletes the relation to a digital asset - not the asset itself. */ public ContentVersionVO checkStateAndChangeIfNeeded(Integer contentVersionId, InfoGluePrincipal principal) throws SystemException, Bug { ContentVersionVO resultingContentVersionVO = null; Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { ContentVersion contentVersion = checkStateAndChangeIfNeeded(contentVersionId, principal, db); resultingContentVersionVO = contentVersion.getValueObject(); 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 resultingContentVersionVO; } /** * This method deletes the relation to a digital asset - not the asset itself. */ public MediumContentVersionImpl checkStateAndChangeIfNeeded(Integer contentVersionId, InfoGluePrincipal principal, Database db) throws ConstraintException, SystemException, Bug { MediumContentVersionImpl contentVersion = null; ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(contentVersionId, db); if(!contentVersionVO.getStateId().equals(ContentVersionVO.WORKING_STATE)) { List events = new ArrayList(); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentVersionVO.getContentId(), db); contentVersion = ContentStateController.changeState(contentVersionVO.getId(), contentVO, ContentVersionVO.WORKING_STATE, "new working version", false, null, principal, contentVersionVO.getContentId(), db, events); } else { contentVersion = ContentVersionController.getContentVersionController().getMediumContentVersionWithId(contentVersionVO.getId(), db); } return contentVersion; } /** * This method deletes the relation to a digital asset - not the asset itself. */ public DigitalAssetVO checkStateAndChangeIfNeeded(Integer contentVersionId, Integer digitalAssetId, InfoGluePrincipal principal, List<Integer> newContentVersionIdList) throws SystemException, Bug { DigitalAssetVO resultingDigitalAssetVO = null; Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { MediumContentVersionImpl contentVersion = null; ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(contentVersionId, db); DigitalAssetVO digitalAssetVO = DigitalAssetController.getController().getDigitalAssetVOWithId(digitalAssetId, db); if(!contentVersionVO.getStateId().equals(ContentVersionVO.WORKING_STATE)) { List events = new ArrayList(); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentVersionVO.getContentId(), db); contentVersion = ContentStateController.changeState(contentVersionVO.getId(), contentVO, ContentVersionVO.WORKING_STATE, "new working version", false, null, principal, contentVersionVO.getContentId(), db, events); newContentVersionIdList.add(contentVersion.getId()); for(MediumDigitalAssetImpl asset : (List<MediumDigitalAssetImpl>)contentVersion.getDigitalAssets()) { if(asset.getAssetKey().equals(digitalAssetVO.getAssetKey())) { digitalAssetVO = asset.getValueObject(); break; } } //digitalAssetVO = DigitalAssetController.getController().getLatestDigitalAssetVO(contentVersion.getId(), digitalAssetVO.getAssetKey(), db); } boolean duplicateAssetsBetweenVersions = CmsPropertyHandler.getDuplicateAssetsBetweenVersions(); logger.info("duplicateAssetsBetweenVersions:" + duplicateAssetsBetweenVersions); if(!duplicateAssetsBetweenVersions) { DigitalAsset oldDigitalAsset = DigitalAssetController.getController().getMediumDigitalAssetWithId(digitalAssetId, db); logger.info("oldDigitalAsset:" + oldDigitalAsset.getContentVersions().size()); if(oldDigitalAsset.getContentVersions().size() > 1) { logger.info("Creating new duplicate of this asset as there are other assets using this one:" + oldDigitalAsset.getId()); logger.info("contentVersion:" + contentVersion); logger.info("oldDigitalAsset:" + oldDigitalAsset.getId()); if(contentVersion == null) contentVersion = ContentVersionController.getContentVersionController().getMediumContentVersionWithId(contentVersionId, db); boolean exists = false; logger.info("contentVersion:" + contentVersion.getId()); for(MediumDigitalAssetImpl asset : (Collection<MediumDigitalAssetImpl>)contentVersion.getDigitalAssets()) { logger.info("asset:" + asset.getId() + "-" + asset.getAssetKey()); if(asset.getAssetKey().equals(oldDigitalAsset.getAssetKey())) { exists = true; digitalAssetVO = asset.getValueObject(); } } if(!exists) { digitalAssetVO = copyDigitalAssetAndRemoveOldReference(contentVersion, oldDigitalAsset, false, db); logger.info("new digitalAssetVO:" + digitalAssetVO.getId()); } } } resultingDigitalAssetVO = digitalAssetVO; 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()); } logger.info("resultingDigitalAssetVO:" + resultingDigitalAssetVO.getId()); return resultingDigitalAssetVO; } /** * This method deletes the relation to a digital asset - not the asset itself. */ public DigitalAssetVO checkStateAndChangeIfNeeded(Integer contentVersionId, Integer digitalAssetId, InfoGluePrincipal principal, Database db) throws ConstraintException, SystemException, Bug, Exception { ContentVersion contentVersion = null; ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(contentVersionId, db); DigitalAssetVO digitalAssetVO = DigitalAssetController.getController().getDigitalAssetVOWithId(digitalAssetId, db); if(!contentVersionVO.getStateId().equals(ContentVersionVO.WORKING_STATE)) { List events = new ArrayList(); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentVersionVO.getContentId(), db); contentVersion = ContentStateController.changeState(contentVersionVO.getId(), contentVO, ContentVersionVO.WORKING_STATE, "new working version", false, null, principal, contentVersionVO.getContentId(), db, events); digitalAssetVO = DigitalAssetController.getController().getLatestDigitalAssetVO(contentVersion.getId(), digitalAssetVO.getAssetKey(), db); } return digitalAssetVO; } /** * This method gets a contentVersion with a state and a language which is active. */ public void preCacheContentVersionVOList(Collection contentList, Integer languageId, Integer operatingMode, DeliveryContext deliveryContext, Database db) throws Exception { List<Content> localContentList = new ArrayList<Content>(); localContentList.addAll(contentList); while(localContentList != null && localContentList.size() > 0) { List<Content> localContentSubList = new ArrayList<Content>(); if(localContentList.size() > 50) { localContentSubList.addAll(localContentList.subList(0, 50)); localContentList = localContentList.subList(50, localContentList.size()-1); } else { localContentSubList.addAll(localContentList); localContentList.clear(); } StringBuffer contentIds = new StringBuffer(); for(Object localContent : localContentSubList) { if(contentIds.length() > 0) contentIds.append(","); if(localContent instanceof Integer) contentIds.append(localContent); else if(localContent instanceof ContentVO) contentIds.append(((ContentVO)localContent).getId()); else if(localContent instanceof Content) contentIds.append(((Content)localContent).getId()); } //System.out.println("contentIds:" + contentIds); //logger.info("Querying for verson: " + versionKey); OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.contentId IN LIST (" + contentIds + ") AND cv.languageId = $1 AND cv.stateId >= $2 AND cv.isActive = $3 ORDER BY cv.contentVersionId desc"); oql.bind(languageId); oql.bind(operatingMode); oql.bind(true); QueryResults results = oql.execute(Database.READONLY); while(results.hasMore()) { ContentVersion contentVersion = (ContentVersion)results.next(); ContentVersionVO contentVersionVO = contentVersion.getValueObject(); String versionKey = "" + contentVersionVO.getContentId() + "_" + languageId + "_" + operatingMode + "_contentVersionVO"; CacheController.cacheObjectInAdvancedCache("contentVersionCache", versionKey, contentVersionVO, new String[]{CacheController.getPooledString(2, contentVersionVO.getId()), CacheController.getPooledString(1, contentVersionVO.getContentId())}, true); } results.close(); oql.close(); break; } } public List<ContentVersionVO> getContentVersionVOList(Integer contentTypeDefinitionId, Integer excludeContentTypeDefinitionId, Integer languageId, boolean showDeletedItems, Integer stateId, Integer lastContentVersionId, Integer limit, boolean ascendingOrder, boolean includeSiteNode) throws Exception { List<ContentVersionVO> contentVersionVOList = new ArrayList<ContentVersionVO>(); Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { ContentVersionVO lastContentVersionVO = getLatestContentVersionVO(languageId, db); logger.info("lastContentVersionVO 2:" + lastContentVersionVO.getId()); contentVersionVOList = getContentVersionVOList(contentTypeDefinitionId, excludeContentTypeDefinitionId, languageId, showDeletedItems, stateId, lastContentVersionId, limit, 10000, ascendingOrder, db, includeSiteNode, lastContentVersionVO.getId()); 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 contentVersionVOList; } /** * This method precaches a number of meta info content versions to get the site up to speed faster. */ public List<ContentVersionVO> getContentVersionVOList(Integer languageId, Integer stateId, Integer limit, Database db) throws Exception { List<ContentVersionVO> contentVersionVOList = new ArrayList<ContentVersionVO>(); StringBuffer SQL = new StringBuffer(); if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true")) { SQL.append("CALL SQL select cv.contVerId, cv.stateId, cv.modifiedDateTime, cv.verComment, cv.isCheckedOut, cv.isActive, cv.contId, cv.languageId, cv.versionModifier, cv.verValue, (select count(*) from cmContVerDigitalAsset cvda where cvda.contVerId = cv.contVerId) AS assetCount "); SQL.append(", -1 as siteNodeId, '' as siteNodeName "); SQL.append(" from cmContVer cv, cmCont c "); SQL.append("WHERE "); SQL.append("c.contTypeDefId >= $1 AND "); SQL.append("cv.languageId >= $2 AND "); SQL.append("cv.stateId >= $3 AND "); SQL.append("cv.isActive = $4 AND "); SQL.append("cv.contId = c.contId AND "); SQL.append("cv.contVerId = ( "); SQL.append(" select max(contVerId) from cmContVer cv2 "); SQL.append(" WHERE "); SQL.append(" cv2.contId = cv.contId AND "); SQL.append(" cv2.languageId = cv.languageId AND "); SQL.append(" cv2.isActive = cv.isActive AND "); SQL.append(" cv2.stateId >= $5 "); SQL.append(" ) "); SQL.append(" order by cv.contVerId limit $6 AS org.infoglue.cms.entities.content.impl.simple.IndexFriendlyContentVersionImpl"); } else { SQL.append("CALL SQL select cv.contentVersionId, cv.stateId, cv.modifiedDateTime, cv.versionComment, cv.isCheckedOut, cv.isActive, cv.contentId, cv.languageId, cv.versionModifier, cv.versionValue, (select count(*) from cmContentVersionDigitalAsset cvda where cvda.contentVersionId = cv.contentVersionId) AS assetCount "); SQL.append(", -1 as siteNodeId, '' as siteNodeName "); SQL.append(" from cmContent c, cmContentVersion cv "); SQL.append("WHERE "); SQL.append("c.contentTypeDefinitionId >= $1 AND "); SQL.append("cv.languageId >= $2 AND "); SQL.append("cv.stateId >= $3 AND "); SQL.append("cv.isActive = $4 AND "); SQL.append("cv.contentId = c.contentId AND "); SQL.append("cv.contentVersionId = ( "); SQL.append(" select max(contentVersionId) from cmContentVersion cv2 "); SQL.append(" WHERE "); SQL.append(" cv2.contentId = cv.contentId AND "); SQL.append(" cv2.languageId = cv.languageId AND "); SQL.append(" cv2.isActive = cv.isActive AND "); SQL.append(" cv2.stateId >= $5 "); SQL.append(" ) "); SQL.append(" order by cv.contentVersionId limit $6 AS org.infoglue.cms.entities.content.impl.simple.IndexFriendlyContentVersionImpl"); } //logger.info("SQL:" + SQL); //logger.info("parentSiteNodeId:" + parentSiteNodeId); //logger.info("showDeletedItems:" + showDeletedItems); OQLQuery oql = db.getOQLQuery(SQL.toString()); oql.bind(2); oql.bind(3); oql.bind(stateId); oql.bind(true); oql.bind(stateId); oql.bind(limit); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { IndexFriendlyContentVersionImpl contentVersion = (IndexFriendlyContentVersionImpl)results.next(); contentVersionVOList.add(contentVersion.getValueObject()); } results.close(); oql.close(); return contentVersionVOList; } /** * This method returns a list of the children a siteNode has. */ public SmallestContentVersionVO getFirstContentVersionId(Integer languageId, Database db) throws Exception { Timer t = new Timer(); SmallestContentVersionVO contentVersionVO = null; StringBuffer SQL = new StringBuffer(); OQLQuery oql = db.getOQLQuery("CALL SQL select cv.contentVersionId, cv.stateId, cv.modifiedDateTime, cv.versionComment, cv.isCheckedOut, cv.isActive, cv.contentId, cv.languageId, cv.versionModifier FROM cmContentVersion cv where cv.languageId = $1 AS org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl"); if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true")) oql = db.getOQLQuery("CALL SQL select * from (select cv.contVerId, cv.stateId, cv.modifiedDateTime, cv.verComment, cv.isCheckedOut, cv.isActive, cv.contId, cv.languageId, cv.versionModifier FROM cmContVer cv where cv.languageId = $1 order by cv.contVerId) where rownum < 10 AS org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl"); //OQLQuery oql = db.getOQLQuery( "SELECT cv FROM org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl cv WHERE cv.languageId = $1 ORDER BY cv.contentVersionId limit $2"); oql.bind(languageId); //oql.bind(10); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { SmallestContentVersionImpl contentVersion = (SmallestContentVersionImpl)results.next(); contentVersionVO = contentVersion.getValueObject(); } return contentVersionVO; } /** * This method returns a list of the children a siteNode has. */ public List<ContentVersionVO> getContentVersionVOList(Integer contentTypeDefinitionId, Integer excludeContentTypeDefinitionId, Integer languageId, boolean showDeletedItems, Integer stateId, Integer lastContentVersionId, Integer limit, Integer cvIdSpan, boolean ascendingOrder, Database db, boolean includeSiteNode, Integer maxContentVersionIdForLanguageVersion) throws Exception { logger.info("maxContentVersionIdForLanguageVersion for " + languageId + "=" + maxContentVersionIdForLanguageVersion); List<ContentVersionVO> contentVersionVOList = new ArrayList<ContentVersionVO>(); Timer t = new Timer(); StringBuffer SQL = new StringBuffer(); if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true")) { SQL.append("CALL SQL select * from (select cv.contVerId, cv.stateId, cv.modifiedDateTime, cv.verComment, cv.isCheckedOut, cv.isActive, cv.contId, cv.languageId, cv.versionModifier, cv.verValue, (select count(*) from cmContVerDigAsset cvda where cvda.contVerId = cv.contVerId) AS assetCount "); if(includeSiteNode) SQL.append(", (select sn.siNoId from cmSiNo sn where sn.metaInfoContentId = c.contId) AS siNoId, (select sn.name from cmSiNo sn where sn.metaInfoContentId = c.contId) AS siteNodeName "); else SQL.append(", -1 as siNoId, '' as siteNodeName "); SQL.append(" from cmCont c, cmContVer cv "); SQL.append("WHERE "); SQL.append("c.isDeleted = $1 AND "); SQL.append("cv.stateId >= $2 AND "); SQL.append("cv.isActive = $3 AND "); SQL.append("cv.contId = c.contId AND "); SQL.append("cv.contVerId = ( "); SQL.append(" select max(contVerId) from cmContVer cv2 "); SQL.append(" WHERE "); SQL.append(" cv2.contId = cv.contId AND "); SQL.append(" cv2.languageId = cv.languageId AND "); SQL.append(" cv2.isActive = cv.isActive AND "); SQL.append(" cv2.stateId >= $4 "); SQL.append(" ) "); int index = 5; if(contentTypeDefinitionId != null) { SQL.append(" AND c.contentTypeDefId = $" + index + ""); index++; } if(excludeContentTypeDefinitionId != null) { SQL.append(" AND c.contentTypeDefId <> $" + index + ""); index++; } if(languageId != null) { SQL.append(" AND cv.languageId = $" + index + ""); index++; } if(lastContentVersionId != null && lastContentVersionId > 0) { SQL.append(" AND cv.contVerId > $" + index + " and cv.contVerId < $" + (index+1) + ""); index++; index++; } else { SQL.append(" AND cv.contVerId > $" + index + " and cv.contVerId < $" + (index+1) + ""); index++; index++; } //SQL.append(" AND rownum<=$" + index + " "); SQL.append(" order by cv.contVerId " + (ascendingOrder ? "" : "DESC") + ") where rownum<=$" + index + " AS org.infoglue.cms.entities.content.impl.simple.IndexFriendlyContentVersionImpl"); } else { SQL.append("CALL SQL select cv.contentVersionId, cv.stateId, cv.modifiedDateTime, cv.versionComment, cv.isCheckedOut, cv.isActive, cv.contentId, cv.languageId, cv.versionModifier, cv.versionValue, (select count(*) from cmContentVersionDigitalAsset cvda where cvda.contentVersionId = cv.contentVersionId) AS assetCount "); if(includeSiteNode) SQL.append(", (select sn.siteNodeId from cmSiteNode sn where sn.metaInfoContentId = c.contentId) AS siteNodeId, (select sn.name from cmSiteNode sn where sn.metaInfoContentId = c.contentId) AS siteNodeName "); else SQL.append(", -1 as siteNodeId, '' as siteNodeName "); SQL.append(" from cmContent c, cmContentVersion cv "); SQL.append("WHERE "); SQL.append("c.isDeleted = $1 AND "); SQL.append("cv.stateId >= $2 AND "); SQL.append("cv.isActive = $3 AND "); SQL.append("cv.contentId = c.contentId AND "); SQL.append("cv.contentVersionId = ( "); SQL.append(" select max(contentVersionId) from cmContentVersion cv2 "); SQL.append(" WHERE "); SQL.append(" cv2.contentId = cv.contentId AND "); SQL.append(" cv2.languageId = cv.languageId AND "); SQL.append(" cv2.isActive = cv.isActive AND "); SQL.append(" cv2.stateId >= $4 "); SQL.append(" ) "); int index = 5; if(contentTypeDefinitionId != null) { SQL.append(" AND c.contentTypeDefinitionId = $" + index + ""); index++; } if(excludeContentTypeDefinitionId != null) { SQL.append(" AND c.contentTypeDefinitionId <> $" + index + ""); index++; } if(languageId != null) { SQL.append(" AND cv.languageId = $" + index + ""); index++; } if(lastContentVersionId != null && lastContentVersionId > 0) { SQL.append(" AND cv.contentVersionId > $" + index + " and cv.contentVersionId < $" + (index+1) + ""); index++; index++; } else { SQL.append(" AND cv.contentVersionId > $" + index + " and cv.contentVersionId < $" + (index+1) + ""); index++; index++; } SQL.append(" order by cv.contentVersionId " + (ascendingOrder ? "" : "DESC") + " limit $" + index + " AS org.infoglue.cms.entities.content.impl.simple.IndexFriendlyContentVersionImpl"); } //logger.error("SQL:" + SQL); //logger.info("SQL:" + SQL); //logger.info("parentSiteNodeId:" + parentSiteNodeId); //logger.info("showDeletedItems:" + showDeletedItems); OQLQuery oql = db.getOQLQuery(SQL.toString()); oql.bind(showDeletedItems); oql.bind(stateId); oql.bind(true); oql.bind(stateId); if(contentTypeDefinitionId != null) oql.bind(contentTypeDefinitionId); if(excludeContentTypeDefinitionId != null) oql.bind(excludeContentTypeDefinitionId); if(languageId != null) oql.bind(languageId); if(lastContentVersionId != null && lastContentVersionId > 0) { oql.bind(lastContentVersionId); oql.bind(lastContentVersionId + (ascendingOrder? cvIdSpan : -cvIdSpan)); } else { oql.bind(0); oql.bind((ascendingOrder? cvIdSpan : -cvIdSpan)); } //if(CmsPropertyHandler.getUseShortTableNames() == null || !CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true")) oql.bind(limit); QueryResults results = oql.execute(Database.READONLY); logger.info("Getting all IndexFriendlyContentVersionImpl took:" + t.getElapsedTime()); while (results.hasMore()) { IndexFriendlyContentVersionImpl contentVersion = (IndexFriendlyContentVersionImpl)results.next(); contentVersionVOList.add(contentVersion.getValueObject()); //System.out.print("."); //String versionKey = "" + contentVersion.getValueObject().getContentId() + "_" + contentVersion.getLanguageId() + "_" + stateId + "_contentVersionVO"; //CacheController.cacheObjectInAdvancedCache("contentVersionCache", versionKey, contentVersion.getValueObject(), new String[]{CacheController.getPooledString(2, contentVersion.getValueObject().getId()), CacheController.getPooledString(1, contentVersion.getValueObject().getContentId())}, true); //CacheController.cacheObjectInAdvancedCache("contentVersionCache", "" + contentVersion.getId(), contentVersion.getValueObject(), new String[]{CacheController.getPooledString(2, contentVersion.getValueObject().getId()), CacheController.getPooledString(1, contentVersion.getValueObject().getContentId())}, true); } logger.info("Fetching all IndexFriendlyContentVersionImpl took:" + t.getElapsedTime() + " and returned " + contentVersionVOList.size()); results.close(); oql.close(); if(maxContentVersionIdForLanguageVersion < 1000) maxContentVersionIdForLanguageVersion = 10000; if(contentVersionVOList.size() == 0 && lastContentVersionId < maxContentVersionIdForLanguageVersion*2 && lastContentVersionId < Integer.MAX_VALUE/4) { return getContentVersionVOList(contentTypeDefinitionId, excludeContentTypeDefinitionId, languageId, showDeletedItems, stateId, lastContentVersionId+cvIdSpan, cvIdSpan*2, limit, ascendingOrder, db, includeSiteNode, maxContentVersionIdForLanguageVersion); } return contentVersionVOList; } /*sss*/ public SmallestContentVersionVO getLatestContentVersionVO(Set<String> contentVersionIds, Database db) throws SystemException, Bug, Exception { Timer t = new Timer(); if(contentVersionIds == null || contentVersionIds.size() == 0) return null; SmallestContentVersionVO result = null; StringBuilder variables = new StringBuilder(); int i = 0; for(String contentVersionId : contentVersionIds) { if(contentVersionId.indexOf("contentVersion_") > -1) { if(variables.length() > 0) variables.append(","); variables.append("$" + (i+1)); i++; } } //System.out.println("variables:" + variables); //System.out.println("variables:" + variables); String SQL = "select cv.contentVersionId, cv.stateId, cv.modifiedDateTime, cv.versionComment, cv.isCheckedOut, cv.isActive, cv.contentId, cv.languageId, cv.versionModifier FROM cmContentVersion cv where cv.contentVersionId IN (" + variables + ") AND cv.stateId >= " + CmsPropertyHandler.getOperatingMode() + " ORDER BY cv.modifiedDateTime DESC"; if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true")) SQL = "select cv.contVerId, cv.stateId, cv.modifiedDateTime, cv.verComment, cv.isCheckedOut, cv.isActive, cv.contId, cv.languageId, cv.versionModifier FROM cmContVer cv where cv.contVerId IN (" + variables + ") AND cv.stateId >= " + CmsPropertyHandler.getOperatingMode() + " ORDER BY cv.modifiedDateTime DESC"; //System.out.println("SQL:" + SQL); OQLQuery oql = db.getOQLQuery("CALL SQL " + SQL + " AS org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl"); if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true")) oql = db.getOQLQuery("CALL SQL " + SQL + " AS org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl"); for(String contentVersionId : contentVersionIds) { if(contentVersionId.indexOf("contentVersion_") > -1) { logger.info("contentVersionId:" +contentVersionId); oql.bind(contentVersionId.replaceAll("contentVersion_", "").replaceAll("_.*", "")); } } QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { SmallestContentVersionImpl contentVersion = (SmallestContentVersionImpl)results.next(); result = contentVersion.getValueObject(); } results.close(); oql.close(); t.printElapsedTime("getLatestContentVersion from ids took", 20); return result; } public SmallestContentVersionVO getLatestContentVersionVOByContentIds(Set<String> contentIds, Database db) throws SystemException, Bug, Exception { SmallestContentVersionVO latestContentVersion = null; List<String> contentIdsSubList = new ArrayList<String>(); contentIdsSubList.addAll(contentIds); int slotSize = 700; if(contentIdsSubList.size() > 0) { List<String> subList = new ArrayList<String>(contentIdsSubList); if(contentIdsSubList.size() > slotSize) subList = contentIdsSubList.subList(0, slotSize); while(subList != null && subList.size() > 0) { SmallestContentVersionVO latestContentVersionCandidate = getLatestContentVersionVOByContentIdsImpl(subList, db); if(latestContentVersion == null || latestContentVersion.getModifiedDateTime().getTime() < latestContentVersionCandidate.getModifiedDateTime().getTime()) { latestContentVersion = latestContentVersionCandidate; } contentIdsSubList = contentIdsSubList.subList(subList.size(), contentIdsSubList.size()); subList = new ArrayList(contentIdsSubList); if(contentIdsSubList.size() > slotSize) subList = contentIdsSubList.subList(0, slotSize); } } return latestContentVersion; } public SmallestContentVersionVO getLatestContentVersionVOByContentIdsImpl(List<String> contentIds, Database db) throws SystemException, Bug, Exception { Timer t = new Timer(); if(contentIds == null || contentIds.size() == 0) return null; SmallestContentVersionVO result = null; StringBuilder variables = new StringBuilder(); int i = 0; for(String contentId : contentIds) { if(contentId.indexOf("content") > -1) { if(variables.length() > 0) variables.append(","); variables.append("$" + (i+1)); i++; } } String SQL = "select cv.contentVersionId, cv.stateId, cv.modifiedDateTime, cv.versionComment, cv.isCheckedOut, cv.isActive, cv.contentId, cv.languageId, cv.versionModifier FROM cmContentVersion cv where cv.contentId IN (" + variables + ") AND cv.stateId >= " + CmsPropertyHandler.getOperatingMode() + " ORDER BY cv.modifiedDateTime DESC"; if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true")) SQL = "select cv.contVerId, cv.stateId, cv.modifiedDateTime, cv.verComment, cv.isCheckedOut, cv.isActive, cv.contId, cv.languageId, cv.versionModifier FROM cmContVer cv where cv.contId IN (" + variables + ") AND cv.stateId >= " + CmsPropertyHandler.getOperatingMode() + " ORDER BY cv.modifiedDateTime DESC"; //System.out.println("SQL:" + SQL); OQLQuery oql = db.getOQLQuery("CALL SQL " + SQL + " AS org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl"); if(CmsPropertyHandler.getUseShortTableNames() != null && CmsPropertyHandler.getUseShortTableNames().equalsIgnoreCase("true")) oql = db.getOQLQuery("CALL SQL " + SQL + " AS org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl"); for(String contentId : contentIds) { logger.info("contentId:" +contentId); if(contentId.indexOf("content_") > -1) { oql.bind(contentId.replaceAll("content_", "").replaceAll("_.*", "")); } } QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { SmallestContentVersionImpl contentVersion = (SmallestContentVersionImpl)results.next(); result = contentVersion.getValueObject(); } results.close(); oql.close(); t.printElapsedTime("getLatestContentVersion from content ids took", 100); return result; } }