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}