mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-08 18:44:22 +00:00
94299 Multiple Bitstream deletion endpoint
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.dspace.app.rest;
|
package org.dspace.app.rest;
|
||||||
|
|
||||||
|
import static org.dspace.app.rest.utils.ContextUtil.obtainContext;
|
||||||
import static org.dspace.app.rest.utils.RegexUtils.REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT;
|
import static org.dspace.app.rest.utils.RegexUtils.REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT;
|
||||||
import static org.dspace.app.rest.utils.RegexUtils.REGEX_REQUESTMAPPING_IDENTIFIER_AS_HEX32;
|
import static org.dspace.app.rest.utils.RegexUtils.REGEX_REQUESTMAPPING_IDENTIFIER_AS_HEX32;
|
||||||
import static org.dspace.app.rest.utils.RegexUtils.REGEX_REQUESTMAPPING_IDENTIFIER_AS_STRING_VERSION_STRONG;
|
import static org.dspace.app.rest.utils.RegexUtils.REGEX_REQUESTMAPPING_IDENTIFIER_AS_STRING_VERSION_STRONG;
|
||||||
@@ -55,6 +56,8 @@ import org.dspace.app.rest.repository.LinkRestRepository;
|
|||||||
import org.dspace.app.rest.utils.RestRepositoryUtils;
|
import org.dspace.app.rest.utils.RestRepositoryUtils;
|
||||||
import org.dspace.app.rest.utils.Utils;
|
import org.dspace.app.rest.utils.Utils;
|
||||||
import org.dspace.authorize.AuthorizeException;
|
import org.dspace.authorize.AuthorizeException;
|
||||||
|
import org.dspace.content.DSpaceObject;
|
||||||
|
import org.dspace.core.Context;
|
||||||
import org.dspace.util.UUIDUtils;
|
import org.dspace.util.UUIDUtils;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -1050,6 +1053,13 @@ public class RestResourceController implements InitializingBean {
|
|||||||
return deleteInternal(apiCategory, model, uuid);
|
return deleteInternal(apiCategory, model, uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequestMapping(method = RequestMethod.DELETE, consumes = {"text/uri-list"})
|
||||||
|
public ResponseEntity<RepresentationModel<?>> delete(HttpServletRequest request, @PathVariable String apiCategory,
|
||||||
|
@PathVariable String model)
|
||||||
|
throws HttpRequestMethodNotSupportedException {
|
||||||
|
return deleteUriListInternal(request, apiCategory, model);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal method to delete resource.
|
* Internal method to delete resource.
|
||||||
*
|
*
|
||||||
@@ -1067,6 +1077,29 @@ public class RestResourceController implements InitializingBean {
|
|||||||
return ControllerUtils.toEmptyResponse(HttpStatus.NO_CONTENT);
|
return ControllerUtils.toEmptyResponse(HttpStatus.NO_CONTENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <ID extends Serializable> ResponseEntity<RepresentationModel<?>> deleteUriListInternal(
|
||||||
|
HttpServletRequest request,
|
||||||
|
String apiCategory,
|
||||||
|
String model)
|
||||||
|
throws HttpRequestMethodNotSupportedException {
|
||||||
|
checkModelPluralForm(apiCategory, model);
|
||||||
|
DSpaceRestRepository<RestAddressableModel, ID> repository = utils.getResourceRepository(apiCategory, model);
|
||||||
|
Context context = obtainContext(request);
|
||||||
|
List<String> dsoStringList = utils.getStringListFromRequest(request);
|
||||||
|
List<DSpaceObject> dsoList = utils.constructDSpaceObjectList(context, dsoStringList);
|
||||||
|
if (dsoStringList.size() != dsoList.size()) {
|
||||||
|
throw new ResourceNotFoundException("One or more bitstreams could not be found.");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
repository.delete(dsoList);
|
||||||
|
} catch (ClassCastException e) {
|
||||||
|
log.error("Something went wrong whilst creating the object for apiCategory: " + apiCategory +
|
||||||
|
" and model: " + model, e);
|
||||||
|
return ControllerUtils.toEmptyResponse(HttpStatus.INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
return ControllerUtils.toEmptyResponse(HttpStatus.NO_CONTENT);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute a PUT request for an entity with id of type UUID;
|
* Execute a PUT request for an entity with id of type UUID;
|
||||||
*
|
*
|
||||||
|
@@ -10,6 +10,8 @@ package org.dspace.app.rest.repository;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@@ -147,6 +149,48 @@ public class BitstreamRestRepository extends DSpaceObjectRestRepository<Bitstrea
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void deleteList(Context context, List<DSpaceObject> dsoList)
|
||||||
|
throws SQLException, AuthorizeException {
|
||||||
|
// check if list is empty
|
||||||
|
if (dsoList.isEmpty()) {
|
||||||
|
throw new ResourceNotFoundException("No bitstreams given.");
|
||||||
|
}
|
||||||
|
// check if every DSO is a Bitstream
|
||||||
|
if (dsoList.stream().anyMatch(dso -> !(dso instanceof Bitstream))) {
|
||||||
|
throw new UnprocessableEntityException("Not all given items are bitstreams.");
|
||||||
|
}
|
||||||
|
// check that they're all part of the same Item
|
||||||
|
List<DSpaceObject> items = new ArrayList<>();
|
||||||
|
for (DSpaceObject dso : dsoList) {
|
||||||
|
Bitstream bit = bs.find(context, dso.getID());
|
||||||
|
DSpaceObject bitstreamParent = bs.getParentObject(context, bit);
|
||||||
|
if (bit == null) {
|
||||||
|
throw new ResourceNotFoundException("The bitstream with uuid " + dso.getID() + " could not be found");
|
||||||
|
}
|
||||||
|
// we have to check if the bitstream has already been deleted
|
||||||
|
if (bit.isDeleted()) {
|
||||||
|
throw new UnprocessableEntityException("The bitstream with uuid " + bit.getID()
|
||||||
|
+ " was already deleted");
|
||||||
|
} else {
|
||||||
|
items.add(bitstreamParent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (items.stream().distinct().count() > 1) {
|
||||||
|
throw new UnprocessableEntityException("Not all given items are part of the same Item.");
|
||||||
|
}
|
||||||
|
// delete all Bitstreams
|
||||||
|
Iterator<DSpaceObject> iterator = dsoList.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
Bitstream bit = (Bitstream) iterator.next();
|
||||||
|
try {
|
||||||
|
bs.delete(context, bit);
|
||||||
|
} catch (SQLException | IOException e) {
|
||||||
|
throw new RuntimeException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the bitstream for the provided handle and sequence or filename.
|
* Find the bitstream for the provided handle and sequence or filename.
|
||||||
* When a bitstream can be found with the sequence ID it will be returned if the user has "METADATA_READ" access.
|
* When a bitstream can be found with the sequence ID it will be returned if the user has "METADATA_READ" access.
|
||||||
|
@@ -26,6 +26,7 @@ import org.dspace.app.rest.model.ItemRest;
|
|||||||
import org.dspace.app.rest.model.RestAddressableModel;
|
import org.dspace.app.rest.model.RestAddressableModel;
|
||||||
import org.dspace.app.rest.model.patch.Patch;
|
import org.dspace.app.rest.model.patch.Patch;
|
||||||
import org.dspace.authorize.AuthorizeException;
|
import org.dspace.authorize.AuthorizeException;
|
||||||
|
import org.dspace.content.DSpaceObject;
|
||||||
import org.dspace.content.service.MetadataFieldService;
|
import org.dspace.content.service.MetadataFieldService;
|
||||||
import org.dspace.core.Context;
|
import org.dspace.core.Context;
|
||||||
import org.springframework.beans.factory.BeanNameAware;
|
import org.springframework.beans.factory.BeanNameAware;
|
||||||
@@ -256,6 +257,23 @@ public abstract class DSpaceRestRepository<T extends RestAddressableModel, ID ex
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void delete(List<DSpaceObject> dsoList) {
|
||||||
|
Context context = obtainContext();
|
||||||
|
try {
|
||||||
|
getThisRepository().deleteList(context, dsoList);
|
||||||
|
context.commit();
|
||||||
|
} catch (AuthorizeException e) {
|
||||||
|
throw new RESTAuthorizationException(e);
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
throw new RuntimeException(ex.getMessage(), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void deleteList(Context context, List<DSpaceObject> list)
|
||||||
|
throws AuthorizeException, SQLException, RepositoryMethodNotImplementedException {
|
||||||
|
throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", "");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
/**
|
/**
|
||||||
* This method cannot be implemented we required all the find method to be paginated
|
* This method cannot be implemented we required all the find method to be paginated
|
||||||
|
@@ -13,6 +13,7 @@ import static org.dspace.core.Constants.WRITE;
|
|||||||
import static org.hamcrest.Matchers.contains;
|
import static org.hamcrest.Matchers.contains;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hamcrest.Matchers.not;
|
import static org.hamcrest.Matchers.not;
|
||||||
|
import static org.springframework.data.rest.webmvc.RestMediaTypes.TEXT_URI_LIST;
|
||||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
|
||||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||||
@@ -1201,6 +1202,960 @@ public class BitstreamRestRepositoryIT extends AbstractControllerIntegrationTest
|
|||||||
.andExpect(status().isNotFound());
|
.andExpect(status().isNotFound());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListOneBitstream() throws Exception {
|
||||||
|
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
String bitstreamContent = "ThisIsSomeDummyText";
|
||||||
|
//Add a bitstream to an item
|
||||||
|
Bitstream bitstream = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent, CharEncoding.UTF_8)) {
|
||||||
|
bitstream = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream")
|
||||||
|
.withDescription("Description")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream.getID()))
|
||||||
|
.andExpect(status().is(204));
|
||||||
|
|
||||||
|
// Verify 404 after delete
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream.getID()))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListOneOfMultipleBitstreams() throws Exception {
|
||||||
|
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Add 3 bitstreams to the item
|
||||||
|
String bitstreamContent1 = "ThisIsSomeDummyText1";
|
||||||
|
Bitstream bitstream1 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent1, CharEncoding.UTF_8)) {
|
||||||
|
bitstream1 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream1")
|
||||||
|
.withDescription("Description1")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent2 = "ThisIsSomeDummyText2";
|
||||||
|
Bitstream bitstream2 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent2, CharEncoding.UTF_8)) {
|
||||||
|
bitstream2 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream2")
|
||||||
|
.withDescription("Description2")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent3 = "ThisIsSomeDummyText3";
|
||||||
|
Bitstream bitstream3 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent3, CharEncoding.UTF_8)) {
|
||||||
|
bitstream3 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream3")
|
||||||
|
.withDescription("Description3")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete bitstream1
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().is(204));
|
||||||
|
|
||||||
|
// Verify 404 after delete for bitstream1
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
|
||||||
|
// check that bitstream2 still exists
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream2.getID()))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(jsonPath("$", HalMatcher.matchNoEmbeds()));
|
||||||
|
|
||||||
|
// check that bitstream3 still exists
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(jsonPath("$", HalMatcher.matchNoEmbeds()))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListAllBitstreams() throws Exception {
|
||||||
|
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Add 3 bitstreams to the item
|
||||||
|
String bitstreamContent1 = "ThisIsSomeDummyText1";
|
||||||
|
Bitstream bitstream1 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent1, CharEncoding.UTF_8)) {
|
||||||
|
bitstream1 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream1")
|
||||||
|
.withDescription("Description1")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent2 = "ThisIsSomeDummyText2";
|
||||||
|
Bitstream bitstream2 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent2, CharEncoding.UTF_8)) {
|
||||||
|
bitstream2 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream2")
|
||||||
|
.withDescription("Description2")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent3 = "ThisIsSomeDummyText3";
|
||||||
|
Bitstream bitstream3 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent3, CharEncoding.UTF_8)) {
|
||||||
|
bitstream3 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream3")
|
||||||
|
.withDescription("Description3")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete all bitstreams
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream1.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream2.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().is(204));
|
||||||
|
|
||||||
|
// Verify 404 after delete for bitstream1
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
|
||||||
|
// Verify 404 after delete for bitstream2
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream2.getID()))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
|
||||||
|
// Verify 404 after delete for bitstream3
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListForbidden() throws Exception {
|
||||||
|
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Add 3 bitstreams to the item
|
||||||
|
String bitstreamContent1 = "ThisIsSomeDummyText1";
|
||||||
|
Bitstream bitstream1 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent1, CharEncoding.UTF_8)) {
|
||||||
|
bitstream1 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream1")
|
||||||
|
.withDescription("Description1")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent2 = "ThisIsSomeDummyText2";
|
||||||
|
Bitstream bitstream2 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent2, CharEncoding.UTF_8)) {
|
||||||
|
bitstream2 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream2")
|
||||||
|
.withDescription("Description2")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent3 = "ThisIsSomeDummyText3";
|
||||||
|
Bitstream bitstream3 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent3, CharEncoding.UTF_8)) {
|
||||||
|
bitstream3 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream3")
|
||||||
|
.withDescription("Description3")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(eperson.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete using an unauthorized user
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream1.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream2.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().isForbidden());
|
||||||
|
|
||||||
|
// Verify the bitstreams are still here
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream2.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListUnauthorized() throws Exception {
|
||||||
|
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Add 3 bitstreams to the item
|
||||||
|
String bitstreamContent1 = "ThisIsSomeDummyText1";
|
||||||
|
Bitstream bitstream1 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent1, CharEncoding.UTF_8)) {
|
||||||
|
bitstream1 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream1")
|
||||||
|
.withDescription("Description1")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent2 = "ThisIsSomeDummyText2";
|
||||||
|
Bitstream bitstream2 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent2, CharEncoding.UTF_8)) {
|
||||||
|
bitstream2 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream2")
|
||||||
|
.withDescription("Description2")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent3 = "ThisIsSomeDummyText3";
|
||||||
|
Bitstream bitstream3 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent3, CharEncoding.UTF_8)) {
|
||||||
|
bitstream3 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream3")
|
||||||
|
.withDescription("Description3")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
// Delete as anonymous
|
||||||
|
getClient().perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream1.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream2.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().isUnauthorized());
|
||||||
|
|
||||||
|
// Verify the bitstreams are still here
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream2.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient().perform(get("/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListEmpty() throws Exception {
|
||||||
|
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Add 3 bitstreams to the item
|
||||||
|
String bitstreamContent1 = "ThisIsSomeDummyText1";
|
||||||
|
Bitstream bitstream1 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent1, CharEncoding.UTF_8)) {
|
||||||
|
bitstream1 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream1")
|
||||||
|
.withDescription("Description1")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent2 = "ThisIsSomeDummyText2";
|
||||||
|
Bitstream bitstream2 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent2, CharEncoding.UTF_8)) {
|
||||||
|
bitstream2 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream2")
|
||||||
|
.withDescription("Description2")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent3 = "ThisIsSomeDummyText3";
|
||||||
|
Bitstream bitstream3 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent3, CharEncoding.UTF_8)) {
|
||||||
|
bitstream3 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream3")
|
||||||
|
.withDescription("Description3")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete with empty list throws 404
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content(""))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
|
||||||
|
// Verify the bitstreams are still here
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream2.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListNotBitstream() throws Exception {
|
||||||
|
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Add 3 bitstreams to the item
|
||||||
|
String bitstreamContent1 = "ThisIsSomeDummyText1";
|
||||||
|
Bitstream bitstream1 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent1, CharEncoding.UTF_8)) {
|
||||||
|
bitstream1 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream1")
|
||||||
|
.withDescription("Description1")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent2 = "ThisIsSomeDummyText2";
|
||||||
|
Bitstream bitstream2 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent2, CharEncoding.UTF_8)) {
|
||||||
|
bitstream2 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream2")
|
||||||
|
.withDescription("Description2")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent3 = "ThisIsSomeDummyText3";
|
||||||
|
Bitstream bitstream3 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent3, CharEncoding.UTF_8)) {
|
||||||
|
bitstream3 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream3")
|
||||||
|
.withDescription("Description3")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete with list containing non-Bitstream throws 422
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream1.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream2.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream3.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/items/" + publicItem1.getID()))
|
||||||
|
.andExpect(status().is(422));
|
||||||
|
|
||||||
|
// Verify the bitstreams are still here
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream2.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListDifferentItems() throws Exception {
|
||||||
|
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. Two public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Item publicItem2 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Add 1 bitstream to each item
|
||||||
|
String bitstreamContent1 = "ThisIsSomeDummyText1";
|
||||||
|
Bitstream bitstream1 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent1, CharEncoding.UTF_8)) {
|
||||||
|
bitstream1 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream1")
|
||||||
|
.withDescription("Description1")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent2 = "ThisIsSomeDummyText2";
|
||||||
|
Bitstream bitstream2 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent2, CharEncoding.UTF_8)) {
|
||||||
|
bitstream2 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem2, is)
|
||||||
|
.withName("Bitstream2")
|
||||||
|
.withDescription("Description2")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete with list containing Bitstreams from different items throws 422
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream1.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream2.getID()))
|
||||||
|
.andExpect(status().is(422));
|
||||||
|
|
||||||
|
// Verify the bitstreams are still here
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream2.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListLogo() throws Exception {
|
||||||
|
// We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
// ** GIVEN **
|
||||||
|
// 1. A community with a logo
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context).withName("Community").withLogo("logo_community")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// 2. A collection with a logo
|
||||||
|
Collection col = CollectionBuilder.createCollection(context, parentCommunity).withName("Collection")
|
||||||
|
.withLogo("logo_collection").build();
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// trying to DELETE parentCommunity logo and collection logo should work
|
||||||
|
// we have to delete them separately otherwise it will throw 422 as they belong to different items
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + parentCommunity.getLogo().getID()))
|
||||||
|
.andExpect(status().is(204));
|
||||||
|
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + col.getLogo().getID()))
|
||||||
|
.andExpect(status().is(204));
|
||||||
|
|
||||||
|
// Verify 404 after delete for parentCommunity logo
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + parentCommunity.getLogo().getID()))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
|
||||||
|
// Verify 404 after delete for collection logo
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + col.getLogo().getID()))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListMissing() throws Exception {
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/1c11f3f1-ba1f-4f36-908a-3f1ea9a557eb"))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
|
||||||
|
// Verify 404 after failed delete
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/1c11f3f1-ba1f-4f36-908a-3f1ea9a557eb"))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListOneMissing() throws Exception {
|
||||||
|
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Add 3 bitstreams to the item
|
||||||
|
String bitstreamContent1 = "ThisIsSomeDummyText1";
|
||||||
|
Bitstream bitstream1 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent1, CharEncoding.UTF_8)) {
|
||||||
|
bitstream1 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream1")
|
||||||
|
.withDescription("Description1")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent2 = "ThisIsSomeDummyText2";
|
||||||
|
Bitstream bitstream2 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent2, CharEncoding.UTF_8)) {
|
||||||
|
bitstream2 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream2")
|
||||||
|
.withDescription("Description2")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent3 = "ThisIsSomeDummyText3";
|
||||||
|
Bitstream bitstream3 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent3, CharEncoding.UTF_8)) {
|
||||||
|
bitstream3 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream3")
|
||||||
|
.withDescription("Description3")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete all bitstreams and a missing bitstream returns 404
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream1.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream2.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream3.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/1c11f3f1-ba1f-4f36-908a-3f1ea9a557eb"))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
|
||||||
|
// Verify the bitstreams are still here
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream2.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListOneMissingDifferentItems() throws Exception {
|
||||||
|
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. Two public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Item publicItem2 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Add 1 bitstream to each item
|
||||||
|
String bitstreamContent1 = "ThisIsSomeDummyText1";
|
||||||
|
Bitstream bitstream1 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent1, CharEncoding.UTF_8)) {
|
||||||
|
bitstream1 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream1")
|
||||||
|
.withDescription("Description1")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent2 = "ThisIsSomeDummyText2";
|
||||||
|
Bitstream bitstream2 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent2, CharEncoding.UTF_8)) {
|
||||||
|
bitstream2 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem2, is)
|
||||||
|
.withName("Bitstream2")
|
||||||
|
.withDescription("Description2")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete all bitstreams and a missing bitstream returns 404
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream1.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream2.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/1c11f3f1-ba1f-4f36-908a-3f1ea9a557eb"))
|
||||||
|
.andExpect(status().isNotFound());
|
||||||
|
|
||||||
|
// Verify the bitstreams are still here
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
getClient(token).perform(get("/api/core/bitstreams/" + bitstream2.getID()))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListDeleted() throws Exception {
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
String bitstreamContent = "ThisIsSomeDummyText";
|
||||||
|
//Add a bitstream to an item
|
||||||
|
Bitstream bitstream = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent, CharEncoding.UTF_8)) {
|
||||||
|
bitstream = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream")
|
||||||
|
.withDescription("Description")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream.getID()))
|
||||||
|
.andExpect(status().is(204));
|
||||||
|
|
||||||
|
// Verify 404 when trying to delete a non-existing, already deleted, bitstream
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream.getID()))
|
||||||
|
.andExpect(status().is(422));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteListOneDeleted() throws Exception {
|
||||||
|
//We turn off the authorization system in order to create the structure as defined below
|
||||||
|
context.turnOffAuthorisationSystem();
|
||||||
|
|
||||||
|
//** GIVEN **
|
||||||
|
//1. A community-collection structure with one parent community with sub-community and one collection.
|
||||||
|
parentCommunity = CommunityBuilder.createCommunity(context)
|
||||||
|
.withName("Parent Community")
|
||||||
|
.build();
|
||||||
|
Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
|
||||||
|
.withName("Sub Community")
|
||||||
|
.build();
|
||||||
|
Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
|
||||||
|
|
||||||
|
//2. One public items that is readable by Anonymous
|
||||||
|
Item publicItem1 = ItemBuilder.createItem(context, col1)
|
||||||
|
.withTitle("Test")
|
||||||
|
.withIssueDate("2010-10-17")
|
||||||
|
.withAuthor("Smith, Donald")
|
||||||
|
.withSubject("ExtraEntry")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Add 3 bitstreams to the item
|
||||||
|
String bitstreamContent1 = "ThisIsSomeDummyText1";
|
||||||
|
Bitstream bitstream1 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent1, CharEncoding.UTF_8)) {
|
||||||
|
bitstream1 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream1")
|
||||||
|
.withDescription("Description1")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent2 = "ThisIsSomeDummyText2";
|
||||||
|
Bitstream bitstream2 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent2, CharEncoding.UTF_8)) {
|
||||||
|
bitstream2 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream2")
|
||||||
|
.withDescription("Description2")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
String bitstreamContent3 = "ThisIsSomeDummyText3";
|
||||||
|
Bitstream bitstream3 = null;
|
||||||
|
try (InputStream is = IOUtils.toInputStream(bitstreamContent3, CharEncoding.UTF_8)) {
|
||||||
|
bitstream3 = BitstreamBuilder.
|
||||||
|
createBitstream(context, publicItem1, is)
|
||||||
|
.withName("Bitstream3")
|
||||||
|
.withDescription("Description3")
|
||||||
|
.withMimeType("text/plain")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.restoreAuthSystemState();
|
||||||
|
|
||||||
|
String token = getAuthToken(admin.getEmail(), password);
|
||||||
|
|
||||||
|
// Delete bitstream1
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream1.getID()))
|
||||||
|
.andExpect(status().is(204));
|
||||||
|
|
||||||
|
// Verify 404 when trying to delete a non-existing, already deleted, bitstream
|
||||||
|
getClient(token).perform(delete("/api/core/bitstreams")
|
||||||
|
.contentType(TEXT_URI_LIST)
|
||||||
|
.content("http://localhost:8080/server/api/core/bitstreams/" + bitstream1.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream2.getID()
|
||||||
|
+ " \n http://localhost:8080/server/api/core/bitstreams/" + bitstream3.getID()))
|
||||||
|
.andExpect(status().is(422));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void patchBitstreamMetadataAuthorized() throws Exception {
|
public void patchBitstreamMetadataAuthorized() throws Exception {
|
||||||
runPatchMetadataTests(admin, 200);
|
runPatchMetadataTests(admin, 200);
|
||||||
|
Reference in New Issue
Block a user