001package org.nuxeo.template.listeners;
002
003import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_CREATED;
004import static org.nuxeo.ecm.core.api.event.DocumentEventTypes.DOCUMENT_UPDATED;
005
006import org.apache.commons.logging.Log;
007import org.apache.commons.logging.LogFactory;
008import org.nuxeo.ecm.core.api.DocumentModel;
009import org.nuxeo.ecm.core.event.Event;
010import org.nuxeo.ecm.core.event.EventBundle;
011import org.nuxeo.ecm.core.event.EventContext;
012import org.nuxeo.ecm.core.event.PostCommitFilteringEventListener;
013import org.nuxeo.ecm.core.event.impl.DocumentEventContext;
014import org.nuxeo.ecm.core.event.impl.ShallowDocumentModel;
015import org.nuxeo.runtime.api.Framework;
016import org.nuxeo.template.adapters.TemplateAdapterFactory;
017import org.nuxeo.template.api.TemplateProcessorService;
018import org.nuxeo.template.api.adapters.TemplateSourceDocument;
019
020public class TemplateTypeBindingListener implements PostCommitFilteringEventListener {
021
022    protected static Log log = LogFactory.getLog(TemplateTypeBindingListener.class);
023
024    @Override
025    public boolean acceptEvent(Event event) {
026        EventContext context = event.getContext();
027        if (!(context instanceof DocumentEventContext)) {
028            return false;
029        }
030        DocumentModel doc = ((DocumentEventContext) context).getSourceDocument();
031        if (doc == null || doc.isVersion()) {
032            return false;
033        }
034        // we cannot directly adapt the ShallowDocumentModel,
035        // so check the adapter factory manually
036        return TemplateAdapterFactory.isAdaptable(doc, TemplateSourceDocument.class);
037    }
038
039    @Override
040    public void handleEvent(EventBundle eventBundle) {
041        if (eventBundle.containsEventName(DOCUMENT_CREATED) || eventBundle.containsEventName(DOCUMENT_UPDATED)) {
042
043            TemplateProcessorService tps = Framework.getLocalService(TemplateProcessorService.class);
044
045            for (Event event : eventBundle) {
046                if (DOCUMENT_CREATED.equals(event.getName()) || DOCUMENT_UPDATED.equals(event.getName())) {
047                    EventContext ctx = event.getContext();
048                    if (ctx instanceof DocumentEventContext) {
049                        DocumentEventContext docCtx = (DocumentEventContext) ctx;
050                        DocumentModel targetDoc = docCtx.getSourceDocument();
051
052                        if (targetDoc.isVersion()) {
053                            continue;
054                        }
055                        if (targetDoc instanceof ShallowDocumentModel) {
056                            log.warn("Skip unconnected document with type " + targetDoc.getType() + " and path "
057                                    + targetDoc.getPathAsString());
058                            continue;
059                        }
060                        TemplateSourceDocument tmpl = targetDoc.getAdapter(TemplateSourceDocument.class);
061                        if (tmpl != null) {
062                            tps.registerTypeMapping(targetDoc);
063                            // be sure to trigger invalidations in unit tests
064                            targetDoc.getCoreSession().save();
065                        }
066                    }
067                }
068            }
069        }
070    }
071
072}