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}