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

View File

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

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

View File

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

View File

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

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