001package org.nuxeo.template.listeners;
002
003import org.jboss.seam.faces.FacesMessages;
004import org.jboss.seam.international.StatusMessage;
005import org.nuxeo.ecm.core.api.DocumentModel;
006import org.nuxeo.ecm.core.api.event.DocumentEventTypes;
007import org.nuxeo.ecm.core.event.Event;
008import org.nuxeo.ecm.core.event.EventContext;
009import org.nuxeo.ecm.core.event.EventListener;
010import org.nuxeo.ecm.core.event.impl.DocumentEventContext;
011import org.nuxeo.runtime.api.Framework;
012import org.nuxeo.runtime.transaction.TransactionHelper;
013import org.nuxeo.template.api.adapters.TemplateSourceDocument;
014
015public class TemplateDeletionGuard implements EventListener {
016
017    @Override
018    public void handleEvent(Event event) {
019
020        EventContext ctx = event.getContext();
021
022        if (DocumentEventTypes.ABOUT_TO_REMOVE.equals(event.getName())) {
023            if (ctx instanceof DocumentEventContext) {
024                DocumentEventContext docCtx = (DocumentEventContext) ctx;
025                DocumentModel targetDoc = docCtx.getSourceDocument();
026
027                TemplateSourceDocument templateDoc = targetDoc.getAdapter(TemplateSourceDocument.class);
028                if (templateDoc != null && !Framework.isTestModeSet()) {
029                    if (templateDoc.getTemplateBasedDocuments().size() > 0) {
030                        TransactionHelper.setTransactionRollbackOnly();
031                        event.cancel();
032                        // XXX should do better
033                        FacesMessages.instance().clearGlobalMessages();
034                        FacesMessages.instance().addFromResourceBundleOrDefault(StatusMessage.Severity.WARN,
035                                "label.template.canNotDeletedATemplateInUse",
036                                "Can not delete a template that is still in use.");
037                    }
038                }
039            }
040        }
041    }
042}