mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-07 01:54:22 +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.hateoas.DSpaceResource;
|
||||
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.LinkRestRepository;
|
||||
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.hateoas.Link;
|
||||
import org.springframework.hateoas.PagedResources;
|
||||
import org.springframework.hateoas.Resource;
|
||||
import org.springframework.hateoas.ResourceSupport;
|
||||
import org.springframework.hateoas.UriTemplate;
|
||||
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")
|
||||
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,
|
||||
@RequestParam(required=false, value="extraField") String extraField,
|
||||
@RequestParam("file") MultipartFile[] uploadfiles) throws HttpRequestMethodNotSupportedException {
|
||||
//TODO manage extra field
|
||||
return uploadInternal(request, apiCategory, model, id, extraField, uploadfiles);
|
||||
@RequestParam("file") MultipartFile uploadfile) throws HttpRequestMethodNotSupportedException {
|
||||
return uploadInternal(request, apiCategory, model, id, extraField, uploadfile);
|
||||
}
|
||||
|
||||
@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,
|
||||
@RequestParam(required=false, value="extraField") String extraField,
|
||||
@RequestParam("file") MultipartFile[] uploadfiles) throws HttpRequestMethodNotSupportedException {
|
||||
return uploadInternal(request, apiCategory, model, id, extraField, uploadfiles);
|
||||
@RequestParam("file") MultipartFile uploadfile) throws HttpRequestMethodNotSupportedException {
|
||||
return uploadInternal(request, apiCategory, model, id, extraField, uploadfile);
|
||||
}
|
||||
|
||||
private <ID extends Serializable> List<Serializable> uploadInternal(HttpServletRequest request, String apiCategory, String model, ID id,
|
||||
String extraField, MultipartFile... uploadfiles) {
|
||||
private <ID extends Serializable, U extends UploadStatusResponse> ResponseEntity<ResourceSupport> uploadInternal(HttpServletRequest request, String apiCategory, String model, ID id,
|
||||
String extraField, MultipartFile uploadfile) {
|
||||
|
||||
DSpaceRestRepository<DirectlyAddressableRestModel, ID> repository = utils.getResourceRepository(apiCategory, model);
|
||||
|
||||
// Get file name
|
||||
// String uploadedFileName = Arrays.stream(uploadfiles).map(x -> x.getOriginalFilename())
|
||||
// .filter(x -> !StringUtils.isEmpty(x)).collect(Collectors.joining(" , "));
|
||||
|
||||
U result = null;
|
||||
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) {
|
||||
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;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.dspace.app.rest.model.CheckSumRest;
|
||||
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 Long sizeBytes;
|
||||
private CheckSumRest checkSum;
|
||||
@@ -44,4 +46,12 @@ public class UploadBitstreamRest implements Serializable {
|
||||
public void setUrl(String 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.dspace.app.rest.model.DirectlyAddressableRestModel;
|
||||
import org.dspace.app.rest.model.hateoas.DSpaceResource;
|
||||
import org.dspace.app.rest.model.step.UploadStatusResponse;
|
||||
import org.dspace.core.Context;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.repository.PagingAndSortingRepository;
|
||||
import org.springframework.hateoas.ResourceSupport;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
/**
|
||||
@@ -147,17 +149,8 @@ extends AbstractDSpaceRestRepository
|
||||
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!");
|
||||
}
|
||||
|
||||
|
||||
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,57 +189,51 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository<WorkspaceI
|
||||
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;
|
||||
BitstreamFormat bf = null;
|
||||
|
||||
|
||||
Context context = obtainContext();
|
||||
WorkspaceItem wsi = wis.find(context, id);
|
||||
Item item = wsi.getItem();
|
||||
// do we already have a bundle?
|
||||
List<Bundle> bundles = itemService.getBundles(item, "ORIGINAL");
|
||||
|
||||
InputStream inputStream = new BufferedInputStream(file.getInputStream());
|
||||
if (bundles.size() < 1)
|
||||
{
|
||||
// set bundle's name to ORIGINAL
|
||||
source = itemService.createSingleBitstream(context, inputStream, item, "ORIGINAL");
|
||||
}
|
||||
else
|
||||
{
|
||||
// we have a bundle already, just add bitstream
|
||||
source = bitstreamService.create(context, bundles.get(0), inputStream);
|
||||
}
|
||||
// do we already have a bundle?
|
||||
List<Bundle> bundles = itemService.getBundles(item, "ORIGINAL");
|
||||
|
||||
source.setName(context, file.getOriginalFilename());
|
||||
//TODO how retrieve this information?
|
||||
source.setSource(context, extraField);
|
||||
|
||||
// Identify the format
|
||||
bf = bitstreamFormatService.guessFormat(context, source);
|
||||
source.setFormat(context, bf);
|
||||
|
||||
// Update to DB
|
||||
bitstreamService.update(context, source);
|
||||
itemService.update(context, item);
|
||||
context.commit();
|
||||
|
||||
UploadBitstreamRest result = 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);
|
||||
try {
|
||||
InputStream inputStream = new BufferedInputStream(file.getInputStream());
|
||||
if (bundles.size() < 1) {
|
||||
// set bundle's name to ORIGINAL
|
||||
source = itemService.createSingleBitstream(context, inputStream, item, "ORIGINAL");
|
||||
} else {
|
||||
// we have a bundle already, just add bitstream
|
||||
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;
|
||||
}
|
||||
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");
|
||||
|
||||
source.setName(context, file.getOriginalFilename());
|
||||
// TODO how retrieve this information?
|
||||
source.setSource(context, extraField);
|
||||
|
||||
// Identify the format
|
||||
bf = bitstreamFormatService.guessFormat(context, source);
|
||||
source.setFormat(context, bf);
|
||||
|
||||
// Update to DB
|
||||
bitstreamService.update(context, source);
|
||||
itemService.update(context, item);
|
||||
context.commit();
|
||||
|
||||
result = SubmissionService.buildUploadBitstream(configurationService, source);
|
||||
result.setStatus(true);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@@ -7,11 +7,20 @@
|
||||
*/
|
||||
package org.dspace.app.rest.submit;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.atteo.evo.inflector.English;
|
||||
import org.dspace.app.rest.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.MetadataValue;
|
||||
import org.dspace.content.WorkspaceItem;
|
||||
import org.dspace.content.service.CollectionService;
|
||||
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.UploadBitstreamRest;
|
||||
import org.dspace.app.rest.submit.AbstractRestProcessingStep;
|
||||
import org.dspace.app.rest.submit.SubmissionService;
|
||||
import org.dspace.app.util.SubmissionStepConfig;
|
||||
import org.dspace.content.Bitstream;
|
||||
import org.dspace.content.Bundle;
|
||||
import org.dspace.content.MetadataValue;
|
||||
import org.dspace.content.WorkspaceItem;
|
||||
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.
|
||||
@@ -31,7 +33,7 @@ import org.dspace.core.Constants;
|
||||
*
|
||||
*/
|
||||
public class UploadStep extends org.dspace.submit.step.UploadStep implements AbstractRestProcessingStep {
|
||||
|
||||
|
||||
@Override
|
||||
public DataUpload getData(WorkspaceItem obj, SubmissionStepConfig config) throws Exception {
|
||||
|
||||
@@ -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);
|
||||
for(Bundle bundle : bundles) {
|
||||
for(Bitstream source : bundle.getBitstreams()) {
|
||||
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);
|
||||
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");
|
||||
UploadBitstreamRest b = SubmissionService.buildUploadBitstream(configurationService, source);
|
||||
result.getFiles().add(b);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user