001package org.nuxeo.segment.io.listener;
002
003import java.io.Serializable;
004import java.security.Principal;
005import java.util.ArrayList;
006import java.util.HashMap;
007import java.util.List;
008import java.util.Map;
009
010import org.apache.commons.logging.Log;
011import org.apache.commons.logging.LogFactory;
012import org.nuxeo.ecm.core.api.NuxeoPrincipal;
013import org.nuxeo.ecm.core.event.Event;
014import org.nuxeo.ecm.core.event.EventBundle;
015import org.nuxeo.ecm.core.event.PostCommitEventListener;
016import org.nuxeo.ecm.core.event.impl.DocumentEventContext;
017import org.nuxeo.ecm.platform.usermanager.UserManager;
018import org.nuxeo.runtime.api.Framework;
019import org.nuxeo.segment.io.SegmentIO;
020import org.nuxeo.segment.io.SegmentIOComponent;
021import org.nuxeo.segment.io.SegmentIOMapper;
022
023public class SegmentIOAsyncListener implements PostCommitEventListener {
024
025    protected static Log log = LogFactory.getLog(SegmentIOAsyncListener.class);
026
027    protected SegmentIOComponent getComponent() {
028        return (SegmentIOComponent) Framework.getRuntime().getComponent(SegmentIOComponent.class.getName());
029    }
030
031    @Override
032    public void handleEvent(EventBundle bundle) {
033
034        SegmentIOComponent component = getComponent();
035
036        List<String> eventToProcess = new ArrayList<String>();
037
038        for (String event : component.getMappedEvents()) {
039            if (bundle.containsEventName(event)) {
040                eventToProcess.add(event);
041            }
042        }
043
044        if (eventToProcess.size()>0) {
045            Map<String, List<SegmentIOMapper>> event2Mappers = component.getMappers(eventToProcess);
046            processEvents(event2Mappers, bundle);
047        }
048
049    }
050
051    protected void processEvents(Map<String, List<SegmentIOMapper>> event2Mappers, EventBundle bundle) {
052
053        for (Event event : bundle) {
054            List<SegmentIOMapper> mappers = event2Mappers.get(event.getName());
055            if (mappers==null || mappers.size()==0) {
056                continue;
057            }
058
059            for (SegmentIOMapper mapper : mappers) {
060
061                Map<String, Object> ctx = new HashMap<String, Object>();
062
063                Principal princ = event.getContext().getPrincipal();
064                NuxeoPrincipal principal=null;
065                if (princ instanceof NuxeoPrincipal) {
066                    principal = (NuxeoPrincipal) princ;
067                } else {
068                    principal = Framework.getService(UserManager.class).getPrincipal(princ.getName());
069                }
070
071                ctx.put("event", event);
072                ctx.put("eventContext", event.getContext());
073                ctx.put("principal", principal);
074                if (event.getContext() instanceof DocumentEventContext) {
075                    DocumentEventContext docCtx = (DocumentEventContext) event.getContext();
076                    ctx.put("doc", docCtx.getSourceDocument());
077                    ctx.put("repository", docCtx.getRepositoryName());
078                    ctx.put("session", docCtx.getCoreSession());
079                    ctx.put("dest", docCtx.getDestination());
080                }
081                Map<String, Serializable> mapped =  mapper.getMappedData(ctx);
082
083                if (mapper.isIdentify()) {
084                    Framework.getLocalService(SegmentIO.class).identify(principal, mapped);
085                }
086                else {
087                    Framework.getLocalService(SegmentIO.class).track(principal, event.getName(), mapped);
088                }
089
090            }
091        }
092    }
093
094}