/* =============================================================================== * * 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.awt.Color; import java.net.URLDecoder; import java.net.URLEncoder; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; 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.atomic.AtomicBoolean; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; import org.exolab.castor.jdo.CacheManager; import org.exolab.castor.jdo.Database; import org.exolab.castor.jdo.OQLQuery; import org.exolab.castor.jdo.QueryResults; import org.infoglue.cms.applications.databeans.ReferenceBean; import org.infoglue.cms.applications.databeans.ReferenceVersionBean; 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.DigitalAssetVO; import org.infoglue.cms.entities.content.impl.simple.ContentImpl; import org.infoglue.cms.entities.content.impl.simple.MediumContentImpl; import org.infoglue.cms.entities.content.impl.simple.SmallContentImpl; import org.infoglue.cms.entities.content.impl.simple.SmallishContentImpl; import org.infoglue.cms.entities.kernel.BaseEntityVO; import org.infoglue.cms.entities.management.CategoryVO; import org.infoglue.cms.entities.management.ContentTypeDefinition; import org.infoglue.cms.entities.management.ContentTypeDefinitionVO; import org.infoglue.cms.entities.management.LanguageVO; import org.infoglue.cms.entities.management.Registry; import org.infoglue.cms.entities.management.RegistryVO; import org.infoglue.cms.entities.management.impl.simple.RegistryImpl; import org.infoglue.cms.entities.structure.Qualifyer; 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.QualifyerImpl; import org.infoglue.cms.entities.structure.impl.simple.SmallQualifyerImpl; import org.infoglue.cms.entities.structure.impl.simple.SmallServiceBindingImpl; 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.sorters.ReflectionComparator; import org.infoglue.deliver.util.CacheController; import org.infoglue.deliver.util.Timer; /** * The RegistryController manages the registry-parts of InfoGlue. * The Registry is metadata for how things are related - especially to handle bindings and inline links etc * when looking them up in the model is to slow. * * @author Mattias Bogeblad */ public class RegistryController extends BaseController { private final static Logger logger = Logger.getLogger(RegistryController.class.getName()); private static final RegistryController instance = new RegistryController(); public static RegistryController getController() { return instance; } private RegistryController() { } public List getRegistryVOList() throws SystemException, Bug { return getAllVOObjects(RegistryImpl.class, "registryId"); } public List getRegistryVOList(Database db) throws SystemException, Bug { return getAllVOObjects(RegistryImpl.class, "registryId", db); } /** * This method return a RegistryVO */ public RegistryVO getRegistryVOWithId(Integer registryId) throws SystemException, Exception { RegistryVO registryVO = (RegistryVO)getVOWithId(RegistryImpl.class, registryId); return registryVO; } public RegistryVO getRegistryVOWithId(Integer registryId, Database db) throws SystemException, Exception { RegistryVO registryVO = (RegistryVO)getVOWithId(RegistryImpl.class, registryId, db); return registryVO; } public Registry getRegistryWithId(Integer registryId, Database db) throws SystemException, Exception { Registry registry = (RegistryImpl)getObjectWithId(RegistryImpl.class, registryId, db); return registry; } /** * This method creates a registry entity in the db. * @param valueObject * @return * @throws ConstraintException * @throws SystemException */ public RegistryVO create(RegistryVO valueObject, Database db) throws ConstraintException, SystemException, Exception { Registry registry = new RegistryImpl(); registry.setValueObject(valueObject); db.create(registry); return registry.getValueObject(); } /** * This method updates a registry entry * @param vo * @return * @throws ConstraintException * @throws SystemException */ public RegistryVO update(RegistryVO valueObject, Database db) throws ConstraintException, SystemException { return (RegistryVO) updateEntity(RegistryImpl.class, (BaseEntityVO) valueObject, db); } /** * This method deletes a registry entry * @return registryId * @throws ConstraintException * @throws SystemException */ public void delete(Integer registryId) throws ConstraintException, SystemException { deleteEntity(RegistryImpl.class, registryId); } public void delete(Integer registryId, Database db) throws ConstraintException, SystemException { deleteEntity(RegistryImpl.class, registryId, db); } public List<ReferenceBean> delete(String[] registryIds, InfoGluePrincipal principal, boolean clean, boolean onlyLatest) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); List<ReferenceBean> references = null; try { beginTransaction(db); delete(registryIds, principal, clean, onlyLatest, db); commitTransaction(db); // commitRegistryAwareTransaction(db); } catch (Throwable e) { logger.error("Failed to delete registries in list: " + Arrays.toString(registryIds) + ". Message: " + e.getMessage()); rollbackTransaction(db); } return references; } public List<ReferenceBean> delete(String[] registryIds, InfoGluePrincipal principal, boolean clean, boolean onlyLatest, Database db) throws Throwable { if (clean) { Map<ContentVersionVO, RegistryVO> contentVersionRegistryPair = extractContentVersionsFromRegistryList(registryIds, onlyLatest, db); InconsistenciesController.getController().removeContentReferences(contentVersionRegistryPair, principal, db); Map<SiteNodeVO, RegistryVO> siteNodeRegistryPair = extractSiteNodesFromRegistryList(registryIds, db); InconsistenciesController.getController().removeSiteNodeReferences(siteNodeRegistryPair, principal, db); } Map<String,Boolean> checkedLanguageVersions = new HashMap<String,Boolean>(); Map<String, ReferenceBean> entries = new HashMap<String, ReferenceBean>(); List<ReferenceBean> references = new ArrayList<ReferenceBean>(); for (String registryIdString : registryIds) { RegistryVO registryVO = getRegistryVOWithId(new Integer(registryIdString), db); if (logger.isInfoEnabled()) { logger.info("About to remove registry bean. Referencing-type: " + registryVO.getReferencingEntityName() + ", referencing-id: " + registryVO.getReferencingEntityId()); } ReferenceBean referenceBean = getReferenceBeanFromRegistryVO(registryVO, entries, checkedLanguageVersions, onlyLatest, true, db); if (referenceBean != null) { references.add(referenceBean); } delete(registryVO.getRegistryId(), db); } return references; } private Map<ContentVersionVO, RegistryVO> extractContentVersionsFromRegistryList(List<RegistryVO> registryVOs, boolean onlyLatest, Database db) throws Exception { Map<ContentVersionVO, RegistryVO> versionRegistryPair = new HashMap<ContentVersionVO, RegistryVO>(); for (RegistryVO registryVO : registryVOs) { extractContentVersionFromRegistry(versionRegistryPair, registryVO, onlyLatest, db); } if (logger.isInfoEnabled()) { logger.info("Extracted " + versionRegistryPair.size() + " ContentVersions from " + registryVOs.size() + " registry entries"); } return versionRegistryPair; } private Map<ContentVersionVO, RegistryVO> extractContentVersionsFromRegistryList(String[] registryIds, boolean onlyLatest, Database db) throws Throwable { Map<ContentVersionVO, RegistryVO> versionRegistryPair = new HashMap<ContentVersionVO, RegistryVO>(); Integer registryId; RegistryVO registryVO; for (String registryIdString : registryIds) { registryId = new Integer(registryIdString); registryVO = RegistryController.getController().getRegistryVOWithId(registryId, db); extractContentVersionFromRegistry(versionRegistryPair, registryVO, onlyLatest, db); } if (logger.isInfoEnabled()) { logger.info("Extracted " + versionRegistryPair.size() + " ContentVersions from " + registryIds.length + " registry entries"); } return versionRegistryPair; } private void extractContentVersionFromRegistry(Map<ContentVersionVO, RegistryVO> versionRegistryPair, RegistryVO registryVO, boolean onlyLatest, Database db) throws SystemException, Bug, Exception { String referencingEntityName = registryVO.getReferencingEntityName(); String referencingEntityCompletingName = registryVO.getReferencingEntityCompletingName(); if (referencingEntityCompletingName.equals(Content.class.getName()) && referencingEntityName.equals(ContentVersion.class.getName())) { Integer referencingEntityId = new Integer(registryVO.getReferencingEntityId()); try { ContentVersionVO currentCVVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(referencingEntityId, db); if (!onlyLatest) { versionRegistryPair.put(currentCVVO, registryVO); } else { ContentVersionVO latestContentVersion = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(currentCVVO.getContentId(), currentCVVO.getLanguageId(), db); if (currentCVVO.equals(latestContentVersion)) { versionRegistryPair.put(currentCVVO, registryVO); } } } catch (SystemException ex) { logger.warn("Error when getting ContentVersion. Will not be added to the list. ID: " + referencingEntityId + ". Message: " + ex.getMessage()); } } } private Map<SiteNodeVO, RegistryVO> extractSiteNodesFromRegistryList(List<RegistryVO> registryVOs, Database db) throws Exception { Map<SiteNodeVO, RegistryVO> siteNodeRegistryPair = new HashMap<SiteNodeVO, RegistryVO>(); for (RegistryVO registryVO : registryVOs) { extractSiteNodeFromRegistry(siteNodeRegistryPair, registryVO, db); } if (logger.isInfoEnabled()) { logger.info("Extracted " + siteNodeRegistryPair.size() + " ContentVersions from " + registryVOs.size() + " registry entries"); } return siteNodeRegistryPair; } private Map<SiteNodeVO, RegistryVO> extractSiteNodesFromRegistryList(String[] registryIds, Database db) throws Exception { Map<SiteNodeVO, RegistryVO> siteNodeRegistryPair = new HashMap<SiteNodeVO, RegistryVO>(); Integer registryId; RegistryVO registryVO; for (String registryIdString : registryIds) { registryId = new Integer(registryIdString); registryVO = RegistryController.getController().getRegistryVOWithId(registryId, db); extractSiteNodeFromRegistry(siteNodeRegistryPair, registryVO, db); } if (logger.isInfoEnabled()) { logger.info("Extracted " + siteNodeRegistryPair.size() + " ContentVersions from " + registryIds.length + " registry entries"); } return siteNodeRegistryPair; } private void extractSiteNodeFromRegistry(Map<SiteNodeVO, RegistryVO> siteNodeRegistryPair, RegistryVO registryVO, Database db) throws SystemException, Bug, Exception { String referencingEntityCompletingName = registryVO.getReferencingEntityCompletingName(); if (referencingEntityCompletingName.equals(SiteNode.class.getName())) { try { SiteNodeVO siteNodeVO = SiteNodeController.getSiteNodeVOWithId(new Integer(registryVO.getReferencingEntityCompletingId()), db); siteNodeRegistryPair.put(siteNodeVO, registryVO); } catch (SystemException ex) { logger.warn("Error when getting SiteNode. Will not add to registry list. ID: " + registryVO.getReferencingEntityCompletingId() + ". Message: " + ex.getMessage()); } } } public List<ReferenceBean> deleteAllForSiteNode(Integer siteNodeId, InfoGluePrincipal principal) throws SystemException { return deleteAllForSiteNode(siteNodeId, principal, false, false); } public List<ReferenceBean> deleteAllForSiteNode(Integer siteNodeId, InfoGluePrincipal principal, boolean clean, boolean onlyLatest) throws SystemException { Database db = CastorDatabaseService.getDatabase(); List<ReferenceBean> references = null; try { beginTransaction(db); deleteAllForSiteNode(siteNodeId, principal, clean, onlyLatest, db); commitTransaction(db); } catch (Throwable ex) { logger.error("Failed to a SiteNode's references. Message: " + ex.getMessage() + ". Type: " + ex.getClass()); logger.warn("Failed to a SiteNode's references.", ex); rollbackTransaction(db); } return references; } public List<ReferenceBean> deleteAllForSiteNode(Integer siteNodeId, InfoGluePrincipal principal, boolean clean, boolean onlyLatest, Database db) throws Exception { return deleteAllForSiteNode(siteNodeId, principal, clean, onlyLatest, false, db); } public List<ReferenceBean> deleteAllForSiteNode(Integer siteNodeId, InfoGluePrincipal principal, boolean clean, boolean onlyLatest, boolean onlyLatestForEachLanguage, Database db) throws Exception { @SuppressWarnings("unchecked") List<RegistryVO> registryEntires = getMatchingRegistryVOList(SiteNode.class.getName(), siteNodeId.toString(), -1, db); if (clean) { Map<ContentVersionVO, RegistryVO> contentVersionRegistryPair = extractContentVersionsFromRegistryList(registryEntires, onlyLatest, db); if(logger.isInfoEnabled()) logger.info("onlyLatestForEachLanguage:" + onlyLatestForEachLanguage + " and " + contentVersionRegistryPair.size()); if(onlyLatestForEachLanguage) { Iterator<Map.Entry<ContentVersionVO, RegistryVO>> iterator = contentVersionRegistryPair.entrySet().iterator(); while(iterator.hasNext()) { Map.Entry<ContentVersionVO, RegistryVO> entry = iterator.next(); try { Integer contentId = entry.getKey().getContentId(); Integer languageId = entry.getKey().getLanguageId(); ContentVersionVO latestContentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentId, languageId, db); if(entry.getKey().getId() == latestContentVersionVO.getId()) { logger.info("Yes - was latest version - this we care about.."); } else { logger.info("No - was older version - this we skip.."); iterator.remove(); } } catch(Exception e) { logger.error("Error figuring out if to include the version: " + e.getMessage(), e); } } } InconsistenciesController.getController().removeContentReferences(contentVersionRegistryPair, principal, db); Map<SiteNodeVO, RegistryVO> siteNodeRegistryPair = extractSiteNodesFromRegistryList(registryEntires, db); InconsistenciesController.getController().removeSiteNodeReferences(siteNodeRegistryPair, principal, db); } Map<String,Boolean> checkedLanguageVersions = new HashMap<String,Boolean>(); Map<String, ReferenceBean> entries = new HashMap<String, ReferenceBean>(); List<ReferenceBean> references = new ArrayList<ReferenceBean>(); for (RegistryVO registryVO : registryEntires) { if (logger.isInfoEnabled()) { logger.info("About to remove registry bean. Referencing-type: " + registryVO.getReferencingEntityName() + ", referencing-id: " + registryVO.getReferencingEntityId()); } ReferenceBean referenceBean = getReferenceBeanFromRegistryVO(registryVO, entries, checkedLanguageVersions, onlyLatest, false, db); if (referenceBean != null) { references.add(referenceBean); } delete(registryVO.getRegistryId(), db); } return references; } /** * this method goes through all inline stuff and all relations if ordinary content * and all components and bindings if a metainfo. * * @param contentVersionVO * @throws SystemException * @throws Exception */ public void updateContentVersion(ContentVersionVO contentVersionVO) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); ContentVersion contentVersion = ContentVersionController.getContentVersionController().getContentVersionWithId(contentVersionVO.getContentVersionId(), db); updateContentVersion(contentVersion.getValueObject(), db); commitTransaction(db); } catch (Exception e) { rollbackTransaction(db); throw new SystemException("An error occurred when we tried to fetch which sitenode uses a metainfo. Reason:" + e.getMessage(), e); } } /** * this method goes through all inline stuff and all relations if ordinary content * and all components and bindings if a metainfo. * * @param contentVersionVO * @throws SystemException * @throws Exception */ public void updateContentVersion(ContentVersionVO contentVersion, Database db) throws ConstraintException, SystemException, Exception { String versionValue = contentVersion.getVersionValue(); ContentVersionVO oldContentVersion = contentVersion; //ContentVersionController.getContentVersionController().getContentVersionWithId(contentVersionVO.getContentVersionId(), db); // OPTIMIZ // Content oldContent = oldContentVersion.getOwningContent(); ContentVO oldContentVO = ContentController.getContentController().getSmallContentVOWithId(contentVersion.getContentId(), db); ContentTypeDefinition ctd = null; if(oldContentVO.getContentTypeDefinitionId() != null) ctd = ContentTypeDefinitionController.getController().getContentTypeDefinitionWithId(oldContentVO.getContentTypeDefinitionId(), db); if(ctd != null && ctd.getName().equalsIgnoreCase("Meta info")) { logger.info("It was a meta info so lets check it for other stuff as well"); SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithMetaInfoContentId(db, oldContentVO.getContentId()); // SiteNodeVersion siteNodeVersion = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersion(db, siteNodeVO.getId()); if(siteNodeVO != null) { LanguageVO masterLanguageVO = LanguageController.getController().getMasterLanguage(siteNodeVO.getRepositoryId(), db); if(contentVersion.getLanguageId().equals(masterLanguageVO.getId())) { logger.info("It was master language - we will clear registry and reindex: " + contentVersion.getId()); SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(db, siteNodeVO.getId()); //SiteNodeVersion siteNodeVersion = getLatestActiveSiteNodeVersionWhichUsesContentVersionAsMetaInfo(oldContentVersion, db); if(siteNodeVersionVO != null) { logger.info("Going to use " + siteNodeVersionVO.getId() + " as reference"); clearRegistryVOList(SiteNodeVersion.class.getName(), siteNodeVersionVO.getId().toString(), db); getComponents(siteNodeVersionVO, versionValue, db); getComponentBindings(siteNodeVersionVO, versionValue, db); getPageBindings(siteNodeVersionVO, db); } } else logger.info("It was NOT master language - we will NOT clear registry and reindex: " + contentVersion.getId()); } getInlineSiteNodes(oldContentVersion, versionValue, db); getInlineContents(oldContentVersion, versionValue, db); getRelationSiteNodes(oldContentVersion, versionValue, db); getRelationContents(oldContentVersion, versionValue, db); } else { clearRegistryVOList(ContentVersion.class.getName(), oldContentVersion.getContentVersionId().toString(), db); getInlineSiteNodes(oldContentVersion, versionValue, db); getInlineContents(oldContentVersion, versionValue, db); getRelationSiteNodes(oldContentVersion, versionValue, db); getRelationContents(oldContentVersion, versionValue, db); } } private static synchronized void clearCache(Class c, Database db) throws Exception { if(c.getName().contains(".SiteNodeVersionImpl") || c.getName().contains(".MediumSiteNodeVersionImpl") || c.getName().contains(".SiteNodeImpl") || c.getName().contains(".LanguageImpl") || c.getName().contains(".RepositoryImpl") || c.getName().contains(".RepositoryLanguageImpl") || c.getName().contains(".DigitalAssetImpl") || c.getName().contains(".MediumDigitalAssetImpl") || c.getName().contains(".ContentImpl") || c.getName().contains(".MediumContentImpl") || c.getName().contains(".SmallContentImpl") || c.getName().contains(".SmallishContentImpl") || c.getName().contains(".ContentVersionImpl") || c.getName().contains(".MediumContentVersionImpl") || c.getName().contains(".SmallContentVersionImpl") || c.getName().contains(".SmallestContentVersionImpl") || c.getName().contains(".AccessRightImpl") || c.getName().contains(".SmallAccessRightImpl") || c.getName().contains(".AccessRightRoleImpl") || c.getName().contains(".AccessRightGroupImpl") || c.getName().contains(".AccessRightUserImpl") || c.getName().contains(".RegistryImpl")) { logger.info("Skipping " + c.getName() + " as they have no castor cache"); return; } try { Class[] types = {c}; Class[] ids = {null}; CacheManager manager = db.getCacheManager(); manager.expireCache(types); //db.expireCache(types, null); } catch(Exception e) { e.printStackTrace(); } } private static ThreadLocal<List<Object[]>> queuedUpdatedContentVersions = new ThreadLocal<List<Object[]>>() { protected List<Object[]> initialValue() { return new ArrayList<Object[]>(); } }; public static void notifyTransactionCommitted() { class UpdateContentVersionRunnable implements Runnable { List<Object[]> list; UpdateContentVersionRunnable(List<Object[]> list) { this.list = list; } public void run() { try { Database db = CastorDatabaseService.getDatabase(); try { Timer t = new Timer(); beginTransaction(db); logger.info("Start refreshing registry in thread" + Thread.currentThread().getId()); for(Object[] bean : list) { RegistryController.getController().updateContentVersion((ContentVersionVO)bean[0], (SiteNodeVersionVO)bean[1], db); } clearCache(ContentImpl.class, db); clearCache(SmallContentImpl.class, db); clearCache(SmallishContentImpl.class, db); clearCache(MediumContentImpl.class, db); commitTransaction(db); logger.info("Done refreshing registry took:" + t.getElapsedTime()); } catch (Exception e) { logger.error("Error precaching all access rights for this user: " + e.getMessage(), e); rollbackTransaction(db); } } catch (Exception e) { logger.error("Could not start PreCacheTask:" + e.getMessage(), e); } } } class DeleteForReferencingEntityNameRunnable implements Runnable { List<String[]> list; DeleteForReferencingEntityNameRunnable(List<String[]> list) { this.list = list; } public void run() { try { Database db = CastorDatabaseService.getDatabase(); try { Timer t = new Timer(); beginTransaction(db); logger.info("Start refreshing registry in thread" + Thread.currentThread().getId()); //System.out.println("Clearing " + list.size()); for(String[] bean : list) { //System.out.println("bean " + bean[0] + "=" + bean[1]); RegistryController.getController().clearRegistryForReferencingEntityName(bean[0], bean[1], db); } list.clear(); commitTransaction(db); logger.info("Done refreshing registry took:" + t.getElapsedTime()); } catch (Exception e) { logger.error("Error precaching all access rights for this user: " + e.getMessage(), e); rollbackTransaction(db); } } catch (Exception e) { logger.error("Could not start PreCacheTask:" + e.getMessage(), e); } } } //System.out.println("Check for beans:" + clearRegistryForReferencingEntityNameQueue.get()); if (queuedUpdatedContentVersions.get().size() > 0) { List<Object[]> localQueue = new ArrayList<Object[]>(); localQueue.addAll(queuedUpdatedContentVersions.get()); Thread thread = new Thread(new UpdateContentVersionRunnable(localQueue)); thread.start(); queuedUpdatedContentVersions.get().clear(); logger.debug("Started registry update thread. Number of entities: " + localQueue.size()); } else { logger.debug("No queued beans in registry queue. Skipping run."); } if (clearRegistryForReferencingEntityNameQueue.get().size() > 0) { //Thread.dumpStack(); List<String[]> localQueue = new ArrayList<String[]>(); localQueue.addAll(clearRegistryForReferencingEntityNameQueue.get()); Thread thread = new Thread(new DeleteForReferencingEntityNameRunnable(localQueue)); thread.start(); clearRegistryForReferencingEntityNameQueue.get().clear(); logger.debug("Started registry update thread. Number of entities: " + localQueue.size()); } else { logger.debug("No queued beans in registry queue. Skipping run."); } } /** * this method goes through all inline stuff and all relations if ordinary content * and all components and bindings if a metainfo. All in a threaded matter. * * @param contentVersionVO * @param contentVersionVO * @throws Exception */ public void updateContentVersionThreaded(ContentVersionVO contentVersionVO, SiteNodeVersionVO siteNodeVersionVO) throws Exception { if (logger.isInfoEnabled()) { logger.info("Adds entity to registry controller update queue. ContentVersion.id: " + (contentVersionVO == null ? "null" : contentVersionVO.getContentVersionId()) + ", SiteNodeVersion.id " + (siteNodeVersionVO == null ? "null" : siteNodeVersionVO.getSiteNodeVersionId())); } queuedUpdatedContentVersions.get().add(new Object[]{contentVersionVO, siteNodeVersionVO}); } /** * this method goes through all inline stuff and all relations if ordinary content * and all components and bindings if a metainfo. * * @param contentVersionVO * @throws SystemException * @throws Exception */ public void updateContentVersion(ContentVersionVO contentVersion, SiteNodeVersionVO siteNodeVersion, Database db) throws ConstraintException, SystemException, Exception { String versionValue = contentVersion.getVersionValue(); ContentVersionVO oldContentVersion = contentVersion; //ContentVersionController.getContentVersionController().getContentVersionWithId(contentVersionVO.getContentVersionId(), db); //Content oldContent = oldContentVersion.getOwningContent(); ContentVO oldContentVO = ContentController.getContentController().getSmallContentVOWithId(contentVersion.getContentId(), db); ContentTypeDefinitionVO ctd = null; if(oldContentVO.getContentTypeDefinitionId() != null) ctd = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(oldContentVO.getContentTypeDefinitionId(), db); if(ctd != null && ctd.getName().equalsIgnoreCase("Meta info")) { logger.info("It was a meta info so lets check it for other stuff as well"); if(siteNodeVersion != null) { logger.info("Going to use " + siteNodeVersion.getId() + " as reference"); clearRegistryVOList(SiteNodeVersion.class.getName(), siteNodeVersion.getId().toString(), db); getComponents(siteNodeVersion, versionValue, db); getComponentBindings(siteNodeVersion, versionValue, db); getPageBindings(siteNodeVersion, db); } getInlineSiteNodes(oldContentVersion, versionValue, db); getInlineContents(oldContentVersion, versionValue, db); getRelationSiteNodes(oldContentVersion, versionValue, db); getRelationContents(oldContentVersion, versionValue, db); } else { clearRegistryVOList(ContentVersion.class.getName(), oldContentVersion.getContentVersionId().toString(), db); if(siteNodeVersion != null) getPageBindings(siteNodeVersion, db); getInlineSiteNodes(oldContentVersion, versionValue, db); getInlineContents(oldContentVersion, versionValue, db); getRelationSiteNodes(oldContentVersion, versionValue, db); getRelationContents(oldContentVersion, versionValue, db); } } /** * this method goes through all page bindings and makes registry entries for them * * @param siteNodeVersion * @throws SystemException * @throws Exception */ public void updateSiteNodeVersion(SiteNodeVersionVO siteNodeVersionVO) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); logger.info("Starting RegistryController.updateSiteNodeVersion..."); SiteNodeVersion siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionWithId(siteNodeVersionVO.getId(), db); logger.info("Before RegistryController.updateSiteNodeVersion..."); updateSiteNodeVersion(siteNodeVersion.getValueObject(), db); logger.info("Before commit RegistryController.updateSiteNodeVersion..."); commitTransaction(db); } catch (Exception e) { rollbackTransaction(db); throw new SystemException("An error occurred when we tried to fetch which sitenode uses a metainfo. Reason:" + e.getMessage(), e); } } /** * this method goes through all inline stuff and all relations if ordinary content * and all components and bindings if a metainfo. All in a threaded matter. * * @param contentVersionVO * @param contentVersionVO * @throws Exception */ private static List<SiteNodeVersionVO> queuedSiteNodeVersions = new ArrayList<SiteNodeVersionVO>(); private static AtomicBoolean runningUpdateSiteNodeVersion = new AtomicBoolean(); public void updateSiteNodeVersionThreaded(SiteNodeVersionVO siteNodeVersionVO) throws Exception { class UpdateSiteNodeVersionRunnable implements Runnable { SiteNodeVersionVO siteNodeVersionVO; UpdateSiteNodeVersionRunnable(SiteNodeVersionVO siteNodeVersionVO) { this.siteNodeVersionVO = siteNodeVersionVO; } public void run() { Timer t = new Timer(); try {Thread.sleep(30000);} catch (Exception e) {} List<SiteNodeVersionVO> localContentVersions = new ArrayList<SiteNodeVersionVO>(); synchronized (queuedSiteNodeVersions) { localContentVersions.addAll(queuedSiteNodeVersions); queuedSiteNodeVersions.clear(); } logger.warn("localContentVersions:" + localContentVersions.size()); try { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); for(SiteNodeVersionVO siteNodeVersionVO : queuedSiteNodeVersions) { updateSiteNodeVersion(siteNodeVersionVO, db); } logger.warn("Done refreshing page registry took:" + t.getElapsedTime()); commitTransaction(db); } catch (Exception e) { logger.error("Error precaching all access rights for this user: " + e.getMessage(), e); rollbackTransaction(db); } } catch (Exception e) { logger.error("Could not start PreCacheTask:" + e.getMessage(), e); } finally { runningUpdateSiteNodeVersion.set(false); } } } synchronized (queuedSiteNodeVersions) { queuedSiteNodeVersions.add(siteNodeVersionVO); } if(runningUpdateSiteNodeVersion.compareAndSet(false, true)) { Thread thread = new Thread(new UpdateSiteNodeVersionRunnable(siteNodeVersionVO)); thread.start(); } else { logger.info("Running allready - queing"); } } /** * this method goes through all page bindings and makes registry entries for them * * @param siteNodeVersionVO * @throws SystemException * @throws Exception */ public void updateSiteNodeVersion(SiteNodeVersionVO siteNodeVersionVO, Database db) throws ConstraintException, SystemException, Exception { //SiteNodeVersion oldSiteNodeVersion = siteNodeVersion; Integer siteNodeId = siteNodeVersionVO.getSiteNodeId(); //SiteNode oldSiteNode = oldSiteNodeVersion.getOwningSiteNode(); logger.info("Before clearing old registry..."); clearRegistryVOList(SiteNodeVersion.class.getName(), siteNodeVersionVO.getId().toString(), db); logger.info("After clearing old registry..."); //Collection serviceBindings = siteNodeVersion.getServiceBindings(); List<SmallServiceBindingImpl> serviceBindings = ServiceBindingController.getController().getSmallServiceBindingsListForSiteNodeVersion(siteNodeVersionVO.getId(), db); Iterator<SmallServiceBindingImpl> serviceBindingIterator = serviceBindings.iterator(); while(serviceBindingIterator.hasNext()) { SmallServiceBindingImpl serviceBinding = serviceBindingIterator.next(); if(serviceBinding.getBindingQualifyers() != null) { @SuppressWarnings("unchecked") Iterator<SmallQualifyerImpl> qualifyersIterator = serviceBinding.getBindingQualifyers().iterator(); while(qualifyersIterator.hasNext()) { SmallQualifyerImpl qualifyer = (SmallQualifyerImpl)qualifyersIterator.next(); String name = qualifyer.getName(); String value = qualifyer.getValue(); try { RegistryVO registryVO = new RegistryVO(); registryVO.setReferenceType(RegistryVO.PAGE_BINDING); if(name.equalsIgnoreCase("contentId")) { // TODO REMOVE OPTMIZ! // Content content = ContentController.getContentController().getContentWithId(new Integer(value), db); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(value), db); registryVO.setEntityId(value); registryVO.setEntityName(Content.class.getName()); registryVO.setReferencingEntityId(siteNodeVersionVO.getId().toString()); registryVO.setReferencingEntityName(SiteNodeVersion.class.getName()); registryVO.setReferencingEntityCompletingId("" + siteNodeId); registryVO.setReferencingEntityCompletingName(SiteNode.class.getName()); SiteNodeVO snVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeId); LanguageVO masterLanguage = LanguageController.getController().getMasterLanguage(snVO.getRepositoryId(), db); ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVO.getContentId(), masterLanguage.getId(), db); getComponents(siteNodeVersionVO, contentVersionVO.getVersionValue(), db); getComponentBindings(siteNodeVersionVO, contentVersionVO.getVersionValue(), db); /* Collection contentVersions = content.getContentVersions(); Iterator contentVersionIterator = contentVersions.iterator(); while(contentVersionIterator.hasNext()) { ContentVersion contentVersion = (ContentVersion)contentVersionIterator.next(); getComponents(siteNodeVersion, contentVersion.getVersionValue(), db); getComponentBindings(siteNodeVersion, contentVersion.getVersionValue(), db); } */ } else if(name.equalsIgnoreCase("siteNodeId")) { registryVO.setEntityId(value); registryVO.setEntityName(SiteNode.class.getName()); registryVO.setReferencingEntityId(siteNodeVersionVO.getId().toString()); registryVO.setReferencingEntityName(SiteNodeVersion.class.getName()); registryVO.setReferencingEntityCompletingId("" + siteNodeId); registryVO.setReferencingEntityCompletingName(SiteNode.class.getName()); } logger.info("Before creating registry entry..."); this.create(registryVO, db); } catch(Exception e) { logger.error("Error when updating registries for SiteNodeVersion. Message: " + e.getMessage() + ". Type: " + e.getClass()); logger.warn("Error when updating registries for SiteNodeVersion.", e); } } } } } /** * this method goes through all page bindings and makes registry entries for them * * @param siteNodeVersion * @throws SystemException * @throws Exception */ public void getPageBindings(SiteNodeVersionVO siteNodeVersion, Database db) throws ConstraintException, SystemException, Exception { // SiteNode oldSiteNode = siteNodeVersion.getOwningSiteNode(); // Collection serviceBindings = siteNodeVersion.getServiceBindings(); List<SmallServiceBindingImpl> serviceBindings = ServiceBindingController.getController().getSmallServiceBindingsListForSiteNodeVersion(siteNodeVersion.getSiteNodeVersionId(), db); Iterator<SmallServiceBindingImpl> serviceBindingIterator = serviceBindings.iterator(); while(serviceBindingIterator.hasNext()) { SmallServiceBindingImpl serviceBinding = serviceBindingIterator.next(); if(serviceBinding.getBindingQualifyers() != null) { @SuppressWarnings("rawtypes") Iterator qualifyersIterator = serviceBinding.getBindingQualifyers().iterator(); while(qualifyersIterator.hasNext()) { String name = null; String value = null; Object o = qualifyersIterator.next(); if(o instanceof QualifyerImpl) { Qualifyer qualifyer = (Qualifyer)o; name = qualifyer.getName(); value = qualifyer.getValue(); } else if(o instanceof SmallQualifyerImpl) { SmallQualifyerImpl qualifyer = (SmallQualifyerImpl)o; name = qualifyer.getName(); value = qualifyer.getValue(); } if(name != null && value != null) { try { RegistryVO registryVO = new RegistryVO(); registryVO.setReferenceType(RegistryVO.PAGE_BINDING); if(name.equalsIgnoreCase("contentId")) { // Content content = ContentController.getContentController().getContentWithId(new Integer(value), db); registryVO.setEntityId(value); registryVO.setEntityName(Content.class.getName()); registryVO.setReferencingEntityId(siteNodeVersion.getId().toString()); registryVO.setReferencingEntityName(SiteNodeVersion.class.getName()); // registryVO.setReferencingEntityCompletingId(oldSiteNode.getId().toString()); registryVO.setReferencingEntityCompletingId(siteNodeVersion.getSiteNodeId().toString()); registryVO.setReferencingEntityCompletingName(SiteNode.class.getName()); /* Collection contentVersions = content.getContentVersions(); Iterator contentVersionIterator = contentVersions.iterator(); while(contentVersionIterator.hasNext()) { ContentVersion contentVersion = (ContentVersion)contentVersionIterator.next(); getComponents(siteNodeVersion, contentVersion.getVersionValue(), db); getComponentBindings(siteNodeVersion, contentVersion.getVersionValue(), db); } */ } else if(name.equalsIgnoreCase("siteNodeId")) { // SiteNode siteNode = SiteNodeController.getController().getSiteNodeWithId(new Integer(value), db); registryVO.setEntityId(value); registryVO.setEntityName(SiteNode.class.getName()); registryVO.setReferencingEntityId(siteNodeVersion.getId().toString()); registryVO.setReferencingEntityName(SiteNodeVersion.class.getName()); registryVO.setReferencingEntityCompletingId(siteNodeVersion.getSiteNodeId().toString()); registryVO.setReferencingEntityCompletingName(SiteNode.class.getName()); } logger.info("Before creating registry entry..."); this.create(registryVO, db); } catch(Exception e) { e.printStackTrace(); } } } } } } /** * This method fetches all inline links from any text. */ public void getInlineSiteNodes(ContentVersionVO contentVersion, String versionValue, Database db) throws ConstraintException, SystemException, Exception { Pattern pattern = Pattern.compile("\\$templateLogic\\.getPageUrl\\(.*?\\)"); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); logger.info("Adding match to registry after some processing: " + match); Integer siteNodeId; int siteNodeStartIndex = match.indexOf("("); int siteNodeEndIndex = match.indexOf(","); if(siteNodeStartIndex > 0 && siteNodeEndIndex > 0 && siteNodeEndIndex > siteNodeStartIndex) { String siteNodeIdString = match.substring(siteNodeStartIndex + 1, siteNodeEndIndex); try { if(siteNodeIdString.indexOf("templateLogic.siteNodeId") == -1) { siteNodeId = new Integer(siteNodeIdString); logger.info("siteNodeId:" + siteNodeId); RegistryVO registryVO = new RegistryVO(); registryVO.setEntityId(siteNodeId.toString()); registryVO.setEntityName(SiteNode.class.getName()); registryVO.setReferenceType(RegistryVO.INLINE_LINK); registryVO.setReferencingEntityId(contentVersion.getContentVersionId().toString()); registryVO.setReferencingEntityName(ContentVersion.class.getName()); registryVO.setReferencingEntityCompletingId(contentVersion.getContentId().toString()); registryVO.setReferencingEntityCompletingName(Content.class.getName()); this.create(registryVO, db); } } catch(Exception e) { logger.warn("Tried to register inline sitenodes with exception as result:" + e.getMessage(), e); } } } } /** * This method fetches all inline links from any text. */ public void getInlineSiteNodes(String versionValue, Set<Integer> boundSiteNodeIds, Set<Integer> boundContentIds) throws ConstraintException, SystemException, Exception { Pattern pattern = Pattern.compile("\\$templateLogic\\.getPageUrl\\(.*?\\)"); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); logger.info("Adding match to registry after some processing: " + match); Integer siteNodeId; int siteNodeStartIndex = match.indexOf("("); int siteNodeEndIndex = match.indexOf(","); if(siteNodeStartIndex > 0 && siteNodeEndIndex > 0 && siteNodeEndIndex > siteNodeStartIndex) { String siteNodeIdString = match.substring(siteNodeStartIndex + 1, siteNodeEndIndex); try { if(siteNodeIdString.indexOf("templateLogic.siteNodeId") == -1) { siteNodeId = new Integer(siteNodeIdString); logger.info("siteNodeId:" + siteNodeId); boundSiteNodeIds.add(siteNodeId); } } catch(Exception e) { logger.warn("Tried to register inline sitenodes with exception as result:" + e.getMessage(), e); } } } } /** * This method fetches all inline links from any text. */ public void getInlineContents(ContentVersionVO contentVersion, String versionValue, Database db) throws ConstraintException, SystemException, Exception { Pattern pattern = Pattern.compile("\\$templateLogic\\.getInlineAssetUrl\\(.*?\\)"); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); logger.info("Adding match to registry after some processing: " + match); Integer contentId; int contentStartIndex = match.indexOf("("); int contentEndIndex = match.indexOf(","); if(contentStartIndex > 0 && contentEndIndex > 0 && contentEndIndex > contentStartIndex) { String contentIdString = match.substring(contentStartIndex + 1, contentEndIndex); if(contentIdString != null && !contentIdString.equals("")) { contentId = new Integer(contentIdString); logger.info("contentId:" + contentId); RegistryVO registryVO = new RegistryVO(); registryVO.setEntityId(contentId.toString()); registryVO.setEntityName(Content.class.getName()); registryVO.setReferenceType(RegistryVO.INLINE_ASSET); registryVO.setReferencingEntityId(contentVersion.getContentVersionId().toString()); registryVO.setReferencingEntityName(ContentVersion.class.getName()); registryVO.setReferencingEntityCompletingId(contentVersion.getContentId().toString()); registryVO.setReferencingEntityCompletingName(Content.class.getName()); this.create(registryVO, db); } } } } /** * This method fetches all inline links from any text. */ public boolean hasInlineAsset(String versionValue, Integer contentId, String assetKey, Database db) throws ConstraintException, SystemException, Exception { String encodedAssetKey = URLEncoder.encode(assetKey, "utf-8"); Pattern pattern = Pattern.compile("\\$templateLogic\\.getInlineAssetUrl\\(" + contentId + ".*?\\)"); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); if(logger.isInfoEnabled()) { logger.info("match:" + match); logger.info("assetKey:" + assetKey); logger.info("encodedAssetKey:" + encodedAssetKey); } //if(match.contains("\"" + assetKey + "\"") || match.contains("\"" + encodedAssetKey + "\"")) if(match.contains("\"" + assetKey + "\"") || match.contains("\"" + encodedAssetKey + "\"")) return true; } return false; } /** * This method fetches all inline links from any text. */ public String getInlineAssetInformation(String versionValue, Integer contentId, Integer languageId, String assetKey, boolean returnMatchOnNoAssetKey, Database db) throws ConstraintException, SystemException, Exception { logger.info("getInlineAssetInformation: " + contentId + "/" + assetKey); StringBuffer sb = new StringBuffer(); Pattern pattern = Pattern.compile("\\$templateLogic\\.getInlineAssetUrl\\(" + contentId + ".*?\\)"); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); String encodedAssetKey = null; if(assetKey != null) encodedAssetKey = URLEncoder.encode(assetKey, "utf-8"); if(assetKey == null || match.contains("\"" + assetKey + "\"") || match.contains("\"" + encodedAssetKey + "\"")) { match = match.substring(match.indexOf("\"")+1, match.length()-2); match = URLDecoder.decode(match, "utf-8"); DigitalAssetVO daVO = null; if(returnMatchOnNoAssetKey || !match.equals("")) daVO = DigitalAssetController.getController().getDigitalAssetVO(contentId, languageId, match, true, db); if(daVO != null && (assetKey == null || assetKey.equals(daVO.getAssetKey()))) { String assetUrl = DigitalAssetController.getController().getDigitalAssetThumbnailUrl(daVO.getId(), 70, 70, Color.WHITE, "center", "middle", 60, 60, 30, db); if(assetUrl != null && !assetUrl.equals("")) sb.append("<a href='#' onmouseover=\"$('#casset_" + daVO.getId() + "').show();\" onmouseout=\"$('#casset_" + daVO.getId() + "').hide();\">" + match + "</a><div id='casset_" + daVO.getId() + "' style='display: none; position: absolute;'><img src='" + assetUrl + "'/></div>" + ", "); } } } Pattern pattern2 = Pattern.compile("<binding ([^<]*)</binding>"); //Pattern pattern2 = Pattern.compile("<binding *?entity=\"Content\" entityId=\"81\"><binding>"); Matcher matcher2 = pattern2.matcher(versionValue); while ( matcher2.find() ) { String match = matcher2.group(); //System.out.println("assetKey:" + assetKey + ", match:" + match); if(match.contains("entityId=\"" + contentId + "\"") && match.contains("assetKey=")) { int indexAssetKey = match.indexOf("assetKey="); int indexAssetKeyEnd = match.indexOf("\"", indexAssetKey+10); match = match.substring(indexAssetKey+10, indexAssetKeyEnd); logger.info("match:" + match); match = URLDecoder.decode(match, "utf-8"); logger.info("match:" + match); DigitalAssetVO daVO = null; if(returnMatchOnNoAssetKey || !match.equals("")) daVO = DigitalAssetController.getController().getDigitalAssetVO(contentId, languageId, match, true, db); if(daVO != null && (assetKey == null || assetKey.equals(daVO.getAssetKey()))) { logger.info("daVO.getAssetKey():" + daVO.getAssetKey()); String assetUrl = DigitalAssetController.getController().getDigitalAssetThumbnailUrl(daVO.getId(), 70, 70, Color.WHITE, "center", "middle", 60, 60, 30, db); if(assetUrl != null && !assetUrl.equals("")) sb.append("<a href='#' onmouseover=\"$('#passet_" + daVO.getId() + "').show();\" onmouseout=\"$('#passet_" + daVO.getId() + "').hide();\">" + match + "</a><div id='passet_" + daVO.getId() + "' style='display: none; position: absolute;'><img src='" + assetUrl + "'/></div>" + ", "); } } } return sb.toString(); } /** * This method fetches all inline links from any text. */ public void getInlineContents(String versionValue, Set<Integer> boundSiteNodeIds, Set<Integer> boundContentIds) throws ConstraintException, SystemException, Exception { Pattern pattern = Pattern.compile("\\$templateLogic\\.getInlineAssetUrl\\(.*?\\)"); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); logger.info("Adding match to registry after some processing: " + match); Integer contentId; int contentStartIndex = match.indexOf("("); int contentEndIndex = match.indexOf(","); if(contentStartIndex > 0 && contentEndIndex > 0 && contentEndIndex > contentStartIndex) { String contentIdString = match.substring(contentStartIndex + 1, contentEndIndex); if(contentIdString != null && !contentIdString.equals("")) { contentId = new Integer(contentIdString); logger.info("contentId:" + contentId); boundContentIds.add(contentId); } } } } /** * This method fetches all inline links from any text. */ public void getRelationSiteNodes(ContentVersionVO contentVersion, String versionValue, Database db) throws ConstraintException, SystemException, Exception { Pattern pattern = Pattern.compile("<qualifyer entity='SiteNode'>.*?</qualifyer>"); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); logger.info("Adding match to registry after some processing: " + match); Integer siteNodeId; int siteNodeStartIndex = match.indexOf("<id>"); int siteNodeEndIndex = match.indexOf("</id>"); while(siteNodeStartIndex > 0 && siteNodeEndIndex > 0 && siteNodeEndIndex > siteNodeStartIndex) { siteNodeId = new Integer(match.substring(siteNodeStartIndex + 4, siteNodeEndIndex)); logger.info("siteNodeId:" + siteNodeId); RegistryVO registryVO = new RegistryVO(); registryVO.setEntityId(siteNodeId.toString()); registryVO.setEntityName(SiteNode.class.getName()); registryVO.setReferenceType(RegistryVO.INLINE_SITE_NODE_RELATION); registryVO.setReferencingEntityId(contentVersion.getContentVersionId().toString()); registryVO.setReferencingEntityName(ContentVersion.class.getName()); registryVO.setReferencingEntityCompletingId(contentVersion.getContentId().toString()); registryVO.setReferencingEntityCompletingName(Content.class.getName()); this.create(registryVO, db); siteNodeStartIndex = match.indexOf("<id>", siteNodeEndIndex); siteNodeEndIndex = match.indexOf("</id>", siteNodeStartIndex); } } } /** * This method fetches all inline links from any text. */ public void getRelationContents(ContentVersionVO contentVersion, String versionValue, Database db) throws ConstraintException, SystemException, Exception { Pattern pattern = Pattern.compile("<qualifyer entity='Content'>.*?</qualifyer>"); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); logger.info("Adding match to registry after some processing: " + match); Integer contentId; int contentStartIndex = match.indexOf("<id>"); int contentEndIndex = match.indexOf("</id>"); while(contentStartIndex > 0 && contentEndIndex > 0 && contentEndIndex > contentStartIndex) { contentId = new Integer(match.substring(contentStartIndex + 4, contentEndIndex)); logger.info("contentId:" + contentId); RegistryVO registryVO = new RegistryVO(); registryVO.setEntityId(contentId.toString()); registryVO.setEntityName(Content.class.getName()); registryVO.setReferenceType(RegistryVO.INLINE_CONTENT_RELATION); registryVO.setReferencingEntityId(contentVersion.getContentVersionId().toString()); registryVO.setReferencingEntityName(ContentVersion.class.getName()); registryVO.setReferencingEntityCompletingId(contentVersion.getContentId().toString()); registryVO.setReferencingEntityCompletingName(Content.class.getName()); this.create(registryVO, db); contentStartIndex = match.indexOf("<id>", contentEndIndex); contentEndIndex = match.indexOf("</id>", contentStartIndex); } } } /** * This method fetches all components and adds entries to the registry. */ public void getComponents(SiteNodeVersionVO siteNodeVersion, String versionValue, Database db) throws ConstraintException, SystemException, Exception { List<Integer> foundComponents = new ArrayList<Integer>(); Pattern pattern = Pattern.compile("contentId=\".*?\""); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); logger.info("Adding match to registry after some processing: " + match); Integer contentId; int contentStartIndex = match.indexOf("\""); int contentEndIndex = match.lastIndexOf("\""); if(contentStartIndex > 0 && contentEndIndex > 0 && contentEndIndex > contentStartIndex) { contentId = new Integer(match.substring(contentStartIndex + 1, contentEndIndex)); logger.info("contentId:" + contentId); if(!foundComponents.contains(contentId)) { RegistryVO registryVO = new RegistryVO(); registryVO.setEntityId(contentId.toString()); registryVO.setEntityName(Content.class.getName()); registryVO.setReferenceType(RegistryVO.PAGE_COMPONENT); registryVO.setReferencingEntityId(siteNodeVersion.getSiteNodeVersionId().toString()); registryVO.setReferencingEntityName(SiteNodeVersion.class.getName()); registryVO.setReferencingEntityCompletingId("" + siteNodeVersion.getSiteNodeId()); registryVO.setReferencingEntityCompletingName(SiteNode.class.getName()); this.create(registryVO, db); foundComponents.add(contentId); } } } } /** * This method fetches all components and adds entries to the registry. */ public Set<Integer> getComponents(String versionValue) throws Exception { Set foundComponents = new HashSet(); Pattern pattern = Pattern.compile("contentId=\".*?\""); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); logger.info("Adding match to registry after some processing: " + match); Integer contentId; int contentStartIndex = match.indexOf("\""); int contentEndIndex = match.lastIndexOf("\""); if(contentStartIndex > 0 && contentEndIndex > 0 && contentEndIndex > contentStartIndex) { contentId = new Integer(match.substring(contentStartIndex + 1, contentEndIndex)); logger.info("contentId:" + contentId); foundComponents.add(contentId); } } return foundComponents; } /** * This method fetches all components and adds entries to the registry. */ public void getComponentBindings(SiteNodeVersionVO siteNodeVersion, String versionValue, Database db) throws ConstraintException, SystemException, Exception { List<String> foundComponents = new ArrayList<String>(); Pattern pattern = Pattern.compile("<binding.*?entity=\".*?\" entityId=\".*?\">"); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); logger.info("Adding match to registry after some processing: " + match); String entityName; String entityId; int entityNameStartIndex = match.indexOf("entity=\""); int entityNameEndIndex = match.indexOf("\"", entityNameStartIndex + 8); logger.info("entityNameStartIndex:" + entityNameStartIndex); logger.info("entityNameEndIndex:" + entityNameEndIndex); if(entityNameStartIndex > 0 && entityNameEndIndex > 0 && entityNameEndIndex > entityNameStartIndex) { entityName = match.substring(entityNameStartIndex + 8, entityNameEndIndex); logger.info("entityName:" + entityName); int entityIdStartIndex = match.indexOf("entityId=\"", entityNameEndIndex + 1); int entityIdEndIndex = match.indexOf("\"", entityIdStartIndex + 10); logger.info("entityIdStartIndex:" + entityIdStartIndex); logger.info("entityIdEndIndex:" + entityIdEndIndex); if(entityIdStartIndex > 0 && entityIdEndIndex > 0 && entityIdEndIndex > entityIdStartIndex) { entityId = match.substring(entityIdStartIndex + 10, entityIdEndIndex); logger.info("entityId:" + entityId); String key = entityName + ":" + entityId; if(!foundComponents.contains(key)) { RegistryVO registryVO = new RegistryVO(); if(entityName.indexOf("Content") > -1) registryVO.setEntityName(Content.class.getName()); else registryVO.setEntityName(SiteNode.class.getName()); registryVO.setEntityId(entityId); registryVO.setReferenceType(RegistryVO.PAGE_COMPONENT_BINDING); registryVO.setReferencingEntityId(siteNodeVersion.getSiteNodeVersionId().toString()); registryVO.setReferencingEntityName(SiteNodeVersion.class.getName()); registryVO.setReferencingEntityCompletingId(siteNodeVersion.getSiteNodeId().toString()); registryVO.setReferencingEntityCompletingName(SiteNode.class.getName()); this.create(registryVO, db); foundComponents.add(key); } } } } } /** * This method fetches all components and adds entries to the registry. */ public void getComponentBindings(String versionValue, Set<Integer> boundSiteNodeIds, Set<Integer> boundContentIds) throws Exception { Pattern pattern = Pattern.compile("<binding.*?entity=\".*?\" entityId=\".*?\">"); Matcher matcher = pattern.matcher(versionValue); while ( matcher.find() ) { String match = matcher.group(); logger.info("Adding match to registry after some processing: " + match); String entityName; String entityId; int entityNameStartIndex = match.indexOf("entity=\""); int entityNameEndIndex = match.indexOf("\"", entityNameStartIndex + 8); logger.info("entityNameStartIndex:" + entityNameStartIndex); logger.info("entityNameEndIndex:" + entityNameEndIndex); if(entityNameStartIndex > 0 && entityNameEndIndex > 0 && entityNameEndIndex > entityNameStartIndex) { entityName = match.substring(entityNameStartIndex + 8, entityNameEndIndex); logger.info("entityName:" + entityName); int entityIdStartIndex = match.indexOf("entityId=\"", entityNameEndIndex + 1); int entityIdEndIndex = match.indexOf("\"", entityIdStartIndex + 10); logger.info("entityIdStartIndex:" + entityIdStartIndex); logger.info("entityIdEndIndex:" + entityIdEndIndex); if(entityIdStartIndex > 0 && entityIdEndIndex > 0 && entityIdEndIndex > entityIdStartIndex) { entityId = match.substring(entityIdStartIndex + 10, entityIdEndIndex); logger.info("entityId:" + entityId); if(entityName.indexOf("Content") > -1) boundContentIds.add(new Integer(entityId)); else boundSiteNodeIds.add(new Integer(entityId)); } } } } /** * Implemented for BaseController */ public BaseEntityVO getNewVO() { return new CategoryVO(); } /** * This method gets all referencing content versions * * @param contentId * @return */ /* public List getReferencingObjectsForContent(Integer contentId) throws SystemException { List referenceBeanList = new ArrayList(); Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); Map entries = new HashMap(); List registryEntires = getMatchingRegistryVOList(Content.class.getName(), contentId.toString(), db); Iterator registryEntiresIterator = registryEntires.iterator(); while(registryEntiresIterator.hasNext()) { RegistryVO registryVO = (RegistryVO)registryEntiresIterator.next(); logger.info("registryVO:" + registryVO.getReferencingEntityId() + ":" + registryVO.getReferencingEntityCompletingId()); ReferenceBean referenceBean = new ReferenceBean(); if(registryVO.getReferencingEntityName().indexOf("Content") > -1) { ContentVersion contentVersion = ContentVersionController.getContentVersionController().getContentVersionWithId(new Integer(registryVO.getReferencingEntityId()), db); logger.info("contentVersion:" + contentVersion.getContentVersionId()); referenceBean.setName(contentVersion.getOwningContent().getName()); referenceBean.setReferencingObject(contentVersion.getValueObject()); } else { SiteNodeVersion siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionWithId(new Integer(registryVO.getReferencingEntityId()), db); logger.info("siteNodeVersion:" + siteNodeVersion.getSiteNodeVersionId()); referenceBean.setName(siteNodeVersion.getOwningSiteNode().getName()); referenceBean.setReferencingObject(siteNodeVersion.getValueObject()); } String key = "" + registryVO.getReferencingEntityName() + "_" + registryVO.getReferencingEntityId(); ReferenceBean existingReferenceBean = (ReferenceBean)entries.get(key); if(existingReferenceBean == null) { List registryVOList = new ArrayList(); registryVOList.add(registryVO); referenceBean.setRegistryVOList(registryVOList); logger.info("Adding referenceBean to entries with key:" + key); entries.put(key, referenceBean); referenceBeanList.add(referenceBean); } else { logger.info("Found referenceBean in entries with key:" + key); existingReferenceBean.getRegistryVOList().add(registryVO); } } commitTransaction(db); } catch ( Exception e) { logger.warn("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); } return referenceBeanList; } */ public List<ReferenceBean> getReferencingObjectsForContent(Integer contentId) throws SystemException { return getReferencingObjectsForContent(contentId, -1, true, false); } public List<ReferenceBean> getReferencingObjectsForContent(Integer contentId, int maxRows, boolean excludeInternalContentReferences, boolean onlyOneVersionPerLanguage) throws SystemException { List<ReferenceBean> referenceBeanList = new ArrayList<ReferenceBean>(); Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); referenceBeanList = getReferencingObjectsForContent(contentId, maxRows, excludeInternalContentReferences, onlyOneVersionPerLanguage, db); commitTransaction(db); } catch (Exception e) { logger.warn("One of the references was not found which is bad but not critical:" + e.getMessage(), e); rollbackTransaction(db); //throw new SystemException("An error occurred when we tried to fetch a list of roles in the repository. Reason:" + e.getMessage(), e); } logger.info("referenceBeanList:" + referenceBeanList.size()); return referenceBeanList; } public List<ReferenceBean> getReferencingObjectsForContentAsset(Integer contentId, String assetKey, int maxRows, boolean excludeInternalContentReferences, boolean onlyOneVersionPerLanguage, boolean discardMiss) throws SystemException { List<ReferenceBean> referenceBeanList = new ArrayList<ReferenceBean>(); Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); referenceBeanList = getReferencingObjectsForContentAsset(contentId, assetKey, maxRows, excludeInternalContentReferences, onlyOneVersionPerLanguage, discardMiss, db); commitTransaction(db); } catch (Exception e) { e.printStackTrace(); logger.warn("One of the references was not found which is bad but not critical:" + e.getMessage(), e); rollbackTransaction(db); //throw new SystemException("An error occurred when we tried to fetch a list of roles in the repository. Reason:" + e.getMessage(), e); } logger.info("referenceBeanList:" + referenceBeanList.size()); return referenceBeanList; } public Set<SiteNodeVO> getReferencingSiteNodesForContent(Integer contentId, int maxRows, Database db, Boolean onlyVersionsPreventingDelete) throws SystemException, Exception { Timer t = new Timer(); Set<SiteNodeVO> referenceBeanList = new HashSet<SiteNodeVO>(); List registryEntires = getMatchingRegistryVOList(Content.class.getName(), contentId.toString(), maxRows, db); //t.printElapsedTime("registryEntires:" + registryEntires.size()); logger.info("registryEntires:" + registryEntires.size()); Iterator registryEntiresIterator = registryEntires.iterator(); while(registryEntiresIterator.hasNext()) { RegistryVO registryVO = (RegistryVO)registryEntiresIterator.next(); if(registryVO.getReferencingEntityName().indexOf("Content") > -1) continue; logger.info("registryVO:" + registryVO.getReferencingEntityId() + ":" + registryVO.getReferencingEntityCompletingId()); ReferenceVersionBean referenceVersionBean = new ReferenceVersionBean(); try { SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(new Integer(registryVO.getReferencingEntityCompletingId()), db); SiteNodeVersionVO siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(new Integer(registryVO.getReferencingEntityId()), db); if(!onlyVersionsPreventingDelete) referenceBeanList.add(siteNodeVO); else { if(siteNodeVersion.getIsActive()) { if(siteNodeVersion.getStateId().equals(SiteNodeVersionVO.PUBLISHED_STATE)) { referenceBeanList.add(siteNodeVO); } else { SiteNodeVersionVO latestSiteNodeVersion = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(db, siteNodeVersion.getSiteNodeId(), SiteNodeVersionVO.WORKING_STATE); if(latestSiteNodeVersion != null && latestSiteNodeVersion.getSiteNodeVersionId() == siteNodeVersion.getSiteNodeVersionId()) { referenceBeanList.add(siteNodeVO); } } } } } catch(Exception e) { logger.info("siteNode:" + registryVO.getReferencingEntityId() + " did not exist - skipping.."); } } logger.info("referenceBeanList:" + referenceBeanList.size()); return referenceBeanList; } public List<ReferenceBean> getReferencingObjectsForContent(Integer contentId, int maxRows, boolean excludeInternalContentReferences, boolean onlyOneVersionPerLanguage, Database db) throws SystemException, Exception { return getReferencingObjectsForContent(contentId, maxRows, excludeInternalContentReferences, false, onlyOneVersionPerLanguage, db); } public List<ReferenceBean> getReferencingObjectsForContent(Integer contentId, int maxRows, boolean excludeInternalContentReferences, boolean excludeInternalRepoReferences, boolean onlyOneVersionPerLanguage, Database db) throws SystemException, Exception { List<ReferenceBean> referenceBeanList = new ArrayList<ReferenceBean>(); Map entries = new HashMap(); Map<String,Boolean> checkedLanguageVersions = new HashMap<String,Boolean>(); List<RegistryVO> registryEntires = getMatchingRegistryVOList(Content.class.getName(), contentId.toString(), maxRows, db); if(onlyOneVersionPerLanguage) { Collections.sort(registryEntires, new ReflectionComparator("referencingEntityId")); Collections.reverse(registryEntires); } logger.info("registryEntires:" + registryEntires.size()); Iterator registryEntiresIterator = registryEntires.iterator(); while(registryEntiresIterator.hasNext()) { RegistryVO registryVO = (RegistryVO)registryEntiresIterator.next(); logger.info("registryVO:" + registryVO.getReferencingEntityName() + ":" + registryVO.getReferencingEntityId() + ":" + registryVO.getReferencingEntityCompletingName() + ":" + registryVO.getReferencingEntityCompletingId()); boolean add = true; String key = "" + registryVO.getReferencingEntityCompletingName() + "_" + registryVO.getReferencingEntityCompletingId(); //String key = "" + registryVO.getReferencingEntityName() + "_" + registryVO.getReferencingEntityId(); ReferenceBean existingReferenceBean = (ReferenceBean)entries.get(key); if(existingReferenceBean == null) { existingReferenceBean = new ReferenceBean(); logger.info("Adding referenceBean to entries with key:" + key); entries.put(key, existingReferenceBean); referenceBeanList.add(existingReferenceBean); } ReferenceVersionBean referenceVersionBean = new ReferenceVersionBean(); if(registryVO.getReferencingEntityName().indexOf("Content") > -1) { try { Boolean isLocalRepo = false; Boolean isDeleted = false; if(excludeInternalRepoReferences) { ContentVO checkedContentVO = ContentController.getContentController().getSmallContentVOWithId(contentId, db); ContentVO referencingContentVO = ContentController.getContentController().getSmallContentVOWithId(new Integer(registryVO.getReferencingEntityCompletingId()), db); if(checkedContentVO.getRepositoryId().intValue() == referencingContentVO.getRepositoryId().intValue()) isLocalRepo = true; } ContentVO referencingContentVO = ContentController.getContentController().getSmallContentVOWithId(new Integer(registryVO.getReferencingEntityCompletingId()), db); if(referencingContentVO.getIsDeleted()) isDeleted = true; ContentVersionVO contentVersion = ContentVersionController.getContentVersionController().getContentVersionVOWithId(new Integer(registryVO.getReferencingEntityId()), db); ContentVersionVO latestCVVOForReferencingContent = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(referencingContentVO.getId(), contentVersion.getLanguageId(), db); boolean isLatest = (contentVersion.getId().intValue() == latestCVVOForReferencingContent.getId().intValue()); if(!isLatest) { continue; } //logger.info("content: " + contentVersion.getOwningContent().getContentId() + " - contentVersion: " + contentVersion.getId()); Boolean hasVersion = checkedLanguageVersions.get("" + contentVersion.getContentId() + "_" + contentVersion.getLanguageId()); if(hasVersion != null && onlyOneVersionPerLanguage) { continue; //referenceBeanList.remove(existingReferenceBean); } else if(excludeInternalContentReferences && contentVersion.getContentId().equals(contentId)) { logger.info("Skipping internal reference " + contentId + " had on itself."); referenceBeanList.remove(existingReferenceBean); } else if(isLocalRepo) { logger.info("Skipping internal reference " + contentId + " had on local repo contents."); referenceBeanList.remove(existingReferenceBean); } else if(isDeleted) { logger.info("Skipping reference " + contentId + " was deleted."); referenceBeanList.remove(existingReferenceBean); } else { ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentVersion.getContentId(), db); existingReferenceBean.setName(contentVO.getName()); existingReferenceBean.setReferencingCompletingObject(contentVO); existingReferenceBean.setPath(ContentController.getContentController().getContentPath(contentVersion.getContentId(), false, true, db)); try { String userName = contentVersion.getVersionModifier(); if(userName == null || userName.equals("")) userName = contentVO.getCreatorName(); InfoGluePrincipal user = UserControllerProxy.getController().getUser(userName); if(user != null) existingReferenceBean.setContactPersonEmail(user.getEmail()); else existingReferenceBean.setContactPersonEmail(userName); } catch (Exception e) { logger.warn("Problem getting version modifier email: " + e.getMessage()); } referenceVersionBean.setReferencingObject(contentVersion); referenceVersionBean.getRegistryVOList().add(registryVO); String assetExtraInfo = RegistryController.getController().getInlineAssetInformation(contentVersion.getVersionValue(), new Integer(registryVO.getEntityId()), contentVersion.getLanguageId(), null, true, db); if(assetExtraInfo != null) referenceVersionBean.setReferencingExtraInfo(assetExtraInfo); logger.info("assetExtraInfo:" + assetExtraInfo); checkedLanguageVersions.put("" + contentVersion.getContentId() + "_" + contentVersion.getLanguageId(), new Boolean(true)); } } catch(Exception e) { add = false; logger.info("content:" + registryVO.getReferencingEntityId() + " did not exist - skipping.."); } } else { try { SiteNodeVersionVO siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(new Integer(registryVO.getReferencingEntityId()), db); SiteNodeVO referencingSiteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeVersion.getSiteNodeId(), db); Boolean isLocalRepo = false; Boolean isDeleted = false; if(excludeInternalRepoReferences) { ContentVO checkedContentVO = ContentController.getContentController().getSmallContentVOWithId(contentId, db); if(checkedContentVO.getRepositoryId().intValue() == referencingSiteNodeVO.getRepositoryId().intValue()) isLocalRepo = true; } if(referencingSiteNodeVO.getIsDeleted()) isDeleted = true; SiteNodeVersionVO latestSNVVOForReferencingContent = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(db, referencingSiteNodeVO.getId()); boolean isLatest = (siteNodeVersion.getId().intValue() == latestSNVVOForReferencingContent.getId().intValue()); if(!isLatest) { continue; } else if(isDeleted) { logger.info("Skipping reference " + contentId + " was deleted."); referenceBeanList.remove(existingReferenceBean); } if(!siteNodeVersion.getIsActive() || isLocalRepo) add = false; SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeVersion.getSiteNodeId(), db); logger.info("siteNodeVersion:" + siteNodeVersion.getSiteNodeVersionId()); logger.info("siteNode:" + siteNodeVO.getId()); existingReferenceBean.setName(siteNodeVO.getName()); existingReferenceBean.setReferencingCompletingObject(siteNodeVO); existingReferenceBean.setPath(SiteNodeController.getController().getSiteNodePath(siteNodeVO.getSiteNodeId(), false, true, db)); try { String userName = siteNodeVersion.getVersionModifier(); if(userName == null || userName.equals("")) userName = siteNodeVO.getCreatorName(); InfoGluePrincipal user = UserControllerProxy.getController().getUser(userName); if(user != null) existingReferenceBean.setContactPersonEmail(user.getEmail()); else existingReferenceBean.setContactPersonEmail(userName); } catch (Exception e) { logger.warn("Problem getting version modifier email: " + e.getMessage()); } referenceVersionBean.setReferencingObject(siteNodeVersion); referenceVersionBean.getRegistryVOList().add(registryVO); LanguageVO masterLanguageVO = LanguageController.getController().getMasterLanguage(siteNodeVO.getRepositoryId(), db); ContentVersionVO cvVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(siteNodeVO.getMetaInfoContentId(), masterLanguageVO.getId(), db); String assetExtraInfo = RegistryController.getController().getInlineAssetInformation(cvVO.getVersionValue(), new Integer(registryVO.getEntityId()), masterLanguageVO.getLanguageId(), null, true, db); logger.info("assetExtraInfo:" + assetExtraInfo); if(assetExtraInfo != null) referenceVersionBean.setReferencingExtraInfo(assetExtraInfo); } catch(Exception e) { add = false; logger.info("siteNode:" + registryVO.getReferencingEntityId() + " did not exist - skipping:" + e.getMessage()); } } logger.info("Add:" + add); if(add) { boolean exists = false; ReferenceVersionBean existingReferenceVersionBean = null; Iterator versionsIterator = existingReferenceBean.getVersions().iterator(); while(versionsIterator.hasNext()) { existingReferenceVersionBean = (ReferenceVersionBean)versionsIterator.next(); if(existingReferenceVersionBean == null || existingReferenceVersionBean.getReferencingObject() == null || referenceVersionBean.getReferencingObject() == null || referenceVersionBean == null || existingReferenceVersionBean.getReferencingObject().equals(referenceVersionBean.getReferencingObject())) { exists = true; break; } } if(!exists) existingReferenceBean.getVersions().add(referenceVersionBean); else existingReferenceVersionBean.getRegistryVOList().add(registryVO); } } Iterator i = referenceBeanList.iterator(); while(i.hasNext()) { ReferenceBean referenceBean = (ReferenceBean)i.next(); if(referenceBean.getVersions().size() == 0) i.remove(); } logger.info("referenceBeanList:" + referenceBeanList.size()); return referenceBeanList; } public List<ReferenceBean> getReferencingObjectsForContentAsset(Integer contentId, String assetKey, int maxRows, boolean excludeInternalContentReferences, boolean onlyLatestVersionPerLanguage, boolean discardMiss, Database db) throws SystemException, Exception { List<ReferenceBean> referenceBeanList = new ArrayList<ReferenceBean>(); if(contentId == null) return referenceBeanList; Map entries = new HashMap(); Map<String,Boolean> checkedLanguageVersions = new HashMap<String,Boolean>(); List registryEntires = getMatchingRegistryVOList(Content.class.getName(), contentId.toString(), maxRows, db); logger.info("registryEntires:" + registryEntires.size()); Iterator registryEntiresIterator = registryEntires.iterator(); while(registryEntiresIterator.hasNext()) { RegistryVO registryVO = (RegistryVO)registryEntiresIterator.next(); logger.info("registryVO.getReferenceType():" + registryVO.getReferenceType() + ":" + registryVO.getReferencingEntityName() + ":" + registryVO.getReferencingEntityId() + ":" + registryVO.getReferencingEntityCompletingName() + ":" + registryVO.getReferencingEntityCompletingId()); if(!registryVO.getReferenceType().equals(RegistryVO.INLINE_ASSET) && registryVO.getReferencingEntityName().indexOf("SiteNode") == -1) { logger.info("NOT INLINE ASSET:" + registryVO.getId()); } else if(registryVO.getReferenceType().equals(RegistryVO.PAGE_COMPONENT_BINDING)) { logger.info("Page component binding:" + registryVO.getId() + " - " + registryVO.getReferencingEntityName() + ":" + registryVO.getReferencingEntityId() + ":" + registryVO.getReferencingEntityCompletingName() + ":" + registryVO.getReferencingEntityCompletingId()); boolean add = true; String key = "" + registryVO.getReferencingEntityCompletingName() + "_" + registryVO.getReferencingEntityCompletingId(); ReferenceBean existingReferenceBean = (ReferenceBean)entries.get(key); if(existingReferenceBean == null) { existingReferenceBean = new ReferenceBean(); logger.info("Adding referenceBean to entries with key:" + key); entries.put(key, existingReferenceBean); referenceBeanList.add(existingReferenceBean); } ReferenceVersionBean referenceVersionBean = new ReferenceVersionBean(); try { SiteNodeVersionVO siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(new Integer(registryVO.getReferencingEntityId()), db); SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeVersion.getSiteNodeId(), db); logger.info("siteNodeVersion:" + siteNodeVersion.getSiteNodeVersionId()); logger.info("siteNode:" + siteNodeVO.getId()); existingReferenceBean.setName(siteNodeVO.getName()); existingReferenceBean.setReferencingCompletingObject(siteNodeVO); existingReferenceBean.setPath(SiteNodeController.getController().getSiteNodePath(siteNodeVO.getSiteNodeId(), false, true, db)); try { String userName = siteNodeVersion.getVersionModifier(); if(userName == null || userName.equals("")) userName = siteNodeVO.getCreatorName(); InfoGluePrincipal user = UserControllerProxy.getController().getUser(userName); if(user != null) existingReferenceBean.setContactPersonEmail(user.getEmail()); else existingReferenceBean.setContactPersonEmail(userName); } catch (Exception e) { logger.warn("Problem getting version modifier email: " + e.getMessage()); } referenceVersionBean.setReferencingObject(siteNodeVersion); referenceVersionBean.getRegistryVOList().add(registryVO); LanguageVO masterLanguageVO = LanguageController.getController().getMasterLanguage(siteNodeVO.getRepositoryId(), db); ContentVersionVO cvVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(siteNodeVO.getMetaInfoContentId(), masterLanguageVO.getId(), db); logger.info("cvVO:" + cvVO.getId()); String assetExtraInfo = RegistryController.getController().getInlineAssetInformation(cvVO.getVersionValue(), new Integer(registryVO.getEntityId()), masterLanguageVO.getLanguageId(), assetKey, false, db); logger.info("assetExtraInfo:" + assetExtraInfo); if(assetExtraInfo != null && !assetExtraInfo.equals("")) referenceVersionBean.setReferencingExtraInfo(assetExtraInfo); else if(discardMiss) { add = false; } } catch(Exception e) { add = false; logger.info("siteNode:" + registryVO.getReferencingEntityId() + " did not exist - skipping.."); } if(add) { boolean exists = false; ReferenceVersionBean existingReferenceVersionBean = null; Iterator versionsIterator = existingReferenceBean.getVersions().iterator(); while(versionsIterator.hasNext()) { existingReferenceVersionBean = (ReferenceVersionBean)versionsIterator.next(); if(existingReferenceVersionBean == null || existingReferenceVersionBean.getReferencingObject() == null || referenceVersionBean.getReferencingObject() == null || referenceVersionBean == null || existingReferenceVersionBean.getReferencingObject().equals(referenceVersionBean.getReferencingObject())) { exists = true; break; } } if(!exists) existingReferenceBean.getVersions().add(referenceVersionBean); else existingReferenceVersionBean.getRegistryVOList().add(registryVO); logger.info("existingReferenceBean.getVersions():" + existingReferenceBean.getVersions()); } } else { logger.info("Inline ASSET binding: " + assetKey); boolean add = true; String key = "" + registryVO.getReferencingEntityCompletingName() + "_" + registryVO.getReferencingEntityCompletingId(); ReferenceBean existingReferenceBean = (ReferenceBean)entries.get(key); if(existingReferenceBean == null) { existingReferenceBean = new ReferenceBean(); logger.info("Adding referenceBean to entries with key:" + key); entries.put(key, existingReferenceBean); referenceBeanList.add(existingReferenceBean); } ReferenceVersionBean referenceVersionBean = new ReferenceVersionBean(); if(registryVO.getReferencingEntityName().indexOf("Content") > -1) { try { ContentVersionVO cv = ContentVersionController.getContentVersionController().getContentVersionVOWithId(new Integer(registryVO.getReferencingEntityId()), db); ContentVersionVO latestContentVersion = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(new Integer(registryVO.getReferencingEntityCompletingId()), cv.getLanguageId(), db); Boolean hasVersion = checkedLanguageVersions.get("" + latestContentVersion.getContentId() + "_" + latestContentVersion.getLanguageId()); if(hasVersion != null && onlyLatestVersionPerLanguage) { continue; //referenceBeanList.remove(existingReferenceBean); } else if(excludeInternalContentReferences && latestContentVersion.getContentId().equals(contentId)) { logger.info("Skipping internal reference " + contentId + " had on itself."); referenceBeanList.remove(existingReferenceBean); } else { logger.info("contentVersion:" + latestContentVersion.getId() + " : " + assetKey); boolean includesAsset = RegistryController.getController().hasInlineAsset(latestContentVersion.getVersionValue(), new Integer(registryVO.getEntityId()), assetKey, db); logger.info("includesAsset:" + includesAsset); if(includesAsset) { ContentVO contentVO = ContentController.getContentController().getContentVOWithId(latestContentVersion.getContentId(), db); existingReferenceBean.setName(contentVO.getName()); existingReferenceBean.setReferencingCompletingObject(contentVO); existingReferenceBean.setPath(ContentController.getContentController().getContentPath(contentVO.getContentId(), false, true, db)); try { String userName = latestContentVersion.getVersionModifier(); if(userName == null || userName.equals("")) userName = contentVO.getCreatorName(); InfoGluePrincipal user = UserControllerProxy.getController().getUser(userName); if(user != null) existingReferenceBean.setContactPersonEmail(user.getEmail()); else existingReferenceBean.setContactPersonEmail(userName); } catch (Exception e) { logger.warn("Problem getting version modifier email: " + e.getMessage()); } referenceVersionBean.setReferencingObject(latestContentVersion); referenceVersionBean.getRegistryVOList().add(registryVO); checkedLanguageVersions.put("" + latestContentVersion.getContentId() + "_" + latestContentVersion.getLanguageId(), new Boolean(true)); } else { //if(existingReferenceBean.getVersions().size() == 0) referenceBeanList.remove(existingReferenceBean); //logger.info("NOOOOOOOO: This version had no asset reference..."); } } } catch(Exception e) { add = false; logger.info("content:" + registryVO.getReferencingEntityId() + " did not exist - skipping.."); } } else { try { SiteNodeVersionVO siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(new Integer(registryVO.getReferencingEntityId()), db); SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeVersion.getSiteNodeId(), db); logger.info("siteNodeVersion:" + siteNodeVersion.getSiteNodeVersionId()); logger.info("siteNode:" + siteNodeVO.getId()); existingReferenceBean.setName(siteNodeVO.getName()); existingReferenceBean.setReferencingCompletingObject(siteNodeVO); existingReferenceBean.setPath(SiteNodeController.getController().getSiteNodePath(siteNodeVO.getSiteNodeId(), false, true, db)); try { String userName = siteNodeVersion.getVersionModifier(); if(userName == null || userName.equals("")) userName = siteNodeVO.getCreatorName(); InfoGluePrincipal user = UserControllerProxy.getController().getUser(userName); if(user != null) existingReferenceBean.setContactPersonEmail(user.getEmail()); else existingReferenceBean.setContactPersonEmail(userName); } catch (Exception e) { logger.warn("Problem getting version modifier email: " + e.getMessage()); } referenceVersionBean.setReferencingObject(siteNodeVersion); referenceVersionBean.getRegistryVOList().add(registryVO); LanguageVO masterLanguageVO = LanguageController.getController().getMasterLanguage(siteNodeVO.getRepositoryId(), db); ContentVersionVO cvVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(siteNodeVO.getMetaInfoContentId(), masterLanguageVO.getId(), db); String assetExtraInfo = RegistryController.getController().getInlineAssetInformation(cvVO.getVersionValue(), new Integer(registryVO.getEntityId()), masterLanguageVO.getLanguageId(), assetKey, false, db); if(assetExtraInfo != null && !assetExtraInfo.equals("")) referenceVersionBean.setReferencingExtraInfo(assetExtraInfo); else add = false; } catch(Exception e) { add = false; logger.info("siteNode:" + registryVO.getReferencingEntityId() + " did not exist - skipping.."); } } if(add) { boolean exists = false; ReferenceVersionBean existingReferenceVersionBean = null; Iterator versionsIterator = existingReferenceBean.getVersions().iterator(); while(versionsIterator.hasNext()) { existingReferenceVersionBean = (ReferenceVersionBean)versionsIterator.next(); if(existingReferenceVersionBean == null || existingReferenceVersionBean.getReferencingObject() == null || referenceVersionBean.getReferencingObject() == null || referenceVersionBean == null || existingReferenceVersionBean.getReferencingObject().equals(referenceVersionBean.getReferencingObject())) { exists = true; break; } } if(!exists) existingReferenceBean.getVersions().add(referenceVersionBean); else existingReferenceVersionBean.getRegistryVOList().add(registryVO); } } } Iterator i = referenceBeanList.iterator(); while(i.hasNext()) { ReferenceBean referenceBean = (ReferenceBean)i.next(); logger.info("referenceBean:" + referenceBean.getPath() + "/" + referenceBean.getVersions().size()); if(referenceBean.getVersions().size() == 0) i.remove(); } logger.info("referenceBeanList:" + referenceBeanList.size()); return referenceBeanList; } /** * This method gets a List of pages referencing the given content. */ public List<SiteNodeVO> getReferencingSiteNodes(Integer contentId, int maxRows, Database db) { String cacheKey = "content_" + contentId + "_" + maxRows; if(logger.isInfoEnabled()) logger.info("cacheKey:" + cacheKey); List<SiteNodeVO> referencingSiteNodeVOList = (List<SiteNodeVO>)CacheController.getCachedObject("referencingPagesCache", cacheKey); if(referencingSiteNodeVOList != null) { if(logger.isInfoEnabled()) logger.info("There was an cached referencingPages:" + referencingSiteNodeVOList.size()); } else { referencingSiteNodeVOList = new ArrayList<SiteNodeVO>(); try { List referencingObjects = RegistryController.getController().getReferencingObjectsForContent(contentId, maxRows, false, false, db); Iterator referencingObjectsIterator = referencingObjects.iterator(); while(referencingObjectsIterator.hasNext()) { ReferenceBean referenceBean = (ReferenceBean)referencingObjectsIterator.next(); Object pageCandidate = referenceBean.getReferencingCompletingObject(); if(pageCandidate instanceof SiteNodeVO) { referencingSiteNodeVOList.add((SiteNodeVO) pageCandidate); } } if(referencingSiteNodeVOList != null) CacheController.cacheObject("referencingPagesCache", cacheKey, referencingSiteNodeVOList); } catch(Exception e) { logger.error("An error occurred trying to get referencing pages for the contentId " + contentId + ":" + e.getMessage(), e); } } return referencingSiteNodeVOList; } /** * This method gets all referencing sitenode versions * * @param siteNodeId * @return */ /* public List getReferencingObjectsForSiteNode(Integer siteNodeId) throws SystemException, Exception { List referenceBeanList = new ArrayList(); Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); Map entries = new HashMap(); List registryEntires = getMatchingRegistryVOList(SiteNode.class.getName(), siteNodeId.toString(), db); Iterator registryEntiresIterator = registryEntires.iterator(); while(registryEntiresIterator.hasNext()) { RegistryVO registryVO = (RegistryVO)registryEntiresIterator.next(); logger.info("registryVO:" + registryVO.getReferencingEntityId() + ":" + registryVO.getReferencingEntityCompletingId()); ReferenceBean referenceBean = new ReferenceBean(); if(registryVO.getReferencingEntityName().indexOf("Content") > -1) { ContentVersion contentVersion = ContentVersionController.getContentVersionController().getContentVersionWithId(new Integer(registryVO.getReferencingEntityId()), db); logger.info("contentVersion:" + contentVersion.getContentVersionId()); referenceBean.setName(contentVersion.getOwningContent().getName()); referenceBean.setReferencingObject(contentVersion.getValueObject()); } else { SiteNodeVersion siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionWithId(new Integer(registryVO.getReferencingEntityId()), db); logger.info("siteNodeVersion:" + siteNodeVersion.getSiteNodeVersionId()); referenceBean.setName(siteNodeVersion.getOwningSiteNode().getName()); referenceBean.setReferencingObject(siteNodeVersion.getValueObject()); } String key = "" + registryVO.getReferencingEntityName() + "_" + registryVO.getReferencingEntityId(); //String key = "" + registryVO.getReferencingEntityCompletingName() + "_" + registryVO.getReferencingEntityCompletingId(); ReferenceBean existingReferenceBean = (ReferenceBean)entries.get(key); if(existingReferenceBean == null) { List registryVOList = new ArrayList(); registryVOList.add(registryVO); referenceBean.setRegistryVOList(registryVOList); logger.info("Adding referenceBean to entries with key:" + key); entries.put(key, referenceBean); referenceBeanList.add(referenceBean); } else { logger.info("Found referenceBean in entries with key:" + key); existingReferenceBean.getRegistryVOList().add(registryVO); } } commitTransaction(db); } catch (Exception e) { logger.warn("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); //throw new SystemException("An error occurred when we tried to fetch a list of roles in the repository. Reason:" + e.getMessage(), e); } return referenceBeanList; } */ protected String getContactPersonEmail(ContentVO contentVO, Database db) throws SystemException, Exception { InfoGluePrincipal user = UserControllerProxy.getController(db).getUser(contentVO.getCreatorName()); if (user == null) { return "" + contentVO.getCreatorName(); } else { return user.getEmail(); } } /** * Attempts to get an email address to the contact person of the given SiteNode. * * First the Meta info is examined for a value of an attribute specified by {@link CmsPropertyHandler#getContactPersonEmailMetaInfoAttribute()} * and if nothing is found the SiteNode creator's email is used. An empty String is returned if no value could be found. */ protected String getContactPersonEmail(SiteNodeVO siteNode, Database db) throws SystemException, Exception { String contactPersonEmailMetaInfoAttribute = CmsPropertyHandler.getContactPersonEmailMetaInfoAttribute(); if (contactPersonEmailMetaInfoAttribute != null && !contactPersonEmailMetaInfoAttribute.equals("")) { LanguageVO masterLanguage = LanguageController.getController().getMasterLanguage(siteNode.getRepositoryId(), db); if (masterLanguage != null) { ContentVersionVO metaInfoContentVersion = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(siteNode.getMetaInfoContentId(), masterLanguage.getId(), db); if (metaInfoContentVersion != null) { String contactPersonEmail = ContentVersionController.getContentVersionController().getAttributeValue(metaInfoContentVersion, contactPersonEmailMetaInfoAttribute, false); if (contactPersonEmail != null && !contactPersonEmail.equals("")) { if (logger.isDebugEnabled()) { logger.debug("Reading contact person email from: SiteNode, meta info, master language. Id: " + siteNode.getId()); } return contactPersonEmail; } } } @SuppressWarnings("unchecked") List<LanguageVO> repositoryLanguages = LanguageController.getController().getLanguageVOList(siteNode.getRepositoryId(), db); for (LanguageVO language : repositoryLanguages) { ContentVersionVO metaInfoContentVersion = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(siteNode.getMetaInfoContentId(), language.getId(), db); if (metaInfoContentVersion != null) { String contactPersonEmail = ContentVersionController.getContentVersionController().getAttributeValue(metaInfoContentVersion, contactPersonEmailMetaInfoAttribute, false); if (contactPersonEmail != null && !contactPersonEmail.equals("")) { if (logger.isDebugEnabled() && contactPersonEmail != null) { if (logger.isDebugEnabled()) { logger.debug("Reading contact person email from: SiteNode, meta info, language. Language-id: " + language.getId() + ", Id: " + siteNode.getId()); } return contactPersonEmail; } } } } } InfoGluePrincipal user = UserControllerProxy.getController(db).getUser(siteNode.getCreatorName()); if (user != null) { if (logger.isDebugEnabled()) { logger.debug("Reading contact person email from: SiteNode, system user. User: " + user.getName() + ", Id: " + siteNode.getId()); } return user.getEmail(); } else return "" + siteNode.getCreatorName(); } public List<ReferenceBean> getReferencingObjectsForSiteNode(Integer siteNodeId) throws SystemException, Exception { return getReferencingObjectsForSiteNode(siteNodeId, -1, false, false); } public List<ReferenceBean> getReferencingObjectsForSiteNode(Integer siteNodeId, boolean onlyLatestVersion) throws SystemException, Exception { return getReferencingObjectsForSiteNode(siteNodeId, -1, onlyLatestVersion, false); } public List<ReferenceBean> getReferencingObjectsForSiteNode(Integer siteNodeId, int maxRows) throws SystemException, Exception { return getReferencingObjectsForSiteNode(siteNodeId, maxRows, false, false); } public List<ReferenceBean> getReferencingObjectsForSiteNode(Integer siteNodeId, int maxRows, boolean onlyLatestVersion, boolean onlyOneVersionPerLanguage) throws SystemException, Exception { List<ReferenceBean> referenceBeanList = new ArrayList<ReferenceBean>(); Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); referenceBeanList = getReferencingObjectsForSiteNode(siteNodeId, maxRows, onlyLatestVersion, onlyOneVersionPerLanguage, db); commitTransaction(db); } catch (Exception e) { logger.warn("One of the references was not found which is bad but not critical:" + e.getMessage(), e); rollbackTransaction(db); } return referenceBeanList; } public List<ReferenceBean> getReferencingObjectsForSiteNode(Integer siteNodeId, int maxRows, boolean onlyOneVersionPerLanguage, Database db) throws SystemException, Exception { return getReferencingObjectsForSiteNode(siteNodeId, maxRows, false, onlyOneVersionPerLanguage, db); } public List<ReferenceBean> getReferencingObjectsForSiteNode(Integer siteNodeId, int maxRows, boolean onlyLatestVersion, boolean onlyOneVersionPerLanguage, Database db) throws SystemException, Exception { return getReferencingObjectsForSiteNode(siteNodeId, maxRows, onlyLatestVersion, onlyOneVersionPerLanguage, false, db); } public List<ReferenceBean> getReferencingObjectsForSiteNode(Integer siteNodeId, int maxRows, boolean onlyLatestVersion, boolean onlyOneVersionPerLanguage, boolean excludeInternalRepoReferences, Database db) throws SystemException, Exception { List<ReferenceBean> referenceBeanList = new ArrayList<ReferenceBean>(); Map<String,Boolean> checkedLanguageVersions = new HashMap<String,Boolean>(); Map<String, ReferenceBean> entries = new HashMap<String, ReferenceBean>(); @SuppressWarnings("unchecked") List<RegistryVO> registryEntires = getMatchingRegistryVOList(SiteNode.class.getName(), siteNodeId.toString(), maxRows, db); Iterator<RegistryVO> registryEntiresIterator = registryEntires.iterator(); while(registryEntiresIterator.hasNext()) { RegistryVO registryVO = registryEntiresIterator.next(); try { logger.info("registryVO:" + registryVO.getReferencingEntityId() + ":" + registryVO.getReferencingEntityCompletingId()); Boolean isLocalRepo = false; Boolean isDeleted = false; if(excludeInternalRepoReferences) { SiteNodeVO checkedSiteNodeVO = SiteNodeController.getController().getSmallSiteNodeVOWithId(siteNodeId, db); if(registryVO.getReferencingEntityCompletingName().contains("SiteNode")) { SiteNodeVO referencingSiteNodeVO = SiteNodeController.getController().getSmallSiteNodeVOWithId(new Integer(registryVO.getReferencingEntityCompletingId()), db); if(checkedSiteNodeVO == null || referencingSiteNodeVO == null) continue; if(checkedSiteNodeVO.getRepositoryId().intValue() == referencingSiteNodeVO.getRepositoryId().intValue()) isLocalRepo = true; if(checkedSiteNodeVO.getIsDeleted()) isDeleted = true; SiteNodeVersionVO siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(new Integer(registryVO.getReferencingEntityId()), db); SiteNodeVersionVO latestSNVVOForReferencingContent = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(db, referencingSiteNodeVO.getId()); boolean isLatest = (siteNodeVersion.getId().intValue() == latestSNVVOForReferencingContent.getId().intValue()); if(!isLatest || isDeleted) { continue; } } else if(registryVO.getReferencingEntityCompletingName().contains("Content")) { ContentVO referencingContentVO = ContentController.getContentController().getSmallContentVOWithId(new Integer(registryVO.getReferencingEntityCompletingId()), db); if(checkedSiteNodeVO == null || referencingContentVO == null) continue; if(checkedSiteNodeVO.getRepositoryId().intValue() == referencingContentVO.getRepositoryId().intValue()) isLocalRepo = true; if(checkedSiteNodeVO.getIsDeleted()) isDeleted = true; ContentVersionVO contentVersion = ContentVersionController.getContentVersionController().getContentVersionVOWithId(new Integer(registryVO.getReferencingEntityId()), db); ContentVersionVO latestCVVOForReferencingContent = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(referencingContentVO.getId(), contentVersion.getLanguageId(), db); boolean isLatest = (contentVersion.getId().intValue() == latestCVVOForReferencingContent.getId().intValue()); if(!isLatest || isDeleted) { continue; } } } if(!isLocalRepo) { ReferenceBean referenceBean = getReferenceBeanFromRegistryVO(registryVO, entries, checkedLanguageVersions, onlyLatestVersion, onlyOneVersionPerLanguage, db); if (referenceBean != null) { referenceBeanList.add(referenceBean); } } } catch(Exception e) { logger.warn("No reference:" + registryVO.getId() + " had deleted relation - skipping."); } } Iterator<ReferenceBean> i = referenceBeanList.iterator(); while(i.hasNext()) { ReferenceBean referenceBean = i.next(); if(referenceBean.getVersions().size() == 0) i.remove(); } return referenceBeanList; } private ReferenceBean getReferenceBeanFromRegistryVO(RegistryVO registryVO, Map<String, ReferenceBean> entries, Map<String,Boolean> checkedLanguageVersions, boolean onlyLatestVersion, boolean onlyOneVersionPerLanguage, Database db) { ReferenceBean result = null; boolean add = true; String key = "" + registryVO.getReferencingEntityCompletingName() + "_" + registryVO.getReferencingEntityCompletingId(); ReferenceBean existingReferenceBean = (ReferenceBean)entries.get(key); if(existingReferenceBean == null) { existingReferenceBean = new ReferenceBean(); logger.info("Adding referenceBean to entries with key:" + key); entries.put(key, existingReferenceBean); result = existingReferenceBean; } else if (logger.isDebugEnabled()) { logger.info("Already had ReferenceBean for key: " + key); } ReferenceVersionBean referenceVersionBean = new ReferenceVersionBean(); if(registryVO.getReferencingEntityName().indexOf("Content") > -1) { try { logger.info("RegistryVO references Content"); ContentVersionVO contentVersion = null; try { contentVersion = ContentVersionController.getContentVersionController().getContentVersionVOWithId(new Integer(registryVO.getReferencingEntityId()), db); } catch(Exception ex) { add = false; result = null; logger.info("content:" + registryVO.getReferencingEntityId() + " did not exist - skipping.."); } if (contentVersion != null) { if (!contentVersion.getIsActive()) { add = false; logger.info("ContentVersion was not active. Will not add to reference list. ContentVersion.id: " + contentVersion.getContentVersionId()); } else { ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentVersion.getContentId(), db); if (contentVO.getIsDeleted()) { add = false; logger.info("Content is deleted. Will not add to reference list. Content.id: " + contentVO.getContentId()); } else { Boolean hasVersion = checkedLanguageVersions.get("" + contentVersion.getContentId() + "_" + contentVersion.getLanguageId()); if(hasVersion != null && onlyOneVersionPerLanguage) { add = false; //referenceBeanList.remove(existingReferenceBean); } else if (onlyLatestVersion) { ContentVersionVO latestContentVersion = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentVersion.getContentId(), contentVersion.getLanguageId(), ContentVersionVO.WORKING_STATE, db); if (logger.isDebugEnabled()) { logger.info("Latest version in working state for content.id: " + contentVersion.getContentId() + ". latestContentVersion.id: " + (latestContentVersion == null ? "null" : latestContentVersion.getContentVersionId())); } if (latestContentVersion != null && latestContentVersion.getContentVersionId().intValue() != contentVersion.getContentVersionId().intValue()) { logger.debug("ContentVersion was not latest version. Will not add. ContentVersion-Id: " + contentVersion.getId()); add = false; } } if (add) { existingReferenceBean.setName(contentVO.getName()); existingReferenceBean.setPath(ContentController.getContentController().getContentPath(contentVO.getContentId(), false, true, db)); existingReferenceBean.setReferencingCompletingObject(contentVO); String contactPersonEmail = getContactPersonEmail(contentVO, db); existingReferenceBean.setContactPersonEmail(contactPersonEmail); contentVersion.setLanguageName(LanguageController.getController().getLanguageVOWithId(contentVersion.getLanguageId(), db).getName()); referenceVersionBean.setReferencingObject(contentVersion); referenceVersionBean.getRegistryVOList().add(registryVO); checkedLanguageVersions.put("" + contentVersion.getContentId() + "_" + contentVersion.getLanguageId(), new Boolean(true)); } } } } } catch(Exception ex) { add = false; result = null; logger.error("Error when creating reference bean from Registry entry for Content. Message: " + ex.getMessage() + ". Class: " + ex.getClass()); logger.warn("Error when creating reference bean from Registry entry for Content.", ex); } } else { try { logger.debug("RegistryVO references SiteNode"); SiteNodeVersionVO siteNodeVersion = null; try { siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(new Integer(registryVO.getReferencingEntityId()), db); } catch (Exception ex) { add = false; result = null; logger.info("siteNode:" + registryVO.getReferencingEntityId() + " did not exist - skipping.."); } if (siteNodeVersion != null) { logger.info("siteNodeVersion:" + siteNodeVersion); if (!siteNodeVersion.getIsActive()) { add = false; logger.debug("SiteNodeVersion was not active. Will not add to reference list. SiteNodeVersion.id: " + siteNodeVersion.getSiteNodeVersionId()); } else { SiteNodeVO siteNodeVO = SiteNodeController.getSiteNodeVOWithId(siteNodeVersion.getSiteNodeId(), db); if (siteNodeVO.getIsDeleted()) { add = false; logger.debug("SiteNode is deleted. Will not add to reference list. Content.id: " + siteNodeVO.getSiteNodeId()); } else { if (onlyLatestVersion) { SiteNodeVersionVO latestSiteNodeVersion = SiteNodeVersionController.getController().getLatestActiveSiteNodeVersionVO(db, siteNodeVersion.getSiteNodeId(), SiteNodeVersionVO.WORKING_STATE); if (latestSiteNodeVersion != null && latestSiteNodeVersion.getSiteNodeVersionId() != siteNodeVersion.getSiteNodeVersionId()) { logger.debug("ContentVersion was not latest version. Will not add. ContentVersion-Id: " + siteNodeVersion.getId()); add = false; } } if (add) { existingReferenceBean.setName(siteNodeVO.getName()); existingReferenceBean.setPath(SiteNodeController.getController().getSiteNodePath(siteNodeVO, false, true, db)); existingReferenceBean.setReferencingCompletingObject(siteNodeVO); referenceVersionBean.setReferencingObject(siteNodeVersion); String contactPersonEmail = getContactPersonEmail(siteNodeVO, db); existingReferenceBean.setContactPersonEmail(contactPersonEmail); referenceVersionBean.getRegistryVOList().add(registryVO); } } } } } catch(Exception ex) { add = false; result = null; logger.error("Error when creating reference bean from Registry entry for SiteNode. Message: " + ex.getMessage() + ". Class: " + ex.getClass()); logger.warn("Error when creating reference bean from Registry entry for SiteNode.", ex); } } if(add) { boolean exists = false; ReferenceVersionBean existingReferenceVersionBean = null; Iterator<ReferenceVersionBean> versionsIterator = existingReferenceBean.getVersions().iterator(); while(versionsIterator.hasNext()) { existingReferenceVersionBean = (ReferenceVersionBean)versionsIterator.next(); if(existingReferenceVersionBean.getReferencingObject().equals(referenceVersionBean.getReferencingObject())) { exists = true; break; } } if(!exists) existingReferenceBean.getVersions().add(referenceVersionBean); else existingReferenceVersionBean.getRegistryVOList().add(registryVO); logger.debug("Number of versions: " + existingReferenceBean.getVersions()); } return result; } public List<RegistryVO> getMatchingRegistryVOList(String entityName, String entityId, int maxRows) throws SystemException, Exception { List<RegistryVO> matchingRegistryVOList = new ArrayList<RegistryVO>(); Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); matchingRegistryVOList = getMatchingRegistryVOList(entityName, entityId, maxRows, db); commitTransaction(db); } catch (Exception e) { logger.warn("One of the references was not found which is bad but not critical:" + e.getMessage(), e); rollbackTransaction(db); } return matchingRegistryVOList; } /** * Gets matching references */ /* public List<RegistryVO> getMatchingRegistryVOList(String entityName, String entityId, int maxRows, Database db) throws SystemException, Exception { List<RegistryVO> matchingRegistryVOList = new ArrayList<RegistryVO>(); String SQL = "CALL SQL select registryId, entityName, entityid, referencetype, referencingentityname, referencingentityid, referencingentitycomplname, referencingentitycomplid from cmRegistry r where r.entityName = $1 AND r.entityId = $2 AS org.infoglue.cms.entities.management.impl.simple.RegistryImpl"; if(maxRows > 0) { if(CmsPropertyHandler.getDatabaseEngine().equalsIgnoreCase("mysql")) SQL = "CALL SQL select registryId, entityName, entityid, referencetype, referencingentityname, referencingentityid, referencingentitycomplname, referencingentitycomplid from cmRegistry r where r.entityName = $1 AND r.entityId = $2 LIMIT " + maxRows + " AS org.infoglue.cms.entities.management.impl.simple.RegistryImpl"; else if(CmsPropertyHandler.getDatabaseEngine().equalsIgnoreCase("oracle")) SQL = "CALL SQL select * from (select registryId, entityName, entityid, referencetype, referencingentityname, referencingentityid, referencingentitycomplname, referencingentitycomplid from cmRegistry r where r.entityName = $1 AND r.entityId = $2) where rownum <= " + maxRows + " AS org.infoglue.cms.entities.management.impl.simple.RegistryImpl"; else if(CmsPropertyHandler.getDatabaseEngine().equalsIgnoreCase("sqlserver")) SQL = "CALL SQL select top " + maxRows + " registryId, entityName, entityid, referencetype, referencingentityname, referencingentityid, referencingentitycomplname, referencingentitycomplid from cmRegistry r where r.entityName = $1 AND r.entityId = $2 AS org.infoglue.cms.entities.management.impl.simple.RegistryImpl"; } OQLQuery oql = db.getOQLQuery(SQL); //OQLQuery oql = db.getOQLQuery("SELECT r FROM org.infoglue.cms.entities.management.impl.simple.RegistryImpl r WHERE r.entityName = $1 AND r.entityId = $2 ORDER BY r.registryId"); oql.bind(entityName); oql.bind(entityId); QueryResults results = oql.execute(Database.READONLY); int i = 0; while (results.hasMore() && (maxRows == -1 || i < maxRows)) { Registry registry = (Registry)results.next(); RegistryVO registryVO = registry.getValueObject(); matchingRegistryVOList.add(registryVO); i++; } results.close(); oql.close(); return matchingRegistryVOList; } */ /** * Gets matching references through downright JDBC */ public List<RegistryVO> getMatchingRegistryVOList(String entityName, String entityId, int maxRows, Database db) throws SystemException, Exception { List<RegistryVO> matchingRegistryVOList = new ArrayList<RegistryVO>(); String SQL = "select registryId, entityName, entityId, referenceType, referencingEntityName, referencingEntityId, referencingEntityComplName, referencingEntityComplId from cmRegistry r where r.entityName = ? AND r.entityId = ?"; if(maxRows > 0) { if(CmsPropertyHandler.getDatabaseEngine().equalsIgnoreCase("mysql")) SQL = "select registryId, entityName, entityId, referenceType, referencingEntityName, referencingEntityId, referencingEntityComplName, referencingEntityComplId from cmRegistry r where r.entityName = ? AND r.entityId = ? LIMIT " + maxRows + ""; else if(CmsPropertyHandler.getDatabaseEngine().equalsIgnoreCase("oracle")) SQL = "select * from (select registryId, entityName, entityId, referenceType, referencingEntityName, referencingEntityId, referencingEntityComplName, referencingEntityComplId from cmRegistry r where r.entityName = ? AND r.entityId = ?) where rownum <= " + maxRows + ""; else if(CmsPropertyHandler.getDatabaseEngine().equalsIgnoreCase("sqlserver")) SQL = "select top " + maxRows + " registryId, entityName, entityId, referenceType, referencingEntityName, referencingEntityId, referencingEntityComplName, referencingEntityComplId from cmRegistry r where r.entityName = ? AND r.entityId = ?"; } Connection conn = (Connection) db.getJdbcConnection(); PreparedStatement psmt = conn.prepareStatement(SQL.toString()); psmt.setString(1, entityName); psmt.setString(2, entityId); ResultSet rs = psmt.executeQuery(); int i = 0; while (rs.next() && (maxRows == -1 || i < maxRows)) { RegistryVO registryVO = new RegistryVO(); registryVO.setRegistryId(rs.getInt("registryId")); registryVO.setEntityName(rs.getString("entityName")); registryVO.setEntityId(rs.getString("entityId")); registryVO.setReferenceType(rs.getInt("referenceType")); registryVO.setReferencingEntityName(rs.getString("referencingEntityName")); registryVO.setReferencingEntityId(rs.getString("referencingEntityId")); registryVO.setReferencingEntityCompletingName(rs.getString("referencingEntityComplName")); registryVO.setReferencingEntityCompletingId(rs.getString("referencingEntityComplId")); matchingRegistryVOList.add(registryVO); i++; } rs.close(); psmt.close(); return matchingRegistryVOList; } /** * Gets matching references */ public Map<String,Set<SiteNodeVO>> getContentSiteNodeVOListMap(String entityName, String[] entityIds, int maxRows, Database db) throws SystemException, Exception { //Timer t = new Timer(); Map<String,Set<SiteNodeVO>> contentSiteNodeVOListMap = new HashMap<String,Set<SiteNodeVO>>(); Map<String,Set<Integer>> contentSiteNodeIdListMap = new HashMap<String,Set<Integer>>(); Set<Integer> siteNodeIds = new HashSet<Integer>(); int startIndex = 0; int endIndex = (entityIds.length > 100 ? 100 : entityIds.length); String[] partOfEntityIds = Arrays.copyOfRange(entityIds, 0, endIndex); while(partOfEntityIds != null && partOfEntityIds.length > 0) { StringBuilder variables = new StringBuilder(); for(int i=0; i<partOfEntityIds.length; i++) variables.append("$" + (i+2) + (i+1!=partOfEntityIds.length ? "," : "")); //logger.info("partOfEntityIds:" + partOfEntityIds.length); //logger.info("variables:" + variables); String SQL = "CALL SQL select registryid, entityname, entityid, referencetype, referencingentityname, referencingentityid, referencingentitycomplname, referencingentitycomplid from cmRegistry r where r.entityName = $1 AND entityid IN (" + variables + ") AND r.registryid = (select max(registryId) from cmregistry where entityName = r.entityName AND entityid = r.entityId) ORDER BY r.registryId AS org.infoglue.cms.entities.management.impl.simple.RegistryImpl"; //System.out.println("SQL:" + SQL); OQLQuery oql = db.getOQLQuery(SQL); //OQLQuery oql = db.getOQLQuery("SELECT r FROM org.infoglue.cms.entities.management.impl.simple.RegistryImpl r WHERE r.entityName = $1 AND r.entityId IN LIST(" + variables + ") ORDER BY r.registryId"); oql.bind(entityName); for(String entityId : partOfEntityIds) { //System.out.print("'" + entityId + "',"); oql.bind(entityId); } //t.printElapsedTime("bindings done"); QueryResults results = oql.execute(Database.READONLY); //t.printElapsedTime("results"); int i = 0; while (results.hasMore() && (maxRows == -1 || i < maxRows)) { Registry registry = (Registry)results.next(); RegistryVO registryVO = registry.getValueObject(); if(registryVO.getReferencingEntityCompletingName().indexOf("SiteNode") > -1) { try { Set<Integer> existingSiteNodeIds = contentSiteNodeIdListMap.get("" + registryVO.getEntityId()); if(existingSiteNodeIds == null) { existingSiteNodeIds = new HashSet<Integer>(); contentSiteNodeIdListMap.put("" + registryVO.getEntityId(), existingSiteNodeIds); } siteNodeIds.add(new Integer(registryVO.getReferencingEntityCompletingId())); //SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(new Integer(registryVO.getReferencingEntityCompletingId()), db); existingSiteNodeIds.add(new Integer(registryVO.getReferencingEntityCompletingId())); } catch (Exception e) { logger.error("Error getting related sitenode:" + e.getMessage()); } } i++; } results.close(); oql.close(); startIndex = endIndex+1; endIndex = (entityIds.length > startIndex+100 ? startIndex + 100 : entityIds.length - 1); if(startIndex >= endIndex) partOfEntityIds = null; else partOfEntityIds = Arrays.copyOfRange(entityIds, startIndex, endIndex); } //t.printElapsedTime("after registry pullout:" + siteNodeIds.size()); Map<Integer,SiteNodeVO> siteNodeVOMap = SiteNodeController.getController().getSiteNodeVOMap(siteNodeIds.toArray(new Integer[siteNodeIds.size()]), db); //t.printElapsedTime("siteNodeVOMap:" + siteNodeVOMap.size()); for(String contentId : contentSiteNodeIdListMap.keySet()) { Set<Integer> contentSiteNodeIds = contentSiteNodeIdListMap.get(contentId); for(Integer siteNodeId : contentSiteNodeIds) { SiteNodeVO sn = siteNodeVOMap.get(siteNodeId); Set<SiteNodeVO> existingSiteNodeVOList = contentSiteNodeVOListMap.get("" + siteNodeId); if(existingSiteNodeVOList == null) { existingSiteNodeVOList = new HashSet<SiteNodeVO>(); contentSiteNodeVOListMap.put("" + contentId, existingSiteNodeVOList); } existingSiteNodeVOList.add(sn); } } //t.printElapsedTime("contentSiteNodeVOListMap:" + contentSiteNodeVOListMap.size()); return contentSiteNodeVOListMap; } public List getReferencedObjects(String referencingEntityName, String referencingEntityId) throws SystemException, Exception { return getReferencedObjects(referencingEntityName, referencingEntityId, false); } public List getReferencedObjects(String referencingEntityName, String referencingEntityId, boolean excludeComponents) throws SystemException, Exception { List result = new ArrayList(); Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); List registryVOList = getMatchingRegistryVOListForReferencingEntity(referencingEntityName, referencingEntityId, db); Iterator i = registryVOList.iterator(); while(i.hasNext()) { RegistryVO registryVO = (RegistryVO)i.next(); if(registryVO.getEntityName().indexOf("Content") > -1) { try { Content content = ContentController.getContentController().getContentWithId(new Integer(registryVO.getEntityId()), db); logger.info("contentVersion:" + content.getContentId()); if (excludeComponents) { ContentTypeDefinitionVO componentTypeDefinitionVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithName("HTMLTemplate"); if (componentTypeDefinitionVO.getContentTypeDefinitionId() != content.getValueObject().getContentTypeDefinitionId()) { result.add(content.getValueObject()); } } else { result.add(content.getValueObject()); } } catch(Exception e) { logger.info("content:" + registryVO.getEntityId() + " did not exist - skipping.."); } } else if(registryVO.getEntityName().indexOf("SiteNode") > -1) { try { SiteNode siteNode = SiteNodeController.getController().getSiteNodeWithId(new Integer(registryVO.getEntityId()), db); logger.info("siteNode:" + siteNode.getId()); result.add(siteNode.getValueObject()); } catch(Exception e) { logger.info("siteNode:" + registryVO.getEntityId() + " did not exist - skipping.."); } } } commitTransaction(db); } catch (Exception e) { rollbackTransaction(db); throw new SystemException("An error occurred when we tried to fetch which sitenode uses a metainfo. Reason:" + e.getMessage(), e); } return result; } public List getReferencedObjects(String referencingEntityName, String referencingEntityId, Database db) throws SystemException, Exception { return getReferencedObjects(referencingEntityName, referencingEntityId, db, false); } public List getReferencedObjects(String referencingEntityName, String referencingEntityId, Database db, boolean excludeComponents) throws SystemException, Exception { List result = new ArrayList(); List registryVOList = getMatchingRegistryVOListForReferencingEntity(referencingEntityName, referencingEntityId, db); Iterator i = registryVOList.iterator(); while(i.hasNext()) { RegistryVO registryVO = (RegistryVO)i.next(); if(registryVO.getEntityName().indexOf("Content") > -1) { try { ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(registryVO.getEntityId()), db); logger.info("contentVO:" + contentVO.getId()); if (excludeComponents) { ContentTypeDefinitionVO componentTypeDefinitionVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithName("HTMLTemplate"); if (componentTypeDefinitionVO.getContentTypeDefinitionId() != contentVO.getContentTypeDefinitionId()) { result.add(contentVO); } } else { result.add(contentVO); } } catch(Exception e) { logger.info("content:" + registryVO.getEntityId() + " did not exist - skipping.."); } } else if(registryVO.getEntityName().indexOf("SiteNode") > -1) { try { SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(new Integer(registryVO.getEntityId()), db); logger.info("siteNodeVO:" + siteNodeVO.getId()); result.add(siteNodeVO); } catch(Exception e) { logger.info("siteNode:" + registryVO.getEntityId() + " did not exist - skipping.."); } } } return result; } /** * Gets matching references */ public List getMatchingRegistryVOListForReferencingEntity(String referencingEntityName, String referencingEntityId, Database db) throws SystemException, Exception { String cacheName = "registryCache"; String cacheKey = "" + referencingEntityName + "_" + referencingEntityId; List matchingRegistryVOList = (List)CacheController.getCachedObjectFromAdvancedCache(cacheName, cacheKey); if(matchingRegistryVOList != null) { return matchingRegistryVOList; } else { matchingRegistryVOList = new ArrayList(); OQLQuery oql = db.getOQLQuery("SELECT r FROM org.infoglue.cms.entities.management.impl.simple.RegistryImpl r WHERE r.referencingEntityName = $1 AND r.referencingEntityId = $2 ORDER BY r.registryId"); oql.bind(referencingEntityName); oql.bind(referencingEntityId); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { Registry registry = (Registry)results.next(); RegistryVO registryVO = registry.getValueObject(); //logger.info("found match:" + registryVO.getEntityName() + ":" + registryVO.getEntityId()); matchingRegistryVOList.add(registryVO); } CacheController.cacheObjectInAdvancedCache(cacheName, cacheKey, matchingRegistryVOList, new String[]{""+cacheKey.hashCode()}, true); results.close(); oql.close(); } return matchingRegistryVOList; } /** * Gets matching references */ public List<RegistryVO> getMatchingRegistryVOListForReferencingEntities(String referencingEntityName, List<Integer> referencingEntityIds, Database db, int limit) throws SystemException, Exception { List<RegistryVO> matchingRegistryVOList = new ArrayList<RegistryVO>(); StringBuilder variables = new StringBuilder(); for(int i=0; i<referencingEntityIds.size(); i++) variables.append("$" + (i+2) + (i+1!=referencingEntityIds.size() ? "," : "")); OQLQuery oql = db.getOQLQuery("CALL SQL SELECT registryId, entityName, entityId, referenceType, referencingEntityName, referencingEntityId, referencingEntityComplName, referencingEntityComplId FROM cmRegistry WHERE referencingEntityName = $1 AND referencingEntityId IN (" + variables + ") order by registryId AS org.infoglue.cms.entities.management.impl.simple.RegistryImpl"); oql.bind(referencingEntityName); for(Integer entityId : referencingEntityIds) oql.bind(entityId.toString()); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { Registry registry = (Registry)results.next(); RegistryVO registryVO = registry.getValueObject(); //System.out.println("found match:" + registryVO.getEntityName() + ":" + registryVO.getEntityId()); matchingRegistryVOList.add(registryVO); if(limit > -1 && matchingRegistryVOList.size() > limit) break; } logger.info("matchingRegistryVOList:" + matchingRegistryVOList.size()); results.close(); oql.close(); return matchingRegistryVOList; } /** * Gets matching references */ public void clearRegistryVOList(String referencingEntityName, String referencingEntityId) throws SystemException, Exception { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); OQLQuery oql = db.getOQLQuery("SELECT r FROM org.infoglue.cms.entities.management.impl.simple.RegistryImpl r WHERE r.referencingEntityName = $1 AND r.referencingEntityId = $2 ORDER BY r.registryId"); oql.bind(referencingEntityName); oql.bind(referencingEntityId); QueryResults results = oql.execute(); while (results.hasMore()) { Registry registry = (Registry)results.next(); //System.out.println("Removing registry:" + registry.getRegistryId()); db.remove(registry); } results.close(); oql.close(); commitTransaction(db); } catch (Exception e) { rollbackTransaction(db); throw new SystemException("An error occurred when we tried to fetch which sitenode uses a metainfo. Reason:" + e.getMessage(), e); } } /** * Gets matching references */ public void clearRegistryVOList(String referencingEntityName, String referencingEntityId, Database db) throws SystemException, Exception { OQLQuery oql = db.getOQLQuery("SELECT r FROM org.infoglue.cms.entities.management.impl.simple.RegistryImpl r WHERE r.referencingEntityName = $1 AND r.referencingEntityId = $2 ORDER BY r.registryId"); oql.bind(referencingEntityName); oql.bind(referencingEntityId); QueryResults results = oql.execute(); while (results.hasMore()) { Registry registry = (Registry)results.next(); //System.out.println("Removing registry:" + registry.getRegistryId()); db.remove(registry); } results.close(); oql.close(); } /** * Gets matching references */ public void clearRegistryForReferencedEntity(String entityName, String entityId) throws SystemException, Exception { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); OQLQuery oql = db.getOQLQuery("SELECT r FROM org.infoglue.cms.entities.management.impl.simple.RegistryImpl r WHERE r.entityName = $1 AND r.entityId = $2 ORDER BY r.registryId"); oql.bind(entityName); oql.bind(entityId); QueryResults results = oql.execute(); while (results.hasMore()) { Registry registry = (Registry)results.next(); db.remove(registry); } results.close(); oql.close(); commitTransaction(db); } catch (Exception e) { logger.warn("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); } } /** * Gets matching references */ public void clearRegistryForReferencingEntityCompletingName(String entityCompletingName, String entityCompletingId) throws SystemException, Exception { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); OQLQuery oql = db.getOQLQuery("SELECT r FROM org.infoglue.cms.entities.management.impl.simple.RegistryImpl r WHERE r.referencingEntityCompletingName = $1 AND r.referencingEntityCompletingId = $2 ORDER BY r.registryId"); oql.bind(entityCompletingName); oql.bind(entityCompletingId); QueryResults results = oql.execute(); while (results.hasMore()) { Registry registry = (Registry)results.next(); db.remove(registry); } results.close(); oql.close(); commitTransaction(db); } catch (Exception e) { logger.warn("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); } } /** * Gets matching references */ public void clearRegistryForReferencingEntityName(String entityName, String entityId) throws SystemException, Exception { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); OQLQuery oql = db.getOQLQuery("SELECT r FROM org.infoglue.cms.entities.management.impl.simple.RegistryImpl r WHERE r.referencingEntityName = $1 AND r.referencingEntityId = $2 ORDER BY r.registryId"); oql.bind(entityName); oql.bind(entityId); QueryResults results = oql.execute(); while (results.hasMore()) { Registry registry = (Registry)results.next(); db.remove(registry); } results.close(); oql.close(); commitTransaction(db); } catch (Exception e) { logger.warn("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); } } /** * Gets matching references */ public void clearRegistryForReferencingEntityName(String entityName, String entityId, Database db) throws SystemException, Exception { OQLQuery oql = db.getOQLQuery("SELECT r FROM org.infoglue.cms.entities.management.impl.simple.RegistryImpl r WHERE r.referencingEntityName = $1 AND r.referencingEntityId = $2 ORDER BY r.registryId"); oql.bind(entityName); oql.bind(entityId); QueryResults results = oql.execute(); while (results.hasMore()) { Registry registry = (Registry)results.next(); db.remove(registry); } results.close(); oql.close(); } /** * Clears all references to a entity */ /* public void clearRegistryForReferencedEntity(String entityName, String entityId) throws SystemException, Exception { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); OQLQuery oql = db.getOQLQuery("DELETE FROM org.infoglue.cms.entities.management.impl.simple.RegistryImpl r WHERE r.entityName = $1 AND r.entityId = $2"); oql.bind(entityName); oql.bind(entityId); QueryResults results = oql.execute(); commitTransaction(db); } catch (Exception e) { logger.warn("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); } } */ /** * Gets siteNodeVersions which uses the metainfo */ /* public List getSiteNodeVersionsWhichUsesContentVersionAsMetaInfo(ContentVersion contentVersion, Database db) throws SystemException, Exception { List siteNodeVersions = new ArrayList(); OQLQuery oql = db.getOQLQuery("SELECT snv FROM org.infoglue.cms.entities.structure.impl.simple.SiteNodeVersionImpl snv WHERE snv.serviceBindings.availableServiceBinding.name = $1 AND snv.serviceBindings.bindingQualifyers.name = $2 AND snv.serviceBindings.bindingQualifyers.value = $3"); oql.bind("Meta information"); oql.bind("contentId"); oql.bind(contentVersion.getOwningContent().getId()); QueryResults results = oql.execute(); this.logger.info("Fetching entity in read/write mode"); while (results.hasMore()) { SiteNodeVersion siteNodeVersion = (SiteNodeVersion)results.next(); siteNodeVersions.add(siteNodeVersion); //logger.info("siteNodeVersion:" + siteNodeVersion.getId()); } results.close(); oql.close(); return siteNodeVersions; } */ /** * Gets siteNodeVersions which uses the metainfo */ public SiteNodeVersion getLatestActiveSiteNodeVersionWhichUsesContentVersionAsMetaInfo(ContentVersion contentVersion, Database db) throws SystemException, Exception { SiteNodeVersion siteNodeVersion = null; OQLQuery oql = db.getOQLQuery("SELECT snv FROM org.infoglue.cms.entities.structure.impl.simple.SiteNodeVersionImpl snv WHERE snv.owningSiteNode.metaInfoContentId = $1 AND snv.isActive = $2 ORDER BY snv.siteNodeVersionId desc"); oql.bind(contentVersion.getValueObject().getContentId()); oql.bind(new Boolean(true)); /* OQLQuery oql = db.getOQLQuery("SELECT snv FROM org.infoglue.cms.entities.structure.impl.simple.SiteNodeVersionImpl snv WHERE snv.serviceBindings.availableServiceBinding.name = $1 AND snv.serviceBindings.bindingQualifyers.name = $2 AND snv.serviceBindings.bindingQualifyers.value = $3 AND snv.isActive = $4 ORDER BY snv.siteNodeVersionId desc"); oql.bind("Meta information"); oql.bind("contentId"); oql.bind(contentVersion.getOwningContent().getId()); oql.bind(new Boolean(true)); */ QueryResults results = oql.execute(); this.logger.info("Fetching entity in read/write mode"); if (results.hasMore()) { siteNodeVersion = (SiteNodeVersion)results.next(); } results.close(); oql.close(); return siteNodeVersion; } private static ThreadLocal<List<String[]>> clearRegistryForReferencingEntityNameQueue = new ThreadLocal<List<String[]>>() { protected List<String[]> initialValue() { return new ArrayList<String[]>(); } }; /** * this method goes through all inline stuff and all relations if ordinary content * and all components and bindings if a metainfo. All in a threaded matter. * * @param contentVersionVO * @param contentVersionVO * @throws Exception */ public void clearRegistryForReferencingEntityNameThreaded(String entityName, String entityId) throws Exception { clearRegistryForReferencingEntityNameQueue.get().add(new String[]{entityName, entityName}); } public void rebuildRepositoryRegistry(Database db, Integer repositoryId) throws Exception { //Checks the relations from sitenodes List<SiteNodeVO> siteNodeVOList = SiteNodeController.getController().getRepositorySiteNodeVOList(repositoryId, db); Iterator<SiteNodeVO> siteNodesIterator = siteNodeVOList.iterator(); while(siteNodesIterator.hasNext()) { SiteNodeVO siteNodeVO = (SiteNodeVO)siteNodesIterator.next(); logger.info("Going to index all versions of " + siteNodeVO.getName()); List<SiteNodeVersionVO> versions = SiteNodeVersionController.getController().getSiteNodeVersionVOList(db, siteNodeVO.getId()); Iterator<SiteNodeVersionVO> siteNodeVersionsIterator = versions.iterator(); while(siteNodeVersionsIterator.hasNext()) { SiteNodeVersionVO siteNodeVersionVO = siteNodeVersionsIterator.next(); updateSiteNodeVersion(siteNodeVersionVO, db); } } //Checks the relations from contents List<ContentVO> contents = ContentController.getContentController().getRepositoryContentVOList(repositoryId, db); Iterator<ContentVO> iterator = contents.iterator(); while(iterator.hasNext()) { ContentVO content = iterator.next(); logger.info("Going to index all version of " + content.getName()); List<ContentVersionVO> versions = ContentVersionController.getContentVersionController().getContentVersionVOList(content.getId(), db); Iterator<ContentVersionVO> versionsIterator = versions.iterator(); while(versionsIterator.hasNext()) { ContentVersionVO contentVersionVO = versionsIterator.next(); updateContentVersion(contentVersionVO, db); } } } }