From 4870d75afa74ea93c677a6adaacc8143a9db29e4 Mon Sep 17 00:00:00 2001 From: Luigi Andrea Pascarelli Date: Wed, 15 Nov 2017 19:50:12 +0100 Subject: [PATCH] D4CRIS-338 refactoring to implement PATCH operation model; manage upload section operation; --- .../app/itemupdate/AddBitstreamsAction.java | 2 +- .../authorize/AuthorizeServiceImpl.java | 13 +-- .../authorize/service/AuthorizeService.java | 2 +- .../dspace/content/CollectionServiceImpl.java | 6 +- .../dspace/content/CommunityServiceImpl.java | 2 +- .../converter/AccessConditionsConverter.java | 30 +++---- .../app/rest/model/AccessConditionRest.java | 1 - .../dspace/app/rest/model/LicenseRest.java | 2 - .../rest/model/step/UploadBitstreamRest.java | 37 ++++++--- .../AccessConditionRestLinkRepository.java | 1 - .../WorkspaceItemRestRepository.java | 18 ++--- .../submit/AbstractRestProcessingStep.java | 2 +- .../submit/PatchConfigurationService.java | 19 +++++ .../app/rest/submit/SubmissionService.java | 53 ++++++++---- .../submit/factory/PatchOperationFactory.java | 31 +++++++ .../AccessConditionRemovePatchOperation.java | 49 +++++++++++ .../AccessConditionReplacePatchOperation.java | 77 ++++++++++++++++++ .../factory/impl/AddPatchOperation.java | 16 ++++ ...tstreamMetadataValueAddPatchOperation.java | 55 +++++++++++++ ...reamMetadataValueRemovePatchOperation.java | 64 +++++++++++++++ ...eamMetadataValueReplacePatchOperation.java | 55 +++++++++++++ .../impl/BitstreamRemovePatchOperation.java | 63 +++++++++++++++ .../ItemMetadataValueAddPatchOperation.java | 36 +++++++++ ...ItemMetadataValueRemovePatchOperation.java | 46 +++++++++++ ...temMetadataValueReplacePatchOperation.java | 38 +++++++++ .../impl/LicenseRemovePatchOperation.java | 26 ++++++ .../impl/LicenseReplacePatchOperation.java | 38 +++++++++ .../submit/factory/impl/PatchOperation.java | 23 ++++++ .../factory/impl/RemovePatchOperation.java | 16 ++++ .../factory/impl/ReplacePatchOperation.java | 18 +++++ .../app/rest/submit/step/CollectionStep.java | 2 +- .../app/rest/submit/step/DescribeStep.java | 58 ++----------- .../app/rest/submit/step/LicenseStep.java | 37 ++------- .../app/rest/submit/step/UploadStep.java | 44 +++++----- .../spring/spring-dspace-core-services.xml | 81 +++++++++++++++++++ dspace/config/spring/api/access-condition.xml | 21 +---- 36 files changed, 887 insertions(+), 195 deletions(-) create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/PatchConfigurationService.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/PatchOperationFactory.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AccessConditionRemovePatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AccessConditionReplacePatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AddPatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueAddPatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueRemovePatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueReplacePatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamRemovePatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueAddPatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueRemovePatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueReplacePatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseRemovePatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/PatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/RemovePatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ReplacePatchOperation.java create mode 100644 dspace-spring-rest/src/main/resources/spring/spring-dspace-core-services.xml diff --git a/dspace-api/src/main/java/org/dspace/app/itemupdate/AddBitstreamsAction.java b/dspace-api/src/main/java/org/dspace/app/itemupdate/AddBitstreamsAction.java index d78c73693b..349ccfaada 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemupdate/AddBitstreamsAction.java +++ b/dspace-api/src/main/java/org/dspace/app/itemupdate/AddBitstreamsAction.java @@ -210,7 +210,7 @@ public class AddBitstreamsAction extends UpdateBitstreamsAction { if (group != null) { authorizeService.removeAllPolicies(context, bs); // remove the default policy - authorizeService.createResourcePolicy(context, bs, group, null, ce.permissionsActionId, null); + authorizeService.createResourcePolicy(context, bs, group, null, ce.permissionsActionId, null, null, null, null); } } diff --git a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java index d551b23795..f34aba4e03 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java @@ -530,21 +530,21 @@ public class AuthorizeServiceImpl implements AuthorizeService public void addPolicy(Context context, DSpaceObject o, int actionID, EPerson e, String type) throws SQLException, AuthorizeException { - createResourcePolicy(context, o, null, e, actionID, type); + createResourcePolicy(context, o, null, e, actionID, type, null, null, null); } @Override public void addPolicy(Context c, DSpaceObject o, int actionID, Group g) throws SQLException, AuthorizeException { - createResourcePolicy(c, o, g, null, actionID, null); + createResourcePolicy(c, o, g, null, actionID, null, null, null, null); } @Override public void addPolicy(Context c, DSpaceObject o, int actionID, Group g, String type) throws SQLException, AuthorizeException { - createResourcePolicy(c, o, g, null, actionID, type); + createResourcePolicy(c, o, g, null, actionID, type, null, null, null); } @Override @@ -777,7 +777,7 @@ public class AuthorizeServiceImpl implements AuthorizeService } @Override - public ResourcePolicy createResourcePolicy(Context context, DSpaceObject dso, Group group, EPerson eperson, int type, String rpType) throws SQLException, AuthorizeException { + public ResourcePolicy createResourcePolicy(Context context, DSpaceObject dso, Group group, EPerson eperson, int type, String rpType, String rpName, Date startDate, Date endDate) throws SQLException, AuthorizeException { if (group == null && eperson == null) { throw new IllegalArgumentException("We need at least an eperson or a group in order to create a resource policy."); @@ -789,6 +789,9 @@ public class AuthorizeServiceImpl implements AuthorizeService myPolicy.setGroup(group); myPolicy.setEPerson(eperson); myPolicy.setRpType(rpType); + myPolicy.setRpName(rpName); + myPolicy.setEndDate(endDate); + myPolicy.setStartDate(startDate); resourcePolicyService.update(context, myPolicy); return myPolicy; @@ -819,7 +822,7 @@ public class AuthorizeServiceImpl implements AuthorizeService if (policy == null) { - policy = createResourcePolicy(context, dso, group, ePerson, action, ResourcePolicy.TYPE_CUSTOM); + policy = createResourcePolicy(context, dso, group, ePerson, action, ResourcePolicy.TYPE_CUSTOM, null, null, null); } policy.setGroup(group); policy.setEPerson(ePerson); diff --git a/dspace-api/src/main/java/org/dspace/authorize/service/AuthorizeService.java b/dspace-api/src/main/java/org/dspace/authorize/service/AuthorizeService.java index 9b5d30ebe1..e0981f3e02 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/service/AuthorizeService.java +++ b/dspace-api/src/main/java/org/dspace/authorize/service/AuthorizeService.java @@ -471,7 +471,7 @@ public interface AuthorizeService { */ public void generateAutomaticPolicies(Context context, Date embargoDate, String reason, DSpaceObject dso, Collection owningCollection) throws SQLException, AuthorizeException; - public ResourcePolicy createResourcePolicy(Context context, DSpaceObject dso, Group group, EPerson eperson, int type, String rpType) throws SQLException, AuthorizeException; + public ResourcePolicy createResourcePolicy(Context context, DSpaceObject dso, Group group, EPerson eperson, int type, String rpType, String rpName, Date startDate, Date endDate) throws SQLException, AuthorizeException; public ResourcePolicy createOrModifyPolicy(ResourcePolicy policy, Context context, String name, Group group, EPerson ePerson, Date embargoDate, int action, String reason, DSpaceObject dso) throws AuthorizeException, SQLException; diff --git a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java index cbac3cfcfb..fad27252b6 100644 --- a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java @@ -106,10 +106,10 @@ public class CollectionServiceImpl extends DSpaceObjectServiceImpl i Group anonymousGroup = groupService.findByName(context, Group.ANONYMOUS); - authorizeService.createResourcePolicy(context, newCollection, anonymousGroup, null, Constants.READ, null); + authorizeService.createResourcePolicy(context, newCollection, anonymousGroup, null, Constants.READ, null, null, null, null); // now create the default policies for submitted items - authorizeService.createResourcePolicy(context, newCollection, anonymousGroup, null, Constants.DEFAULT_ITEM_READ, null); - authorizeService.createResourcePolicy(context, newCollection, anonymousGroup, null, Constants.DEFAULT_BITSTREAM_READ, null); + authorizeService.createResourcePolicy(context, newCollection, anonymousGroup, null, Constants.DEFAULT_ITEM_READ, null, null, null, null); + authorizeService.createResourcePolicy(context, newCollection, anonymousGroup, null, Constants.DEFAULT_BITSTREAM_READ, null, null, null, null); diff --git a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java index f93e6d441c..844e593516 100644 --- a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java @@ -108,7 +108,7 @@ public class CommunityServiceImpl extends DSpaceObjectServiceImpl imp // of 'anonymous' READ Group anonymousGroup = groupService.findByName(context, Group.ANONYMOUS); - authorizeService.createResourcePolicy(context, newCommunity, anonymousGroup, null, Constants.READ, null); + authorizeService.createResourcePolicy(context, newCommunity, anonymousGroup, null, Constants.READ, null, null, null, null); communityDAO.save(context, newCommunity); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AccessConditionsConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AccessConditionsConverter.java index 496feed41f..371774bc34 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AccessConditionsConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AccessConditionsConverter.java @@ -14,10 +14,9 @@ import org.dspace.services.ConfigurationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - - /** - * Converter to translate ResourcePolicy into human readable value configuration. + * Converter to translate ResourcePolicy into human readable value + * configuration. * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ @@ -26,29 +25,22 @@ public class AccessConditionsConverter extends DSpaceConverter metadata; + private Map> metadata = new HashMap<>(); + private List accessConditions; private Long sizeBytes; private CheckSumRest checkSum; private String url; - public List getMetadata() { - return metadata; - } - - public void setMetadata(List metadata) { - this.metadata = metadata; - } - public Long getSizeBytes() { return sizeBytes; } @@ -54,4 +50,23 @@ public class UploadBitstreamRest extends UploadStatusResponse { public void setUuid(UUID uuid) { this.uuid = uuid; } + + public Map> getMetadata() { + return metadata; + } + + public void setMetadata(Map> metadata) { + this.metadata = metadata; + } + + public List getAccessConditions() { + if(accessConditions==null) { + accessConditions = new ArrayList<>(); + } + return accessConditions; + } + + public void setAccessConditions(List accessConditions) { + this.accessConditions = accessConditions; + } } \ No newline at end of file diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AccessConditionRestLinkRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AccessConditionRestLinkRepository.java index f0fe967daa..bc6064218e 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AccessConditionRestLinkRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AccessConditionRestLinkRepository.java @@ -26,7 +26,6 @@ import org.dspace.core.Constants; import org.dspace.core.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.hateoas.ResourceSupport; import org.springframework.stereotype.Component; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java index 09b48c873e..2dec6de5ca 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java @@ -243,23 +243,19 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository4) { - index = path[4]; - } + String[] path = op.getPath().substring(1).split("/",3); + if("sections".equals(path[0])) { + String section = path[1]; + String absolutePath = path[2]; String operation = op.getOp(); - evaluatePatch(context, request, source, wsi, operation, section, target, index, op.getValue()); + evaluatePatch(context, request, source, wsi, operation, section, absolutePath, op.getValue()); } } wis.update(context, source); } - private void evaluatePatch(Context context, HttpServletRequest request, WorkspaceItem source, WorkspaceItemRest wsi, String operation, String section, String target, String index, + private void evaluatePatch(Context context, HttpServletRequest request, WorkspaceItem source, WorkspaceItemRest wsi, String operation, String section, String path, Object value) throws Exception { SubmissionConfig submissionConfig = submissionConfigReader.getSubmissionConfigByName(wsi.getSubmissionDefinition().getName()); for(int stepNum = 0; stepNum T getData(WorkspaceItem obj, SubmissionStepConfig config) throws Exception; public void doPatchProcessing(Context context, Request currentRequest, WorkspaceItem source, String operation, - String target, String index, Object value) throws Exception; + String path, Object value) throws Exception; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/PatchConfigurationService.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/PatchConfigurationService.java new file mode 100644 index 0000000000..3fe6970717 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/PatchConfigurationService.java @@ -0,0 +1,19 @@ +package org.dspace.app.rest.submit; + +import java.util.Map; + +import org.dspace.app.rest.submit.factory.impl.PatchOperation; + +public class PatchConfigurationService { + + private Map> map; + + public Map> getMap() { + return map; + } + + public void setMap(Map> map) { + this.map = map; + } + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/SubmissionService.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/SubmissionService.java index f185245367..4cda98133d 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/SubmissionService.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/SubmissionService.java @@ -14,10 +14,13 @@ import java.util.UUID; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.atteo.evo.inflector.English; +import org.dspace.app.rest.converter.AccessConditionsConverter; +import org.dspace.app.rest.model.AccessConditionRest; import org.dspace.app.rest.model.BitstreamRest; import org.dspace.app.rest.model.CheckSumRest; -import org.dspace.app.rest.model.MetadataEntryRest; +import org.dspace.app.rest.model.MetadataValueRest; import org.dspace.app.rest.model.step.UploadBitstreamRest; +import org.dspace.authorize.ResourcePolicy; import org.dspace.content.Bitstream; import org.dspace.content.Collection; import org.dspace.content.MetadataValue; @@ -25,6 +28,7 @@ import org.dspace.content.WorkspaceItem; import org.dspace.content.service.CollectionService; import org.dspace.content.service.WorkspaceItemService; import org.dspace.core.Context; +import org.dspace.core.Utils; import org.dspace.services.ConfigurationService; import org.dspace.services.model.Request; import org.springframework.beans.factory.annotation.Autowired; @@ -84,24 +88,43 @@ public class SubmissionService { public static UploadBitstreamRest buildUploadBitstream(ConfigurationService configurationService, Bitstream source) { - UploadBitstreamRest b = new UploadBitstreamRest(); - List metadata = new ArrayList(); - for (MetadataValue mv : source.getMetadata()) { - MetadataEntryRest me = new MetadataEntryRest(); - me.setKey(mv.getMetadataField().toString('.')); - me.setValue(mv.getValue()); - me.setLanguage(mv.getLanguage()); - metadata.add(me); + UploadBitstreamRest data = new UploadBitstreamRest(); + + for (MetadataValue md : source.getMetadata()) { + + MetadataValueRest dto = new MetadataValueRest(); + dto.setAuthority(md.getAuthority()); + dto.setConfidence(md.getConfidence()); + dto.setLanguage(md.getLanguage()); + dto.setPlace(md.getPlace()); + dto.setValue(md.getValue()); + + String[] metadataToCheck = Utils.tokenize(md.getMetadataField().toString()); + if(data.getMetadata().containsKey(Utils.standardize(metadataToCheck[0], metadataToCheck[1], metadataToCheck[2], "."))) { + data.getMetadata().get(Utils.standardize(md.getMetadataField().getMetadataSchema().getName(), md.getMetadataField().getElement(), md.getMetadataField().getQualifier(), ".")).add(dto); + } + else { + List listDto = new ArrayList<>(); + listDto.add(dto); + data.getMetadata().put(Utils.standardize(md.getMetadataField().getMetadataSchema().getName(), md.getMetadataField().getElement(), md.getMetadataField().getQualifier(), "."), listDto); + } + } - b.setMetadata(metadata); - b.setUuid(source.getID()); + + AccessConditionsConverter aCConverter = new AccessConditionsConverter(); + for(ResourcePolicy rp : source.getResourcePolicies()) { + AccessConditionRest accessConditionRest = aCConverter.convert(rp); + data.getAccessConditions().add(accessConditionRest); + } + + data.setUuid(source.getID()); CheckSumRest checksum = new CheckSumRest(); checksum.setCheckSumAlgorithm(source.getChecksumAlgorithm()); checksum.setValue(source.getChecksum()); - b.setCheckSum(checksum); - b.setSizeBytes(source.getSize()); - b.setUrl(configurationService.getProperty("dspace.url")+"/api/"+BitstreamRest.CATEGORY +"/"+ English.plural(BitstreamRest.NAME) + "/" + source.getID() + "/content"); - return b; + data.setCheckSum(checksum); + data.setSizeBytes(source.getSize()); + data.setUrl(configurationService.getProperty("dspace.url")+"/api/"+BitstreamRest.CATEGORY +"/"+ English.plural(BitstreamRest.NAME) + "/" + source.getID() + "/content"); + return data; } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/PatchOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/PatchOperationFactory.java new file mode 100644 index 0000000000..a95e29809d --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/PatchOperationFactory.java @@ -0,0 +1,31 @@ +package org.dspace.app.rest.submit.factory; + +import org.dspace.app.rest.submit.PatchConfigurationService; +import org.dspace.app.rest.submit.factory.impl.PatchOperation; +import org.dspace.services.factory.DSpaceServicesFactory; +import org.dspace.utils.DSpace; +import org.springframework.beans.factory.annotation.Autowired; + +public class PatchOperationFactory { + + private PatchConfigurationService patchConfigurationService; + + public PatchOperation instanceOf(String instance, String operation) { + PatchOperation result = getPatchConfigurationService().getMap().get(operation).get(instance); + if(result==null) { + throw new RuntimeException("Operation "+operation+" not yet implemented for " + instance); + } + return result; + } + + public PatchConfigurationService getPatchConfigurationService() { + if(patchConfigurationService==null) { + patchConfigurationService = DSpaceServicesFactory.getInstance().getServiceManager().getServiceByName("patchConfigurationService", PatchConfigurationService.class); + } + return patchConfigurationService; + } + + public void setPatchConfigurationService(PatchConfigurationService patchOperationService) { + this.patchConfigurationService = patchOperationService; + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AccessConditionRemovePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AccessConditionRemovePatchOperation.java new file mode 100644 index 0000000000..3d27059968 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AccessConditionRemovePatchOperation.java @@ -0,0 +1,49 @@ +package org.dspace.app.rest.submit.factory.impl; + +import java.util.List; + +import org.dspace.app.rest.model.AccessConditionRest; +import org.dspace.authorize.service.AuthorizeService; +import org.dspace.content.Bitstream; +import org.dspace.content.Bundle; +import org.dspace.content.Item; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; + +public class AccessConditionRemovePatchOperation extends RemovePatchOperation { + + @Autowired + ItemService itemService; + + @Autowired + AuthorizeService authorizeService; + + @Override + void remove(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) + throws Exception { + String[] split = path.split("/"); + Item item = source.getItem(); + + List bundle = itemService.getBundles(item, "ORIGINAL"); + ; + for (Bundle bb : bundle) { + int idx = 0; + for (Bitstream b : bb.getBitstreams()) { + if (idx == Integer.parseInt(split[0])) { + authorizeService.removeAllPolicies(context, b); + } + idx++; + } + } + + } + + @Override + protected Class getClassForEvaluation() { + return AccessConditionRest[].class; + } + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AccessConditionReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AccessConditionReplacePatchOperation.java new file mode 100644 index 0000000000..c19133e6a7 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AccessConditionReplacePatchOperation.java @@ -0,0 +1,77 @@ +package org.dspace.app.rest.submit.factory.impl; + +import java.util.Date; +import java.util.List; + +import org.dspace.app.rest.model.AccessConditionRest; +import org.dspace.authorize.ResourcePolicy; +import org.dspace.authorize.service.AuthorizeService; +import org.dspace.content.Bitstream; +import org.dspace.content.Bundle; +import org.dspace.content.Item; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.BitstreamService; +import org.dspace.content.service.ItemService; +import org.dspace.core.Constants; +import org.dspace.core.Context; +import org.dspace.eperson.Group; +import org.dspace.eperson.service.GroupService; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; + +public class AccessConditionReplacePatchOperation extends ReplacePatchOperation { + + @Autowired + BitstreamService bitstreamService; + + @Autowired + ItemService itemService; + + @Autowired + AuthorizeService authorizeService; + + @Autowired + GroupService groupService; + + @Override + void replace(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) + throws Exception { + String[] split = path.split("/"); + Item item = source.getItem(); + + List bundle = itemService.getBundles(item, "ORIGINAL"); + ; + for (Bundle bb : bundle) { + int idx = 0; + for (Bitstream b : bb.getBitstreams()) { + if (idx == Integer.parseInt(split[0])) { + authorizeService.removeAllPolicies(context, b); + AccessConditionRest[] newAccessConditions = evaluateObject((LateObjectEvaluator) value); + for (AccessConditionRest newAccessCondition : newAccessConditions) { + String name = newAccessCondition.getPolicyType(); + Group group = groupService.find(context, newAccessCondition.getGroupUUID()); + //TODO manage error on select group + Date startDate = null; + Date endDate = null; + if("embargo".equals(newAccessCondition.getPolicyType())) { + startDate = newAccessCondition.getEndDate(); + } + if("lease".equals(newAccessCondition.getPolicyType())) { + endDate = newAccessCondition.getEndDate(); + } + authorizeService.createResourcePolicy(context, b, group, null, Constants.READ, ResourcePolicy.TYPE_CUSTOM, name, startDate, endDate); + // TODO manage duplicate policy + } + } + idx++; + } + } + } + + @Override + protected Class getClassForEvaluation() { + return AccessConditionRest[].class; + } + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AddPatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AddPatchOperation.java new file mode 100644 index 0000000000..feed087844 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/AddPatchOperation.java @@ -0,0 +1,16 @@ +package org.dspace.app.rest.submit.factory.impl; + +import org.dspace.content.WorkspaceItem; +import org.dspace.core.Context; +import org.dspace.services.model.Request; + +public abstract class AddPatchOperation extends PatchOperation { + + @Override + public void perform(Context context, Request currentRequest, WorkspaceItem source, String string, Object value) throws Exception { + add(context, currentRequest, source, string, value); + } + + abstract void add(Context context,Request currentRequest,WorkspaceItem source,String string,Object value) throws Exception; + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueAddPatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueAddPatchOperation.java new file mode 100644 index 0000000000..7808beb689 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueAddPatchOperation.java @@ -0,0 +1,55 @@ +package org.dspace.app.rest.submit.factory.impl; + +import java.sql.SQLException; +import java.util.List; + +import org.dspace.app.rest.model.MetadataValueRest; +import org.dspace.content.Bitstream; +import org.dspace.content.Bundle; +import org.dspace.content.Item; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.BitstreamService; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.dspace.core.Utils; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; + +public class BitstreamMetadataValueAddPatchOperation extends AddPatchOperation { + + @Autowired + BitstreamService bitstreamService; + + @Autowired + ItemService itemService; + + @Override + void add(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) throws Exception { + String[] split = path.split("/"); + Item item = source.getItem(); + List bundle = itemService.getBundles(item, "ORIGINAL");; + for(Bundle bb : bundle) { + int idx = 0; + for(Bitstream b : bb.getBitstreams()) { + if(idx==Integer.parseInt(split[0])) { + addValue(context, b, split[2], evaluateObject((LateObjectEvaluator)value)); + } + idx++; + } + } + + } + + @Override + protected Class getClassForEvaluation() { + return MetadataValueRest[].class; + } + + private void addValue(Context context, Bitstream source, String target, MetadataValueRest[] list) throws SQLException { + String[] metadata = Utils.tokenize(target); + for(MetadataValueRest ll : list) { + bitstreamService.addMetadata(context, source, metadata[0], metadata[1], metadata[2], ll.getLanguage(), ll.getValue(), ll.getAuthority(), ll.getConfidence()); + } + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueRemovePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueRemovePatchOperation.java new file mode 100644 index 0000000000..cc6c060864 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueRemovePatchOperation.java @@ -0,0 +1,64 @@ +package org.dspace.app.rest.submit.factory.impl; + +import java.sql.SQLException; +import java.util.List; + +import org.dspace.app.rest.model.MetadataValueRest; +import org.dspace.content.Bitstream; +import org.dspace.content.Bundle; +import org.dspace.content.Item; +import org.dspace.content.MetadataValue; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.BitstreamService; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.dspace.core.Utils; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; + +public class BitstreamMetadataValueRemovePatchOperation extends RemovePatchOperation { + + @Autowired + BitstreamService bitstreamService; + + @Autowired + ItemService itemService; + + @Override + void remove(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) throws Exception { + String[] split = path.split("/"); + Item item = source.getItem(); + List bundle = itemService.getBundles(item, "ORIGINAL");; + for(Bundle bb : bundle) { + int idx = 0; + for(Bitstream b : bb.getBitstreams()) { + if(idx==Integer.parseInt(split[0])) { + deleteValue(context, b, split[2], split[3]); + } + idx++; + } + } + + } + + @Override + protected Class getClassForEvaluation() { + return MetadataValueRest[].class; + } + + private void deleteValue(Context context, Bitstream source, String target, String index) throws SQLException { + String[] metadata = Utils.tokenize(target); + List mm = bitstreamService.getMetadata(source, metadata[0], metadata[1], metadata[2], Item.ANY); + bitstreamService.clearMetadata(context, source, metadata[0], metadata[1], metadata[2], Item.ANY); + int idx = 0; + for(MetadataValue m : mm) { + Integer toDelete = Integer.parseInt(index); + if(idx != toDelete) { + bitstreamService.addMetadata(context, source, metadata[0], metadata[1], metadata[2], m.getLanguage(), m.getValue(), m.getAuthority(), m.getConfidence()); + } + idx++; + } + } + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueReplacePatchOperation.java new file mode 100644 index 0000000000..34daea561a --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamMetadataValueReplacePatchOperation.java @@ -0,0 +1,55 @@ +package org.dspace.app.rest.submit.factory.impl; + +import java.sql.SQLException; +import java.util.List; + +import org.dspace.app.rest.model.MetadataValueRest; +import org.dspace.content.Bitstream; +import org.dspace.content.Bundle; +import org.dspace.content.Item; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.BitstreamService; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.dspace.core.Utils; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; + +public class BitstreamMetadataValueReplacePatchOperation extends ReplacePatchOperation { + + @Autowired + BitstreamService bitstreamService; + + @Autowired + ItemService itemService; + + @Override + void replace(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) throws Exception { + String[] split = path.split("/"); + Item item = source.getItem(); + List bundle = itemService.getBundles(item, "ORIGINAL");; + for(Bundle bb : bundle) { + int idx = 0; + for(Bitstream b : bb.getBitstreams()) { + if(idx==Integer.parseInt(split[0])) { + replaceValue(context, b, split[2], evaluateObject((LateObjectEvaluator)value)); + } + idx++; + } + } + } + + @Override + protected Class getClassForEvaluation() { + return MetadataValueRest[].class; + } + + private void replaceValue(Context context, Bitstream source, String target, MetadataValueRest[] list) throws SQLException { + String[] metadata = Utils.tokenize(target); + bitstreamService.clearMetadata(context, source, metadata[0], metadata[1], metadata[2], Item.ANY); + for(MetadataValueRest ll : list) { + bitstreamService.addMetadata(context, source, metadata[0], metadata[1], metadata[2], ll.getLanguage(), ll.getValue(), ll.getAuthority(), ll.getConfidence()); + } + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamRemovePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamRemovePatchOperation.java new file mode 100644 index 0000000000..01a5e1fef2 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/BitstreamRemovePatchOperation.java @@ -0,0 +1,63 @@ +package org.dspace.app.rest.submit.factory.impl; + +import java.util.List; + +import org.dspace.content.Bitstream; +import org.dspace.content.Bundle; +import org.dspace.content.Item; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.BitstreamService; +import org.dspace.content.service.BundleService; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; + +public class BitstreamRemovePatchOperation extends RemovePatchOperation{ + + @Autowired + ItemService itemService; + + @Autowired + BundleService bundleService; + + @Override + void remove(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) + throws Exception { + + Item item = source.getItem(); + List bbb = itemService.getBundles(item, "ORIGINAL"); + Bitstream bitstream = null; + external : for(Bundle bb : bbb) { + int idx = 0; + for(Bitstream b : bb.getBitstreams()) { + if(idx==Integer.parseInt(path)) { + bitstream = b; + break external; + } + idx++; + } + } + + // remove bitstream from bundle.. + // delete bundle if it's now empty + List bundles = bitstream.getBundles(); + Bundle bundle = bundles.get(0); + bundleService.removeBitstream(context, bundle, bitstream); + + List bitstreams = bundle.getBitstreams(); + + // remove bundle if it's now empty + if (bitstreams.size() < 1) + { + itemService.removeBundle(context, item, bundle); + } + + } + + @Override + protected Class getClassForEvaluation() { + return String[].class; + } + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueAddPatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueAddPatchOperation.java new file mode 100644 index 0000000000..d09686d327 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueAddPatchOperation.java @@ -0,0 +1,36 @@ +package org.dspace.app.rest.submit.factory.impl; + +import java.sql.SQLException; + +import org.dspace.app.rest.model.MetadataValueRest; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.dspace.core.Utils; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; + +public class ItemMetadataValueAddPatchOperation extends AddPatchOperation { + + @Autowired + ItemService itemService; + + @Override + void add(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) throws Exception { + String[] split = path.split("/"); + addValue(context, source, split[0], evaluateObject((LateObjectEvaluator)value)); + } + + @Override + protected Class getClassForEvaluation() { + return MetadataValueRest[].class; + } + + private void addValue(Context context, WorkspaceItem source, String target, MetadataValueRest[] list) throws SQLException { + String[] metadata = Utils.tokenize(target); + for(MetadataValueRest ll : list) { + itemService.addMetadata(context, source.getItem(), metadata[0], metadata[1], metadata[2], ll.getLanguage(), ll.getValue(), ll.getAuthority(), ll.getConfidence()); + } + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueRemovePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueRemovePatchOperation.java new file mode 100644 index 0000000000..97546af7c6 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueRemovePatchOperation.java @@ -0,0 +1,46 @@ +package org.dspace.app.rest.submit.factory.impl; + +import java.sql.SQLException; +import java.util.List; + +import org.dspace.app.rest.model.MetadataValueRest; +import org.dspace.content.Item; +import org.dspace.content.MetadataValue; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.dspace.core.Utils; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; + +public class ItemMetadataValueRemovePatchOperation extends RemovePatchOperation { + + @Autowired + ItemService itemService; + + @Override + void remove(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) throws Exception { + String[] split = path.split("/"); + deleteValue(context, source, split[0], split[1]); + } + + @Override + protected Class getClassForEvaluation() { + return MetadataValueRest[].class; + } + + private void deleteValue(Context context, WorkspaceItem source, String target, String index) throws SQLException { + String[] metadata = Utils.tokenize(target); + List mm = itemService.getMetadata(source.getItem(), metadata[0], metadata[1], metadata[2], Item.ANY); + itemService.clearMetadata(context, source.getItem(), metadata[0], metadata[1], metadata[2], Item.ANY); + int idx = 0; + for(MetadataValue m : mm) { + Integer toDelete = Integer.parseInt(index); + if(idx != toDelete) { + itemService.addMetadata(context, source.getItem(), metadata[0], metadata[1], metadata[2], m.getLanguage(), m.getValue(), m.getAuthority(), m.getConfidence()); + } + idx++; + } + } + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueReplacePatchOperation.java new file mode 100644 index 0000000000..52ac38f915 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ItemMetadataValueReplacePatchOperation.java @@ -0,0 +1,38 @@ +package org.dspace.app.rest.submit.factory.impl; + +import java.sql.SQLException; + +import org.dspace.app.rest.model.MetadataValueRest; +import org.dspace.content.Item; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.dspace.core.Utils; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; + +public class ItemMetadataValueReplacePatchOperation extends ReplacePatchOperation { + + @Autowired + ItemService itemService; + + @Override + void replace(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) throws Exception { + String[] split = path.split("/"); + replaceValue(context, source, split[0], evaluateObject((LateObjectEvaluator)value)); + } + + @Override + protected Class getClassForEvaluation() { + return MetadataValueRest[].class; + } + + private void replaceValue(Context context, WorkspaceItem source, String target, MetadataValueRest[] list) throws SQLException { + String[] metadata = Utils.tokenize(target); + itemService.clearMetadata(context, source.getItem(), metadata[0], metadata[1], metadata[2], Item.ANY); + for(MetadataValueRest ll : list) { + itemService.addMetadata(context, source.getItem(), metadata[0], metadata[1], metadata[2], ll.getLanguage(), ll.getValue(), ll.getAuthority(), ll.getConfidence()); + } + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseRemovePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseRemovePatchOperation.java new file mode 100644 index 0000000000..05adb38f80 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseRemovePatchOperation.java @@ -0,0 +1,26 @@ +package org.dspace.app.rest.submit.factory.impl; + +import org.dspace.content.Item; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; + +public class LicenseRemovePatchOperation extends RemovePatchOperation { + + @Autowired + ItemService itemService; + + @Override + void remove(Context context, Request currentRequest, WorkspaceItem source, String string, Object value) throws Exception { + Item item = source.getItem(); + itemService.removeDSpaceLicense(context, item); + } + + @Override + protected Class getClassForEvaluation() { + return String[].class; + } + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java new file mode 100644 index 0000000000..9c4a93699b --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java @@ -0,0 +1,38 @@ +package org.dspace.app.rest.submit.factory.impl; + +import org.dspace.content.Item; +import org.dspace.content.LicenseUtils; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.services.model.Request; +import org.springframework.beans.factory.annotation.Autowired; + +public class LicenseReplacePatchOperation extends ReplacePatchOperation { + + @Autowired + ItemService itemService; + + @Override + void replace(Context context, Request currentRequest, WorkspaceItem source, String string, Object value) throws Exception { + Item item = source.getItem(); + EPerson submitter = context.getCurrentUser(); + + // remove any existing DSpace license (just in case the user + // accepted it previously) + itemService.removeDSpaceLicense(context, item); + + String license = LicenseUtils.getLicenseText(context.getCurrentLocale(), source.getCollection(), item, + submitter); + + LicenseUtils.grantLicense(context, item, license, (String)value); + } + + @Override + protected Class getClassForEvaluation() { + return String[].class; + } + + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/PatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/PatchOperation.java new file mode 100644 index 0000000000..aca78bac1c --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/PatchOperation.java @@ -0,0 +1,23 @@ +package org.dspace.app.rest.submit.factory.impl; + +import org.dspace.content.WorkspaceItem; +import org.dspace.core.Context; +import org.dspace.services.model.Request; +import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; + +public abstract class PatchOperation { + + public abstract void perform(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) throws Exception; + + public T[] evaluateObject(LateObjectEvaluator value) { + T[] list = null; + if(value!=null) { + LateObjectEvaluator object = (LateObjectEvaluator)value; + list = (T[])object.evaluate(getClassForEvaluation()); + } + return list; + } + + protected abstract Class getClassForEvaluation(); + +} \ No newline at end of file diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/RemovePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/RemovePatchOperation.java new file mode 100644 index 0000000000..1cea5ba79d --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/RemovePatchOperation.java @@ -0,0 +1,16 @@ +package org.dspace.app.rest.submit.factory.impl; + +import org.dspace.content.WorkspaceItem; +import org.dspace.core.Context; +import org.dspace.services.model.Request; + +public abstract class RemovePatchOperation extends PatchOperation { + + @Override + public void perform(Context context, Request currentRequest, WorkspaceItem source, String string, Object value) throws Exception{ + remove(context, currentRequest, source, string, value); + } + + abstract void remove(Context context,Request currentRequest,WorkspaceItem source,String string,Object value) throws Exception; + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ReplacePatchOperation.java new file mode 100644 index 0000000000..47909b48e7 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/ReplacePatchOperation.java @@ -0,0 +1,18 @@ +package org.dspace.app.rest.submit.factory.impl; + +import org.dspace.content.WorkspaceItem; +import org.dspace.core.Context; +import org.dspace.services.model.Request; + +public abstract class ReplacePatchOperation extends PatchOperation { + + @Override + public void perform(Context context, Request currentRequest, WorkspaceItem source, String string, Object value) + throws Exception { + replace(context, currentRequest, source, string, value); + } + + abstract void replace(Context context, Request currentRequest, WorkspaceItem source, String string, Object value) + throws Exception; + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/CollectionStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/CollectionStep.java index 87dc840929..085227a784 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/CollectionStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/CollectionStep.java @@ -34,7 +34,7 @@ public class CollectionStep extends org.dspace.submit.step.SelectCollectionStep @Override public void doPatchProcessing(Context context, Request currentRequest, WorkspaceItem source, String operation, - String target, String index, Object value) { + String path, Object value) { switch (operation) { case "move": diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java index d599621dc7..e2c3f7de25 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java @@ -7,7 +7,6 @@ */ package org.dspace.app.rest.submit.step; -import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @@ -15,18 +14,18 @@ import org.apache.log4j.Logger; import org.dspace.app.rest.model.MetadataValueRest; import org.dspace.app.rest.model.step.DataDescribe; import org.dspace.app.rest.submit.AbstractRestProcessingStep; +import org.dspace.app.rest.submit.factory.PatchOperationFactory; +import org.dspace.app.rest.submit.factory.impl.PatchOperation; import org.dspace.app.util.DCInput; import org.dspace.app.util.DCInputSet; import org.dspace.app.util.DCInputsReader; import org.dspace.app.util.DCInputsReaderException; import org.dspace.app.util.SubmissionStepConfig; -import org.dspace.content.Item; import org.dspace.content.MetadataValue; import org.dspace.content.WorkspaceItem; import org.dspace.core.Context; import org.dspace.core.Utils; import org.dspace.services.model.Request; -import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; /** * Describe step for DSpace Spring Rest. Handle the exposition of metadata own by the in progress submission. @@ -78,54 +77,11 @@ public class DescribeStep extends org.dspace.submit.step.DescribeStep implements @Override public void doPatchProcessing(Context context, Request currentRequest, WorkspaceItem source, String operation, - String target, String index, Object value) throws Exception { - MetadataValueRest[] list = null; - if(value!=null) { - LateObjectEvaluator object = (LateObjectEvaluator)value; - list = (MetadataValueRest[])object.evaluate(MetadataValueRest[].class); - } - switch (operation) { - case "add": - addValue(context, source, target, list); - break; - case "replace": - replaceValue(context, source, target, list); - break; - case "remove": - deleteValue(context, source, target, index); - break; - default: - throw new RuntimeException("Operation "+operation+" not yet implemented!"); - } - } - - private void deleteValue(Context context, WorkspaceItem source, String target, String index) throws SQLException { - String[] metadata = Utils.tokenize(target); - List mm = itemService.getMetadata(source.getItem(), metadata[0], metadata[1], metadata[2], Item.ANY); - itemService.clearMetadata(context, source.getItem(), metadata[0], metadata[1], metadata[2], Item.ANY); - int idx = 0; - for(MetadataValue m : mm) { - Integer toDelete = Integer.parseInt(index); - if(idx != toDelete) { - itemService.addMetadata(context, source.getItem(), metadata[0], metadata[1], metadata[2], m.getLanguage(), m.getValue(), m.getAuthority(), m.getConfidence()); - } - idx++; - } - } - - private void replaceValue(Context context, WorkspaceItem source, String target, MetadataValueRest[] list) throws SQLException { - String[] metadata = Utils.tokenize(target); - itemService.clearMetadata(context, source.getItem(), metadata[0], metadata[1], metadata[2], Item.ANY); - for(MetadataValueRest ll : list) { - itemService.addMetadata(context, source.getItem(), metadata[0], metadata[1], metadata[2], ll.getLanguage(), ll.getValue(), ll.getAuthority(), ll.getConfidence()); - } - } - - private void addValue(Context context, WorkspaceItem source, String target, MetadataValueRest[] list) throws SQLException { - String[] metadata = Utils.tokenize(target); - for(MetadataValueRest ll : list) { - itemService.addMetadata(context, source.getItem(), metadata[0], metadata[1], metadata[2], ll.getLanguage(), ll.getValue(), ll.getAuthority(), ll.getConfidence()); - } + String path, Object value) throws Exception { + + PatchOperation patchOperation = new PatchOperationFactory().instanceOf("metadatavalue", operation); + patchOperation.perform(context, currentRequest, source, path, value); + } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/LicenseStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/LicenseStep.java index f9d733fb2e..674344e3ec 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/LicenseStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/LicenseStep.java @@ -7,25 +7,18 @@ */ package org.dspace.app.rest.submit.step; -import java.io.IOException; -import java.sql.SQLException; -import java.util.Date; - import org.atteo.evo.inflector.English; import org.dspace.app.rest.model.BitstreamRest; import org.dspace.app.rest.model.step.DataLicense; import org.dspace.app.rest.submit.AbstractRestProcessingStep; +import org.dspace.app.rest.submit.factory.PatchOperationFactory; +import org.dspace.app.rest.submit.factory.impl.PatchOperation; import org.dspace.app.util.SubmissionStepConfig; -import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; -import org.dspace.content.Item; -import org.dspace.content.LicenseUtils; import org.dspace.content.WorkspaceItem; import org.dspace.core.Constants; import org.dspace.core.Context; -import org.dspace.eperson.EPerson; import org.dspace.services.model.Request; -import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; /** * License step for DSpace Spring Rest. Expose the license information about the in progress submission. @@ -51,29 +44,13 @@ public class LicenseStep extends org.dspace.submit.step.LicenseStep implements A @Override public void doPatchProcessing(Context context, Request currentRequest, WorkspaceItem source, String operation, - String target, String index, Object value) throws Exception { + String path, Object value) throws Exception { - if("acceptanceDate".equals(target)) { - Item item = source.getItem(); - EPerson submitter = context.getCurrentUser(); - - switch (operation) { - case "replace": - // remove any existing DSpace license (just in case the user - // accepted it previously) - itemService.removeDSpaceLicense(context, item); - - String license = LicenseUtils.getLicenseText(context.getCurrentLocale(), source.getCollection(), item, - submitter); + if("acceptanceDate".equals(path)) { + + PatchOperation patchOperation = new PatchOperationFactory().instanceOf(path, operation); + patchOperation.perform(context, currentRequest, source, path, value); - LicenseUtils.grantLicense(context, item, license, (String)value); - break; - case "remove": - itemService.removeDSpaceLicense(context, item); - break; - default: - throw new RuntimeException("Operation " + operation + " not yet implemented!"); - } } } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java index c42f9c28de..8a9ffb56da 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java @@ -9,10 +9,13 @@ package org.dspace.app.rest.submit.step; import java.util.List; +import org.apache.commons.lang3.math.NumberUtils; import org.dspace.app.rest.model.step.DataUpload; import org.dspace.app.rest.model.step.UploadBitstreamRest; import org.dspace.app.rest.submit.AbstractRestProcessingStep; import org.dspace.app.rest.submit.SubmissionService; +import org.dspace.app.rest.submit.factory.PatchOperationFactory; +import org.dspace.app.rest.submit.factory.impl.PatchOperation; import org.dspace.app.util.SubmissionStepConfig; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -20,45 +23,44 @@ import org.dspace.content.WorkspaceItem; import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.services.model.Request; -import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; /** - * Upload step for DSpace Spring Rest. Expose information about the bitstream uploaded for the in progress submission. + * Upload step for DSpace Spring Rest. Expose information about the bitstream + * uploaded for the in progress submission. * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) * */ public class UploadStep extends org.dspace.submit.step.UploadStep implements AbstractRestProcessingStep { - + @Override public DataUpload getData(WorkspaceItem obj, SubmissionStepConfig config) throws Exception { - - DataUpload result = new DataUpload(); + + DataUpload result = new DataUpload(); List bundles = itemService.getBundles(obj.getItem(), Constants.CONTENT_BUNDLE_NAME); - for(Bundle bundle : bundles) { - for(Bitstream source : bundle.getBitstreams()) { + for (Bundle bundle : bundles) { + for (Bitstream source : bundle.getBitstreams()) { UploadBitstreamRest b = SubmissionService.buildUploadBitstream(configurationService, source); result.getFiles().add(b); } } - return result; + return result; } @Override public void doPatchProcessing(Context context, Request currentRequest, WorkspaceItem source, String operation, - String target, String index, Object value) { - switch (operation) { - case "add": - - break; - case "replace": - - break; - case "remove": - - break; - default: - throw new RuntimeException("Operation "+operation+" not yet implemented!"); + String path, Object value) throws Exception { + + String[] split = path.split("/"); + String instance = ""; + if("remove".equals(operation) && NumberUtils.isNumber(path)) { + instance = "bitstreamremove"; } + else { + instance = split[1]; + } + PatchOperation patchOperation = new PatchOperationFactory().instanceOf(instance, operation); + patchOperation.perform(context, currentRequest, source, path, value); + } } diff --git a/dspace-spring-rest/src/main/resources/spring/spring-dspace-core-services.xml b/dspace-spring-rest/src/main/resources/spring/spring-dspace-core-services.xml new file mode 100644 index 0000000000..eee6064871 --- /dev/null +++ b/dspace-spring-rest/src/main/resources/spring/spring-dspace-core-services.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dspace/config/spring/api/access-condition.xml b/dspace/config/spring/api/access-condition.xml index a18deac299..3489d26bb8 100644 --- a/dspace/config/spring/api/access-condition.xml +++ b/dspace/config/spring/api/access-condition.xml @@ -18,26 +18,7 @@ - - - - - - - - - - - - - - - - +