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}