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