mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-07 10:04:21 +00:00
Merge branch 'D4CRIS-338' of https://github.com/4Science/DSpace into D4CRIS-338
# Conflicts: # dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java
This commit is contained in:
@@ -33,6 +33,7 @@ import org.dspace.app.rest.model.RestModel;
|
|||||||
import org.dspace.app.rest.model.DirectlyAddressableRestModel;
|
import org.dspace.app.rest.model.DirectlyAddressableRestModel;
|
||||||
import org.dspace.app.rest.model.hateoas.DSpaceResource;
|
import org.dspace.app.rest.model.hateoas.DSpaceResource;
|
||||||
import org.dspace.app.rest.model.hateoas.EmbeddedPage;
|
import org.dspace.app.rest.model.hateoas.EmbeddedPage;
|
||||||
|
import org.dspace.app.rest.model.step.UploadStatusResponse;
|
||||||
import org.dspace.app.rest.repository.DSpaceRestRepository;
|
import org.dspace.app.rest.repository.DSpaceRestRepository;
|
||||||
import org.dspace.app.rest.repository.LinkRestRepository;
|
import org.dspace.app.rest.repository.LinkRestRepository;
|
||||||
import org.dspace.app.rest.utils.RestRepositoryUtils;
|
import org.dspace.app.rest.utils.RestRepositoryUtils;
|
||||||
@@ -49,6 +50,7 @@ import org.springframework.data.rest.webmvc.ResourceNotFoundException;
|
|||||||
import org.springframework.data.web.PagedResourcesAssembler;
|
import org.springframework.data.web.PagedResourcesAssembler;
|
||||||
import org.springframework.hateoas.Link;
|
import org.springframework.hateoas.Link;
|
||||||
import org.springframework.hateoas.PagedResources;
|
import org.springframework.hateoas.PagedResources;
|
||||||
|
import org.springframework.hateoas.Resource;
|
||||||
import org.springframework.hateoas.ResourceSupport;
|
import org.springframework.hateoas.ResourceSupport;
|
||||||
import org.springframework.hateoas.UriTemplate;
|
import org.springframework.hateoas.UriTemplate;
|
||||||
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
@@ -197,37 +199,39 @@ public class RestResourceController implements InitializingBean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping(method = RequestMethod.POST, value = "/{id:\\d+}" , headers = "content-type=multipart/form-data")
|
@RequestMapping(method = RequestMethod.POST, value = "/{id:\\d+}" , headers = "content-type=multipart/form-data")
|
||||||
public <ID extends Serializable> List<Serializable> upload(HttpServletRequest request,
|
public <ID extends Serializable> ResponseEntity<ResourceSupport> upload(HttpServletRequest request,
|
||||||
@PathVariable String apiCategory, @PathVariable String model, @PathVariable Integer id,
|
@PathVariable String apiCategory, @PathVariable String model, @PathVariable Integer id,
|
||||||
@RequestParam(required=false, value="extraField") String extraField,
|
@RequestParam(required=false, value="extraField") String extraField,
|
||||||
@RequestParam("file") MultipartFile[] uploadfiles) throws HttpRequestMethodNotSupportedException {
|
@RequestParam("file") MultipartFile uploadfile) throws HttpRequestMethodNotSupportedException {
|
||||||
//TODO manage extra field
|
return uploadInternal(request, apiCategory, model, id, extraField, uploadfile);
|
||||||
return uploadInternal(request, apiCategory, model, id, extraField, uploadfiles);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping(method = RequestMethod.POST, value = "/{uuid:[0-9a-fxA-FX]{8}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{12}}", headers = "content-type=multipart/form-data")
|
@RequestMapping(method = RequestMethod.POST, value = "/{uuid:[0-9a-fxA-FX]{8}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{12}}", headers = "content-type=multipart/form-data")
|
||||||
public <ID extends Serializable> List<Serializable> upload(HttpServletRequest request,
|
public <ID extends Serializable> ResponseEntity<ResourceSupport> upload(HttpServletRequest request,
|
||||||
@PathVariable String apiCategory, @PathVariable String model, @PathVariable UUID id,
|
@PathVariable String apiCategory, @PathVariable String model, @PathVariable UUID id,
|
||||||
@RequestParam(required=false, value="extraField") String extraField,
|
@RequestParam(required=false, value="extraField") String extraField,
|
||||||
@RequestParam("file") MultipartFile[] uploadfiles) throws HttpRequestMethodNotSupportedException {
|
@RequestParam("file") MultipartFile uploadfile) throws HttpRequestMethodNotSupportedException {
|
||||||
return uploadInternal(request, apiCategory, model, id, extraField, uploadfiles);
|
return uploadInternal(request, apiCategory, model, id, extraField, uploadfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
private <ID extends Serializable> List<Serializable> uploadInternal(HttpServletRequest request, String apiCategory, String model, ID id,
|
private <ID extends Serializable, U extends UploadStatusResponse> ResponseEntity<ResourceSupport> uploadInternal(HttpServletRequest request, String apiCategory, String model, ID id,
|
||||||
String extraField, MultipartFile... uploadfiles) {
|
String extraField, MultipartFile uploadfile) {
|
||||||
|
|
||||||
DSpaceRestRepository<DirectlyAddressableRestModel, ID> repository = utils.getResourceRepository(apiCategory, model);
|
DSpaceRestRepository<DirectlyAddressableRestModel, ID> repository = utils.getResourceRepository(apiCategory, model);
|
||||||
|
|
||||||
// Get file name
|
U result = null;
|
||||||
// String uploadedFileName = Arrays.stream(uploadfiles).map(x -> x.getOriginalFilename())
|
|
||||||
// .filter(x -> !StringUtils.isEmpty(x)).collect(Collectors.joining(" , "));
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return repository.upload(request, apiCategory, model, id, extraField, Arrays.asList(uploadfiles));
|
result = repository.upload(request, apiCategory, model, id, extraField, uploadfile);
|
||||||
|
if(result.isStatus()) {
|
||||||
|
return ControllerUtils.toResponseEntity(HttpStatus.CREATED, null, new Resource(result));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return ControllerUtils.toResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR, null, new Resource(result));
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
return null;
|
return ControllerUtils.toEmptyResponse(HttpStatus.INTERNAL_SERVER_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,13 +1,15 @@
|
|||||||
package org.dspace.app.rest.model.step;
|
package org.dspace.app.rest.model.step;
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.dspace.app.rest.model.CheckSumRest;
|
import org.dspace.app.rest.model.CheckSumRest;
|
||||||
import org.dspace.app.rest.model.MetadataEntryRest;
|
import org.dspace.app.rest.model.MetadataEntryRest;
|
||||||
|
import org.springframework.hateoas.ResourceSupport;
|
||||||
|
|
||||||
public class UploadBitstreamRest implements Serializable {
|
public class UploadBitstreamRest extends UploadStatusResponse {
|
||||||
|
|
||||||
|
private UUID uuid;
|
||||||
private List<MetadataEntryRest> metadata;
|
private List<MetadataEntryRest> metadata;
|
||||||
private Long sizeBytes;
|
private Long sizeBytes;
|
||||||
private CheckSumRest checkSum;
|
private CheckSumRest checkSum;
|
||||||
@@ -44,4 +46,12 @@ public class UploadBitstreamRest implements Serializable {
|
|||||||
public void setUrl(String url) {
|
public void setUrl(String url) {
|
||||||
this.url = url;
|
this.url = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UUID getUuid() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUuid(UUID uuid) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
}
|
}
|
@@ -0,0 +1,29 @@
|
|||||||
|
package org.dspace.app.rest.model.step;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude.Include;
|
||||||
|
|
||||||
|
public abstract class UploadStatusResponse {
|
||||||
|
|
||||||
|
private Boolean status;
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
@JsonInclude(Include.NON_NULL)
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonInclude(Include.NON_NULL)
|
||||||
|
public Boolean isStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(Boolean status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessage(String message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -17,11 +17,13 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.dspace.app.rest.model.DirectlyAddressableRestModel;
|
import org.dspace.app.rest.model.DirectlyAddressableRestModel;
|
||||||
import org.dspace.app.rest.model.hateoas.DSpaceResource;
|
import org.dspace.app.rest.model.hateoas.DSpaceResource;
|
||||||
|
import org.dspace.app.rest.model.step.UploadStatusResponse;
|
||||||
import org.dspace.core.Context;
|
import org.dspace.core.Context;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.domain.Sort;
|
import org.springframework.data.domain.Sort;
|
||||||
import org.springframework.data.repository.PagingAndSortingRepository;
|
import org.springframework.data.repository.PagingAndSortingRepository;
|
||||||
|
import org.springframework.hateoas.ResourceSupport;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -147,17 +149,8 @@ extends AbstractDSpaceRestRepository
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected <S extends Serializable> S upload(HttpServletRequest request, String apiCategory, String model, ID id, String extraField, MultipartFile file) throws Exception {
|
public <U extends UploadStatusResponse> U upload(HttpServletRequest request, String apiCategory, String model, ID id, String extraField, MultipartFile file) throws Exception {
|
||||||
throw new RuntimeException("No implementation found; Metod not allowed!");
|
throw new RuntimeException("No implementation found; Metod not allowed!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public <S extends Serializable> List<S> upload(HttpServletRequest request, String apiCategory, String model, ID id,
|
|
||||||
String extraField, List<MultipartFile> files) throws Exception {
|
|
||||||
List<S> results = new ArrayList<>();
|
|
||||||
for(MultipartFile file : files) {
|
|
||||||
results.add(upload(request, apiCategory, model, id, extraField, file));
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -189,7 +189,10 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository<WorkspaceI
|
|||||||
return new WorkspaceItemResource(witem, utils, rels);
|
return new WorkspaceItemResource(witem, utils, rels);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected UploadBitstreamRest upload(HttpServletRequest request, String apiCategory, String model, Integer id, String extraField, MultipartFile file) throws Exception {
|
public UploadBitstreamRest upload(HttpServletRequest request, String apiCategory, String model, Integer id,
|
||||||
|
String extraField, MultipartFile file) throws Exception {
|
||||||
|
|
||||||
|
UploadBitstreamRest result;
|
||||||
Bitstream source = null;
|
Bitstream source = null;
|
||||||
BitstreamFormat bf = null;
|
BitstreamFormat bf = null;
|
||||||
|
|
||||||
@@ -199,20 +202,25 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository<WorkspaceI
|
|||||||
// do we already have a bundle?
|
// do we already have a bundle?
|
||||||
List<Bundle> bundles = itemService.getBundles(item, "ORIGINAL");
|
List<Bundle> bundles = itemService.getBundles(item, "ORIGINAL");
|
||||||
|
|
||||||
|
try {
|
||||||
InputStream inputStream = new BufferedInputStream(file.getInputStream());
|
InputStream inputStream = new BufferedInputStream(file.getInputStream());
|
||||||
if (bundles.size() < 1)
|
if (bundles.size() < 1) {
|
||||||
{
|
|
||||||
// set bundle's name to ORIGINAL
|
// set bundle's name to ORIGINAL
|
||||||
source = itemService.createSingleBitstream(context, inputStream, item, "ORIGINAL");
|
source = itemService.createSingleBitstream(context, inputStream, item, "ORIGINAL");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// we have a bundle already, just add bitstream
|
// we have a bundle already, just add bitstream
|
||||||
source = bitstreamService.create(context, bundles.get(0), inputStream);
|
source = bitstreamService.create(context, bundles.get(0), inputStream);
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
|
result = new UploadBitstreamRest();
|
||||||
|
result.setMessage(e.getMessage());
|
||||||
|
result.setStatus(false);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
source.setName(context, file.getOriginalFilename());
|
source.setName(context, file.getOriginalFilename());
|
||||||
//TODO how retrieve this information?
|
// TODO how retrieve this information?
|
||||||
source.setSource(context, extraField);
|
source.setSource(context, extraField);
|
||||||
|
|
||||||
// Identify the format
|
// Identify the format
|
||||||
@@ -224,22 +232,8 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository<WorkspaceI
|
|||||||
itemService.update(context, item);
|
itemService.update(context, item);
|
||||||
context.commit();
|
context.commit();
|
||||||
|
|
||||||
UploadBitstreamRest result = new UploadBitstreamRest();
|
result = SubmissionService.buildUploadBitstream(configurationService, source);
|
||||||
List<MetadataEntryRest> metadata = new ArrayList<MetadataEntryRest>();
|
result.setStatus(true);
|
||||||
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);
|
|
||||||
}
|
|
||||||
result.setMetadata(metadata);
|
|
||||||
CheckSumRest checksum = new CheckSumRest();
|
|
||||||
checksum.setCheckSumAlgorithm(source.getChecksumAlgorithm());
|
|
||||||
checksum.setValue(source.getChecksum());
|
|
||||||
result.setCheckSum(checksum);
|
|
||||||
result.setSizeBytes(source.getSize());
|
|
||||||
result.setUrl(configurationService.getProperty("dspace.url")+"/api/"+BitstreamRest.CATEGORY +"/"+ English.plural(BitstreamRest.NAME) + "/" + source.getID() + "/content");
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -7,11 +7,20 @@
|
|||||||
*/
|
*/
|
||||||
package org.dspace.app.rest.submit;
|
package org.dspace.app.rest.submit;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
import org.atteo.evo.inflector.English;
|
||||||
|
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.step.UploadBitstreamRest;
|
||||||
|
import org.dspace.content.Bitstream;
|
||||||
import org.dspace.content.Collection;
|
import org.dspace.content.Collection;
|
||||||
|
import org.dspace.content.MetadataValue;
|
||||||
import org.dspace.content.WorkspaceItem;
|
import org.dspace.content.WorkspaceItem;
|
||||||
import org.dspace.content.service.CollectionService;
|
import org.dspace.content.service.CollectionService;
|
||||||
import org.dspace.content.service.WorkspaceItemService;
|
import org.dspace.content.service.WorkspaceItemService;
|
||||||
@@ -73,4 +82,26 @@ public class SubmissionService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static UploadBitstreamRest buildUploadBitstream(ConfigurationService configurationService, Bitstream source) {
|
||||||
|
UploadBitstreamRest b = new UploadBitstreamRest();
|
||||||
|
List<MetadataEntryRest> metadata = new ArrayList<MetadataEntryRest>();
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
b.setMetadata(metadata);
|
||||||
|
b.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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -17,12 +17,14 @@ import org.dspace.app.rest.model.MetadataEntryRest;
|
|||||||
import org.dspace.app.rest.model.step.DataUpload;
|
import org.dspace.app.rest.model.step.DataUpload;
|
||||||
import org.dspace.app.rest.model.step.UploadBitstreamRest;
|
import org.dspace.app.rest.model.step.UploadBitstreamRest;
|
||||||
import org.dspace.app.rest.submit.AbstractRestProcessingStep;
|
import org.dspace.app.rest.submit.AbstractRestProcessingStep;
|
||||||
|
import org.dspace.app.rest.submit.SubmissionService;
|
||||||
import org.dspace.app.util.SubmissionStepConfig;
|
import org.dspace.app.util.SubmissionStepConfig;
|
||||||
import org.dspace.content.Bitstream;
|
import org.dspace.content.Bitstream;
|
||||||
import org.dspace.content.Bundle;
|
import org.dspace.content.Bundle;
|
||||||
import org.dspace.content.MetadataValue;
|
import org.dspace.content.MetadataValue;
|
||||||
import org.dspace.content.WorkspaceItem;
|
import org.dspace.content.WorkspaceItem;
|
||||||
import org.dspace.core.Constants;
|
import org.dspace.core.Constants;
|
||||||
|
import org.dspace.services.ConfigurationService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
@@ -39,27 +41,11 @@ public class UploadStep extends org.dspace.submit.step.UploadStep implements Abs
|
|||||||
List<Bundle> bundles = itemService.getBundles(obj.getItem(), Constants.CONTENT_BUNDLE_NAME);
|
List<Bundle> bundles = itemService.getBundles(obj.getItem(), Constants.CONTENT_BUNDLE_NAME);
|
||||||
for(Bundle bundle : bundles) {
|
for(Bundle bundle : bundles) {
|
||||||
for(Bitstream source : bundle.getBitstreams()) {
|
for(Bitstream source : bundle.getBitstreams()) {
|
||||||
UploadBitstreamRest b = new UploadBitstreamRest();
|
UploadBitstreamRest b = SubmissionService.buildUploadBitstream(configurationService, source);
|
||||||
List<MetadataEntryRest> metadata = new ArrayList<MetadataEntryRest>();
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
b.setMetadata(metadata);
|
|
||||||
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");
|
|
||||||
result.getFiles().add(b);
|
result.getFiles().add(b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user