]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-5793: Initial re-integration of work previously done for this issue.
authorAron Roberts <aron@socrates.berkeley.edu>
Fri, 17 Apr 2015 04:00:25 +0000 (21:00 -0700)
committerAron Roberts <aron@socrates.berkeley.edu>
Fri, 17 Apr 2015 04:00:25 +0000 (21:00 -0700)
3rdparty/nuxeo/nuxeo-platform-listener/updateobjectlocationonmove/src/main/java/org/collectionspace/services/listener/AbstractUpdateObjectLocationValues.java
3rdparty/nuxeo/nuxeo-platform-listener/updateobjectlocationonmove/src/main/resources/OSGI-INF/ecm-types-contrib.xml

index cbb23bd1c89e2164c398528029a134a68dbfee22..99164cc77977a4db999bda80ecbd6d881b681f49 100644 (file)
@@ -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<EventNotificationDocumentType> 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()) {
index 4e050e31fe11a6e755e83e300a4a262fb7563a1b..a6e2876a31f27cb217ff1f0f8d4b693b145553e3 100644 (file)
@@ -7,6 +7,7 @@
             <event>documentCreated</event>
             <event>documentModified</event>
             <event>lifecycle_transition_event</event>
+            <event>aboutToRemove</event>
         </listener>
     </extension>