From: Aron Roberts Date: Fri, 17 Apr 2015 04:00:25 +0000 (-0700) Subject: CSPACE-5793: Initial re-integration of work previously done for this issue. X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=593f34c63b4b1a970a416c7d09d5550149d938ba;p=tmp%2Fjakarta-migration.git CSPACE-5793: Initial re-integration of work previously done for this issue. --- diff --git a/3rdparty/nuxeo/nuxeo-platform-listener/updateobjectlocationonmove/src/main/java/org/collectionspace/services/listener/AbstractUpdateObjectLocationValues.java b/3rdparty/nuxeo/nuxeo-platform-listener/updateobjectlocationonmove/src/main/java/org/collectionspace/services/listener/AbstractUpdateObjectLocationValues.java index cbb23bd1c..99164cc77 100644 --- a/3rdparty/nuxeo/nuxeo-platform-listener/updateobjectlocationonmove/src/main/java/org/collectionspace/services/listener/AbstractUpdateObjectLocationValues.java +++ b/3rdparty/nuxeo/nuxeo-platform-listener/updateobjectlocationonmove/src/main/java/org/collectionspace/services/listener/AbstractUpdateObjectLocationValues.java @@ -17,6 +17,7 @@ import org.collectionspace.services.nuxeo.util.NuxeoUtils; import org.nuxeo.ecm.core.api.ClientException; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.DocumentModelList; +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; @@ -53,7 +54,10 @@ public abstract class AbstractUpdateObjectLocationValues implements EventListene private final static String ACTIVE_DOCUMENT_WHERE_CLAUSE_FRAGMENT = "AND (ecm:currentLifeCycleState <> 'deleted') " + NONVERSIONED_NONPROXY_DOCUMENT_WHERE_CLAUSE_FRAGMENT; - + private boolean isAboutToBeRemovedEvent = false; + private String movementCsidToFilter; + private String eventType; + public enum EventNotificationDocumentType { // Document type about which we've received a notification @@ -76,6 +80,15 @@ public abstract class AbstractUpdateObjectLocationValues implements EventListene DocumentEventContext docEventContext = (DocumentEventContext) eventContext; DocumentModel docModel = docEventContext.getSourceDocument(); + if (logger.isTraceEnabled()) { + eventType = event.getName(); + logger.trace("A(n) " + eventType + " event was received by UpdateObjectLocationOnMove ..."); + } + + if (eventType.equals(DocumentEventTypes.ABOUT_TO_REMOVE)) { + isAboutToBeRemovedEvent = true; + } + // If this document event involves a Relation record, does this pertain to // a relationship between a Movement record and a CollectionObject record? // @@ -85,21 +98,29 @@ public abstract class AbstractUpdateObjectLocationValues implements EventListene // // (The rest of the code flow below is then identical to that which - // is followed when this document event involves a Movement record. + // is followed when this document event involves a Movement record.) String movementCsid = ""; Enum notificationDocumentType; if (documentMatchesType(docModel, RELATION_DOCTYPE)) { if (logger.isTraceEnabled()) { logger.trace("An event involving a Relation document was received by UpdateObjectLocationOnMove ..."); } - // Get a Movement CSID from the Relation record. (If we can't - // get it, then we don't have a pertinent relation record.) + // Get a Movement CSID from the Relation record. + // + // If we can't get it - if this Relation doesn't involve a + // Movement - then we don't have a pertinent relation record + // that can be processed by this event listener / handler.) movementCsid = getCsidForDesiredDocTypeFromRelation(docModel, MOVEMENT_DOCTYPE, COLLECTIONOBJECT_DOCTYPE); if (Tools.isBlank(movementCsid)) { logger.warn("Could not obtain CSID for Movement record from document event."); logger.warn(NO_FURTHER_PROCESSING_MESSAGE); return; } + // If this Relation record is about to be (hard) deleted, set aside + // its CSID so it can filtered out in all subsequent processing. + if (isAboutToBeRemovedEvent) { + movementCsidToFilter = movementCsid; + } notificationDocumentType = EventNotificationDocumentType.RELATION; } else if (documentMatchesType(docModel, MOVEMENT_DOCTYPE)) { // Otherwise, get a Movement CSID directly from the Movement record. @@ -116,6 +137,11 @@ public abstract class AbstractUpdateObjectLocationValues implements EventListene logger.warn(NO_FURTHER_PROCESSING_MESSAGE); return; } + // If this Movement record is about to be (hard) deleted, set aside + // its CSID so it can filtered out in all subsequent processing. + if (isAboutToBeRemovedEvent) { + movementCsidToFilter = movementCsid; + } notificationDocumentType = EventNotificationDocumentType.MOVEMENT; } else { if (logger.isTraceEnabled()) { @@ -166,7 +192,7 @@ public abstract class AbstractUpdateObjectLocationValues implements EventListene return; } else { if (logger.isTraceEnabled()) { - logger.trace("Found " + collectionObjectCsids.size() + " CSIDs of related CollectionObject records."); + logger.trace("Found " + collectionObjectCsids.size() + " CSID(s) of related CollectionObject records."); } } // Iterate through the list of CollectionObject CSIDs found. @@ -194,13 +220,20 @@ public abstract class AbstractUpdateObjectLocationValues implements EventListene continue; } // Get the CollectionObject's most recent, related Movement. - mostRecentMovementDocModel = getMostRecentMovement(coreSession, collectionObjectCsid); + mostRecentMovementDocModel = getMostRecentMovement(coreSession, collectionObjectCsid, + isAboutToBeRemovedEvent, movementCsidToFilter); if (mostRecentMovementDocModel == null) { continue; } // Update the CollectionObject with values from that Movement. collectionObjectDocModel = updateCollectionObjectValuesFromMovement(collectionObjectDocModel, mostRecentMovementDocModel); + if (logger.isTraceEnabled()) { + String computedCurrentLocationRefName = + (String) collectionObjectDocModel.getProperty(COLLECTIONOBJECTS_COMMON_SCHEMA, + COMPUTED_CURRENT_LOCATION_PROPERTY); + logger.trace("computedCurrentLocation refName after value update=" + computedCurrentLocationRefName); + } coreSession.saveDocument(collectionObjectDocModel); } } @@ -367,11 +400,17 @@ public abstract class AbstractUpdateObjectLocationValues implements EventListene * * @param session a repository session. * @param collectionObjectCsid a CollectionObject identifier (CSID) + * @param isAboutToBeRemovedEvent whether the current event involves a + * record that is slated for removal (hard deletion) + * @param movementCsidToFilter the CSID of a Movement record slated for + * deletion. This record should be filtered out, prior to returning the most + * recent Movement record. * @throws ClientException * @return the most recent Movement record related to the CollectionObject * identified by the supplied CSID. */ - protected static DocumentModel getMostRecentMovement(CoreSessionInterface session, String collectionObjectCsid) + protected static DocumentModel getMostRecentMovement(CoreSession session, String collectionObjectCsid, + boolean isAboutToBeRemovedEvent, String aboutToBeRemovedMovementCsidToFilter) throws ClientException { DocumentModel mostRecentMovementDocModel = null; // Get Relation records for Movements related to this CollectionObject. @@ -436,6 +475,16 @@ public abstract class AbstractUpdateObjectLocationValues implements EventListene if (logger.isTraceEnabled()) { logger.trace("Related movement CSID=" + relatedMovementCsid); } + // If our event involves a Movement record that is about to be + // (hard) deleted, filter out that record. + if (isAboutToBeRemovedEvent && Tools.notBlank(aboutToBeRemovedMovementCsidToFilter)) { + if (relatedMovementCsid.equals(aboutToBeRemovedMovementCsidToFilter)) { + if (logger.isTraceEnabled()) { + logger.trace("Skipping about-to-be-deleted Movement record or referenced, related Movement record ..."); + } + continue; + } + } movementDocModel = getCurrentDocModelFromCsid(session, relatedMovementCsid); if (movementDocModel == null) { if (logger.isTraceEnabled()) { diff --git a/3rdparty/nuxeo/nuxeo-platform-listener/updateobjectlocationonmove/src/main/resources/OSGI-INF/ecm-types-contrib.xml b/3rdparty/nuxeo/nuxeo-platform-listener/updateobjectlocationonmove/src/main/resources/OSGI-INF/ecm-types-contrib.xml index 4e050e31f..a6e2876a3 100644 --- a/3rdparty/nuxeo/nuxeo-platform-listener/updateobjectlocationonmove/src/main/resources/OSGI-INF/ecm-types-contrib.xml +++ b/3rdparty/nuxeo/nuxeo-platform-listener/updateobjectlocationonmove/src/main/resources/OSGI-INF/ecm-types-contrib.xml @@ -7,6 +7,7 @@ documentCreated documentModified lifecycle_transition_event + aboutToRemove