DS-1745 : Change logic in InstallItem so that dc.date.issued MUST be specified to be set. Add an option to set dc.date.issued="today" to auto-apply today's date. Also add unit tests for new logic

This commit is contained in:
Tim Donohue
2013-10-31 17:17:22 +00:00
parent 89f7798450
commit 0e4b0f39e2
2 changed files with 126 additions and 17 deletions

View File

@@ -113,23 +113,33 @@ public class InstallItem
}
// Even though we are restoring an item it may not have the proper dates. So let's
// double check that it has a date accessioned and date issued, and if either of those dates
// are not set then set them to today.
// double check its associated date(s)
DCDate now = DCDate.getCurrent();
// If the item doesn't have a date.accessioned, create one.
// If the item doesn't have a date.accessioned, set it to today
DCValue[] dateAccessioned = item.getDC("date", "accessioned", Item.ANY);
if (dateAccessioned.length == 0)
{
item.addDC("date", "accessioned", null, now.toString());
}
// create issue date if not present
// If issue date is set as "today" (literal string), then set it to current date
// In the below loop, we temporarily clear all issued dates and re-add, one-by-one,
// replacing "today" with today's date.
// NOTE: As of DSpace 4.0, DSpace no longer sets an issue date by default
DCValue[] currentDateIssued = item.getDC("date", "issued", Item.ANY);
if (currentDateIssued.length == 0)
item.clearDC("date", "issued", Item.ANY);
for (DCValue dcv : currentDateIssued)
{
if(dcv.value!=null && dcv.value.equalsIgnoreCase("today"))
{
DCDate issued = new DCDate(now.getYear(),now.getMonth(),now.getDay(),-1,-1,-1);
item.addDC("date", "issued", null, issued.toString());
item.addDC(dcv.element, dcv.qualifier, dcv.language, issued.toString());
}
else if(dcv.value!=null)
{
item.addDC(dcv.element, dcv.qualifier, dcv.language, dcv.value);
}
}
// Record that the item was restored
@@ -156,24 +166,40 @@ public class InstallItem
item.addDC("date", "available", null, now.toString());
}
// create issue date if not present
// If issue date is set as "today" (literal string), then set it to current date
// In the below loop, we temporarily clear all issued dates and re-add, one-by-one,
// replacing "today" with today's date.
// NOTE: As of DSpace 4.0, DSpace no longer sets an issue date by default
DCValue[] currentDateIssued = item.getDC("date", "issued", Item.ANY);
if (currentDateIssued.length == 0)
item.clearDC("date", "issued", Item.ANY);
for (DCValue dcv : currentDateIssued)
{
if(dcv.value!=null && dcv.value.equalsIgnoreCase("today"))
{
DCDate issued = new DCDate(now.getYear(),now.getMonth(),now.getDay(),-1,-1,-1);
item.addDC("date", "issued", null, issued.toString());
item.addDC(dcv.element, dcv.qualifier, dcv.language, issued.toString());
}
else if(dcv.value!=null)
{
item.addDC(dcv.element, dcv.qualifier, dcv.language, dcv.value);
}
}
String provDescription = "Made available in DSpace on " + now
+ " (GMT). " + getBitstreamProvenanceMessage(item);
// If an issue date was passed in and it wasn't set to "today" (literal string)
// then note this previous issue date in provenance message
if (currentDateIssued.length != 0)
{
DCDate d = new DCDate(currentDateIssued[0].value);
String previousDateIssued = currentDateIssued[0].value;
if(previousDateIssued!=null && !previousDateIssued.equalsIgnoreCase("today"))
{
DCDate d = new DCDate(previousDateIssued);
provDescription = provDescription + " Previous issue date: "
+ d.toString();
}
}
// Add provenance description
item.addDC("description", "provenance", "en", provDescription);

View File

@@ -198,4 +198,87 @@ public class InstallItemTest extends AbstractUnitTest
assertThat("testGetBitstreamProvenanceMessage 0", InstallItem.getBitstreamProvenanceMessage(item), equalTo(testMessage));
}
/**
* Test passing in "today" as an issued date to InstallItem.
*/
@Test
public void testInstallItem_todayAsIssuedDate() throws Exception
{
//create a dummy WorkspaceItem
context.turnOffAuthorisationSystem();
String handle = "1345/567";
Collection col = Collection.create(context);
WorkspaceItem is = WorkspaceItem.create(context, col, false);
// Set "today" as "dc.date.issued"
is.getItem().addMetadata("dc", "date", "issued", Item.ANY, "today");
is.getItem().addMetadata("dc", "date", "issued", Item.ANY, "2011-01-01");
//get current date
DCDate now = DCDate.getCurrent();
String dayAndTime = now.toString();
//parse out just the date, remove the time (format: yyyy-mm-ddT00:00:00Z)
String date = dayAndTime.substring(0, dayAndTime.indexOf("T"));
Item result = InstallItem.installItem(context, is, handle);
context.restoreAuthSystemState();
//Make sure the string "today" was replaced with today's date
DCValue[] issuedDates = result.getMetadata("dc", "date", "issued", Item.ANY);
assertThat("testInstallItem_todayAsIssuedDate 0", issuedDates[0].value, equalTo(date));
assertThat("testInstallItem_todayAsIssuedDate 1", issuedDates[1].value, equalTo("2011-01-01"));
}
/**
* Test null issue date (when none set) in InstallItem
*/
@Test
public void testInstallItem_nullIssuedDate() throws Exception
{
//create a dummy WorkspaceItem with no dc.date.issued
context.turnOffAuthorisationSystem();
String handle = "1345/567";
Collection col = Collection.create(context);
WorkspaceItem is = WorkspaceItem.create(context, col, false);
Item result = InstallItem.installItem(context, is, handle);
context.restoreAuthSystemState();
//Make sure dc.date.issued is NOT set
DCValue[] issuedDates = result.getMetadata("dc", "date", "issued", Item.ANY);
assertThat("testInstallItem_nullIssuedDate 0", issuedDates.length, equalTo(0));
}
/**
* Test passing in "today" as an issued date to restoreItem.
*/
@Test
public void testRestoreItem_todayAsIssuedDate() throws Exception
{
//create a dummy WorkspaceItem
context.turnOffAuthorisationSystem();
String handle = "1345/567";
Collection col = Collection.create(context);
WorkspaceItem is = WorkspaceItem.create(context, col, false);
// Set "today" as "dc.date.issued"
is.getItem().addMetadata("dc", "date", "issued", Item.ANY, "today");
is.getItem().addMetadata("dc", "date", "issued", Item.ANY, "2011-01-01");
//get current date
DCDate now = DCDate.getCurrent();
String dayAndTime = now.toString();
//parse out just the date, remove the time (format: yyyy-mm-ddT00:00:00Z)
String date = dayAndTime.substring(0, dayAndTime.indexOf("T"));
Item result = InstallItem.restoreItem(context, is, handle);
context.restoreAuthSystemState();
//Make sure the string "today" was replaced with today's date
DCValue[] issuedDates = result.getMetadata("dc", "date", "issued", Item.ANY);
assertThat("testRestoreItem_todayAsIssuedDate 0", issuedDates[0].value, equalTo(date));
assertThat("testRestoreItem_todayAsIssuedDate 1", issuedDates[1].value, equalTo("2011-01-01"));
}
}