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:
Andrea Bollini
2017-11-14 18:40:01 +01:00
7 changed files with 137 additions and 90 deletions

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}