From b60b76d29e318ccea362a6c03471122cc6cce739 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Mon, 12 Jul 2021 15:35:57 -0500 Subject: [PATCH 1/3] Add test to prove pagination total is incorrect when WorkspaceItem(s) exist. --- .../dspace/app/rest/ItemRestRepositoryIT.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java index e1748a5ab8..6ab11efbfc 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java @@ -197,6 +197,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .withSubject("ExtraEntry") .build(); + // Create a Workspace Item (which in turn creates an Item with "in_archive=false") + // This is only created to prove that WorkspaceItems are NOT counted/listed in this endpoint + WorkspaceItem workspaceItem = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("In Progress Item") + .withIssueDate("2018-02-05") + .withAuthor("Doe, Jane").withAuthor("Smith, Jennifer") + .build(); + Item itemInWorkspace = workspaceItem.getItem(); + context.restoreAuthSystemState(); String token = getAuthToken(admin.getEmail(), password); @@ -212,7 +221,9 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$._embedded.items", Matchers.not( Matchers.contains( ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, - "Public item 3", "2016-02-13") + "Public item 3", "2016-02-13"), + ItemMatcher.matchItemWithTitleAndDateIssued(itemInWorkspace, + "In Progress Item", "2018-02-05") ) ))) .andExpect(jsonPath("$._links.first.href", Matchers.allOf( @@ -245,7 +256,9 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17"), ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, - "Public item 2", "2016-02-13") + "Public item 2", "2016-02-13"), + ItemMatcher.matchItemWithTitleAndDateIssued(itemInWorkspace, + "In Progress Item", "2018-02-05") ) ))) .andExpect(jsonPath("$._links.first.href", Matchers.allOf( From 025c7a8c78a488df0ee300ed5e6cef0a6c472492 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Mon, 12 Jul 2021 16:00:02 -0500 Subject: [PATCH 2/3] Fix total to only include archived items. --- .../org/dspace/app/rest/repository/ItemRestRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 4d06a19b1b..16ce8629d1 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 @@ -121,7 +121,8 @@ public class ItemRestRepository extends DSpaceObjectRestRepository findAll(Context context, Pageable pageable) { try { - long total = itemService.countTotal(context); + // This endpoint only returns archived items + long total = itemService.countArchivedItems(context); Iterator it = itemService.findAll(context, pageable.getPageSize(), Math.toIntExact(pageable.getOffset())); List items = new ArrayList<>(); From 065514b5f3ebc8c55bc3ed7820ba95bcd23b842c Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 16 Jul 2021 11:57:40 -0500 Subject: [PATCH 3/3] Add tests to prove Workflow Items and Template Items are also not counted/listed --- .../org/dspace/builder/CollectionBuilder.java | 22 +++++++++++- .../dspace/app/rest/ItemRestRepositoryIT.java | 34 ++++++++++++++++--- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/dspace-api/src/test/java/org/dspace/builder/CollectionBuilder.java b/dspace-api/src/test/java/org/dspace/builder/CollectionBuilder.java index 1b44fec105..eece873380 100644 --- a/dspace-api/src/test/java/org/dspace/builder/CollectionBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/CollectionBuilder.java @@ -23,6 +23,7 @@ import org.dspace.core.Context; import org.dspace.discovery.SearchServiceException; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; +import org.dspace.xmlworkflow.WorkflowConfigurationException; /** * Builder to construct Collection objects. @@ -177,7 +178,7 @@ public class CollectionBuilder extends AbstractDSpaceObjectBuilder { /** * Generate and populate a workflow group for the Collection. Obsolete: - * the 3-step workflow model has been removed. + * the 3-step workflow model has been removed. Use other withWorkflowGroup() method instead * * @param step number of the workflow step. * @param members make these users members of the group. @@ -196,6 +197,25 @@ public class CollectionBuilder extends AbstractDSpaceObjectBuilder { return this; } + /** + * Generate and populate a role-based workflow group for the Collection. + * + * @param roleName the rolename for the group + * @param members make these users members of the group. + * @return this + * @throws SQLException passed through. + * @throws AuthorizeException passed through. + */ + public CollectionBuilder withWorkflowGroup(String roleName, EPerson... members) + throws SQLException, AuthorizeException, IOException, WorkflowConfigurationException { + Group g = workflowService.createWorkflowRoleGroup(context, collection, roleName); + for (EPerson e : members) { + groupService.addMember(context, g, e); + } + groupService.update(context, g); + return this; + } + /** * Create an admin group for the collection with the specified members * diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java index 6ab11efbfc..1c47825a21 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java @@ -62,6 +62,7 @@ import org.dspace.builder.ItemBuilder; import org.dspace.builder.RelationshipBuilder; import org.dspace.builder.RelationshipTypeBuilder; import org.dspace.builder.ResourcePolicyBuilder; +import org.dspace.builder.WorkflowItemBuilder; import org.dspace.builder.WorkspaceItemBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -76,6 +77,7 @@ import org.dspace.content.service.CollectionService; import org.dspace.core.Constants; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; +import org.dspace.workflow.WorkflowItem; import org.hamcrest.Matcher; import org.hamcrest.Matchers; import org.junit.Test; @@ -171,8 +173,17 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) .withName("Sub Community") .build(); - Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); - Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + // Create one Collection with an enabled "reviewer" Workflow step. This lets us create a WorkflowItem below. + Collection col1 = CollectionBuilder.createCollection(context, child1) + .withName("Collection 1") + .withWorkflowGroup("reviewer", admin) + .build(); + // Create a second Collection with a template Item. This is used to ensure that Template Items are + // NOT counted/listed in this endpoint. + Collection col2 = CollectionBuilder.createCollection(context, child1) + .withName("Collection 2") + .withTemplateItem() + .build(); //2. Three public items that are readable by Anonymous with different subjects Item publicItem1 = ItemBuilder.createItem(context, col1) @@ -206,6 +217,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .build(); Item itemInWorkspace = workspaceItem.getItem(); + // Also create a Workflow Item (in the workflow-enabled Collection), to ensure WorkflowItems are + // NOT counted/listed in this endpoint + WorkflowItem workflowItem = WorkflowItemBuilder.createWorkflowItem(context, col1) + .withTitle("Item in Workflow") + .withIssueDate("2019-06-03") + .withAuthor("Smith, Jennifer").withAuthor("Doe, John") + .build(); + Item itemInWorkflow = workflowItem.getItem(); + context.restoreAuthSystemState(); String token = getAuthToken(admin.getEmail(), password); @@ -223,7 +243,10 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, "Public item 3", "2016-02-13"), ItemMatcher.matchItemWithTitleAndDateIssued(itemInWorkspace, - "In Progress Item", "2018-02-05") + "In Progress Item", "2018-02-05"), + ItemMatcher.matchItemWithTitleAndDateIssued(itemInWorkflow, + "Item in Workflow", "2019-06-03"), + ItemMatcher.matchItemProperties(col2.getTemplateItem()) ) ))) .andExpect(jsonPath("$._links.first.href", Matchers.allOf( @@ -258,7 +281,10 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13"), ItemMatcher.matchItemWithTitleAndDateIssued(itemInWorkspace, - "In Progress Item", "2018-02-05") + "In Progress Item", "2018-02-05"), + ItemMatcher.matchItemWithTitleAndDateIssued(itemInWorkflow, + "Item in Workflow", "2019-06-03"), + ItemMatcher.matchItemProperties(col2.getTemplateItem()) ) ))) .andExpect(jsonPath("$._links.first.href", Matchers.allOf(