mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-19 07:53:08 +00:00
128 lines
5.3 KiB
Java
128 lines
5.3 KiB
Java
/**
|
|
* 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.versioning;
|
|
|
|
import org.dspace.authorize.AuthorizeException;
|
|
import org.dspace.content.Item;
|
|
import org.dspace.content.WorkspaceItem;
|
|
import org.dspace.content.service.WorkspaceItemService;
|
|
import org.dspace.core.Context;
|
|
import org.dspace.identifier.IdentifierException;
|
|
import org.dspace.identifier.service.IdentifierService;
|
|
import org.dspace.versioning.service.VersionHistoryService;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import java.io.IOException;
|
|
import java.sql.SQLException;
|
|
import java.util.List;
|
|
import org.apache.log4j.Logger;
|
|
import org.dspace.authorize.ResourcePolicy;
|
|
import org.dspace.versioning.service.VersioningService;
|
|
import org.dspace.workflow.WorkflowItemService;
|
|
|
|
/**
|
|
*
|
|
*
|
|
* @author Fabio Bolognesi (fabio at atmire dot com)
|
|
* @author Mark Diggory (markd at atmire dot com)
|
|
* @author Ben Bosman (ben at atmire dot com)
|
|
*/
|
|
public class DefaultItemVersionProvider extends AbstractVersionProvider implements ItemVersionProvider
|
|
{
|
|
|
|
Logger log = Logger.getLogger(DefaultItemVersionProvider.class);
|
|
|
|
@Autowired(required = true)
|
|
protected WorkspaceItemService workspaceItemService;
|
|
@Autowired(required = true)
|
|
protected WorkflowItemService workflowItemService;
|
|
@Autowired(required = true)
|
|
protected VersionHistoryService versionHistoryService;
|
|
@Autowired(required = true)
|
|
protected VersioningService versioningService;
|
|
@Autowired(required = true)
|
|
protected IdentifierService identifierService;
|
|
|
|
@Override
|
|
public Item createNewItemAndAddItInWorkspace(Context context, Item nativeItem) {
|
|
try
|
|
{
|
|
WorkspaceItem workspaceItem = workspaceItemService.create(context, nativeItem.getOwningCollection(), false);
|
|
Item itemNew = workspaceItem.getItem();
|
|
itemService.update(context, itemNew);
|
|
return itemNew;
|
|
}catch (SQLException | AuthorizeException e) {
|
|
throw new RuntimeException(e.getMessage(), e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void deleteVersionedItem(Context c, Version versionToDelete, VersionHistory history)
|
|
throws SQLException
|
|
{
|
|
try
|
|
{
|
|
// if versionToDelete is the current version we have to reinstate the previous version
|
|
// and reset canonical
|
|
if(versionHistoryService.isLastVersion(c, history, versionToDelete)
|
|
&& versioningService.getVersionsByHistory(c, history).size() > 1)
|
|
{
|
|
// if a new version gets archived, the old one is set to false.
|
|
// we need to do the oposite now, if the old version was previously
|
|
// unarchived. If the old version is still archived, the new
|
|
// version is a WorkspaceItem or WorkflowItem we should skip this,
|
|
// as unarchiving of previous versions is done only when a newer
|
|
// version gets archived.
|
|
Item item = versionHistoryService.getPrevious(c, history, versionToDelete).getItem();
|
|
if (!item.isArchived()
|
|
|| workspaceItemService.findByItem(c, versionToDelete.getItem()) != null
|
|
|| workflowItemService.findByItem(c, versionToDelete.getItem()) != null)
|
|
{
|
|
item.setArchived(true);
|
|
itemService.update(c, item);
|
|
}
|
|
}
|
|
|
|
// assign tombstone to the Identifier and reset canonical to the previous version only if there is a previous version
|
|
Item itemToDelete=versionToDelete.getItem();
|
|
identifierService.delete(c, itemToDelete);
|
|
} catch (SQLException | AuthorizeException | IdentifierException e) {
|
|
throw new RuntimeException(e.getMessage(), e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Item updateItemState(Context c, Item itemNew, Item previousItem)
|
|
{
|
|
try
|
|
{
|
|
copyMetadata(c, itemNew, previousItem);
|
|
createBundlesAndAddBitstreams(c, itemNew, previousItem);
|
|
try
|
|
{
|
|
identifierService.reserve(c, itemNew);
|
|
} catch (IdentifierException e) {
|
|
throw new RuntimeException("Can't create Identifier!", e);
|
|
}
|
|
// DSpace knows several types of resource policies (see the class
|
|
// org.dspace.authorize.ResourcePolicy): Submission, Workflow, Custom
|
|
// and inherited. Submission, Workflow and Inherited policies will be
|
|
// set automatically as neccessary. We need to copy the custom policies
|
|
// only to preserve customly set policies and embargos (which are
|
|
// realized by custom policies with a start date).
|
|
List<ResourcePolicy> policies =
|
|
authorizeService.findPoliciesByDSOAndType(c, previousItem, ResourcePolicy.TYPE_CUSTOM);
|
|
authorizeService.addPolicies(c, policies, itemNew);
|
|
itemService.update(c, itemNew);
|
|
return itemNew;
|
|
}catch (IOException | SQLException | AuthorizeException e) {
|
|
throw new RuntimeException(e.getMessage(), e);
|
|
}
|
|
}
|
|
}
|