package org.easysoa.registry.subproject; import java.util.Arrays; import org.apache.log4j.Logger; import org.easysoa.registry.SubprojectServiceImpl; import org.easysoa.registry.types.Subproject; import org.easysoa.registry.types.SubprojectNode; import org.nuxeo.ecm.core.api.ClientException; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.event.DocumentEventTypes; import org.nuxeo.ecm.core.event.Event; import org.nuxeo.ecm.core.event.EventContext; import org.nuxeo.ecm.core.event.EventListener; import org.nuxeo.ecm.core.event.impl.DocumentEventContext; /** * Listens to aboutToCreate events * TODO elsewhere handle documentCreatedByCopy, aboutToMove... * * @author mdutoo * */ public class SubprojectNodeListener implements EventListener { private static Logger logger = Logger.getLogger(SubprojectNodeListener.class); @Override public void handleEvent(Event event) throws ClientException { // Ensure event nature EventContext context = event.getContext(); if (!(context instanceof DocumentEventContext)) { return; } DocumentEventContext documentContext = (DocumentEventContext) context; DocumentModel sourceDocument = documentContext.getSourceDocument(); CoreSession documentManager = documentContext.getCoreSession(); // TODO check isSoaNode() ?? ///DocumentModel previousDocumentModel = (DocumentModel) documentContext.getProperty("previousDocumentModel"); // TODO check matching properties changes, in order to match only if they changed ?? // TODO compute spnode props if subproject changed ??? NO would require to save (which would trigger event loop) //match(documentManager, sourceDocument); if (sourceDocument.isProxy()) { logger.debug("SubprojectNodeListener : skipping because proxy " + sourceDocument); return; } if (sourceDocument.hasSchema(Subproject.SCHEMA)) { // TODO NOO needs to be created first to get id if (DocumentEventTypes.ABOUT_TO_CREATE.equals(event.getName())) { SubprojectServiceImpl.onSubprojectAboutToCreate(documentManager, sourceDocument); } else { // DocumentEventTypes.BEFORE_DOC_UPDATE.equals(event.getName()) DocumentModel subproject = sourceDocument; DocumentModel previousSubproject = (DocumentModel) context.getProperty("previousDocumentModel"); String subprojectId = (String) subproject.getPropertyValue(SubprojectNode.XPATH_SUBPROJECT); String previousSubprojectId = (String) previousSubproject.getPropertyValue(SubprojectNode.XPATH_SUBPROJECT); boolean subprojectIdChanged = !subprojectId.equals(previousSubprojectId); if (subprojectIdChanged) { // case 1 : changing subprojectId before or after tree snapshot versioning // case 2 : TODO check if rename changes path logger.warn("Changing subprojectId from " + previousSubprojectId + " to " + subprojectId + " on " + previousSubproject); } String[] parentSubprojects = (String[]) subproject.getPropertyValue(Subproject.XPATH_PARENT_SUBPROJECTS); String[] previousParentSubprojects = (String[]) previousSubproject.getPropertyValue(Subproject.XPATH_PARENT_SUBPROJECTS); boolean parentSubprojectsChanged = parentSubprojects == null && previousParentSubprojects != null || parentSubprojects != null && previousParentSubprojects == null || parentSubprojects != null && previousParentSubprojects != null && !Arrays.asList(previousParentSubprojects).equals(Arrays.asList(previousParentSubprojects)); if (subprojectIdChanged || parentSubprojectsChanged) { // parentSubprojects changed // update computed metas : SubprojectServiceImpl.computeAndSetVisibleSubprojects(documentManager, sourceDocument); // recursively set them on subnodes : SubprojectServiceImpl.copySubprojectNodePropertiesOnChildrenRecursive(subproject); } } } else if (!DocumentEventTypes.BEFORE_DOC_UPDATE.equals(event.getName())) { // anything that is under a subproject DocumentModel parentDocument = documentManager.getDocument(sourceDocument.getParentRef()); SubprojectServiceImpl.copySubprojectNodeProperties(parentDocument, sourceDocument); if (!DocumentEventTypes.ABOUT_TO_CREATE.equals(event.getName())) { documentManager.saveDocument(sourceDocument); } // else saved later } // else assuming no change } }