001/*
002 * Copyright (c) 2006-2011 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 Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     Nuxeo - initial API and implementation
011 *
012 * $Id$
013 */
014package org.nuxeo.ecm.core.management.events;
015
016import java.util.Arrays;
017import java.util.List;
018
019import org.nuxeo.ecm.core.api.LifeCycleConstants;
020import org.nuxeo.ecm.core.api.event.DocumentEventTypes;
021import org.nuxeo.ecm.core.event.EventBundle;
022import org.nuxeo.ecm.core.event.PostCommitEventListener;
023import org.nuxeo.ecm.core.event.impl.ReconnectedEventBundleImpl;
024import org.nuxeo.runtime.management.counters.CounterHelper;
025
026/**
027 * AsyncEventListener that collects events to update the Simon counters
028 *
029 * @author Tiry (tdelprat@nuxeo.com)
030 */
031public class EventCounterListener implements PostCommitEventListener {
032
033    // Counters used
034    public static final String EVENT_CREATE_COUNTER = "org.nuxeo.event.create";
035
036    public static final String EVENT_UPDATE_COUNTER = "org.nuxeo.event.update";
037
038    public static final String EVENT_REMOVE_COUNTER = "org.nuxeo.event.remove";
039
040    // Event tracked
041    protected static final List<String> createEvents = Arrays.asList(new String[] {
042            DocumentEventTypes.DOCUMENT_CREATED, DocumentEventTypes.DOCUMENT_CREATED_BY_COPY,
043            DocumentEventTypes.DOCUMENT_IMPORTED, DocumentEventTypes.DOCUMENT_PROXY_PUBLISHED,
044            DocumentEventTypes.DOCUMENT_PROXY_UPDATED });
045
046    protected static final List<String> updateEvents = Arrays.asList(new String[] {
047            DocumentEventTypes.DOCUMENT_CHECKEDIN, DocumentEventTypes.DOCUMENT_CHECKEDOUT,
048            DocumentEventTypes.DOCUMENT_CHILDREN_ORDER_CHANGED, DocumentEventTypes.DOCUMENT_LOCKED,
049            DocumentEventTypes.DOCUMENT_MOVED, DocumentEventTypes.DOCUMENT_PUBLISHED,
050            DocumentEventTypes.DOCUMENT_SECURITY_UPDATED, DocumentEventTypes.DOCUMENT_UNLOCKED,
051            DocumentEventTypes.DOCUMENT_UPDATED, LifeCycleConstants.TRANSITION_EVENT });
052
053    protected static final List<String> removeEvents = Arrays.asList(new String[] {
054            DocumentEventTypes.DOCUMENT_REMOVED, DocumentEventTypes.VERSION_REMOVED });
055
056    @Override
057    public void handleEvent(EventBundle events) {
058        if (events instanceof ReconnectedEventBundleImpl) {
059            ReconnectedEventBundleImpl bundle = (ReconnectedEventBundleImpl) events;
060            updateCounters(bundle.getEventNames());
061        }
062    }
063
064    protected void updateCounters(List<String> eventNames) {
065
066        int created = 0;
067        int updated = 0;
068        int removed = 0;
069
070        for (String eventName : eventNames) {
071            if (createEvents.contains(eventName)) {
072                created += 1;
073            } else if (updateEvents.contains(eventName)) {
074                updated += 1;
075            } else if (removeEvents.contains(eventName)) {
076                removed += 1;
077            }
078        }
079
080        if (created > 0) {
081            CounterHelper.increaseCounter(EVENT_CREATE_COUNTER, created);
082        }
083        if (updated > 0) {
084            CounterHelper.increaseCounter(EVENT_UPDATE_COUNTER, updated);
085        }
086        if (removed > 0) {
087            CounterHelper.increaseCounter(EVENT_REMOVE_COUNTER, removed);
088        }
089    }
090
091}