mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-18 23:43:06 +00:00
DSpace refactored service api
This commit is contained in:
@@ -0,0 +1,243 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
package org.dspace.content;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
|
||||
import org.dspace.authorize.AuthorizeException;
|
||||
import org.dspace.content.factory.ContentServiceFactory;
|
||||
import org.dspace.content.service.CollectionService;
|
||||
import org.dspace.content.service.InstallItemService;
|
||||
import org.dspace.content.service.ItemService;
|
||||
import org.dspace.core.Constants;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.embargo.service.EmbargoService;
|
||||
import org.dspace.event.Event;
|
||||
import org.dspace.identifier.IdentifierException;
|
||||
import org.dspace.identifier.service.IdentifierService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
/**
|
||||
* Support to install an Item in the archive.
|
||||
*
|
||||
* @author dstuve
|
||||
* @version $Revision$
|
||||
*/
|
||||
public class InstallItemServiceImpl implements InstallItemService
|
||||
{
|
||||
|
||||
@Autowired(required = true)
|
||||
protected ContentServiceFactory contentServiceFactory;
|
||||
@Autowired(required = true)
|
||||
protected CollectionService collectionService;
|
||||
@Autowired(required = true)
|
||||
protected EmbargoService embargoService;
|
||||
@Autowired(required = true)
|
||||
protected IdentifierService identifierService;
|
||||
@Autowired(required = true)
|
||||
protected ItemService itemService;
|
||||
|
||||
@Override
|
||||
public Item installItem(Context c, InProgressSubmission is)
|
||||
throws SQLException, AuthorizeException
|
||||
{
|
||||
return installItem(c, is, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item installItem(Context c, InProgressSubmission is,
|
||||
String suppliedHandle) throws SQLException,
|
||||
AuthorizeException
|
||||
{
|
||||
Item item = is.getItem();
|
||||
try {
|
||||
if(suppliedHandle == null)
|
||||
{
|
||||
identifierService.register(c, item);
|
||||
}else{
|
||||
identifierService.register(c, item, suppliedHandle);
|
||||
}
|
||||
} catch (IdentifierException e) {
|
||||
throw new RuntimeException("Can't create an Identifier!", e);
|
||||
}
|
||||
|
||||
populateMetadata(c, item);
|
||||
|
||||
return finishItem(c, item, is);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item restoreItem(Context c, InProgressSubmission is,
|
||||
String suppliedHandle)
|
||||
throws SQLException, IOException, AuthorizeException
|
||||
{
|
||||
Item item = is.getItem();
|
||||
|
||||
try {
|
||||
if(suppliedHandle == null)
|
||||
{
|
||||
identifierService.register(c, item);
|
||||
}else{
|
||||
identifierService.register(c, item, suppliedHandle);
|
||||
}
|
||||
} catch (IdentifierException e) {
|
||||
throw new RuntimeException("Can't create an Identifier!");
|
||||
}
|
||||
|
||||
// Even though we are restoring an item it may not have the proper dates. So let's
|
||||
// double check its associated date(s)
|
||||
DCDate now = DCDate.getCurrent();
|
||||
|
||||
// If the item doesn't have a date.accessioned, set it to today
|
||||
List<MetadataValue> dateAccessioned = itemService.getMetadata(item, MetadataSchema.DC_SCHEMA, "date", "accessioned", Item.ANY);
|
||||
if (dateAccessioned.size() == 0)
|
||||
{
|
||||
itemService.addMetadata(c, item, MetadataSchema.DC_SCHEMA, "date", "accessioned", null, now.toString());
|
||||
}
|
||||
|
||||
// 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
|
||||
List<MetadataValue> currentDateIssued = itemService.getMetadata(item, MetadataSchema.DC_SCHEMA, "date", "issued", Item.ANY);
|
||||
itemService.clearMetadata(c, item, MetadataSchema.DC_SCHEMA, "date", "issued", Item.ANY);
|
||||
for (MetadataValue dcv : currentDateIssued)
|
||||
{
|
||||
if(dcv.getValue()!=null && dcv.getValue().equalsIgnoreCase("today"))
|
||||
{
|
||||
DCDate issued = new DCDate(now.getYear(),now.getMonth(),now.getDay(),-1,-1,-1);
|
||||
itemService.addMetadata(c, item, dcv.getMetadataField(), dcv.getLanguage(), issued.toString());
|
||||
}
|
||||
else if(dcv.getValue()!=null)
|
||||
{
|
||||
itemService.addMetadata(c, item, dcv.getMetadataField(), dcv.getLanguage(), dcv.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
// Record that the item was restored
|
||||
String provDescription = "Restored into DSpace on "+ now + " (GMT).";
|
||||
itemService.addMetadata(c, item, MetadataSchema.DC_SCHEMA, "description", "provenance", "en", provDescription);
|
||||
|
||||
return finishItem(c, item, is);
|
||||
}
|
||||
|
||||
|
||||
protected void populateMetadata(Context c, Item item)
|
||||
throws SQLException, AuthorizeException
|
||||
{
|
||||
// create accession date
|
||||
DCDate now = DCDate.getCurrent();
|
||||
itemService.addMetadata(c, item, MetadataSchema.DC_SCHEMA, "date", "accessioned", null, now.toString());
|
||||
|
||||
// add date available if not under embargo, otherwise it will
|
||||
// be set when the embargo is lifted.
|
||||
// this will flush out fatal embargo metadata
|
||||
// problems before we set inArchive.
|
||||
if (embargoService.getEmbargoTermsAsDate(c, item) == null)
|
||||
{
|
||||
itemService.addMetadata(c, item, MetadataSchema.DC_SCHEMA, "date", "available", null, now.toString());
|
||||
}
|
||||
|
||||
// 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
|
||||
List<MetadataValue> currentDateIssued = itemService.getMetadata(item, MetadataSchema.DC_SCHEMA, "date", "issued", Item.ANY);
|
||||
itemService.clearMetadata(c, item, MetadataSchema.DC_SCHEMA, "date", "issued", Item.ANY);
|
||||
for (MetadataValue dcv : currentDateIssued)
|
||||
{
|
||||
if(dcv.getValue()!=null && dcv.getValue().equalsIgnoreCase("today"))
|
||||
{
|
||||
DCDate issued = new DCDate(now.getYear(),now.getMonth(),now.getDay(),-1,-1,-1);
|
||||
itemService.addMetadata(c, item, dcv.getMetadataField(), dcv.getLanguage(), issued.toString());
|
||||
}
|
||||
else if(dcv.getValue()!=null)
|
||||
{
|
||||
itemService.addMetadata(c, item, dcv.getMetadataField(), dcv.getLanguage(), dcv.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
String provDescription = "Made available in DSpace on " + now
|
||||
+ " (GMT). " + getBitstreamProvenanceMessage(c, 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.size() != 0)
|
||||
{
|
||||
String previousDateIssued = currentDateIssued.get(0).getValue();
|
||||
if(previousDateIssued!=null && !previousDateIssued.equalsIgnoreCase("today"))
|
||||
{
|
||||
DCDate d = new DCDate(previousDateIssued);
|
||||
provDescription = provDescription + " Previous issue date: "
|
||||
+ d.toString();
|
||||
}
|
||||
}
|
||||
|
||||
// Add provenance description
|
||||
itemService.addMetadata(c, item, MetadataSchema.DC_SCHEMA, "description", "provenance", "en", provDescription);
|
||||
}
|
||||
|
||||
// final housekeeping when adding new Item to archive
|
||||
// common between installing and "restoring" items.
|
||||
protected Item finishItem(Context c, Item item, InProgressSubmission is)
|
||||
throws SQLException, AuthorizeException
|
||||
{
|
||||
// create collection2item mapping
|
||||
collectionService.addItem(c, is.getCollection(), item);
|
||||
|
||||
// set owning collection
|
||||
item.setOwningCollection(is.getCollection());
|
||||
|
||||
// set in_archive=true
|
||||
item.setArchived(true);
|
||||
|
||||
// save changes ;-)
|
||||
itemService.update(c, item);
|
||||
|
||||
// Notify interested parties of newly archived Item
|
||||
c.addEvent(new Event(Event.INSTALL, Constants.ITEM, item.getID(),
|
||||
item.getHandle(), itemService.getIdentifiers(c, item)));
|
||||
|
||||
// remove in-progress submission
|
||||
contentServiceFactory.getInProgressSubmissionService(is).deleteWrapper(c, is);
|
||||
|
||||
// remove the item's policies and replace them with
|
||||
// the defaults from the collection
|
||||
itemService.inheritCollectionDefaultPolicies(c, item, is.getCollection());
|
||||
|
||||
// set embargo lift date and take away read access if indicated.
|
||||
embargoService.setEmbargo(c, item);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBitstreamProvenanceMessage(Context context, Item myitem)
|
||||
throws SQLException
|
||||
{
|
||||
// Get non-internal format bitstreams
|
||||
List<Bitstream> bitstreams = itemService.getNonInternalBitstreams(context, myitem);
|
||||
|
||||
// Create provenance description
|
||||
StringBuilder myMessage = new StringBuilder();
|
||||
myMessage.append("No. of bitstreams: ").append(bitstreams.size()).append("\n");
|
||||
|
||||
// Add sizes and checksums of bitstreams
|
||||
for (Bitstream bitstream : bitstreams)
|
||||
{
|
||||
myMessage.append(bitstream.getName()).append(": ")
|
||||
.append(bitstream.getSize()).append(" bytes, checksum: ")
|
||||
.append(bitstream.getChecksum()).append(" (")
|
||||
.append(bitstream.getChecksumAlgorithm()).append(")\n");
|
||||
}
|
||||
|
||||
return myMessage.toString();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user