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 abcc1a6cf3..828d154840 100644 --- a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java @@ -761,6 +761,8 @@ public class CollectionServiceImpl extends DSpaceObjectServiceImpl i // Remove any workflow roles collectionRoleService.deleteByCollection(context, collection); + collection.getResourcePolicies().clear(); + // Remove default administrators group Group g = collection.getAdministrators(); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java index e8d5f956d8..729c4c49dc 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java @@ -10,11 +10,10 @@ package org.dspace.app.rest.repository; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.Objects; import java.util.UUID; -import java.util.stream.Collectors; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; @@ -64,7 +63,9 @@ public class ItemRestRepository extends DSpaceObjectRestRepository items = new ArrayList(); int total = 0; try { - total = is.countTotal(context); - it = is.findAll(context, pageable.getPageSize(), pageable.getOffset()); + total = itemService.countTotal(context); + it = itemService.findAll(context, pageable.getPageSize(), pageable.getOffset()); while (it.hasNext()) { Item i = it.next(); items.add(i); @@ -147,14 +147,14 @@ public class ItemRestRepository extends DSpaceObjectRestRepository 0) { - List relationshipIds = - Arrays.stream(copyVirtual).filter(StringUtils::isNumeric).collect(Collectors.toList()) - .stream().map(Integer::parseInt).collect(Collectors.toList()); + } else { + // Option 3: Copy the virtual metadata of selected types of this item to its related items. The copyVirtual + // array should only contain numeric values at this point. These values are used to select the + // types. Iterate over all selected types and copy the corresponding values to this item's + // relatives. + List relationshipIds = parseVirtualMetadataTypes(copyVirtual); for (Integer relationshipId : relationshipIds) { RelationshipType relationshipType = relationshipTypeService.find(context, relationshipId); for (Relationship relationship : relationshipService @@ -229,6 +240,19 @@ public class ItemRestRepository extends DSpaceObjectRestRepository parseVirtualMetadataTypes(String[] copyVirtual) { + List types = new ArrayList<>(); + for (String typeString: copyVirtual) { + if (!StringUtils.isNumeric(typeString)) { + throw new DSpaceBadRequestException("parameter " + REQUESTPARAMETER_COPYVIRTUALMETADATA + + " should only contain a single value '" + COPYVIRTUAL_ALL[0] + "', '" + COPYVIRTUAL_CONFIGURED[0] + + "' or a list of numbers."); + } + types.add(Integer.parseInt(typeString)); + } + return types; + } + private void deleteRelationshipCopyVirtualMetadata(Item itemToDelete, Relationship relationshipToDelete) throws SQLException, AuthorizeException { diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipDeleteRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipDeleteRestRepositoryIT.java index a325557e3f..c4f03a60eb 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipDeleteRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipDeleteRestRepositoryIT.java @@ -18,7 +18,6 @@ import java.util.List; import org.dspace.app.rest.builder.CollectionBuilder; import org.dspace.app.rest.builder.CommunityBuilder; -import org.dspace.app.rest.builder.GroupBuilder; import org.dspace.app.rest.builder.ItemBuilder; import org.dspace.app.rest.builder.RelationshipBuilder; import org.dspace.app.rest.test.AbstractEntityIntegrationTest; @@ -106,7 +105,6 @@ public class RelationshipDeleteRestRepositoryIT extends AbstractEntityIntegratio collectionAdmin = ePersonService.findByEmail(context, "collectionAdminTest@email.com"); if (collectionAdmin != null) { ePersonService.delete(context, collectionAdmin); - context.commit(); } } catch (Exception e) { throw new RuntimeException(e); @@ -454,6 +452,38 @@ public class RelationshipDeleteRestRepositoryIT extends AbstractEntityIntegratio assertThat(projectRelationships.size(), equalTo(0)); } + @Test + public void deleteItemCopyVirtualMetadataInvalid() throws Exception { + initPersonProjectPublication(); + + getClient(adminAuthToken).perform( + delete("/api/core/items/" + personItem.getID() + + "?copyVirtualMetadata=" + publicationPersonRelationshipType.getID() + + "©VirtualMetadata=" + personProjectRelationshipType.getID() + + "©VirtualMetadata=SomeThingWrong")) + .andExpect(status().isBadRequest()); + + publicationItem = itemService.find(context, publicationItem.getID()); + List publicationAuthorList = + itemService.getMetadata(publicationItem, "dc", "contributor", "author", Item.ANY); + assertThat(publicationAuthorList.size(), equalTo(1)); + assertThat(publicationAuthorList.get(0).getValue(), equalTo("Smith, Donald")); + assertThat(publicationAuthorList.get(0).getAuthority(), startsWith("virtual::")); + List publicationRelationships = itemService.getMetadata(publicationItem, + "relation", "isAuthorOfPublication", Item.ANY, Item.ANY); + assertThat(publicationRelationships.size(), equalTo(1)); + + projectItem = itemService.find(context, projectItem.getID()); + List projectAuthorList = + itemService.getMetadata(projectItem, "project", "contributor", "author", Item.ANY); + assertThat(projectAuthorList.size(), equalTo(1)); + assertThat(projectAuthorList.get(0).getValue(), equalTo("Smith, Donald")); + assertThat(projectAuthorList.get(0).getAuthority(), startsWith("virtual::")); + List projectRelationships = itemService.getMetadata(projectItem, + "relation", "isPersonOfProject", Item.ANY, Item.ANY); + assertThat(projectRelationships.size(), equalTo(1)); + } + @Test public void deleteItemCopyVirtualMetadataAllNoPermissions() throws Exception { initPersonProjectPublication(); @@ -461,6 +491,26 @@ public class RelationshipDeleteRestRepositoryIT extends AbstractEntityIntegratio getClient(getAuthToken(eperson.getEmail(), password)).perform( delete("/api/core/items/" + personItem.getID())) .andExpect(status().isForbidden()); + + publicationItem = itemService.find(context, publicationItem.getID()); + List publicationAuthorList = + itemService.getMetadata(publicationItem, "dc", "contributor", "author", Item.ANY); + assertThat(publicationAuthorList.size(), equalTo(1)); + assertThat(publicationAuthorList.get(0).getValue(), equalTo("Smith, Donald")); + assertThat(publicationAuthorList.get(0).getAuthority(), startsWith("virtual::")); + List publicationRelationships = itemService.getMetadata(publicationItem, + "relation", "isAuthorOfPublication", Item.ANY, Item.ANY); + assertThat(publicationRelationships.size(), equalTo(1)); + + projectItem = itemService.find(context, projectItem.getID()); + List projectAuthorList = + itemService.getMetadata(projectItem, "project", "contributor", "author", Item.ANY); + assertThat(projectAuthorList.size(), equalTo(1)); + assertThat(projectAuthorList.get(0).getValue(), equalTo("Smith, Donald")); + assertThat(projectAuthorList.get(0).getAuthority(), startsWith("virtual::")); + List projectRelationships = itemService.getMetadata(projectItem, + "relation", "isPersonOfProject", Item.ANY, Item.ANY); + assertThat(projectRelationships.size(), equalTo(1)); } @Test @@ -470,6 +520,26 @@ public class RelationshipDeleteRestRepositoryIT extends AbstractEntityIntegratio getClient(getAuthToken(collectionAdmin.getEmail(), password)).perform( delete("/api/core/items/" + personItem.getID())) .andExpect(status().isForbidden()); + + publicationItem = itemService.find(context, publicationItem.getID()); + List publicationAuthorList = + itemService.getMetadata(publicationItem, "dc", "contributor", "author", Item.ANY); + assertThat(publicationAuthorList.size(), equalTo(1)); + assertThat(publicationAuthorList.get(0).getValue(), equalTo("Smith, Donald")); + assertThat(publicationAuthorList.get(0).getAuthority(), startsWith("virtual::")); + List publicationRelationships = itemService.getMetadata(publicationItem, + "relation", "isAuthorOfPublication", Item.ANY, Item.ANY); + assertThat(publicationRelationships.size(), equalTo(1)); + + projectItem = itemService.find(context, projectItem.getID()); + List projectAuthorList = + itemService.getMetadata(projectItem, "project", "contributor", "author", Item.ANY); + assertThat(projectAuthorList.size(), equalTo(1)); + assertThat(projectAuthorList.get(0).getValue(), equalTo("Smith, Donald")); + assertThat(projectAuthorList.get(0).getAuthority(), startsWith("virtual::")); + List projectRelationships = itemService.getMetadata(projectItem, + "relation", "isPersonOfProject", Item.ANY, Item.ANY); + assertThat(projectRelationships.size(), equalTo(1)); } @Test @@ -480,5 +550,25 @@ public class RelationshipDeleteRestRepositoryIT extends AbstractEntityIntegratio delete("/api/core/items/" + personItem.getID() + "?copyVirtualMetadata=" + publicationPersonRelationshipType.getID())) .andExpect(status().isForbidden()); + + publicationItem = itemService.find(context, publicationItem.getID()); + List publicationAuthorList = + itemService.getMetadata(publicationItem, "dc", "contributor", "author", Item.ANY); + assertThat(publicationAuthorList.size(), equalTo(1)); + assertThat(publicationAuthorList.get(0).getValue(), equalTo("Smith, Donald")); + assertThat(publicationAuthorList.get(0).getAuthority(), startsWith("virtual::")); + List publicationRelationships = itemService.getMetadata(publicationItem, + "relation", "isAuthorOfPublication", Item.ANY, Item.ANY); + assertThat(publicationRelationships.size(), equalTo(1)); + + projectItem = itemService.find(context, projectItem.getID()); + List projectAuthorList = + itemService.getMetadata(projectItem, "project", "contributor", "author", Item.ANY); + assertThat(projectAuthorList.size(), equalTo(1)); + assertThat(projectAuthorList.get(0).getValue(), equalTo("Smith, Donald")); + assertThat(projectAuthorList.get(0).getAuthority(), startsWith("virtual::")); + List projectRelationships = itemService.getMetadata(projectItem, + "relation", "isPersonOfProject", Item.ANY, Item.ANY); + assertThat(projectRelationships.size(), equalTo(1)); } } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java index e1f983f388..b61cb041f2 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java @@ -226,12 +226,7 @@ public abstract class AbstractDSpaceObjectBuilder if (attachedDso != null) { getService().delete(c, attachedDso); } - try { - c.complete(); - } - catch (Exception e) { - throw new RuntimeException(e); - } + c.complete(); } indexingService.commit(); diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java index 4d806a01f7..f50487b076 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java @@ -131,7 +131,6 @@ public class CollectionBuilder extends AbstractDSpaceObjectBuilder { @Override public void cleanup() throws Exception { deleteWorkflowGroups(collection); - //collectionService.removeAdministrators(context, collection); delete(collection); }