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