</auths>\r
\r
<!-- This tests the UpdateObjectLocationBatchJob -->\r
+ <!-- in various invocation modes -->\r
\r
<testGroup ID="invocationModeSingle" autoDeletePOSTS="true">\r
\r
\r
</testGroup>\r
\r
+ <testGroup ID="invocationModeSingleWithTiebreaker" autoDeletePOSTS="true">\r
+ \r
+ <test ID="createBatchRecordWithTiebreaker">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/batch</uri>\r
+ <filename>batch/batch-create-updateobjloc.xml</filename>\r
+ <expectedCodes>201</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="createCollectionObjectWithTiebreaker">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/collectionobjects</uri>\r
+ <filename>batch/collObj1.xml</filename>\r
+ <expectedCodes>201</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="createMovement1WithTiebreaker">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/movements</uri>\r
+ <filename>batch/movement.xml</filename>\r
+ <vars>\r
+ <var ID="currentLocation">location-1-with-tiebreaker</var>\r
+ <var ID="locationDate">1900-01-01</var>\r
+ </vars>\r
+ <expectedCodes>201</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="createMovement2WithTiebreaker">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/movements</uri>\r
+ <filename>batch/movement.xml</filename>\r
+ <vars>\r
+ <var ID="currentLocation">location-2-with-tiebreaker</var>\r
+ <var ID="locationDate">${createMovement1WithTiebreaker.locationDate}</var>\r
+ </vars>\r
+ <expectedCodes>201</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="createMovement3WithTiebreaker">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/movements</uri>\r
+ <filename>batch/movement.xml</filename>\r
+ <vars>\r
+ <var ID="currentLocation">location-3-with-tiebreaker</var>\r
+ <var ID="locationDate">${createMovement1WithTiebreaker.locationDate}</var>\r
+ </vars>\r
+ <expectedCodes>201</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="relateCollectionObjectToMovement1WithTiebreaker">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/relations</uri>\r
+ <filename>batch/relation.xml</filename>\r
+ <vars>\r
+ <var ID="subjectCsid">${createCollectionObjectWithTiebreaker.CSID}</var>\r
+ <var ID="subjectDocumentType">CollectionObject</var>\r
+ <var ID="objectCsid">${createMovement1WithTiebreaker.CSID}</var>\r
+ <var ID="objectDocumentType">Movement</var>\r
+ </vars>\r
+ <expectedCodes>201</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="relateCollectionObjectToMovement2WithTiebreaker">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/relations</uri>\r
+ <filename>batch/relation.xml</filename>\r
+ <vars>\r
+ <var ID="subjectCsid">${createCollectionObjectWithTiebreaker.CSID}</var>\r
+ <var ID="subjectDocumentType">CollectionObject</var>\r
+ <var ID="objectCsid">${createMovement2WithTiebreaker.CSID}</var>\r
+ <var ID="objectDocumentType">Movement</var>\r
+ </vars>\r
+ <expectedCodes>201</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="relateCollectionObjectToMovement3WithTiebreaker">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/relations</uri>\r
+ <filename>batch/relation.xml</filename>\r
+ <vars>\r
+ <var ID="subjectCsid">${createCollectionObjectWithTiebreaker.CSID}</var>\r
+ <var ID="subjectDocumentType">CollectionObject</var>\r
+ <var ID="objectCsid">${createMovement3WithTiebreaker.CSID}</var>\r
+ <var ID="objectDocumentType">Movement</var>\r
+ </vars>\r
+ <expectedCodes>201</expectedCodes>\r
+ </test>\r
+\r
+ <test ID="modifyMovement1WithTiebreaker">\r
+ <method>PUT</method>\r
+ <uri>/cspace-services/movements/${createMovement1WithTiebreaker.CSID}</uri>\r
+ <filename>batch/movement.xml</filename>\r
+ <vars>\r
+ <var ID="currentLocation">location-1-modified-with-tiebreaker</var>\r
+ <var ID="locationDate">${createMovement1WithTiebreaker.locationDate}</var>\r
+ </vars>\r
+ <expectedCodes>200</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="invokeBatchAfterMovement1ModificationWithTiebreaker" auth="test" autoDeletePOSTS="false">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/batch/${createBatchRecordWithTiebreaker.CSID}</uri>\r
+ <filename>batch/batch-invoke-updateobjloc-single.xml</filename>\r
+ <vars>\r
+ <var ID="collectionObjectCSID">${createCollectionObjectWithTiebreaker.CSID}</var>\r
+ </vars>\r
+ <expectedCodes>200</expectedCodes>\r
+ </test> \r
+ \r
+ <!-- Verify that, following the invocation of the batch job, the -->\r
+ <!-- computedCurrentLocation field in the CollectionObject record has -->\r
+ <!-- been updated to the appropriate value, reflecting the most recent -->\r
+ <!-- movement (e.g. the Movement record with the most recent locationDate, -->\r
+ <!-- and, as in this test group - where two Movement records have identical -->\r
+ <!-- locationDate values - the Movement record that has been updated most recently. -->\r
+ <test ID="readCollectionObjectAfterMovement1ModificationWithTiebreaker">\r
+ <method>GET</method>\r
+ <uri>/cspace-services/collectionobjects/${createCollectionObjectWithTiebreaker.CSID}</uri>\r
+ <filename>batch/updateobjloc.xml</filename>\r
+ <response>\r
+ <expected level="ADDOK" />\r
+ <filename>batch/res/collectionobject.res.xml</filename>\r
+ <vars>\r
+ <var ID="computedCurrentLocationValue">${modifyMovement1WithTiebreaker.currentLocation}</var>\r
+ </vars>\r
+ </response>\r
+ <expectedCodes>200</expectedCodes>\r
+ </test> \r
+\r
+ <test ID="modifyMovement2WithTiebreaker">\r
+ <method>PUT</method>\r
+ <uri>/cspace-services/movements/${createMovement2WithTiebreaker.CSID}</uri>\r
+ <filename>batch/movement.xml</filename>\r
+ <vars>\r
+ <var ID="currentLocation">location-2-modified-with-tiebreaker</var>\r
+ <var ID="locationDate">${createMovement1WithTiebreaker.locationDate}</var>\r
+ </vars>\r
+ <expectedCodes>200</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="invokeBatchAfterMovement2ModificationWithTiebreaker" auth="test" autoDeletePOSTS="false">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/batch/${createBatchRecordWithTiebreaker.CSID}</uri>\r
+ <filename>batch/batch-invoke-updateobjloc-single.xml</filename>\r
+ <vars>\r
+ <var ID="collectionObjectCSID">${createCollectionObjectWithTiebreaker.CSID}</var>\r
+ </vars>\r
+ <expectedCodes>200</expectedCodes>\r
+ </test> \r
+ \r
+ <test ID="readCollectionObjectRecordAfterMovement2ModificationWithTiebreaker">\r
+ <method>GET</method>\r
+ <uri>/cspace-services/collectionobjects/${createCollectionObjectWithTiebreaker.CSID}</uri>\r
+ <filename>batch/updateobjloc.xml</filename>\r
+ <response>\r
+ <expected level="ADDOK" />\r
+ <filename>batch/res/collectionobject.res.xml</filename>\r
+ <vars>\r
+ <var ID="computedCurrentLocationValue">${modifyMovement2WithTiebreaker.currentLocation}</var>\r
+ </vars>\r
+ </response>\r
+ <expectedCodes>200</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="modifyMovement3WithTiebreaker">\r
+ <method>PUT</method>\r
+ <uri>/cspace-services/movements/${createMovement3WithTiebreaker.CSID}</uri>\r
+ <filename>batch/movement.xml</filename>\r
+ <vars>\r
+ <var ID="currentLocation">location-3-modified-with-tiebreaker</var>\r
+ <var ID="locationDate">${createMovement1WithTiebreaker.locationDate}</var>\r
+ </vars>\r
+ <expectedCodes>200</expectedCodes>\r
+ </test>\r
+ \r
+ <test ID="invokeBatchAfterMovement3ModificationWithTiebreaker" auth="test" autoDeletePOSTS="false">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/batch/${createBatchRecordWithTiebreaker.CSID}</uri>\r
+ <filename>batch/batch-invoke-updateobjloc-single.xml</filename>\r
+ <vars>\r
+ <var ID="collectionObjectCSID">${createCollectionObjectWithTiebreaker.CSID}</var>\r
+ </vars>\r
+ <expectedCodes>200</expectedCodes>\r
+ </test> \r
+ \r
+ <test ID="readCollectionObjectRecordAfterMovement3ModificationWithTiebreaker">\r
+ <method>GET</method>\r
+ <uri>/cspace-services/collectionobjects/${createCollectionObjectWithTiebreaker.CSID}</uri>\r
+ <filename>batch/updateobjloc.xml</filename>\r
+ <response>\r
+ <expected level="ADDOK" />\r
+ <filename>batch/res/collectionobject.res.xml</filename>\r
+ <vars>\r
+ <var ID="computedCurrentLocationValue">${modifyMovement3WithTiebreaker.currentLocation}</var>\r
+ </vars>\r
+ </response>\r
+ <expectedCodes>200</expectedCodes>\r
+ </test>\r
+ \r
+ </testGroup>\r
+ \r
<testGroup ID="invocationModeList" autoDeletePOSTS="true">\r
\r
<test ID="createBatchRecord">\r
private final static String LIFECYCLE_STATE_ELEMENT_NAME = "currentLifeCycleState";
private final static String LOCATION_DATE_ELEMENT_NAME = "locationDate";
private final static String OBJECT_NUMBER_ELEMENT_NAME = "objectNumber";
+ private final static String UPDATE_DATE_ELEMENT_NAME = "updatedAt";
private final static String WORKFLOW_COMMON_SCHEMA_NAME = "workflow_common";
private final static String WORKFLOW_COMMON_NAMESPACE_PREFIX = "ns2";
private final static String WORKFLOW_COMMON_NAMESPACE_URI =
String movementCsid;
String currentLocation;
String locationDate;
+ String updateDate;
String mostRecentLocationDate = "";
+ String comparisonUpdateDate = "";
for (AbstractCommonList.ListItem movementListItem : relatedMovements.getListItem()) {
movementCsid = AbstractCommonListUtils.ListItemGetElementValue(movementListItem, CSID_ELEMENT_NAME);
if (Tools.isBlank(movementCsid)) {
if (Tools.isBlank(locationDate)) {
continue;
}
+ updateDate = AbstractCommonListUtils.ListItemGetElementValue(movementListItem, UPDATE_DATE_ELEMENT_NAME);
+ if (Tools.isBlank(updateDate)) {
+ continue;
+ }
currentLocation = AbstractCommonListUtils.ListItemGetElementValue(movementListItem, CURRENT_LOCATION_ELEMENT_NAME);
if (Tools.isBlank(currentLocation)) {
continue;
// value of a parameter passed in during batch job invocation.
if (logger.isTraceEnabled()) {
logger.trace("Location date value = " + locationDate);
+ logger.trace("Update date value = " + updateDate);
logger.trace("Current location value = " + currentLocation);
}
// If this record's location date value is more recent than that of other
if (locationDate.compareTo(mostRecentLocationDate) > 0) {
mostRecentLocationDate = locationDate;
mostRecentMovement = movementListItem;
+ comparisonUpdateDate = updateDate;
+ } else if (locationDate.compareTo(mostRecentLocationDate) == 0) {
+ // If the two location dates match, then use a tiebreaker
+ if (updateDate.compareTo(comparisonUpdateDate) > 0) {
+ // The most recent location date value doesn't need to be
+ // updated here, as the two records' values are identical
+ mostRecentMovement = movementListItem;
+ comparisonUpdateDate = updateDate;
+ }
}
}