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;
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
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?
//
//
// (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.
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()) {
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.
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);
}
}
*
* @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.
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()) {