mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-19 07:53:08 +00:00
Merge pull request #896 from tuub/DS-1814
DS-1814: Allow submitter to create new version of their items.
This commit is contained in:
@@ -7,6 +7,15 @@
|
||||
*/
|
||||
package org.dspace.content;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.log4j.Logger;
|
||||
@@ -18,7 +27,15 @@ import org.dspace.authorize.service.AuthorizeService;
|
||||
import org.dspace.authorize.service.ResourcePolicyService;
|
||||
import org.dspace.content.authority.Choices;
|
||||
import org.dspace.content.dao.ItemDAO;
|
||||
import org.dspace.content.service.*;
|
||||
import org.dspace.content.service.BitstreamFormatService;
|
||||
import org.dspace.content.service.BitstreamService;
|
||||
import org.dspace.content.service.BundleService;
|
||||
import org.dspace.content.service.CollectionService;
|
||||
import org.dspace.content.service.CommunityService;
|
||||
import org.dspace.content.service.InstallItemService;
|
||||
import org.dspace.content.service.ItemService;
|
||||
import org.dspace.content.service.MetadataSchemaService;
|
||||
import org.dspace.content.service.WorkspaceItemService;
|
||||
import org.dspace.core.Constants;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.core.LogManager;
|
||||
@@ -29,15 +46,11 @@ import org.dspace.harvest.HarvestedItem;
|
||||
import org.dspace.harvest.service.HarvestedItemService;
|
||||
import org.dspace.identifier.IdentifierException;
|
||||
import org.dspace.identifier.service.IdentifierService;
|
||||
import org.dspace.services.ConfigurationService;
|
||||
import org.dspace.versioning.service.VersioningService;
|
||||
import org.dspace.workflow.WorkflowItemService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Service implementation for the Item object.
|
||||
* This class is responsible for all business logic calls for the Item object and is autowired by spring.
|
||||
@@ -79,6 +92,9 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
|
||||
protected VersioningService versioningService;
|
||||
@Autowired(required=true)
|
||||
protected HarvestedItemService harvestedItemService;
|
||||
@Autowired(required=true)
|
||||
protected ConfigurationService configurationService;
|
||||
|
||||
@Autowired(required=true)
|
||||
protected WorkspaceItemService workspaceItemService;
|
||||
@Autowired(required=true)
|
||||
@@ -596,13 +612,15 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
|
||||
context.addEvent(new Event(Event.DELETE, Constants.ITEM, item.getID(),
|
||||
item.getHandle(), getIdentifiers(context, item)));
|
||||
|
||||
|
||||
log.info(LogManager.getHeader(context, "delete_item", "item_id="
|
||||
+ item.getID()));
|
||||
|
||||
// Remove bundles
|
||||
removeAllBundles(context, item);
|
||||
|
||||
// Remove any Handle
|
||||
handleService.unbindHandle(context, item);
|
||||
|
||||
// remove version attached to the item
|
||||
removeVersion(context, item);
|
||||
|
||||
@@ -618,10 +636,6 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
|
||||
item.getCollections().clear();
|
||||
item.setOwningCollection(null);
|
||||
|
||||
// Remove any Handle
|
||||
handleService.unbindHandle(context, item);
|
||||
|
||||
|
||||
// Finally remove item row
|
||||
itemDAO.delete(context, item);
|
||||
}
|
||||
@@ -1213,4 +1227,21 @@ prevent the generation of resource policy entry values with null dspace_object a
|
||||
// return count of items that are not in archive and withdrawn
|
||||
return itemDAO.countItems(context, false, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canCreateNewVersion(Context context, Item item) throws SQLException{
|
||||
if (authorizeService.isAdmin(context, item))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (context.getCurrentUser() != null
|
||||
&& context.getCurrentUser().equals(item.getSubmitter()))
|
||||
{
|
||||
return configurationService.getPropertyAsType(
|
||||
"versioning.submitterCanCreateNewVersion", false);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@@ -444,7 +444,15 @@ public interface ItemService extends DSpaceObjectService<Item>, DSpaceObjectLega
|
||||
* @throws SQLException if database error
|
||||
*/
|
||||
public boolean canEdit(Context context, Item item) throws java.sql.SQLException;
|
||||
|
||||
|
||||
/**
|
||||
* return TRUE if context's user can create new version of the item, false
|
||||
* otherwise.
|
||||
* @return boolean true = current user can create new version of the item
|
||||
* @throws SQLException
|
||||
*/
|
||||
public boolean canCreateNewVersion(Context context, Item item) throws SQLException;
|
||||
|
||||
/**
|
||||
* Returns an iterator of Items possessing the passed metadata field, or only
|
||||
* those matching the passed value, if value is not Item.ANY
|
||||
|
@@ -96,18 +96,19 @@ public abstract class AbstractVersionProvider {
|
||||
{
|
||||
bundleNew.setPrimaryBitstreamID(bitstreamNew);
|
||||
}
|
||||
|
||||
bitstreamService.update(c, bitstreamNew);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected Bitstream createBitstream(Context context, Bitstream nativeBitstream) throws AuthorizeException, SQLException, IOException {
|
||||
protected Bitstream createBitstream(Context context, Bitstream nativeBitstream) throws AuthorizeException, SQLException, IOException {
|
||||
Bitstream newBitstream = bitstreamStorageService.clone(context, nativeBitstream);
|
||||
List<MetadataValue> bitstreamMeta = bitstreamService.getMetadata(nativeBitstream, Item.ANY, Item.ANY, Item.ANY, Item.ANY);
|
||||
for (MetadataValue value : bitstreamMeta) {
|
||||
bitstreamService.addMetadata(context, newBitstream, value.getMetadataField(), value.getLanguage(), value.getValue(), value.getAuthority(), value.getConfidence());
|
||||
}
|
||||
bitstreamService.update(context, newBitstream);
|
||||
return newBitstream;
|
||||
}
|
||||
|
||||
|
@@ -23,6 +23,7 @@ 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;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -39,6 +40,8 @@ public class DefaultItemVersionProvider extends AbstractVersionProvider implemen
|
||||
@Autowired(required = true)
|
||||
protected WorkspaceItemService workspaceItemService;
|
||||
@Autowired(required = true)
|
||||
protected WorkflowItemService workflowItemService;
|
||||
@Autowired(required = true)
|
||||
protected VersionHistoryService versionHistoryService;
|
||||
@Autowired(required = true)
|
||||
protected VersioningService versioningService;
|
||||
@@ -69,10 +72,20 @@ public class DefaultItemVersionProvider extends AbstractVersionProvider implemen
|
||||
if(versionHistoryService.isLastVersion(c, history, versionToDelete)
|
||||
&& versioningService.getVersionsByHistory(c, history).size() > 1)
|
||||
{
|
||||
// reset the previous version to archived
|
||||
// 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();
|
||||
item.setArchived(true);
|
||||
itemService.update(c, item);
|
||||
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
|
||||
|
@@ -7,22 +7,25 @@
|
||||
*/
|
||||
package org.dspace.versioning;
|
||||
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.dspace.content.DCDate;
|
||||
import org.dspace.content.MetadataValue;
|
||||
import org.dspace.content.Item;
|
||||
import org.dspace.content.MetadataValue;
|
||||
import org.dspace.content.WorkspaceItem;
|
||||
import org.dspace.content.service.ItemService;
|
||||
import org.dspace.content.service.WorkspaceItemService;
|
||||
import org.dspace.core.Context;
|
||||
import org.dspace.versioning.dao.VersionDAO;
|
||||
import org.dspace.versioning.service.VersionHistoryService;
|
||||
import org.dspace.versioning.service.VersioningService;
|
||||
import org.dspace.workflow.WorkflowItem;
|
||||
import org.dspace.workflow.WorkflowItemService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Required;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
@@ -39,6 +42,11 @@ public class VersioningServiceImpl implements VersioningService {
|
||||
protected VersionDAO versionDAO;
|
||||
@Autowired(required = true)
|
||||
private ItemService itemService;
|
||||
@Autowired(required = true)
|
||||
private WorkspaceItemService workspaceItemService;
|
||||
@Autowired(required = true)
|
||||
protected WorkflowItemService workflowItemService;
|
||||
|
||||
private DefaultItemVersionProvider provider;
|
||||
|
||||
@Required
|
||||
@@ -129,7 +137,24 @@ public class VersioningServiceImpl implements VersioningService {
|
||||
|
||||
// Completely delete the item
|
||||
if (item != null) {
|
||||
itemService.delete(c, item);
|
||||
// DS-1814 introduce the possibility that submitter can create
|
||||
// new versions. To avoid authorithation problems we need to
|
||||
// check whether a corresponding workspaceItem exists.
|
||||
if (!item.isArchived())
|
||||
{
|
||||
WorkspaceItem wsi = workspaceItemService.findByItem(c, item);
|
||||
if(wsi != null) {
|
||||
workspaceItemService.deleteAll(c, wsi);
|
||||
} else {
|
||||
WorkflowItem wfi = workflowItemService.findByItem(c, item);
|
||||
if (wfi != null) {
|
||||
workflowItemService.delete(c, wfi);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
itemService.delete(c, item);
|
||||
}
|
||||
}
|
||||
}catch (Exception e) {
|
||||
c.abort();
|
||||
|
Reference in New Issue
Block a user