001/* 002 * (C) Copyright 2006-2012 Nuxeo SA (http://nuxeo.com/) and others. 003 * 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser General Public License 006 * (LGPL) version 2.1 which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/lgpl-2.1.html 008 * 009 * This library is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * Contributors: 015 * Thomas Roger <troger@nuxeo.com> 016 */ 017 018package org.nuxeo.ecm.quota; 019 020import static org.nuxeo.ecm.core.api.LifeCycleConstants.TRANSITION_EVENT; 021import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.ABOUT_TO_REMOVE; 022import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.ABOUT_TO_REMOVE_VERSION; 023import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.BEFORE_DOC_RESTORE; 024import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.BEFORE_DOC_UPDATE; 025import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_CHECKEDIN; 026import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_CHECKEDOUT; 027import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_CREATED; 028import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_CREATED_BY_COPY; 029import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_MOVED; 030import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_RESTORED; 031import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_UPDATED; 032 033import java.util.ArrayList; 034import java.util.List; 035 036import org.apache.commons.logging.Log; 037import org.apache.commons.logging.LogFactory; 038import org.nuxeo.ecm.core.api.CoreSession; 039import org.nuxeo.ecm.core.api.DocumentModel; 040import org.nuxeo.ecm.core.api.DocumentRef; 041import org.nuxeo.ecm.core.api.VersioningOption; 042import org.nuxeo.ecm.core.api.event.CoreEventConstants; 043import org.nuxeo.ecm.core.event.Event; 044import org.nuxeo.ecm.core.event.impl.DocumentEventContext; 045import org.nuxeo.ecm.core.versioning.VersioningService; 046import org.nuxeo.ecm.quota.size.QuotaExceededException; 047 048/** 049 * Abstract class implementing {@code QuotaStatsUpdater} to handle common cases. 050 * <p> 051 * Provides abstract methods to override for common events. 052 * 053 * @author <a href="mailto:troger@nuxeo.com">Thomas Roger</a> 054 * @since 5.5 055 */ 056public abstract class AbstractQuotaStatsUpdater implements QuotaStatsUpdater { 057 058 protected String name; 059 060 protected String label; 061 062 protected String descriptionLabel; 063 064 protected static Log log = LogFactory.getLog(AbstractQuotaStatsUpdater.class); 065 066 @Override 067 public void setName(String name) { 068 this.name = name; 069 } 070 071 @Override 072 public String getName() { 073 return name; 074 } 075 076 @Override 077 public void setLabel(String label) { 078 this.label = label; 079 } 080 081 @Override 082 public String getLabel() { 083 return label; 084 } 085 086 @Override 087 public void setDescriptionLabel(String descriptionLabel) { 088 this.descriptionLabel = descriptionLabel; 089 } 090 091 @Override 092 public String getDescriptionLabel() { 093 return descriptionLabel; 094 } 095 096 @Override 097 public void updateStatistics(CoreSession session, DocumentEventContext docCtx, Event event) { 098 DocumentModel doc = docCtx.getSourceDocument(); 099 100 if (!needToProcessEventOnDocument(event, doc)) { 101 log.debug("Exit Listener !!!!"); 102 return; 103 } 104 105 String eventName = event.getName(); 106 107 try { 108 if (DOCUMENT_CREATED.equals(eventName)) { 109 processDocumentCreated(session, doc, docCtx); 110 } else if (ABOUT_TO_REMOVE.equals(eventName) || ABOUT_TO_REMOVE_VERSION.equals(eventName)) { 111 processDocumentAboutToBeRemoved(session, doc, docCtx); 112 } else if (DOCUMENT_CREATED_BY_COPY.equals(eventName)) { 113 processDocumentCopied(session, doc, docCtx); 114 } else if (DOCUMENT_MOVED.equals(eventName)) { 115 DocumentRef sourceParentRef = (DocumentRef) docCtx.getProperty(CoreEventConstants.PARENT_PATH); 116 DocumentModel sourceParent = session.getDocument(sourceParentRef); 117 processDocumentMoved(session, doc, sourceParent, docCtx); 118 } else if (DOCUMENT_UPDATED.equals(eventName)) { 119 processDocumentUpdated(session, doc, docCtx); 120 } else if (BEFORE_DOC_UPDATE.equals(eventName)) { 121 processDocumentBeforeUpdate(session, doc, docCtx); 122 } else if (TRANSITION_EVENT.equals(eventName)) { 123 processDocumentTrashOp(session, doc, docCtx); 124 } else if (DOCUMENT_CHECKEDIN.equals(eventName)) { 125 processDocumentCheckedIn(session, doc, docCtx); 126 } else if (DOCUMENT_CHECKEDOUT.equals(eventName)) { 127 processDocumentCheckedOut(session, doc, docCtx); 128 } else if (DOCUMENT_RESTORED.equals(eventName)) { 129 processDocumentRestored(session, doc, docCtx); 130 } else if (BEFORE_DOC_RESTORE.equals(eventName)) { 131 processDocumentBeforeRestore(session, doc, docCtx); 132 } 133 } catch (QuotaExceededException e) { 134 handleQuotaExceeded(e, event); 135 throw e; 136 } 137 } 138 139 protected List<DocumentModel> getAncestors(CoreSession session, DocumentModel doc) { 140 List<DocumentModel> ancestors = new ArrayList<DocumentModel>(); 141 if (doc != null && doc.getParentRef() != null) { 142 doc = session.getDocument(doc.getParentRef()); 143 while (doc != null && !doc.getPath().isRoot()) { 144 ancestors.add(doc); 145 doc = session.getDocument(doc.getParentRef()); 146 } 147 } 148 return ancestors; 149 } 150 151 protected abstract void handleQuotaExceeded(QuotaExceededException e, Event event); 152 153 protected abstract boolean needToProcessEventOnDocument(Event event, DocumentModel targetDoc); 154 155 protected abstract void processDocumentCreated(CoreSession session, DocumentModel doc, DocumentEventContext docCtx); 156 157 protected abstract void processDocumentCopied(CoreSession session, DocumentModel doc, DocumentEventContext docCtx); 158 159 protected abstract void processDocumentCheckedIn(CoreSession session, DocumentModel doc, DocumentEventContext docCtx); 160 161 protected abstract void processDocumentCheckedOut(CoreSession session, DocumentModel doc, 162 DocumentEventContext docCtx); 163 164 protected abstract void processDocumentUpdated(CoreSession session, DocumentModel doc, DocumentEventContext docCtx); 165 166 protected abstract void processDocumentMoved(CoreSession session, DocumentModel doc, DocumentModel sourceParent, 167 DocumentEventContext docCtx); 168 169 protected abstract void processDocumentAboutToBeRemoved(CoreSession session, DocumentModel doc, 170 DocumentEventContext docCtx); 171 172 protected abstract void processDocumentBeforeUpdate(CoreSession session, DocumentModel targetDoc, 173 DocumentEventContext docCtx); 174 175 protected abstract void processDocumentTrashOp(CoreSession session, DocumentModel doc, DocumentEventContext docCtx); 176 177 protected abstract void processDocumentRestored(CoreSession session, DocumentModel doc, DocumentEventContext docCtx); 178 179 protected abstract void processDocumentBeforeRestore(CoreSession session, DocumentModel doc, 180 DocumentEventContext docCtx); 181 182}