001/*
002 * (C) Copyright 2015 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 *     Vladimir Pasquier <vpasquier@nuxeo.com>
016 */
017
018package org.nuxeo.binary.metadata.internals.listeners;
019
020import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_CREATED;
021import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_UPDATED;
022
023import java.util.LinkedList;
024
025import org.nuxeo.binary.metadata.api.BinaryMetadataConstants;
026import org.nuxeo.binary.metadata.internals.BinaryMetadataWork;
027import org.nuxeo.binary.metadata.internals.MetadataMappingDescriptor;
028import org.nuxeo.ecm.core.api.DocumentModel;
029import org.nuxeo.ecm.core.event.Event;
030import org.nuxeo.ecm.core.event.EventContext;
031import org.nuxeo.ecm.core.event.EventListener;
032import org.nuxeo.ecm.core.event.impl.DocumentEventContext;
033import org.nuxeo.ecm.core.work.api.WorkManager;
034import org.nuxeo.runtime.api.Framework;
035
036/**
037 * Handle document and blob updates according to {@link BinaryMetadataSyncListener} rules. If
038 * {@link org.nuxeo.binary.metadata.api.BinaryMetadataConstants#ASYNC_BINARY_METADATA_EXECUTE} flag is set into Document
039 * Event Context, a work should be executed.
040 *
041 * @since 7.2
042 */
043public class BinaryMetadataWorkListener implements EventListener {
044
045    @Override
046    public void handleEvent(Event event) {
047        EventContext ctx = event.getContext();
048        if (!(ctx instanceof DocumentEventContext)) {
049            return;
050        }
051        if (DOCUMENT_CREATED.equals(event.getName()) || DOCUMENT_UPDATED.equals(event.getName())) {
052            DocumentEventContext docCtx = (DocumentEventContext) ctx;
053            DocumentModel doc = docCtx.getSourceDocument();
054            Boolean execute = (Boolean) event.getContext().getProperty(
055                    BinaryMetadataConstants.ASYNC_BINARY_METADATA_EXECUTE);
056            LinkedList<MetadataMappingDescriptor> mappingDescriptors = (LinkedList<MetadataMappingDescriptor>) docCtx.getProperty(BinaryMetadataConstants.ASYNC_MAPPING_RESULT);
057            if (execute != null && execute && !doc.isProxy()) {
058                BinaryMetadataWork work = new BinaryMetadataWork(doc.getRepositoryName(), doc.getId(),
059                        mappingDescriptors, docCtx);
060                WorkManager workManager = Framework.getLocalService(WorkManager.class);
061                workManager.schedule(work, true);
062            }
063        }
064    }
065
066}