/* =============================================================================== * * 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.util.Iterator; import java.util.List; import org.apache.log4j.Logger; import org.infoglue.cms.applications.databeans.ProcessBean; import org.infoglue.cms.entities.content.ContentVO; import org.infoglue.cms.entities.kernel.BaseEntityVO; import org.infoglue.cms.entities.management.RepositoryVO; import org.infoglue.cms.entities.structure.SiteNodeVO; import org.infoglue.cms.security.InfoGluePrincipal; import org.infoglue.cms.util.CmsPropertyHandler; /** * This class handles Deleting a repository - by processing it as a thread in a process bean. * * @author Mattias Bogeblad */ public class TrashcanController extends BaseController implements Runnable { public final static Logger logger = Logger.getLogger(TrashcanController.class.getName()); private InfoGluePrincipal principal; private ProcessBean processBean; private String entity; private Integer entityId; private Boolean emptyAll; private Integer repositoryFilter; private Boolean restore = false; private RepositoryVO repositoryVO; private TrashcanController(RepositoryVO repositoryVO, InfoGluePrincipal principal, ProcessBean processBean) { this.principal = principal; this.repositoryVO = repositoryVO; this.processBean = processBean; } private TrashcanController(String entity, Integer entityId, Boolean restore, InfoGluePrincipal principal, ProcessBean processBean) { this.principal = principal; this.entity = entity; this.entityId = entityId; this.restore = restore; this.processBean = processBean; } private TrashcanController(Boolean emptyAll, Integer repositoryFilter, InfoGluePrincipal principal, ProcessBean processBean) { this.principal = principal; this.emptyAll = emptyAll; this.repositoryFilter = repositoryFilter; this.processBean = processBean; } /** * Factory method to get object */ public static void deleteEntity(String entity, Integer entityId, InfoGluePrincipal principal, ProcessBean processBean) throws Exception { TrashcanController trashcanController = new TrashcanController(entity, entityId, false, principal, processBean); Thread thread = new Thread(trashcanController); thread.start(); } public static void restoreEntity(String entity, Integer entityId, InfoGluePrincipal principal, ProcessBean processBean) throws Exception { TrashcanController trashcanController = new TrashcanController(entity, entityId, true, principal, processBean); Thread thread = new Thread(trashcanController); thread.start(); } public static void emptyTrashcan(Integer repositoryFilter, InfoGluePrincipal principal, ProcessBean processBean) throws Exception { TrashcanController trashcanController = new TrashcanController(true, repositoryFilter, principal, processBean); Thread thread = new Thread(trashcanController); thread.start(); } public synchronized void run() { Integer updateEntityId = -1; try { if(!restore) { processBean.updateProcess("Deleting " + (entity == null ? " everything" : entity)); if(repositoryVO != null) { logger.info("Starting Delete Repo Thread...."); try { RepositoryController.getController().delete(this.repositoryVO, true, this.principal, processBean); processBean.setStatus(ProcessBean.FINISHED); } catch (Exception e) { //TODO: Fix this error message better. Support illegal xml-chars processBean.setError("Something went wrong with the import. Please consult the logfiles."); logger.error("Error in monitor:" + e.getMessage(), e); } } else if(entity != null && !entity.equals("") && entityId != null && !entityId.equals("")) { if(entity.equalsIgnoreCase("Repository")) { RepositoryVO repositoryVO = RepositoryController.getController().getRepositoryVOWithId(new Integer(entityId)); RepositoryController.getController().delete(repositoryVO, true, this.principal, processBean); } else if(entity.equalsIgnoreCase("Content")) { ContentController.getContentController().delete(new Integer(entityId), true, this.principal); } else if(entity.equalsIgnoreCase("SiteNode")) { SiteNodeController.getController().delete(new Integer(entityId), true, this.principal); } } else if(emptyAll) { List<RepositoryVO> repositoriesMarkedForDeletion = RepositoryController.getController().getRepositoryVOListMarkedForDeletion(this.principal); Iterator<RepositoryVO> repositoriesMarkedForDeletionIterator = repositoriesMarkedForDeletion.iterator(); while(repositoriesMarkedForDeletionIterator.hasNext()) { RepositoryVO repositoryVO = repositoriesMarkedForDeletionIterator.next(); try { RepositoryController.getController().delete(repositoryVO, true, this.principal, this.processBean); } catch (Exception e) { logger.error("Could not delete repository[" + repositoryVO.getName() + "]:" + e.getMessage()); logger.warn("Could not delete repository[" + repositoryVO.getName() + "]:" + e.getMessage(), e); } } List<ContentVO> contentsMarkedForDeletion = ContentController.getContentController().getContentVOListMarkedForDeletion(this.repositoryFilter, this.principal, repositoriesMarkedForDeletion); List<SiteNodeVO> siteNodesMarkedForDeletion = SiteNodeController.getController().getSiteNodeVOListMarkedForDeletion(this.repositoryFilter, this.principal, repositoriesMarkedForDeletion); Iterator<SiteNodeVO> siteNodesMarkedForDeletionIterator = siteNodesMarkedForDeletion.iterator(); while(siteNodesMarkedForDeletionIterator.hasNext()) { SiteNodeVO siteNodeVO = siteNodesMarkedForDeletionIterator.next(); try { SiteNodeControllerProxy.getSiteNodeControllerProxy().acDelete(this.principal, siteNodeVO, true); } catch (Exception e) { logger.error("Could not delete page[" + siteNodeVO.getName() + "]:" + e.getMessage()); logger.warn("Could not delete page[" + siteNodeVO.getName() + "]:" + e.getMessage(), e); } } Iterator<ContentVO> contentsMarkedForDeletionIterator = contentsMarkedForDeletion.iterator(); while(contentsMarkedForDeletionIterator.hasNext()) { ContentVO contentVO = contentsMarkedForDeletionIterator.next(); try { ContentControllerProxy.getController().acDelete(this.principal, contentVO, true); } catch (Exception e) { logger.error("Could not delete content[" + contentVO.getName() + "]:" + e.getMessage()); logger.warn("Could not delete content[" + contentVO.getName() + "]:" + e.getMessage(), e); } } } } else { if(entity != null && !entity.equals("") && entityId != null && !entityId.equals("")) { if(entity.equalsIgnoreCase("Repository")) { RepositoryController.getController().restoreRepository(new Integer(entityId), this.principal); } else if(entity.equalsIgnoreCase("Content")) { ContentController.getContentController().restoreContent(new Integer(entityId), this.principal); try { updateEntityId = ContentController.getContentController().getContentVOWithId(new Integer(entityId)).getParentContentId(); } catch (Exception e) { logger.error("Error getting parent content for update:" + e.getMessage()); } } else if(entity.equalsIgnoreCase("SiteNode")) { SiteNodeController.getController().restoreSiteNode(new Integer(entityId), this.principal); try { updateEntityId = SiteNodeController.getController().getSiteNodeVOWithId(new Integer(entityId)).getParentSiteNodeId(); } catch (Exception e) { logger.error("Error getting parent page for update:" + e.getMessage()); } } } } processBean.setRedirectUrl("Operation complete..", "" + "Trashcan.action?updateEntityId=" + updateEntityId); processBean.setStatus(ProcessBean.REDIRECTED); } catch (Exception e) { processBean.setError("Something went wrong with the import. Please consult the logfiles."); logger.error("Error in monitor:" + e.getMessage(), e); } } public BaseEntityVO getNewVO() { return null; } }