diff --git a/api/pom.xml b/api/pom.xml index 2dafadb96cf9f6ac99e7a73c3d249e99d3f97e6f..e5680a46ab086a769e01cf863b89a557364aca74 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>com.indiscale.fdo</groupId> <artifactId>fdo-manager-service</artifactId> - <version>0.1.0-rc7</version> + <version>0.1.0-rc8</version> <relativePath>../pom.xml</relativePath> </parent> <properties> diff --git a/api/src/main/resources/api.yaml b/api/src/main/resources/api.yaml index e98a497561574be8bd614601dbd400c0e6e4f9ee..b98db0f4b18413e50823477d0d33e333073ab646 100644 --- a/api/src/main/resources/api.yaml +++ b/api/src/main/resources/api.yaml @@ -6,10 +6,10 @@ info: contact: name: IndiScale GmbH email: t.fitschen@indiscale.com - url: https://www.indiscale.com + url: "https://www.indiscale.com" servers: - - url: http://localhost:8080 + - url: "http://localhost:8080" tags: - name: Repositories @@ -203,7 +203,7 @@ paths: multipart/form-data: schema: type: object - required: ["repositories", "data", "metadata"] + required: ["repositories", "metadata"] properties: repositories: $ref: "#/components/schemas/TargetRepositories" @@ -213,6 +213,13 @@ paths: metadata: type: string format: binary + dataUrl: + type: string + format: uri + metadataProfile: + type: string + fdoType: + type: string responses: "201": description: "The Location header points to the newly created FDO." @@ -412,6 +419,13 @@ components: type: string metadataPid: type: string + fdoType: + type: string + fdoProfile: + type: string + attributes: + type: object + additionalProperties: true Info: type: object properties: diff --git a/application/pom.xml b/application/pom.xml index 7be0e8ffcbac58911e40ee981838d204acecc3ce..a0dc68ec6bde21a2252cabe80dbc7d242d212c4f 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -3,7 +3,7 @@ <parent> <groupId>com.indiscale.fdo</groupId> <artifactId>fdo-manager-service</artifactId> - <version>0.1.0-rc7</version> + <version>0.1.0-rc8</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> @@ -11,7 +11,7 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.outputEncoding>UTF-8</project.build.outputEncoding> <sourceDir>${project.basedir}/src/main</sourceDir> - <fdo.sdk.version>0.1.0-rc13</fdo.sdk.version> + <fdo.sdk.version>0.1.0-rc16</fdo.sdk.version> </properties> <artifactId>fdo-manager-service.application</artifactId> <dependencies> diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java b/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java index 4bb36de0aa56eede18dc0a653b8ec54c9fe10073..c2943b358e414dabb39ddfc3a081878f164b2a0c 100644 --- a/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java +++ b/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java @@ -2,13 +2,20 @@ package com.indiscale.fdo.manager.service.fdo; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import com.google.gson.JsonElement; import com.indiscale.fdo.manager.DefaultData; import com.indiscale.fdo.manager.DefaultMetadata; +import com.indiscale.fdo.manager.DefaultMetadataProfile; +import com.indiscale.fdo.manager.UrlRefData; +import com.indiscale.fdo.manager.api.Data; import com.indiscale.fdo.manager.api.DigitalObject; import com.indiscale.fdo.manager.api.FDO; +import com.indiscale.fdo.manager.api.FdoComponent; import com.indiscale.fdo.manager.api.FdoProfile; +import com.indiscale.fdo.manager.api.FdoType; import com.indiscale.fdo.manager.api.InputStreamSource; import com.indiscale.fdo.manager.api.Manager; +import com.indiscale.fdo.manager.api.MetadataProfile; import com.indiscale.fdo.manager.api.PidUnresolvableException; import com.indiscale.fdo.manager.api.RepositoryConnection; import com.indiscale.fdo.manager.api.TokenAuthenticationInfo; @@ -22,7 +29,10 @@ import com.indiscale.fdo.manager.service.api.operation.FdoApi; import jakarta.validation.Valid; import java.io.IOException; import java.io.InputStream; +import java.net.MalformedURLException; import java.net.URI; +import java.util.HashMap; +import java.util.Map.Entry; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; @@ -48,8 +58,16 @@ class MetadataWrapper extends DefaultMetadata { private MultipartFile file; - public MetadataWrapper(MultipartFile file) { - super(); + private static MetadataProfile createMetadataProfile(String metadataProfile) { + if (metadataProfile != null) { + + return new DefaultMetadataProfile(metadataProfile); + } + return null; + } + + public MetadataWrapper(MultipartFile file, String metadataProfile) { + super(createMetadataProfile(metadataProfile)); this.file = file; } @@ -82,7 +100,12 @@ public class FDOApiImpl extends BaseController implements FdoApi { @Override public ResponseEntity<Void> createFDO( - @Valid TargetRepositories repositories, MultipartFile data, MultipartFile metadata) { + @Valid TargetRepositories repositories, + MultipartFile metadataFile, + MultipartFile dataFile, + @Valid URI dataUrl, + @Valid String metadataProfile, + @Valid String fdoType) { try (Manager manager = getManager()) { RepositoryConnection repository = manager.getRepositoryRegistry().createRepositoryConnection(repositories.getFdo()); @@ -90,9 +113,21 @@ public class FDOApiImpl extends BaseController implements FdoApi { repository.setTokenAuthenticationInfo(new TokenAuthenticationInfo(getToken())); } FdoProfile profile = manager.getDefaultProfile(); + Data data = null; + if (dataFile != null) { + data = new DataWrapper(dataFile); + } else if (dataUrl != null) { + data = new UrlRefData(dataUrl.toURL()); + } else { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Missing data component."); + } FDO fdo = manager.createFDO( - profile, repository, new DataWrapper(data), new MetadataWrapper(metadata)); + profile, + FdoType.getType(fdoType), + repository, + data, + new MetadataWrapper(metadataFile, metadataProfile)); getLogger().createFDO(fdo, repository); // TODO(tf) this is a workaround for the apache proxy @@ -104,6 +139,8 @@ public class FDOApiImpl extends BaseController implements FdoApi { throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found. Unknown repository id."); } catch (ValidationException e) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getValidationResult().toString()); + } catch (MalformedURLException e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.toString()); } } @@ -166,6 +203,22 @@ public class FDOApiImpl extends BaseController implements FdoApi { if (fdo.getMetadata() != null) { data.setMetadataPid(fdo.getMetadata().getPID()); } + if (fdo.getType() != null) { + data.setFdoType(fdo.getType().getPID()); + } + if (fdo.getProfile() != null) { + data.setFdoProfile(fdo.getProfile().getPID()); + } + } + if (resolved.getAttributes() != null) { + data.setAttributes(new HashMap<>()); + for (Entry<String, JsonElement> s : resolved.getAttributes().entrySet()) { + data.getAttributes().put(s.getKey(), s.getValue().getAsString()); + } + } + if (resolved.isFdoComponent()) { + FdoComponent fdoComponent = resolved.toFdoComponent(); + if (fdoComponent.getProfile() != null) data.setFdoProfile(fdoComponent.getProfile().getPID()); } return new ResolvePID200Response().data(data).links(self); diff --git a/application/src/test/java/com/indiscale/fdo/manager/service/fdo/FDOApiTest.java b/application/src/test/java/com/indiscale/fdo/manager/service/fdo/FDOApiTest.java index 4a50e6c60f37e6cbb91423c87d65555c5574df26..ac3c3cf2e44e047928912e3e3fe7292b955877cf 100644 --- a/application/src/test/java/com/indiscale/fdo/manager/service/fdo/FDOApiTest.java +++ b/application/src/test/java/com/indiscale/fdo/manager/service/fdo/FDOApiTest.java @@ -11,6 +11,7 @@ import com.google.gson.JsonObject; import com.indiscale.fdo.manager.DefaultRepositoryRegistry; import com.indiscale.fdo.manager.api.DigitalObject; import com.indiscale.fdo.manager.api.FDO; +import com.indiscale.fdo.manager.api.FdoComponent; import com.indiscale.fdo.manager.api.Manager; import com.indiscale.fdo.manager.api.PidUnresolvableException; import com.indiscale.fdo.manager.api.RepositoryConnection; @@ -72,6 +73,16 @@ public class FDOApiTest { public FDO toFDO() { return null; } + + @Override + public FdoComponent toFdoComponent() { + return null; + } + + @Override + public boolean isFdoComponent() { + return false; + } }; DigitalObject mockDO2 = new DigitalObject() { @@ -94,6 +105,16 @@ public class FDOApiTest { public FDO toFDO() { return null; } + + @Override + public FdoComponent toFdoComponent() { + return null; + } + + @Override + public boolean isFdoComponent() { + return false; + } }; // Configure Test returns, commented out returns are there so that each set of returns has same // index. diff --git a/pom.xml b/pom.xml index e42e62e523a860a6df9b86ba83c595bf7bc48956..0b11c1f209d776bbbc937a051328700d032fb052 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <groupId>com.indiscale.fdo</groupId> <artifactId>fdo-manager-service</artifactId> <packaging>pom</packaging> - <version>0.1.0-rc7</version> + <version>0.1.0-rc8</version> <modules> <module>api</module> <module>application</module>