From 1cdf92ba1a2ab13432ce1252ee1febed5068b67a Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Mon, 17 Jan 2022 13:30:21 +0100 Subject: [PATCH 001/293] Various refactoring --- cms-plugin-framework/CHANGELOG.md | 3 + cms-plugin-framework/pom.xml | 8 +- .../gcube/application/cms/Serialization.java | 138 ++++++++++++++++++ .../cms/plugins/reports/Report.java | 7 + concessioni-lifecycle/CHANGELOG.md | 3 + concessioni-lifecycle/pom.xml | 2 +- .../plugins/ConcessioniLifeCycleManager.java | 10 +- concessioni-model/CHANGELOG.md | 4 + concessioni-model/pom.xml | 2 +- .../model/ProfiledConcessione.java | 27 ++-- geoportal-common/CHANGELOG.md | 3 + geoportal-common/pom.xml | 2 +- .../common/faults/JsonParseException.java | 37 ----- .../model/document/ProfiledDocument.java | 1 + geoportal-service/CHANGELOG.md | 3 + geoportal-service/pom.xml | 7 +- .../geoportal/service/GeoPortalService.java | 2 +- .../engine/mongo/ConcessioniMongoManager.java | 5 +- .../engine/mongo/ProfiledMongoManager.java | 76 +++++----- .../service/engine/postgis/PostgisIndex.java | 2 +- .../engine/providers/ProfileMapCache.java | 2 +- .../service/rest/ConcessioniOverMongo.java | 2 +- .../service/rest/ProfiledDocuments.java | 6 +- .../service/utils/Serialization.java | 61 -------- .../service/BasicServiceTestUnit.java | 2 +- .../service/ConcessioniOverMongoTest.java | 3 +- .../geoportal/service/ProjectTests.java | 17 +++ .../engine/materialization/SDITests.java | 4 +- 28 files changed, 261 insertions(+), 178 deletions(-) create mode 100644 cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java delete mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/faults/JsonParseException.java delete mode 100644 geoportal-service/src/main/java/org/gcube/application/geoportal/service/utils/Serialization.java diff --git a/cms-plugin-framework/CHANGELOG.md b/cms-plugin-framework/CHANGELOG.md index 7e9289e..ed0fc9e 100644 --- a/cms-plugin-framework/CHANGELOG.md +++ b/cms-plugin-framework/CHANGELOG.md @@ -2,5 +2,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm # Changelog for org.gcube.application.cms-plugin-framework +## [v1.0.1-SNAPSHOT] 2022-01-17 +- Serialization Features + ## [v1.0.0] 2021-09-20 - First release \ No newline at end of file diff --git a/cms-plugin-framework/pom.xml b/cms-plugin-framework/pom.xml index 99f0dd0..83f5175 100644 --- a/cms-plugin-framework/pom.xml +++ b/cms-plugin-framework/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 cms-plugin-framework - 1.0.0 + 1.0.1-SNAPSHOT org.gcube.application.cms @@ -38,6 +38,12 @@ org.projectlombok lombok + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + \ No newline at end of file diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java new file mode 100644 index 0000000..ff73097 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java @@ -0,0 +1,138 @@ +package org.gcube.application.cms; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import lombok.extern.slf4j.Slf4j; +import org.bson.Document; +import org.bson.types.ObjectId; +import org.gcube.application.geoportal.common.model.document.ComparableVersion; +import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.model.rest.QueryRequest; + +import java.io.IOException; +import java.time.format.DateTimeFormatter; +import java.util.Iterator; + +@Slf4j +public class Serialization { + + public static final DateTimeFormatter FULL_FORMATTER=DateTimeFormatter.ofPattern("uuuuMMdd_HH-mm-ss"); + + public static ObjectMapper mapper; + + static { + mapper=new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); + mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + mapper.registerModule(new JavaTimeModule()); + + SimpleModule s=new SimpleModule(); + s.addDeserializer(ObjectId.class,new ObjectIdDeserializer()); + s.addSerializer(ObjectId.class,new ObjectIdSerializer()); + s.addDeserializer(ComparableVersion.class,new ComparableVersionDeserializer()); + s.addSerializer(ComparableVersion.class,new ComparableVersionSerializer()); + mapper.registerModule(s); + } + + public static T read(String jsonString,Class clazz) throws JsonProcessingException, IOException { + return mapper.readerFor(clazz).readValue(jsonString); + } + + public static Iterator readCollection(String jsonString, Class clazz) throws IOException { + return mapper.readerFor(clazz).readValues(jsonString); + } + + + public static String write(Object toWrite) throws JsonProcessingException { + String toReturn= mapper.writeValueAsString(toWrite); + return toReturn; + } + + + public static QueryRequest parseQuery(String queryString) throws IOException { + log.debug("Parsing query Request {} ",queryString); + Document queryDocument = Document.parse(queryString); + log.debug("Document is ",queryDocument.toJson()); + QueryRequest req = new QueryRequest(); + if (queryDocument.getOrDefault("ordering",null)!=null) + req.setOrdering(Serialization.read(((Document) queryDocument.get("ordering")).toJson(), QueryRequest.OrderedRequest.class)); + if (queryDocument.getOrDefault("paging",null)!=null) + req.setPaging(Serialization.read(((Document) queryDocument.get("paging")).toJson(), QueryRequest.PagedRequest.class)); + req.setProjection(queryDocument.get("projection", Document.class)); + req.setFilter(queryDocument.get("filter", Document.class)); + return req; + } + + + //**** PROFILED DOCUMENTS + + public static final T convert(Object d,Class clazz){ + return mapper.convertValue(d,clazz); + } + + public static final Document asDocument(Object obj) throws JsonProcessingException { + return Document.parse(mapper.writeValueAsString(obj)); + } + + // ***** Serialization Exceptions + + // OBJECT ID + private static class ObjectIdSerializer extends JsonSerializer { + @Override + public void serialize(ObjectId objectId, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { + if (objectId == null) jsonGenerator.writeNull(); + else jsonGenerator.writeString(objectId.toHexString()); + } + + @Override + public Class handledType() { + return ObjectId.class; + } + } + private static class ObjectIdDeserializer extends JsonDeserializer { + + @Override + public ObjectId deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + String value=jsonParser.getValueAsString(); + if(value==null || value.isEmpty() || value.equals("null")) + return null; + else return new ObjectId(value); + } + @Override + public Class handledType() { + return ObjectId.class; + } + } + + //Comparable Version + private static class ComparableVersionSerializer extends JsonSerializer { + @Override + public void serialize(ComparableVersion comparableVersion, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { + if (comparableVersion == null) jsonGenerator.writeNull(); + else jsonGenerator.writeString(comparableVersion.getCanonical()); + } + + @Override + public Class handledType() { + return ComparableVersion.class; + } + } + private static class ComparableVersionDeserializer extends JsonDeserializer { + + @Override + public ComparableVersion deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + String value=jsonParser.getValueAsString(); + if(value==null || value.isEmpty() || value.equals("null")) + return null; + else return new ComparableVersion(value); + } + @Override + public Class handledType() { + return ComparableVersion.class; + } + } +} diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/Report.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/Report.java index 58b9755..848f9e2 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/Report.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/Report.java @@ -2,6 +2,7 @@ package org.gcube.application.cms.plugins.reports; import lombok.Data; +import java.util.ArrayList; import java.util.List; @Data @@ -13,4 +14,10 @@ public class Report { private Status status; private List messages; + + public Report putMessage(String msg){ + if(messages==null)messages=new ArrayList<>(); + messages.add(msg); + return this; + } } diff --git a/concessioni-lifecycle/CHANGELOG.md b/concessioni-lifecycle/CHANGELOG.md index 078a9e4..e11392d 100644 --- a/concessioni-lifecycle/CHANGELOG.md +++ b/concessioni-lifecycle/CHANGELOG.md @@ -4,5 +4,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains custom extensions for the support of GNA "concessioni" use case +## [v1.0.1-SNAPSHOT] - 2022-01-17 +- Serialization adaptation + ## [v1.0.0] - 2021-12-15 - First release diff --git a/concessioni-lifecycle/pom.xml b/concessioni-lifecycle/pom.xml index c62a2e8..04f1257 100644 --- a/concessioni-lifecycle/pom.xml +++ b/concessioni-lifecycle/pom.xml @@ -5,7 +5,7 @@ 4.0.0 concessioni-lifecycle - 1.0.0 + 1.0.1 GNA Concessioni Lifecycle diff --git a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java index b94d603..c5a7c15 100644 --- a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java +++ b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java @@ -2,6 +2,7 @@ package org.gcube.application.cms.concessioni.plugins; import lombok.extern.slf4j.Slf4j; import org.bson.Document; +import org.gcube.application.cms.Serialization; import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione; import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.faults.InitializationException; @@ -47,13 +48,14 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { ExecutionReport report=new ExecutionReport(); report.setRequest(request); report.setStatus(Report.Status.OK); + report.setResult(request.getDocument()); try { switch (request.getStep()) { case StepExecutionRequest.Steps.ON_INIT_DOCUMENT: // Set Defaults as for on update case StepExecutionRequest.Steps.ON_UPDATE_DOCUMENT: { - ProfiledDocument doc = request.getDocument(); - + log.debug("Setting default values.."); + report.setResult(setDefaults(request.getDocument())); break; } case StepExecutionRequest.Steps.ON_MATERIALIZE_DOCUMENT: { @@ -79,7 +81,7 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { }catch (Throwable t){ log.error("Unable to perform step "+request.getStep(),t); report.setStatus(Report.Status.ERROR); - report.getMessages().add("Unable to execute Step "+request.getStep()+". Error was "+t.getMessage()); + report.putMessage("Unable to execute Step "+request.getStep()+". Error was "+t.getMessage()); } return report; } @@ -93,7 +95,7 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { // STATIC ROUTINES private static final ProfiledDocument setDefaults(ProfiledDocument document){ - ProfiledConcessione c =(ProfiledConcessione) document; + ProfiledConcessione c=Serialization.convert(document,ProfiledConcessione.class); c.setDefaults(); return c; } diff --git a/concessioni-model/CHANGELOG.md b/concessioni-model/CHANGELOG.md index 0ce89ea..2047637 100644 --- a/concessioni-model/CHANGELOG.md +++ b/concessioni-model/CHANGELOG.md @@ -4,5 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm This library contains custom BEANS for the support of GNA "concessioni" use case +## [v1.0.1-SNAPSHOT] - 2022-01-17 +- Defaults Evaluation + + ## [v1.0.0] - 2021-12-15 - First release diff --git a/concessioni-model/pom.xml b/concessioni-model/pom.xml index b3dc4af..ac112d0 100644 --- a/concessioni-model/pom.xml +++ b/concessioni-model/pom.xml @@ -6,7 +6,7 @@ org.gcube.application.cms concessioni-model - 1.0.0 + 1.0.1-SNAPSHOT GNA Concessioni Model diff --git a/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java b/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java index cee48e6..e13396a 100644 --- a/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java +++ b/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java @@ -1,5 +1,6 @@ package org.gcube.application.cms.custom.gna.concessioni.model; + import org.bson.BsonDocument; import org.bson.BsonString; import org.bson.BsonValue; @@ -8,8 +9,6 @@ import org.gcube.application.geoportal.common.model.document.Access; import org.gcube.application.geoportal.common.model.document.AccessPolicy; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.document.RegisteredFileSet; -import org.gcube.application.geoportal.common.model.legacy.AbstractRelazione; -import org.gcube.application.geoportal.common.model.legacy.report.Check; import org.gcube.application.geoportal.common.model.legacy.report.ConstraintCheck; import java.util.List; @@ -79,7 +78,8 @@ public class ProfiledConcessione extends ProfiledDocument { //RELAZIONE - doc.putIfAbsent(RELAZIONE_SCAVO,new RegisteredFileSet()); + // TODO NB provare se object gia' presente sia usando Document che sub Object + doc.putIfAbsent(RELAZIONE_SCAVO,new Document()); Document rel=doc.get(RELAZIONE_SCAVO,Document.class); rel.putIfAbsent(Sections.TITOLO,doc.getString(NOME)+" relazione di scavo"); rel.putIfAbsent(SOGGETTO,doc.get(SOGGETTO)); @@ -90,7 +90,7 @@ public class ProfiledConcessione extends ProfiledDocument { relAccess.setPolicy(ConstraintCheck.defaultFor(relAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); //ABSTRACT Relazione - doc.putIfAbsent(ABSTRACT_RELAZIONE,new RegisteredFileSet()); + doc.putIfAbsent(ABSTRACT_RELAZIONE,new Document()); Document abs=doc.get(ABSTRACT_RELAZIONE,Document.class); abs.putIfAbsent(Sections.TITOLO,doc.getString(NOME)+" abstract relazione di scavo"); abs.putIfAbsent(RegisteredFileSet.CREATION_INFO,this.getInfo().getCreationInfo()); @@ -99,20 +99,23 @@ public class ProfiledConcessione extends ProfiledDocument { absAccess.setLicense(ConstraintCheck.defaultFor(absAccess.getLicense(),"CC-BY-4.0").evaluate()); absAccess.setPolicy(ConstraintCheck.defaultFor(absAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); + //TODO complete setDefaults //IMMAGINI RAPPRESENTATIVE -// if(doc.containsKey(IMMAGINI_RAPPRESENTATIVE)) { -// for (BsonValue bsonValue : doc.toBsonDocument(null, null). -// getArray(IMMAGINI_RAPPRESENTATIVE)) { -// BsonDocument imgDocument = bsonValue.asDocument(); -// imgDocument.putIfAbsent(SOGGETTO,new BsonString(doc.getString(SOGGETTO)); -// imgDocument.putIfAbsent(RegisteredFileSet.CREATION_INFO,new BsonDocument(this.getInfo().getCreationInfo()); + if(doc.containsKey(IMMAGINI_RAPPRESENTATIVE)) { + for (BsonValue bsonValue : doc.toBsonDocument(null, null). + getArray(IMMAGINI_RAPPRESENTATIVE)) { + + BsonDocument imgDocument = bsonValue.asDocument(); + imgDocument.putIfAbsent(SOGGETTO,new BsonString(doc.getString(SOGGETTO))); +// imgDocument.putIfAbsent(RegisteredFileSet.CREATION_INFO,this.getInfo().getCreationInfo()); +// imgDocument.putIfAbsent(RegisteredFileSet.CREATION_INFO,new BsonDocument(new Document())); // imgDocument.putIfAbsent(RegisteredFileSet.ACCESS,this.getInfo().getAccess()); // Access absAccess=rel.get(RegisteredFileSet.ACCESS,Access.class); // absAccess.setLicense(ConstraintCheck.defaultFor(absAccess.getLicense(),"CC-BY-4.0").evaluate()); // absAccess.setPolicy(ConstraintCheck.defaultFor(absAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); -// } -// } + } + } } } diff --git a/geoportal-common/CHANGELOG.md b/geoportal-common/CHANGELOG.md index 1b3264b..7e1739c 100644 --- a/geoportal-common/CHANGELOG.md +++ b/geoportal-common/CHANGELOG.md @@ -2,6 +2,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm # Changelog for org.gcube.application.geoportal-common +# [v1.0.9-SNAPSHOT] - 2022-01-17 +- Minor fixes in model + # [v1.0.8] - 2021-11-10 - Fixes [#22369](https://support.d4science.org/issues/22369) - Fixes [#22338](https://support.d4science.org/issues/22338) diff --git a/geoportal-common/pom.xml b/geoportal-common/pom.xml index 97d5a51..5467c49 100644 --- a/geoportal-common/pom.xml +++ b/geoportal-common/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 geoportal-common - 1.0.8 + 1.0.9-SNAPSHOT Geoportal Common diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/faults/JsonParseException.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/faults/JsonParseException.java deleted file mode 100644 index f45f8a1..0000000 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/faults/JsonParseException.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.gcube.application.geoportal.common.faults; - -public class JsonParseException extends Exception{ - - /** - * - */ - private static final long serialVersionUID = 1L; - - public JsonParseException() { - super(); - // TODO Auto-generated constructor stub - } - - public JsonParseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - // TODO Auto-generated constructor stub - } - - public JsonParseException(String message, Throwable cause) { - super(message, cause); - // TODO Auto-generated constructor stub - } - - public JsonParseException(String message) { - super(message); - // TODO Auto-generated constructor stub - } - - public JsonParseException(Throwable cause) { - super(cause); - // TODO Auto-generated constructor stub - } - - - -} diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java index 3a081d9..c4968d2 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java @@ -3,6 +3,7 @@ package org.gcube.application.geoportal.common.model.document; import com.mongodb.client.model.geojson.GeoJsonObjectType; import lombok.*; import org.bson.Document; +import org.bson.types.ObjectId; @NoArgsConstructor diff --git a/geoportal-service/CHANGELOG.md b/geoportal-service/CHANGELOG.md index d89cf4e..be2df5e 100644 --- a/geoportal-service/CHANGELOG.md +++ b/geoportal-service/CHANGELOG.md @@ -2,6 +2,9 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm # Changelog for org.gcube.application.geoportal-service +## [v1.0.9-SNAPSHOT] 2022-01-17 +- Plugin Management + ## [v1.0.8] 2021-09-20 - Logging - Fixes [#22193](https://support.d4science.org/issues/22193) diff --git a/geoportal-service/pom.xml b/geoportal-service/pom.xml index b837b74..55a71c3 100644 --- a/geoportal-service/pom.xml +++ b/geoportal-service/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.gcube.application geoportal-service - 1.0.8 + 1.0.9-SNAPSHOT Geoportal Service war @@ -185,10 +185,7 @@ - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - + org.reflections diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/GeoPortalService.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/GeoPortalService.java index d06a0f5..6fedfd5 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/GeoPortalService.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/GeoPortalService.java @@ -7,7 +7,7 @@ import org.gcube.application.geoportal.service.rest.ConcessioniOverMongo; import org.gcube.application.geoportal.service.rest.ProfiledDocuments; import org.gcube.application.geoportal.service.rest.Sections; -import org.gcube.application.geoportal.service.utils.Serialization; +import org.gcube.application.cms.Serialization; import org.glassfish.jersey.server.ResourceConfig; import javax.ws.rs.ApplicationPath; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java index fe9c811..8db9c29 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ConcessioniMongoManager.java @@ -23,18 +23,15 @@ import org.gcube.application.geoportal.service.engine.WorkspaceManager.FileOptio import org.gcube.application.geoportal.service.engine.WorkspaceManager.FolderOptions; import org.gcube.application.geoportal.service.engine.postgis.PostgisIndex; import org.gcube.application.geoportal.service.model.internal.faults.*; -import org.gcube.application.geoportal.service.utils.Serialization; +import org.gcube.application.cms.Serialization; import org.gcube.application.geoportal.service.utils.UserUtils; import org.gcube.common.storagehub.client.dsl.FolderContainer; import org.gcube.common.storagehub.model.exceptions.StorageHubException; -import org.gcube.data.transfer.library.faults.RemoteServiceException; import java.io.IOException; import java.io.InputStream; -import java.net.MalformedURLException; import java.net.URL; import java.sql.SQLException; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java index df93e8b..eef80e8 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java @@ -2,7 +2,7 @@ package org.gcube.application.geoportal.service.engine.mongo; import com.fasterxml.jackson.core.JsonProcessingException; import com.mongodb.client.MongoDatabase; -import lombok.Synchronized; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.bson.types.ObjectId; @@ -13,15 +13,13 @@ import org.gcube.application.cms.plugins.reports.ExecutionReport; import org.gcube.application.cms.plugins.requests.StepExecutionRequest; import org.gcube.application.geoportal.common.model.document.*; import org.gcube.application.geoportal.common.model.legacy.Concessione; -import org.gcube.application.geoportal.common.model.legacy.report.ValidationReport; import org.gcube.application.geoportal.common.model.profile.HandlerDeclaration; import org.gcube.application.geoportal.common.model.profile.Profile; import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.service.engine.ImplementationProvider; -import org.gcube.application.geoportal.service.engine.providers.PluginManager; import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import org.gcube.application.geoportal.service.model.internal.faults.DeletionException; -import org.gcube.application.geoportal.service.utils.Serialization; +import org.gcube.application.cms.Serialization; import org.gcube.application.geoportal.service.utils.UserUtils; import javax.ws.rs.WebApplicationException; @@ -33,7 +31,7 @@ import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; import java.util.function.Consumer; -import static org.gcube.application.geoportal.service.engine.mongo.ConcessioniMongoManager.asConcessione; +import static org.gcube.application.cms.Serialization.*; @Slf4j public class ProfiledMongoManager extends MongoManager implements MongoManagerI{ @@ -42,7 +40,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< Profile profile; MongoDatabase db=null; - LifecycleManager lfManager; + public ProfiledMongoManager(String profileId) throws ConfigurationException { @@ -58,25 +56,6 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< log.debug("Loaded Profile {} ",profile); - - - //Getting Lifecycle Manager declaration from Profile - List handlerDeclarations= profile.getHandlersMap().get(PluginDescriptor.BaseTypes.LIFECYCLE_MANAGER); - if(handlerDeclarations==null || handlerDeclarations.isEmpty()) throw new ConfigurationException("No Lifecycle Handler defined for profile ID "+profileId); - if(handlerDeclarations.size()>1) throw new ConfigurationException("Too many Lifecycle Handlers defined ("+handlerDeclarations+") in profile ID "+profileId); - - HandlerDeclaration lcHandlerDeclaration=handlerDeclarations.get(0); - - // Loading Lifecycle Manager - log.debug("Looking for handler {} ",lcHandlerDeclaration); - try{ - lfManager=(LifecycleManager) ImplementationProvider.get().getPluginManager().getObject().get(lcHandlerDeclaration.getId()); - if(lfManager==null) throw new ConfigurationException("Unable to find Lifecycle Manager Plugin. ID "+lcHandlerDeclaration.getId()); - }catch(ClassCastException e){ - throw new ConfigurationException("Unable to use "+lcHandlerDeclaration.getId()+" as Lifecycle Manager"); - } - - // Connect to DB String toUseDB=super.client.getConnection().getDatabase(); log.info("Connecting to DB {} ",toUseDB); @@ -85,8 +64,30 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< db=client.getTheClient().getDatabase(toUseDB); } + @Getter(lazy = true) + private final LifecycleManager manager=getLCManager(); + private LifecycleManager getLCManager() { + try{ + LifecycleManager toReturn=null; + //Getting Lifecycle Manager declaration from Profile + List handlerDeclarations= profile.getHandlersMap().get(PluginDescriptor.BaseTypes.LIFECYCLE_MANAGER); + if(handlerDeclarations==null || handlerDeclarations.isEmpty()) throw new ConfigurationException("No Lifecycle Handler defined for profile ID "+profile.getId()); + if(handlerDeclarations.size()>1) throw new ConfigurationException("Too many Lifecycle Handlers defined ("+handlerDeclarations+") in profile ID "+profile.getId()); + HandlerDeclaration lcHandlerDeclaration=handlerDeclarations.get(0); + + // Loading Lifecycle Manager + log.debug("Looking for handler {} ",lcHandlerDeclaration); + toReturn=(LifecycleManager) ImplementationProvider.get().getPluginManager().getObject().get(lcHandlerDeclaration.getId()); + if(toReturn==null) throw new ConfigurationException("Unable to find Lifecycle Manager Plugin. ID "+lcHandlerDeclaration.getId()); + + return toReturn; + } catch(Throwable t){ + log.warn("Unable to load LC Manager ",t); + return null; + } + } private ProfiledDocument onUpdate(ProfiledDocument updatedDocument) throws StepException { @@ -96,13 +97,13 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return step(updatedDocument,StepExecutionRequest.Steps.ON_UPDATE_DOCUMENT).getResult(); } - private Document asDocument(ProfiledDocument d) throws JsonProcessingException { - return Document.parse(Serialization.write(d)); - } - - private ProfiledDocument asProfiledDocument(Document d) throws IOException { - return Serialization.read(d.toJson(),ProfiledDocument.class); - } +// private Document asDocument(ProfiledDocument d) throws JsonProcessingException { +// return Document.parse(Serialization.write(d)); +// } +// +// private ProfiledDocument asProfiledDocument(Document d) throws IOException { +// return Serialization.read(d.toJson(),ProfiledDocument.class); +// } private String getCollectionName(){ // TODO Profile can directly specify, use ID only as default @@ -156,7 +157,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< public ProfiledDocument update(String id, ProfiledDocument toSet) throws IOException, StepException { log.trace("Replacing {} ",toSet); toSet=onUpdate(toSet); - return asProfiledDocument(replace(asDocument(toSet),getCollectionName())); + return convert(replace(asDocument(toSet),getCollectionName()),ProfiledDocument.class); } @Override @@ -190,7 +191,7 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< @Override public ProfiledDocument getByID(String id) throws IOException { - return asProfiledDocument(super.getById(asId(id),getCollectionName())); + return convert(super.getById(asId(id),getCollectionName()),ProfiledDocument.class); } @Override @@ -245,12 +246,15 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< private ExecutionReport step(ProfiledDocument theDocument,String step) throws StepException { - log.info("[Profile {} ] Invoking Step {} on " ,profile.getId(),step,lfManager.getDescriptor()); + log.info("[Profile {} ] Invoking Step {} on " ,profile.getId(),step,getManager().getDescriptor()); StepExecutionRequest request=new StepExecutionRequest(); request.setDocument(theDocument); request.setProfile(profile); request.setStep(StepExecutionRequest.Steps.ON_INIT_DOCUMENT); log.debug("Requesting Step Execution {} ",request); - return lfManager.performStep(request); + ExecutionReport report= getManager().performStep(request); + log.debug("Report is {}",report); + if(report.getResult()==null) throw new StepException("Report result is null"); + return report; } } diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisIndex.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisIndex.java index 514ebb8..cb34e79 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisIndex.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisIndex.java @@ -13,7 +13,7 @@ import org.gcube.application.geoportal.service.model.internal.db.PostgisTable.Fi import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import org.gcube.application.geoportal.service.model.internal.faults.PublishException; import org.gcube.application.geoportal.service.model.internal.faults.SDIInteractionException; -import org.gcube.application.geoportal.service.utils.Serialization; +import org.gcube.application.cms.Serialization; import java.sql.PreparedStatement; import java.sql.SQLException; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProfileMapCache.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProfileMapCache.java index 4545e6d..54fbdc4 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProfileMapCache.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/ProfileMapCache.java @@ -5,7 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.gcube.application.geoportal.common.model.profile.Profile; import org.gcube.application.geoportal.common.utils.Files; import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; -import org.gcube.application.geoportal.service.utils.Serialization; +import org.gcube.application.cms.Serialization; import java.io.IOException; import java.nio.charset.Charset; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java index 426f46e..c43f164 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ConcessioniOverMongo.java @@ -9,7 +9,7 @@ import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.service.engine.mongo.ConcessioniMongoManager; import org.gcube.application.geoportal.service.engine.postgis.PostgisIndex; import org.gcube.application.geoportal.service.model.internal.faults.DeletionException; -import org.gcube.application.geoportal.service.utils.Serialization; +import org.gcube.application.cms.Serialization; import org.json.JSONArray; import javax.ws.rs.*; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java index 0422a28..1c53501 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java @@ -3,16 +3,12 @@ package org.gcube.application.geoportal.service.rest; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; -import org.gcube.application.geoportal.common.model.legacy.Concessione; import org.gcube.application.geoportal.common.model.rest.Configuration; import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.rest.InterfaceConstants; -import org.gcube.application.geoportal.service.engine.mongo.ConcessioniMongoManager; import org.gcube.application.geoportal.service.engine.mongo.ProfiledMongoManager; -import org.gcube.application.geoportal.service.engine.postgis.PostgisIndex; import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; -import org.gcube.application.geoportal.service.utils.Serialization; -import org.json.JSONArray; +import org.gcube.application.cms.Serialization; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/utils/Serialization.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/utils/Serialization.java deleted file mode 100644 index ef9812f..0000000 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/utils/Serialization.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.gcube.application.geoportal.service.utils; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import lombok.extern.slf4j.Slf4j; -import org.bson.Document; -import org.gcube.application.geoportal.common.model.rest.QueryRequest; - -import java.io.IOException; -import java.time.format.DateTimeFormatter; -import java.util.Iterator; - -@Slf4j -public class Serialization { - - - public static final DateTimeFormatter FULL_FORMATTER=DateTimeFormatter.ofPattern("uuuuMMdd_HH-mm-ss"); - - public static ObjectMapper mapper; - - static { - mapper=new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.registerModule(new JavaTimeModule()); - - } - - public static T read(String jsonString,Class clazz) throws JsonProcessingException, IOException { - return mapper.readerFor(clazz).readValue(jsonString); - } - - public static Iterator readCollection(String jsonString, Class clazz) throws IOException { - return mapper.readerFor(clazz).readValues(jsonString); - } - - - public static String write(Object toWrite) throws JsonProcessingException { - String toReturn= mapper.writeValueAsString(toWrite); - return toReturn; - } - - - public static QueryRequest parseQuery(String queryString) throws IOException { - log.debug("Parsing query Request {} ",queryString); - Document queryDocument = Document.parse(queryString); - log.debug("Document is ",queryDocument.toJson()); - QueryRequest req = new QueryRequest(); - if (queryDocument.getOrDefault("ordering",null)!=null) - req.setOrdering(Serialization.read(((Document) queryDocument.get("ordering")).toJson(), QueryRequest.OrderedRequest.class)); - if (queryDocument.getOrDefault("paging",null)!=null) - req.setPaging(Serialization.read(((Document) queryDocument.get("paging")).toJson(), QueryRequest.PagedRequest.class)); - req.setProjection(queryDocument.get("projection", Document.class)); - req.setFilter(queryDocument.get("filter", Document.class)); - return req; - } - -} diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/BasicServiceTestUnit.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/BasicServiceTestUnit.java index 02990ae..dbc0cdd 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/BasicServiceTestUnit.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/BasicServiceTestUnit.java @@ -3,7 +3,7 @@ package org.gcube.application.geoportal.service; import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.tests.TokenSetter; import org.gcube.application.geoportal.service.rest.GuardedMethod; -import org.gcube.application.geoportal.service.utils.Serialization; +import org.gcube.application.cms.Serialization; import org.glassfish.jersey.test.JerseyTest; import org.junit.BeforeClass; diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java index f084f6d..c0afb9f 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ConcessioniOverMongoTest.java @@ -15,8 +15,7 @@ import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.common.utils.FileSets; import org.gcube.application.geoportal.common.utils.Files; import org.gcube.application.geoportal.common.utils.StorageUtils; -import org.gcube.application.geoportal.service.utils.Serialization; -import org.gcube.common.storagehub.model.query.Queries; +import org.gcube.application.cms.Serialization; import org.json.JSONObject; import org.junit.Assert; import org.junit.Before; diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProjectTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProjectTests.java index 8b7e51b..b3ab62d 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProjectTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProjectTests.java @@ -1,8 +1,11 @@ package org.gcube.application.geoportal.service; import org.bson.Document; +import org.gcube.application.cms.Serialization; import org.gcube.application.cms.tests.TokenSetter; +import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.rest.InterfaceConstants; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -37,6 +40,20 @@ public class ProjectTests extends BasicServiceTestUnit{ System.out.println(target(InterfaceConstants.Methods.PROJECTS).path(testProfileId).request(MediaType.APPLICATION_JSON).get(List.class)); } + @Test + public void getByID(){ + target(InterfaceConstants.Methods.PROJECTS).path(testProfileId).request(MediaType.APPLICATION_JSON).get(List.class).forEach(d ->{ + + try { + check(target(InterfaceConstants.Methods.PROJECTS).path(testProfileId).path((Serialization.convert(d,ProfiledDocument.class)).get_id()) + .request(MediaType.APPLICATION_JSON).get(),ProfiledDocument.class); + } catch (Exception e) { + e.printStackTrace(System.err); + Assert.fail(e.getMessage()); + } + }); + } + @Test public void registerNew() { WebTarget target=target(InterfaceConstants.Methods.PROJECTS); diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/materialization/SDITests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/materialization/SDITests.java index 7896692..0b88e1d 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/materialization/SDITests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/materialization/SDITests.java @@ -8,13 +8,11 @@ import org.gcube.application.cms.tests.model.concessioni.TestConcessioniModel; import org.gcube.application.geoportal.common.model.legacy.Concessione; import org.gcube.application.geoportal.common.model.legacy.GeoServerContent; import org.gcube.application.geoportal.common.model.legacy.LayerConcessione; -import org.gcube.application.geoportal.common.model.legacy.PersistedContent; import org.gcube.application.geoportal.common.utils.Files; -import org.gcube.application.geoportal.service.engine.materialization.SDIManager; import org.gcube.application.geoportal.service.engine.postgis.PostgisIndex; import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import org.gcube.application.geoportal.service.model.internal.faults.SDIInteractionException; -import org.gcube.application.geoportal.service.utils.Serialization; +import org.gcube.application.cms.Serialization; import org.junit.Assert; import org.junit.Before; import org.junit.Test; From a4e8cb2f1eaef5dd537bf15cee68a869dee83a9c Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Mon, 17 Jan 2022 14:19:59 +0100 Subject: [PATCH 002/293] Lifecycleinformation in result --- .../cms/plugins/reports/ExecutionReport.java | 3 ++- .../plugins/ConcessioniLifeCycleManager.java | 13 +++++++------ .../model/document/LifecycleInformation.java | 14 +++++++++++++- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/ExecutionReport.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/ExecutionReport.java index ea0d69e..dadbcd1 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/ExecutionReport.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/ExecutionReport.java @@ -2,10 +2,11 @@ package org.gcube.application.cms.plugins.reports; import lombok.Data; import org.gcube.application.cms.plugins.requests.StepExecutionRequest; +import org.gcube.application.geoportal.common.model.document.LifecycleInformation; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; @Data -public class ExecutionReport extends Report{ +public class ExecutionReport { StepExecutionRequest request; diff --git a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java index c5a7c15..328f7e0 100644 --- a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java +++ b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java @@ -1,7 +1,6 @@ package org.gcube.application.cms.concessioni.plugins; import lombok.extern.slf4j.Slf4j; -import org.bson.Document; import org.gcube.application.cms.Serialization; import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione; import org.gcube.application.cms.plugins.LifecycleManager; @@ -11,11 +10,10 @@ import org.gcube.application.cms.plugins.faults.StepException; import org.gcube.application.cms.plugins.model.PluginDescriptor; import org.gcube.application.cms.plugins.reports.ExecutionReport; import org.gcube.application.cms.plugins.reports.InitializationReport; -import org.gcube.application.cms.plugins.reports.Report; import org.gcube.application.cms.plugins.requests.StepExecutionRequest; import org.gcube.application.geoportal.common.model.document.ComparableVersion; +import org.gcube.application.geoportal.common.model.document.LifecycleInformation; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; -import org.gcube.application.geoportal.common.utils.JSONPathWrapper; @Slf4j public class ConcessioniLifeCycleManager implements LifecycleManager { @@ -46,9 +44,12 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { public ExecutionReport performStep(StepExecutionRequest request) throws StepException { log.info("Serving Request {}",request); ExecutionReport report=new ExecutionReport(); + LifecycleInformation info=new LifecycleInformation(); + info.setPhase(request.getStep()); + info.setLastOperationStatus(LifecycleInformation.Status.OK); report.setRequest(request); - report.setStatus(Report.Status.OK); report.setResult(request.getDocument()); + try { switch (request.getStep()) { case StepExecutionRequest.Steps.ON_INIT_DOCUMENT: @@ -80,8 +81,8 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { throw e; }catch (Throwable t){ log.error("Unable to perform step "+request.getStep(),t); - report.setStatus(Report.Status.ERROR); - report.putMessage("Unable to execute Step "+request.getStep()+". Error was "+t.getMessage()); + report.getResult().getLifecycleInformation().setLastOperationStatus(LifecycleInformation.Status.ERROR); + report.getResult().getLifecycleInformation().addErrorMessage("Unable to execute Step "+request.getStep()+". Error was "+t.getMessage()); } return report; } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/LifecycleInformation.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/LifecycleInformation.java index d6fc700..8ad8550 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/LifecycleInformation.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/LifecycleInformation.java @@ -2,6 +2,7 @@ package org.gcube.application.geoportal.common.model.document; import lombok.*; +import java.util.ArrayList; import java.util.List; @NoArgsConstructor @@ -18,7 +19,7 @@ public class LifecycleInformation { public static final String CHILDREN="children"; public static enum Status{ - PASSED,ERROR,WARNING + OK,ERROR,WARNING } @@ -28,4 +29,15 @@ public class LifecycleInformation { private List warningMessages; private List children; + + public void addErrorMessage(String msg){ + if(errorMessages==null) + errorMessages=new ArrayList<>(); + errorMessages.add(msg); + } + public void addWarningMessage(String msg){ + if(warningMessages==null) + warningMessages=new ArrayList<>(); + warningMessages.add(msg); + } } From 64b03247cc9d00a6b97862543cb75d3890c3d237 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Mon, 17 Jan 2022 18:19:40 +0100 Subject: [PATCH 003/293] Register ProfiledDocument Filesets --- cms-test-commons/CHANGELOG.md | 4 + cms-test-commons/pom.xml | 2 +- .../application/cms/tests/TestProfiles.java | 30 +++ geoportal-common/CHANGELOG.md | 1 + geoportal-common/pom.xml | 6 + .../model/document/ProfiledDocument.java | 5 +- .../model/document/PublicationInfo.java | 2 - .../geoportal/common/model/profile/Field.java | 36 ++++ .../common/model/profile/FieldMap.java | 13 ++ .../common/model/profile/Profile.java | 8 +- .../common/utils/JSONPathWrapper.java | 41 +++- geoportal-service/CHANGELOG.md | 3 +- .../service/engine/WorkspaceManager.java | 17 ++ .../service/engine/mongo/MongoManagerI.java | 24 +-- .../engine/mongo/ProfiledMongoManager.java | 191 +++++++++++++----- ...Tests.java => ProfiledDocumentsTests.java} | 24 ++- .../geoportal/service/Profiles.java | 19 ++ test-data/profiledDocuments/basicProfile.json | 13 ++ 18 files changed, 360 insertions(+), 79 deletions(-) create mode 100644 cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestProfiles.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Field.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/FieldMap.java rename geoportal-service/src/test/java/org/gcube/application/geoportal/service/{ProjectTests.java => ProfiledDocumentsTests.java} (81%) create mode 100644 geoportal-service/src/test/java/org/gcube/application/geoportal/service/Profiles.java create mode 100644 test-data/profiledDocuments/basicProfile.json diff --git a/cms-test-commons/CHANGELOG.md b/cms-test-commons/CHANGELOG.md index 883bfa2..cf7ac00 100644 --- a/cms-test-commons/CHANGELOG.md +++ b/cms-test-commons/CHANGELOG.md @@ -1,6 +1,10 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). # Changelog for org.gcube.application.cms.cms-test-commons + +## [v1.0.2-SNAPSHOT] - 2022-01-17 +- Profiles + ## [v1.0.1] - 2021-09-11 - Introduced profiled documents diff --git a/cms-test-commons/pom.xml b/cms-test-commons/pom.xml index eec1913..7c28195 100644 --- a/cms-test-commons/pom.xml +++ b/cms-test-commons/pom.xml @@ -5,7 +5,7 @@ 4.0.0 cms-test-commons - 1.0.1 + 1.0.2-SNAPSHOT CMS Test Commons diff --git a/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestProfiles.java b/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestProfiles.java new file mode 100644 index 0000000..06cd1ce --- /dev/null +++ b/cms-test-commons/src/main/java/org/gcube/application/cms/tests/TestProfiles.java @@ -0,0 +1,30 @@ +package org.gcube.application.cms.tests; + +import org.gcube.application.cms.Serialization; +import org.gcube.application.cms.tests.model.concessioni.TestConcessioniModel; +import org.gcube.application.geoportal.common.model.profile.Profile; +import org.gcube.application.geoportal.common.utils.Files; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.HashMap; + +public class TestProfiles { + + + public static File BASE_FOLDER =new File("../test-data/profiledDocuments"); + public static final HashMap profiles =new HashMap<>(); + + static{ + + for(File f:BASE_FOLDER.listFiles()){ + try { + profiles.put(f.getName(), Serialization.read( + Files.readFileAsString(f.getAbsolutePath(), Charset.defaultCharset()),Profile.class)); + } catch (IOException e) { + throw new RuntimeException("Unable to read "+f.getAbsolutePath(),e); + } + } + } +} diff --git a/geoportal-common/CHANGELOG.md b/geoportal-common/CHANGELOG.md index 7e1739c..5112bea 100644 --- a/geoportal-common/CHANGELOG.md +++ b/geoportal-common/CHANGELOG.md @@ -4,6 +4,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm # [v1.0.9-SNAPSHOT] - 2022-01-17 - Minor fixes in model +- Schema and jsonPath support # [v1.0.8] - 2021-11-10 - Fixes [#22369](https://support.d4science.org/issues/22369) diff --git a/geoportal-common/pom.xml b/geoportal-common/pom.xml index 5467c49..fe2deb6 100644 --- a/geoportal-common/pom.xml +++ b/geoportal-common/pom.xml @@ -47,6 +47,12 @@ 2.4.0 + + com.vdurmont + semver4j + 3.1.0 + + junit diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java index c4968d2..46d22df 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java @@ -1,6 +1,7 @@ package org.gcube.application.geoportal.common.model.document; import com.mongodb.client.model.geojson.GeoJsonObjectType; +import com.vdurmont.semver4j.Semver; import lombok.*; import org.bson.Document; import org.bson.types.ObjectId; @@ -27,14 +28,14 @@ public class ProfiledDocument { // CORE METADATA private String _id; - private ComparableVersion version; + private Semver version; // Publication Info private PublicationInfo info; // Profile reference private String profileID; - private ComparableVersion profileVersion; + private Semver profileVersion; private LifecycleInformation lifecycleInformation; diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/PublicationInfo.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/PublicationInfo.java index c48add5..82df14c 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/PublicationInfo.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/PublicationInfo.java @@ -14,10 +14,8 @@ public class PublicationInfo { public static final String LAST_EDIT_INFO="lastEditInfo"; public static final String ACCESS = "access"; - private AccountingInfo creationInfo; private AccountingInfo lastEditInfo; private Access access; - } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Field.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Field.java new file mode 100644 index 0000000..98782c5 --- /dev/null +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Field.java @@ -0,0 +1,36 @@ +package org.gcube.application.geoportal.common.model.profile; + +import org.bson.Document; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Field extends Document { + + public static final String TYPE="_type"; + public static final String CHILDREN="_children"; + public static final String MAX_CARDINALITY="_max"; + public static final String MIN_CARDINALITY="_min"; + + + public String getType(){ + return this.getString(TYPE); + }; + + public List getChildren(){ + return this.get(CHILDREN,List.class); + } + + public Integer getMaxCardinality(){ + return (Integer) this.getOrDefault(MAX_CARDINALITY,1); + } + + public Integer getMinCardinality(){ + return (Integer) this.getOrDefault(MIN_CARDINALITY,0); + } + public Boolean isMandatory(){ + return getMinCardinality()==0; + } + +} diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/FieldMap.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/FieldMap.java new file mode 100644 index 0000000..e5485d1 --- /dev/null +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/FieldMap.java @@ -0,0 +1,13 @@ +package org.gcube.application.geoportal.common.model.profile; + +import java.util.ArrayList; +import java.util.HashMap; + + +class FieldMap extends ArrayList { + + public static class MapElement extends HashMap{ + + } + +} diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Profile.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Profile.java index c1f96bb..d60c130 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Profile.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Profile.java @@ -7,6 +7,7 @@ import java.util.Map; import javax.xml.bind.annotation.XmlRootElement; +import com.vdurmont.semver4j.Semver; import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; @@ -20,13 +21,13 @@ import org.gcube.application.geoportal.common.model.document.ComparableVersion; public class Profile{ private String id; - private ComparableVersion version; + private Semver version; private String name; private String description; private AccountingInfo creationInfo; - private Document schema; + private Field schema; private List handlers; @@ -43,4 +44,7 @@ public class Profile{ }); return toReturn; } + + + } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/JSONPathWrapper.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/JSONPathWrapper.java index 3b0cfdf..d90461e 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/JSONPathWrapper.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/JSONPathWrapper.java @@ -1,11 +1,11 @@ package org.gcube.application.geoportal.common.utils; -import com.jayway.jsonpath.Configuration; -import com.jayway.jsonpath.DocumentContext; -import com.jayway.jsonpath.JsonPath; -import com.jayway.jsonpath.Option; +import com.jayway.jsonpath.*; import lombok.Getter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; public class JSONPathWrapper { @@ -27,8 +27,39 @@ public class JSONPathWrapper { } public List getByPath(String path){ - throw new RuntimeException("TO IMPLEMENT"); + return ctx.read(path); } + public List getByPath(String path,Class clazz){ + return ctx.read(path, new TypeRef>() {}); + } + public JSONPathWrapper set(String path, Object toSet){ + ctx.set(path,toSet); + return this; + } + +// public static final DocumentContext addElement(DocumentContext ctx,String path) throws JsonPathException{ +// JsonPath jPath=JsonPath.compile(path); +// if(jPath.isDefinite()) { +// String parent=path.substring(0,path.lastIndexOf(".")); +// List found=ctx.read(parent); +// if(found==null || found.size()==0 || found.get(0)==null) { +// //missing parent, use recursion +// addElement(ctx,parent); +// } +// // found parent, adding element +// String element=path.substring(path.lastIndexOf(".")+1); +// +// Object value=new HashMap(); +// if(element.contains("[")) { +// value=new ArrayList(Collections.singletonList(value)); +// +// element=element.substring(0,element.indexOf("[")); +// } +// +// ctx.put(parent, element, value); +// return ctx; +// }else throw new JsonPathException("Unable to initialize non-definite path : "+path); +// } } diff --git a/geoportal-service/CHANGELOG.md b/geoportal-service/CHANGELOG.md index be2df5e..e96dc51 100644 --- a/geoportal-service/CHANGELOG.md +++ b/geoportal-service/CHANGELOG.md @@ -3,7 +3,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm # Changelog for org.gcube.application.geoportal-service ## [v1.0.9-SNAPSHOT] 2022-01-17 -- Plugin Management +- Plugin Management +- Profiled Document : FileSet Registration ## [v1.0.8] 2021-09-20 - Logging diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/WorkspaceManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/WorkspaceManager.java index 4e1bf75..146553b 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/WorkspaceManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/WorkspaceManager.java @@ -3,6 +3,7 @@ package org.gcube.application.geoportal.service.engine; import lombok.*; import lombok.extern.slf4j.Slf4j; import org.gcube.application.geoportal.common.faults.PathException; +import org.gcube.application.geoportal.common.model.document.RegisteredFile; import org.gcube.application.geoportal.common.model.legacy.WorkspaceContent; import org.gcube.application.geoportal.common.utils.Files; import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; @@ -106,6 +107,22 @@ public class WorkspaceManager { } + public RegisteredFile registerFile(FileOptions opts) throws StorageHubException { + FileContainer item=createFileRoutine(opts); + item=sgClient.open(item.getId()).asFile(); + + RegisteredFile file=new RegisteredFile(); + + + file.setLink(item.getPublicLink().toString()); + file.setMimetype(item.get().getContent().getMimeType()); + file.setStorageID(item.getId()); + file.setName(item.get().getName()); + return file; + + } + + public void deleteFromWS(WorkspaceContent toDelete) throws StorageHubException { sgClient.open(toDelete.getStorageID()).asFile().forceDelete(); } diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java index adb71f1..a0242f9 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java @@ -3,10 +3,16 @@ package org.gcube.application.geoportal.service.engine.mongo; import com.fasterxml.jackson.core.JsonProcessingException; import org.bson.Document; import org.gcube.application.cms.plugins.faults.StepException; +import org.gcube.application.geoportal.common.faults.StorageException; +import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.rest.QueryRequest; +import org.gcube.application.geoportal.common.rest.TempFile; +import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import org.gcube.application.geoportal.service.model.internal.faults.DeletionException; +import org.gcube.common.storagehub.model.exceptions.StorageHubException; import java.io.IOException; +import java.util.List; public interface MongoManagerI { @@ -16,7 +22,7 @@ public interface MongoManagerI { public T registerNew(Document toRegister) throws IOException, StepException; // update - public T update(String id,T toSet) throws IOException, StepException; + public T update(String id,Document toSetDocument) throws IOException, StepException; // delete @@ -31,19 +37,7 @@ public interface MongoManagerI { public Iterable query(QueryRequest request); public Iterable filter(QueryRequest request); - // materialize + public T performStep(String id, String step, Document options) throws IOException, StepException; - public T materialize(String id); - - // dematerialize - - public T dematerialize(String id); - // index - - public T index(String id); - - // deIndex - public T deIndex(String id); - - public T performStep(String id, String step, Document options); + public T registerFileSet(String id, String destination, Document attributes, List files) throws ConfigurationException, StorageHubException, StorageException, StepException, JsonProcessingException; } diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java index eef80e8..4e7303b 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java @@ -2,8 +2,10 @@ package org.gcube.application.geoportal.service.engine.mongo; import com.fasterxml.jackson.core.JsonProcessingException; import com.mongodb.client.MongoDatabase; +import com.vdurmont.semver4j.Semver; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; import org.bson.Document; import org.bson.types.ObjectId; import org.gcube.application.cms.plugins.LifecycleManager; @@ -11,21 +13,33 @@ import org.gcube.application.cms.plugins.faults.StepException; import org.gcube.application.cms.plugins.model.PluginDescriptor; import org.gcube.application.cms.plugins.reports.ExecutionReport; import org.gcube.application.cms.plugins.requests.StepExecutionRequest; +import org.gcube.application.geoportal.common.faults.StorageException; import org.gcube.application.geoportal.common.model.document.*; import org.gcube.application.geoportal.common.model.legacy.Concessione; +import org.gcube.application.geoportal.common.model.legacy.WorkspaceContent; +import org.gcube.application.geoportal.common.model.profile.Field; import org.gcube.application.geoportal.common.model.profile.HandlerDeclaration; import org.gcube.application.geoportal.common.model.profile.Profile; import org.gcube.application.geoportal.common.model.rest.QueryRequest; +import org.gcube.application.geoportal.common.rest.TempFile; +import org.gcube.application.geoportal.common.utils.JSONPathWrapper; +import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.application.geoportal.service.engine.ImplementationProvider; +import org.gcube.application.geoportal.service.engine.WorkspaceManager; import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import org.gcube.application.geoportal.service.model.internal.faults.DeletionException; import org.gcube.application.cms.Serialization; import org.gcube.application.geoportal.service.utils.UserUtils; +import org.gcube.common.storagehub.client.dsl.FolderContainer; +import org.gcube.common.storagehub.model.exceptions.StorageHubException; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import java.io.IOException; +import java.io.InputStream; +import java.net.URL; import java.security.InvalidParameterException; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; @@ -89,22 +103,6 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } } - private ProfiledDocument onUpdate(ProfiledDocument updatedDocument) throws StepException { - - UserUtils.AuthenticatedUser u = UserUtils.getCurrent(); - updatedDocument.getInfo().setLastEditInfo(u.asInfo()); - - return step(updatedDocument,StepExecutionRequest.Steps.ON_UPDATE_DOCUMENT).getResult(); - } - -// private Document asDocument(ProfiledDocument d) throws JsonProcessingException { -// return Document.parse(Serialization.write(d)); -// } -// -// private ProfiledDocument asProfiledDocument(Document d) throws IOException { -// return Serialization.read(d.toJson(),ProfiledDocument.class); -// } - private String getCollectionName(){ // TODO Profile can directly specify, use ID only as default @@ -138,11 +136,11 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< toRegister.setProfileID(profile.getId()); toRegister.setProfileVersion(profile.getVersion()); - toRegister.setVersion(new ComparableVersion("1.0.0")); + toRegister.setVersion(new Semver("1.0.0")); // Apply Lifecycle - toRegister=step(toRegister,StepExecutionRequest.Steps.ON_INIT_DOCUMENT).getResult(); + toRegister=step(toRegister,StepExecutionRequest.Steps.ON_INIT_DOCUMENT,null).getResult(); log.debug("Going to register {} ",toRegister); @@ -154,10 +152,22 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } @Override - public ProfiledDocument update(String id, ProfiledDocument toSet) throws IOException, StepException { + public ProfiledDocument update(String id, Document toSet) throws IOException, StepException { log.trace("Replacing {} ",toSet); - toSet=onUpdate(toSet); - return convert(replace(asDocument(toSet),getCollectionName()),ProfiledDocument.class); + ProfiledDocument toUpdate=getByID(id); + toUpdate.setTheDocument(toSet); + + toUpdate=onUpdate(toUpdate); + return convert(replace(asDocument(toUpdate),getCollectionName()),ProfiledDocument.class); + } + + + private ProfiledDocument onUpdate(ProfiledDocument toUpdate) throws StepException { + UserUtils.AuthenticatedUser u = UserUtils.getCurrent(); + toUpdate.getInfo().setLastEditInfo(u.asInfo()); + toUpdate.setVersion(toUpdate.getVersion().withIncPatch()); + + return step(toUpdate,StepExecutionRequest.Steps.ON_UPDATE_DOCUMENT,null).getResult(); } @Override @@ -190,8 +200,10 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< } @Override - public ProfiledDocument getByID(String id) throws IOException { - return convert(super.getById(asId(id),getCollectionName()),ProfiledDocument.class); + public ProfiledDocument getByID(String id){ + Document doc=super.getById(asId(id),getCollectionName()); + if(doc==null) throw new WebApplicationException("No document with ID "+id); + return convert(doc,ProfiledDocument.class); } @Override @@ -218,43 +230,128 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return queue; } - @Override - public ProfiledDocument materialize(String id) { - throw new RuntimeException("TO IMPLEMENT"); - } @Override - public ProfiledDocument dematerialize(String id) { - throw new RuntimeException("TO IMPLEMENT"); - } - - @Override - public ProfiledDocument index(String id) { - throw new RuntimeException("TO IMPLEMENT"); - } - - @Override - public ProfiledDocument deIndex(String id) { - throw new RuntimeException("TO IMPLEMENT"); - } - - @Override - public ProfiledDocument performStep(String id, String step, Document options) { - throw new RuntimeException("TO IMPLEMENT"); + public ProfiledDocument performStep(String id, String step, Document options) throws StepException, JsonProcessingException { + ExecutionReport report = step(getByID(id), step, options); + return convert(replace(asDocument(report.getResult()),getCollectionName()),ProfiledDocument.class); } - private ExecutionReport step(ProfiledDocument theDocument,String step) throws StepException { - log.info("[Profile {} ] Invoking Step {} on " ,profile.getId(),step,getManager().getDescriptor()); + /** + * NB Put at path : + * + * + * + */ + @Override + public ProfiledDocument registerFileSet(String id, String destination, Document attributes, List files) throws ConfigurationException, StorageHubException, StorageException, StepException, JsonProcessingException { + log.info("Registering fileset [size : {}] for {} at {} with options {}",files.size(),id,destination,attributes); + + ProfiledDocument doc=getByID(id); + WorkspaceManager ws=new WorkspaceManager(); + StorageUtils storage=ImplementationProvider.get().getStorageProvider().getObject(); + + + log.debug("Checking {}  path against profile {}",destination,profile.getId()); + JSONPathWrapper schemaWrapper= new JSONPathWrapper(profile.getSchema().toJson()); + List fieldDefinitions=schemaWrapper.getByPath(destination); + if(fieldDefinitions==null || fieldDefinitions.isEmpty()) throw new WebApplicationException("No Field found in schema "+profile.getId()+" at "+destination, Response.Status.BAD_REQUEST); + if(fieldDefinitions.size()>1) throw new WebApplicationException("Multiple field definitions ("+fieldDefinitions.size()+") found in "+profile.getId()+" for "+destination,Response.Status.BAD_REQUEST); + + Field fieldDefinition=Serialization.convert(fieldDefinitions.get(0),Field.class); + + log.debug("Field definition is {}",fieldDefinition); + JSONPathWrapper docWrapper=new JSONPathWrapper(doc.getTheDocument().toJson()); + List found=docWrapper.getByPath(destination,RegisteredFileSet.class); + if(fieldDefinition.getMaxCardinality()==1 && (!found.isEmpty())){ + throw new WebApplicationException("Cannot add registered fileset at "+destination+" : field is not collection.",Response.Status.BAD_REQUEST); + } + + + RegisteredFileSet registeredFileSet=prepareRegisteredFileSet(doc,profile,destination,attributes,files,storage,ws); + + log.debug("Registered fileset is {} ",registeredFileSet); + + + if(fieldDefinition.getMaxCardinality()>1){ + // Field is collection + found.add(registeredFileSet); + docWrapper.set(destination,found); + } + else { + docWrapper.set(destination,registeredFileSet); + } + + log.debug("Setting result on profiled document"); + doc.setTheDocument(Document.parse(docWrapper.getCtx().jsonString())); + + doc=onUpdate(doc); + + return convert(replace(asDocument(doc),getCollectionName()),ProfiledDocument.class); + } + + + + + +// @Override +// public ProfiledDocument deleteRegisteredFileSet(String id, String destination, List files) { +// throw new RuntimeException("TO IMPLEMENT"); +// } + + private ExecutionReport step(ProfiledDocument theDocument,String step,Document callParameters) throws StepException { + log.info("[Profile {} ] Invoking Step {} on {}" ,profile.getId(),step,getManager().getDescriptor()); StepExecutionRequest request=new StepExecutionRequest(); + request.setCallParameters(callParameters); request.setDocument(theDocument); request.setProfile(profile); - request.setStep(StepExecutionRequest.Steps.ON_INIT_DOCUMENT); + request.setStep(step); log.debug("Requesting Step Execution {} ",request); ExecutionReport report= getManager().performStep(request); log.debug("Report is {}",report); if(report.getResult()==null) throw new StepException("Report result is null"); return report; } + + + + + private static final RegisteredFileSet prepareRegisteredFileSet(ProfiledDocument doc, Profile profile,String destination, + Document attributes,List files, StorageUtils storage,WorkspaceManager ws) throws StorageHubException, StorageException { + log.debug("Preparing Registered FileSet.."); + attributes.putIfAbsent(RegisteredFileSet.CREATION_INFO,UserUtils.getCurrent().asInfo()); + attributes.putIfAbsent(RegisteredFileSet.ACCESS,doc.getInfo().getAccess()); + FolderContainer base=ws.createFolder(new WorkspaceManager.FolderOptions( + doc.get_id(),"Base Folder for profiled document. Profile "+profile.getId(),null)); + + FolderContainer sectionFolder=ws.createFolder(new WorkspaceManager.FolderOptions( + doc.get_id()+destination,"Registered Fileset at path "+destination,base)); + + attributes.putIfAbsent(RegisteredFileSet.FOLDER_ID,sectionFolder.getId()); + + ArrayList registeredFiles=new ArrayList<>(); + + for (TempFile f : files) { + InputStream is=null; + try{ + log.debug("Opening temp file {}",f); + String fileUrl=storage.getURL(f.getId()); + log.debug("Got URL {} from ID {}",fileUrl,f.getId()); + is=new URL(fileUrl).openStream(); + RegisteredFile registered=ws.registerFile(new WorkspaceManager.FileOptions(f.getFilename(),is, + "Imported via gcube CMS service ", sectionFolder)); + log.debug("Registered "+registered); + registeredFiles.add(registered); + }catch(StorageHubException | IOException e){ + throw new StorageException("Unable to store "+f,e); + }finally{ + if(is!=null) + IOUtils.closeQuietly(is); + } + } + attributes.putIfAbsent(RegisteredFileSet.PAYLOADS,registeredFiles); + return Serialization.convert(attributes,RegisteredFileSet.class); + } } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProjectTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProfiledDocumentsTests.java similarity index 81% rename from geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProjectTests.java rename to geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProfiledDocumentsTests.java index b3ab62d..5abb83a 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProjectTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProfiledDocumentsTests.java @@ -18,7 +18,7 @@ import java.util.List; import static org.junit.Assert.assertEquals; -public class ProjectTests extends BasicServiceTestUnit{ +public class ProfiledDocumentsTests extends BasicServiceTestUnit{ String testProfileId="profiledConcessioni"; @@ -55,12 +55,28 @@ public class ProjectTests extends BasicServiceTestUnit{ } @Test - public void registerNew() { + public void registerNew() throws Exception { WebTarget target=target(InterfaceConstants.Methods.PROJECTS); Document document =new Document(Collections.singletonMap("dumbKey","dumbValue")); - System.out.println(target.path(testProfileId).request(MediaType.APPLICATION_JSON). - post(Entity.entity(document, MediaType.APPLICATION_JSON))); + check(target.path(testProfileId).request(MediaType.APPLICATION_JSON). + post(Entity.entity(document, MediaType.APPLICATION_JSON)),ProfiledDocument.class); + + } + + private ProfiledDocument createNew() throws Exception { + WebTarget target=target(InterfaceConstants.Methods.PROJECTS); + + Document document =new Document(Collections.singletonMap("dumbKey","dumbValue")); + return check(target.path(testProfileId).request(MediaType.APPLICATION_JSON). + post(Entity.entity(document, MediaType.APPLICATION_JSON)),ProfiledDocument.class); + } + + @Test + public void addFileSet() throws Exception { + // TODO Test register fileset + + } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/Profiles.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/Profiles.java new file mode 100644 index 0000000..3da4a69 --- /dev/null +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/Profiles.java @@ -0,0 +1,19 @@ +package org.gcube.application.geoportal.service; + +import org.gcube.application.cms.tests.TestProfiles; +import org.junit.Test; + +public class Profiles { + + + @Test + public void getFields(){ + TestProfiles.profiles.forEach((k,v)->{ + System.out.println(k+"\t"+v); + v.getSchema().getChildren().forEach( + i-> System.out.println(i.getClass()+"\t"+i) + ); + }); + } + +} diff --git a/test-data/profiledDocuments/basicProfile.json b/test-data/profiledDocuments/basicProfile.json new file mode 100644 index 0000000..d241d16 --- /dev/null +++ b/test-data/profiledDocuments/basicProfile.json @@ -0,0 +1,13 @@ +{"id": "myProfileStructure", + + "schema": { + "_type" : "complex", + "_children" :[ + { "nome" : {"_type" : "Text", "_index" : ""}}, + { "abstract" : {"_type" : "complex", + "_children" :[ + {"name" : {"Type" : "Text"}}, + {"files" : {"Type" : "FileSet"}} + ]}} + ]} +} From b0e5d098c087e60dd49f36405e2258805342af1b Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Mon, 17 Jan 2022 18:25:07 +0100 Subject: [PATCH 004/293] Register ProfiledDocument Filesets --- concessioni-lifecycle/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/concessioni-lifecycle/pom.xml b/concessioni-lifecycle/pom.xml index 04f1257..3392945 100644 --- a/concessioni-lifecycle/pom.xml +++ b/concessioni-lifecycle/pom.xml @@ -5,7 +5,7 @@ 4.0.0 concessioni-lifecycle - 1.0.1 + 1.0.1-SNAPSHOT GNA Concessioni Lifecycle From 2cdfcd2870ea3a87aac50b6f67c7321fa15dbb8d Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 18 Jan 2022 12:01:33 +0100 Subject: [PATCH 005/293] ProfiledDocument REST methods --- .../rest/AddSectionToConcessioneRequest.java | 3 +- .../common/rest/InterfaceConstants.java | 3 +- .../common/rest/StepExecutionRequest.java | 19 ++++ .../service/engine/mongo/MongoManagerI.java | 1 + .../engine/mongo/ProfiledMongoManager.java | 8 +- .../service/rest/ProfiledDocuments.java | 102 +++++++++++++++++- 6 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/StepExecutionRequest.java diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/AddSectionToConcessioneRequest.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/AddSectionToConcessioneRequest.java index ae9774a..4606c34 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/AddSectionToConcessioneRequest.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/AddSectionToConcessioneRequest.java @@ -7,6 +7,7 @@ import javax.xml.bind.annotation.XmlRootElement; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.bson.Document; import org.gcube.application.geoportal.common.faults.InvalidRequestException; import org.gcube.application.geoportal.common.model.legacy.Concessione; import org.gcube.application.geoportal.common.rest.TempFile; @@ -19,7 +20,7 @@ public class AddSectionToConcessioneRequest { private String destinationPath; private List streams; - + private Document attributes; public void validate()throws InvalidRequestException { Concessione.Paths.validate(destinationPath); diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/InterfaceConstants.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/InterfaceConstants.java index 1dac42a..276b288 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/InterfaceConstants.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/InterfaceConstants.java @@ -25,7 +25,8 @@ public class InterfaceConstants { public static final String CONFIGURATION_PATH="configuration"; public static final String SEARCH_PATH="search"; public static final String QUERY_PATH="query"; - + + public static final String STEP="step"; } public static final class Parameters{ diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/StepExecutionRequest.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/StepExecutionRequest.java new file mode 100644 index 0000000..4790186 --- /dev/null +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/StepExecutionRequest.java @@ -0,0 +1,19 @@ +package org.gcube.application.geoportal.common.rest; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.bson.Document; + + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +@Data +@AllArgsConstructor +@NoArgsConstructor +public class StepExecutionRequest { + + private String stepID; + private Document options; +} diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java index a0242f9..0469c2a 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManagerI.java @@ -40,4 +40,5 @@ public interface MongoManagerI { public T performStep(String id, String step, Document options) throws IOException, StepException; public T registerFileSet(String id, String destination, Document attributes, List files) throws ConfigurationException, StorageHubException, StorageException, StepException, JsonProcessingException; + public T deleteFileSet(String id, String destination, Boolean force) throws ConfigurationException, StorageHubException, StorageException, StepException, JsonProcessingException; } diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java index 4e7303b..9f419cc 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java @@ -50,7 +50,7 @@ import static org.gcube.application.cms.Serialization.*; @Slf4j public class ProfiledMongoManager extends MongoManager implements MongoManagerI{ - + @Getter Profile profile; MongoDatabase db=null; @@ -292,8 +292,10 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< return convert(replace(asDocument(doc),getCollectionName()),ProfiledDocument.class); } - - + @Override + public ProfiledDocument deleteFileSet(String id, String destination, Boolean force) throws ConfigurationException, StorageHubException, StorageException, StepException, JsonProcessingException { + throw new RuntimeException("Implement this"); + } // @Override diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java index 1c53501..bf7fa59 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/ProfiledDocuments.java @@ -3,9 +3,13 @@ package org.gcube.application.geoportal.service.rest; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.model.legacy.Concessione; +import org.gcube.application.geoportal.common.model.rest.AddSectionToConcessioneRequest; import org.gcube.application.geoportal.common.model.rest.Configuration; import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.rest.InterfaceConstants; +import org.gcube.application.geoportal.common.rest.StepExecutionRequest; +import org.gcube.application.geoportal.service.engine.mongo.ConcessioniMongoManager; import org.gcube.application.geoportal.service.engine.mongo.ProfiledMongoManager; import org.gcube.application.geoportal.service.model.internal.faults.ConfigurationException; import org.gcube.application.cms.Serialization; @@ -20,7 +24,7 @@ public class ProfiledDocuments { private ProfiledMongoManager manager; public ProfiledDocuments(@PathParam(InterfaceConstants.Parameters.PROFILE_ID) String profileID) throws ConfigurationException { - log.debug("Accessing profiles "+profileID); + log.info("Accessing profiles "+profileID); manager=new GuardedMethod(){ @Override protected ProfiledMongoManager run() throws Exception { @@ -51,7 +55,101 @@ public class ProfiledDocuments { return new GuardedMethod() { @Override protected ProfiledDocument run() throws Exception, WebApplicationException { - return manager.registerNew(d); + log.info("Creating new ProfiledDocument ({})",manager.getProfile().getId()); + ProfiledDocument toReturn= manager.registerNew(d); + log.info("Created new ProfiledDocument ({}, ID {})",manager.getProfile().getId(),toReturn.get_id()); + return toReturn; + } + }.execute().getResult(); + } + + + @PUT + @Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public ProfiledDocument update(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String documentId, Document d) { + return new GuardedMethod() { + @Override + protected ProfiledDocument run() throws Exception, WebApplicationException { + log.info("Updating ProfiledDocument ({}, ID {})",manager.getProfile().getId(),documentId); + return manager.update(documentId,d); + } + }.execute().getResult(); + } + + + @DELETE + @Produces(MediaType.APPLICATION_JSON) + @Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}") + public Boolean delete(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + @DefaultValue("false") + @QueryParam(InterfaceConstants.Parameters.FORCE) Boolean force) { + return new GuardedMethod() { + @Override + protected Boolean run() throws Exception, WebApplicationException { + log.info("Deleting ProfiledDocument ({}, ID {}). Force is {}",manager.getProfile().getId(),id,force); + manager.delete(id,force); + return true; + } + }.execute().getResult(); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/"+InterfaceConstants.Methods.REGISTER_FILES_PATH+"/{"+InterfaceConstants.Parameters.PROJECT_ID+"}") + public ProfiledDocument registerFileSet(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + AddSectionToConcessioneRequest request) { + return new GuardedMethod() { + @Override + protected ProfiledDocument run() throws Exception, WebApplicationException { + log.info("Registering {} file(s) for ProfiledDocument ({}, ID {}) at path {}", + request.getStreams().size(), + manager.getProfile().getId(), + id,request.getDestinationPath()); + request.validate(); + return manager.registerFileSet(id,request.getDestinationPath(),request.getAttributes(),request.getStreams()); + } + }.execute().getResult(); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/"+InterfaceConstants.Methods.DELETE_FILES_PATH+"/{"+InterfaceConstants.Parameters.PROJECT_ID+"}") + public ProfiledDocument deleteFileSet( + @PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + @DefaultValue("false") + @QueryParam(InterfaceConstants.Parameters.FORCE) Boolean force, + String path) { + return new GuardedMethod() { + @Override + protected ProfiledDocument run() throws Exception, WebApplicationException { + log.info("Deleting FileSet of ProfiledDocument ({}, ID {}) at path {}. Force is {}", + manager.getProfile().getId(), + id,path,force); + return manager.deleteFileSet(id,path,force); + } + }.execute().getResult(); + } + + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/"+InterfaceConstants.Methods.STEP+"/{"+InterfaceConstants.Parameters.PROJECT_ID+"}") + public ProfiledDocument performStep( + @PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id, + StepExecutionRequest request) { + return new GuardedMethod() { + @Override + protected ProfiledDocument run() throws Exception, WebApplicationException { + log.info("Executing step {} on ProfiledDocument ({},ID,{}) with options {}", + request.getStepID(), + manager.getProfile().getId(), + id,request.getOptions()); + return manager.performStep(id,request.getStepID(),request.getOptions()); } }.execute().getResult(); } From 0099e09b1fba8ccd08806e6a5687ad6dab042f50 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Tue, 18 Jan 2022 14:25:49 +0100 Subject: [PATCH 006/293] Testing --- .../gcube/application/cms/Serialization.java | 39 ++++++- .../model/ProfiledConcessione.java | 19 ++-- .../service/ProfiledDocumentsTests.java | 100 ++++++++---------- 3 files changed, 90 insertions(+), 68 deletions(-) diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java index ff73097..f245097 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.vdurmont.semver4j.Semver; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.bson.types.ObjectId; @@ -33,8 +34,14 @@ public class Serialization { SimpleModule s=new SimpleModule(); s.addDeserializer(ObjectId.class,new ObjectIdDeserializer()); s.addSerializer(ObjectId.class,new ObjectIdSerializer()); - s.addDeserializer(ComparableVersion.class,new ComparableVersionDeserializer()); - s.addSerializer(ComparableVersion.class,new ComparableVersionSerializer()); + +// s.addDeserializer(ComparableVersion.class,new ComparableVersionDeserializer()); +// s.addSerializer(ComparableVersion.class,new ComparableVersionSerializer()); + + s.addDeserializer(Semver.class,new SemverDeserializer()); + s.addSerializer(Semver.class,new SemverSerializer()); + + mapper.registerModule(s); } @@ -135,4 +142,32 @@ public class Serialization { return ComparableVersion.class; } } + + //Sem Version + private static class SemverSerializer extends JsonSerializer { + @Override + public void serialize(Semver semver, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { + if (semver == null) jsonGenerator.writeNull(); + else jsonGenerator.writeString(semver.toString()); + } + + @Override + public Class handledType() { + return Semver.class; + } + } + private static class SemverDeserializer extends JsonDeserializer { + + @Override + public Semver deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + String value=jsonParser.getValueAsString(); + if(value==null || value.isEmpty() || value.equals("null")) + return null; + else return new Semver(value); + } + @Override + public Class handledType() { + return Semver.class; + } + } } diff --git a/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java b/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java index e13396a..8665bc0 100644 --- a/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java +++ b/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java @@ -9,6 +9,7 @@ import org.gcube.application.geoportal.common.model.document.Access; import org.gcube.application.geoportal.common.model.document.AccessPolicy; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.document.RegisteredFileSet; +import org.gcube.application.geoportal.common.model.legacy.RelazioneScavo; import org.gcube.application.geoportal.common.model.legacy.report.ConstraintCheck; import java.util.List; @@ -80,14 +81,14 @@ public class ProfiledConcessione extends ProfiledDocument { //RELAZIONE // TODO NB provare se object gia' presente sia usando Document che sub Object doc.putIfAbsent(RELAZIONE_SCAVO,new Document()); - Document rel=doc.get(RELAZIONE_SCAVO,Document.class); - rel.putIfAbsent(Sections.TITOLO,doc.getString(NOME)+" relazione di scavo"); - rel.putIfAbsent(SOGGETTO,doc.get(SOGGETTO)); - rel.putIfAbsent(RegisteredFileSet.CREATION_INFO,this.getInfo().getCreationInfo()); - rel.putIfAbsent(RegisteredFileSet.ACCESS,this.getInfo().getAccess()); - Access relAccess=rel.get(RegisteredFileSet.ACCESS,Access.class); - relAccess.setLicense(ConstraintCheck.defaultFor(relAccess.getLicense(),"CC-BY-4.0").evaluate()); - relAccess.setPolicy(ConstraintCheck.defaultFor(relAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); + RelazioneScavo rel=doc.get(RELAZIONE_SCAVO,RelazioneScavo.class); +// rel.putIfAbsent(Sections.TITOLO,doc.getString(NOME)+" relazione di scavo"); +// rel.putIfAbsent(SOGGETTO,doc.get(SOGGETTO)); +// rel.putIfAbsent(RegisteredFileSet.CREATION_INFO,this.getInfo().getCreationInfo()); +// rel.putIfAbsent(RegisteredFileSet.ACCESS,this.getInfo().getAccess()); +// Access relAccess=rel.get(RegisteredFileSet.ACCESS,Access.class); +// relAccess.setLicense(ConstraintCheck.defaultFor(relAccess.getLicense(),"CC-BY-4.0").evaluate()); +// relAccess.setPolicy(ConstraintCheck.defaultFor(relAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); //ABSTRACT Relazione doc.putIfAbsent(ABSTRACT_RELAZIONE,new Document()); @@ -95,7 +96,7 @@ public class ProfiledConcessione extends ProfiledDocument { abs.putIfAbsent(Sections.TITOLO,doc.getString(NOME)+" abstract relazione di scavo"); abs.putIfAbsent(RegisteredFileSet.CREATION_INFO,this.getInfo().getCreationInfo()); abs.putIfAbsent(RegisteredFileSet.ACCESS,this.getInfo().getAccess()); - Access absAccess=rel.get(RegisteredFileSet.ACCESS,Access.class); + Access absAccess=abs.get(RegisteredFileSet.ACCESS,Access.class); absAccess.setLicense(ConstraintCheck.defaultFor(absAccess.getLicense(),"CC-BY-4.0").evaluate()); absAccess.setPolicy(ConstraintCheck.defaultFor(absAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProfiledDocumentsTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProfiledDocumentsTests.java index 5abb83a..741becc 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProfiledDocumentsTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/ProfiledDocumentsTests.java @@ -1,9 +1,12 @@ package org.gcube.application.geoportal.service; +import com.fasterxml.jackson.core.JsonProcessingException; import org.bson.Document; import org.gcube.application.cms.Serialization; import org.gcube.application.cms.tests.TokenSetter; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.model.rest.Configuration; +import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.junit.Assert; import org.junit.Before; @@ -27,9 +30,14 @@ public class ProfiledDocumentsTests extends BasicServiceTestUnit{ TokenSetter.set(scope); } + + protected WebTarget baseTarget(){ + return target(InterfaceConstants.Methods.PROJECTS).path(testProfileId); + } + // GET @Test public void testMissingProfile(){ - Response resp = target(InterfaceConstants.Methods.PROJECTS) + Response resp = baseTarget() .path("non-existent-profile").request().get(); assertEquals(resp.getStatus(),404); } @@ -37,15 +45,15 @@ public class ProfiledDocumentsTests extends BasicServiceTestUnit{ @Test public void getAll() { - System.out.println(target(InterfaceConstants.Methods.PROJECTS).path(testProfileId).request(MediaType.APPLICATION_JSON).get(List.class)); + System.out.println(baseTarget().request(MediaType.APPLICATION_JSON).get(List.class)); } @Test public void getByID(){ - target(InterfaceConstants.Methods.PROJECTS).path(testProfileId).request(MediaType.APPLICATION_JSON).get(List.class).forEach(d ->{ + baseTarget().request(MediaType.APPLICATION_JSON).get(List.class).forEach(d ->{ try { - check(target(InterfaceConstants.Methods.PROJECTS).path(testProfileId).path((Serialization.convert(d,ProfiledDocument.class)).get_id()) + check(baseTarget().path((Serialization.convert(d,ProfiledDocument.class)).get_id()) .request(MediaType.APPLICATION_JSON).get(),ProfiledDocument.class); } catch (Exception e) { e.printStackTrace(System.err); @@ -54,74 +62,52 @@ public class ProfiledDocumentsTests extends BasicServiceTestUnit{ }); } + @Test + public void getConfiguration() { + System.out.println(baseTarget().request(MediaType.APPLICATION_JSON).get(Configuration.class)); + } + + // Queries + @Test + public void query() throws JsonProcessingException { + System.out.println(baseTarget().path(InterfaceConstants.Methods.QUERY_PATH). + request(MediaType.APPLICATION_JSON). + post(Entity.entity(Serialization.write(new QueryRequest()),MediaType.APPLICATION_JSON))); + } + + // CREATE / edit / delete + @Test public void registerNew() throws Exception { - WebTarget target=target(InterfaceConstants.Methods.PROJECTS); - - Document document =new Document(Collections.singletonMap("dumbKey","dumbValue")); - check(target.path(testProfileId).request(MediaType.APPLICATION_JSON). - post(Entity.entity(document, MediaType.APPLICATION_JSON)),ProfiledDocument.class); - + createNew(); } private ProfiledDocument createNew() throws Exception { - WebTarget target=target(InterfaceConstants.Methods.PROJECTS); - Document document =new Document(Collections.singletonMap("dumbKey","dumbValue")); - return check(target.path(testProfileId).request(MediaType.APPLICATION_JSON). + return check(baseTarget().request(MediaType.APPLICATION_JSON). post(Entity.entity(document, MediaType.APPLICATION_JSON)),ProfiledDocument.class); } + @Test + public void edit() throws Exception { + ProfiledDocument doc=createNew(); + String beforeJson=doc.getTheDocument().toJson(); + doc.getTheDocument().put("someStrangeField","someOtherRandomValue"); + String edited=doc.getTheDocument().toJson(); + Assert.assertNotEquals(beforeJson,doc.getTheDocument().toJson()); + doc=check(baseTarget().path(doc.get_id()).request(MediaType.APPLICATION_JSON). + put(Entity.entity(doc.getTheDocument(), MediaType.APPLICATION_JSON)),ProfiledDocument.class); + Assert.assertEquals(edited,doc.getTheDocument().toJson()); + } + @Test public void addFileSet() throws Exception { - // TODO Test register fileset + + ProfiledDocument doc = createNew(); } -// @Test -// public void getFilteredAll() { -// WebTarget target=target(InterfaceConstants.Methods.PROJECTS); -// Document document =new Document(Collections.singletonMap("key", "value")); -// -// System.out.println(target.path("search").request(MediaType.APPLICATION_JSON). -// post(Entity.entity(document, MediaType.APPLICATION_JSON))); -// -// } -// -// @Test -// public void getAllByProfile() { -// WebTarget target=target(InterfaceConstants.Methods.PROJECTS); -// System.out.println(target.path(testProfileId).request(MediaType.APPLICATION_JSON).get(List.class)); -// } -// -// @Test -// public void getFilteredByProfile() { -// WebTarget target=target(InterfaceConstants.Methods.PROJECTS); -// Document document =new Document(Collections.singletonMap("key", "value")); -// -// System.out.println(target.path("search").path(testProfileId).request(MediaType.APPLICATION_JSON). -// post(Entity.entity(document, MediaType.APPLICATION_JSON))); -// -// } -// -// -// @Test -// public void getById() { -// WebTarget target=target(InterfaceConstants.Methods.PROJECTS); -// System.out.println(target.path(testProfileId).path(projectId).request(MediaType.APPLICATION_JSON).get().readEntity(String.class)); -// } -// -// -// -// @Test -// public void updateDocument() { -// WebTarget target=target(InterfaceConstants.Methods.PROJECTS); -// Document document =new Document(Collections.singletonMap("key", "value")); -// -// System.out.println(target.path(testProfileId).path(projectId).request(MediaType.APPLICATION_JSON). -// put(Entity.entity(document, MediaType.APPLICATION_JSON))); -// } } From 0bea1699a10c55c975da3787af7aac91e3741516 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Thu, 27 Jan 2022 15:02:53 +0100 Subject: [PATCH 007/293] Register Fileset --- .../gcube/application/cms/Serialization.java | 11 +- .../plugins/ConcessioniLifeCycleManager.java | 70 +++++++++++- .../model/ProfiledConcessione.java | 54 ---------- .../client/legacy/ConcessioniManagerI.java | 2 +- .../legacy/StatefulMongoConcessioni.java | 2 +- .../application/geoportal/StorageTests.java | 9 -- .../geoportal/clients/BasicVreTests.java | 4 +- .../clients/StatefulClientTests.java | 3 +- .../model/document/ProfiledDocument.java | 5 +- .../model/profile/DataAccessPolicy.java | 51 +++++++++ .../geoportal/common/model/profile/Field.java | 9 ++ .../common/model/profile/Profile.java | 3 + .../rest/AddSectionToConcessioneRequest.java | 2 +- .../model/rest/RegisterFileSetRequest.java | 39 +++++++ .../rest/StepExecutionRequest.java | 2 +- .../common/{ => model}/rest/TempFile.java | 2 +- .../geoportal/common/utils/FileSets.java | 12 +-- .../common/utils/JSONPathWrapper.java | 32 +++++- .../geoportal/common/utils/StorageUtils.java | 2 +- .../engine/mongo/ConcessioniMongoManager.java | 16 +-- .../service/engine/mongo/MongoManager.java | 4 +- .../service/engine/mongo/MongoManagerI.java | 6 +- .../engine/mongo/ProfiledMongoManager.java | 100 +++++++++++++----- .../service/rest/ProfiledDocuments.java | 10 +- .../profiles/profiledConcessioni.json | 76 ++++++++++++- .../service/BasicServiceTestUnit.java | 2 +- .../service/ProfiledDocumentsTests.java | 46 ++++++-- .../queries/lastNameRegisteredByFabio.json | 2 +- .../application/cms/usecases/Export.java | 2 +- 29 files changed, 425 insertions(+), 153 deletions(-) create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/DataAccessPolicy.java create mode 100644 geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/RegisterFileSetRequest.java rename geoportal-common/src/main/java/org/gcube/application/geoportal/common/{ => model}/rest/StepExecutionRequest.java (84%) rename geoportal-common/src/main/java/org/gcube/application/geoportal/common/{ => model}/rest/TempFile.java (90%) diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java index f245097..cc42dd7 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/Serialization.java @@ -84,6 +84,13 @@ public class Serialization { public static final Document asDocument(Object obj) throws JsonProcessingException { return Document.parse(mapper.writeValueAsString(obj)); } + + public static final Document asDocumentWithId(ProfiledDocument doc) throws JsonProcessingException { + Document toReturn =Document.parse(mapper.writeValueAsString(doc)); + if(doc.get_id()!=null) + toReturn.put(ProfiledDocument.ID,new ObjectId(doc.get_id())); + return toReturn; + } // ***** Serialization Exceptions @@ -92,7 +99,7 @@ public class Serialization { @Override public void serialize(ObjectId objectId, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { if (objectId == null) jsonGenerator.writeNull(); - else jsonGenerator.writeString(objectId.toHexString()); + else jsonGenerator.writeString(objectId.toString()); } @Override @@ -148,7 +155,7 @@ public class Serialization { @Override public void serialize(Semver semver, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { if (semver == null) jsonGenerator.writeNull(); - else jsonGenerator.writeString(semver.toString()); + else jsonGenerator.writeString(semver.getValue()); } @Override diff --git a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java index 328f7e0..0754e9c 100644 --- a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java +++ b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/ConcessioniLifeCycleManager.java @@ -1,6 +1,10 @@ package org.gcube.application.cms.concessioni.plugins; import lombok.extern.slf4j.Slf4j; +import org.bson.BsonDocument; +import org.bson.BsonString; +import org.bson.BsonValue; +import org.bson.Document; import org.gcube.application.cms.Serialization; import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione; import org.gcube.application.cms.plugins.LifecycleManager; @@ -11,9 +15,11 @@ import org.gcube.application.cms.plugins.model.PluginDescriptor; import org.gcube.application.cms.plugins.reports.ExecutionReport; import org.gcube.application.cms.plugins.reports.InitializationReport; import org.gcube.application.cms.plugins.requests.StepExecutionRequest; -import org.gcube.application.geoportal.common.model.document.ComparableVersion; -import org.gcube.application.geoportal.common.model.document.LifecycleInformation; -import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.model.document.*; +import org.gcube.application.geoportal.common.model.legacy.RelazioneScavo; +import org.gcube.application.geoportal.common.model.legacy.report.ConstraintCheck; + +import java.util.List; @Slf4j public class ConcessioniLifeCycleManager implements LifecycleManager { @@ -97,7 +103,63 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { private static final ProfiledDocument setDefaults(ProfiledDocument document){ ProfiledConcessione c=Serialization.convert(document,ProfiledConcessione.class); - c.setDefaults(); + + + + Document doc=c.getTheDocument(); + doc.putIfAbsent(ProfiledConcessione.SOGGETTO,new String[]{"Research Excavation","Archaeology"}); + + doc.putIfAbsent(ProfiledConcessione.DSCRIZIONE_CONTENUTO,"Relazione di fine scavo e relativo abstract; selezione di immagini rappresentative;" + + " posizionamento topografico dell'area indagata, pianta di fine scavo."); + + // Super Section + c.getInfo().getAccess().setLicense( + ConstraintCheck.defaultFor(c.getInfo().getAccess().getLicense(), "CC0-1.0").evaluate()); + + + //RELAZIONE + // TODO NB provare se object gia' presente sia usando Document che sub Object + doc.putIfAbsent(ProfiledConcessione.RELAZIONE_SCAVO,new Document()); + Document rel=Serialization.convert(doc.get(ProfiledConcessione.RELAZIONE_SCAVO), Document.class); + + rel.putIfAbsent(ProfiledConcessione.Sections.TITOLO,doc.getString(ProfiledConcessione.NOME)+" relazione di scavo"); + rel.putIfAbsent(ProfiledConcessione.SOGGETTO,doc.get(ProfiledConcessione.SOGGETTO)); + rel.putIfAbsent(RegisteredFileSet.CREATION_INFO,c.getInfo().getCreationInfo()); + rel.putIfAbsent(RegisteredFileSet.ACCESS,c.getInfo().getAccess()); + Access relAccess=Serialization.convert(rel.get(RegisteredFileSet.ACCESS),Access.class); + relAccess.setLicense(ConstraintCheck.defaultFor(relAccess.getLicense(),"CC-BY-4.0").evaluate()); + relAccess.setPolicy(ConstraintCheck.defaultFor(relAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); + + //ABSTRACT Relazione + doc.putIfAbsent(ProfiledConcessione.ABSTRACT_RELAZIONE,new Document()); + Document abs=Serialization.convert(doc.get(ProfiledConcessione.ABSTRACT_RELAZIONE),Document.class); + abs.putIfAbsent(ProfiledConcessione.Sections.TITOLO,doc.getString(ProfiledConcessione.NOME)+" abstract relazione di scavo"); + abs.putIfAbsent(RegisteredFileSet.CREATION_INFO,c.getInfo().getCreationInfo()); + abs.putIfAbsent(RegisteredFileSet.ACCESS,c.getInfo().getAccess()); + Access absAccess=Serialization.convert(abs.get(RegisteredFileSet.ACCESS),Access.class); + absAccess.setLicense(ConstraintCheck.defaultFor(absAccess.getLicense(),"CC-BY-4.0").evaluate()); + absAccess.setPolicy(ConstraintCheck.defaultFor(absAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); + + //TODO complete setDefaults + //IMMAGINI RAPPRESENTATIVE + + + if(doc.containsKey(ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE)) { + for (BsonValue bsonValue : doc.toBsonDocument(null, null). + getArray(ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE)) { + + BsonDocument imgDocument = bsonValue.asDocument(); + imgDocument.putIfAbsent(ProfiledConcessione.SOGGETTO,new BsonString(doc.getString(ProfiledConcessione.SOGGETTO))); +// imgDocument.putIfAbsent(RegisteredFileSet.CREATION_INFO,this.getInfo().getCreationInfo()); +// imgDocument.putIfAbsent(RegisteredFileSet.CREATION_INFO,new BsonDocument(new Document())); +// imgDocument.putIfAbsent(RegisteredFileSet.ACCESS,this.getInfo().getAccess()); +// Access absAccess=rel.get(RegisteredFileSet.ACCESS,Access.class); +// absAccess.setLicense(ConstraintCheck.defaultFor(absAccess.getLicense(),"CC-BY-4.0").evaluate()); +// absAccess.setPolicy(ConstraintCheck.defaultFor(absAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); + } + } + + return c; } diff --git a/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java b/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java index 8665bc0..60b6a36 100644 --- a/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java +++ b/concessioni-model/src/main/java/org/gcube/application/cms/custom/gna/concessioni/model/ProfiledConcessione.java @@ -9,7 +9,6 @@ import org.gcube.application.geoportal.common.model.document.Access; import org.gcube.application.geoportal.common.model.document.AccessPolicy; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.document.RegisteredFileSet; -import org.gcube.application.geoportal.common.model.legacy.RelazioneScavo; import org.gcube.application.geoportal.common.model.legacy.report.ConstraintCheck; import java.util.List; @@ -65,58 +64,5 @@ public class ProfiledConcessione extends ProfiledDocument { } - @Override - public void setDefaults() { - Document doc=this.getTheDocument(); - doc.putIfAbsent(SOGGETTO,new String[]{"Research Excavation","Archaeology"}); - doc.putIfAbsent(DSCRIZIONE_CONTENUTO,"Relazione di fine scavo e relativo abstract; selezione di immagini rappresentative;" - + " posizionamento topografico dell'area indagata, pianta di fine scavo."); - - // Super Section - this.getInfo().getAccess().setLicense( - ConstraintCheck.defaultFor(getInfo().getAccess().getLicense(), "CC0-1.0").evaluate()); - - - //RELAZIONE - // TODO NB provare se object gia' presente sia usando Document che sub Object - doc.putIfAbsent(RELAZIONE_SCAVO,new Document()); - RelazioneScavo rel=doc.get(RELAZIONE_SCAVO,RelazioneScavo.class); -// rel.putIfAbsent(Sections.TITOLO,doc.getString(NOME)+" relazione di scavo"); -// rel.putIfAbsent(SOGGETTO,doc.get(SOGGETTO)); -// rel.putIfAbsent(RegisteredFileSet.CREATION_INFO,this.getInfo().getCreationInfo()); -// rel.putIfAbsent(RegisteredFileSet.ACCESS,this.getInfo().getAccess()); -// Access relAccess=rel.get(RegisteredFileSet.ACCESS,Access.class); -// relAccess.setLicense(ConstraintCheck.defaultFor(relAccess.getLicense(),"CC-BY-4.0").evaluate()); -// relAccess.setPolicy(ConstraintCheck.defaultFor(relAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); - - //ABSTRACT Relazione - doc.putIfAbsent(ABSTRACT_RELAZIONE,new Document()); - Document abs=doc.get(ABSTRACT_RELAZIONE,Document.class); - abs.putIfAbsent(Sections.TITOLO,doc.getString(NOME)+" abstract relazione di scavo"); - abs.putIfAbsent(RegisteredFileSet.CREATION_INFO,this.getInfo().getCreationInfo()); - abs.putIfAbsent(RegisteredFileSet.ACCESS,this.getInfo().getAccess()); - Access absAccess=abs.get(RegisteredFileSet.ACCESS,Access.class); - absAccess.setLicense(ConstraintCheck.defaultFor(absAccess.getLicense(),"CC-BY-4.0").evaluate()); - absAccess.setPolicy(ConstraintCheck.defaultFor(absAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); - - //TODO complete setDefaults - //IMMAGINI RAPPRESENTATIVE - - - if(doc.containsKey(IMMAGINI_RAPPRESENTATIVE)) { - for (BsonValue bsonValue : doc.toBsonDocument(null, null). - getArray(IMMAGINI_RAPPRESENTATIVE)) { - - BsonDocument imgDocument = bsonValue.asDocument(); - imgDocument.putIfAbsent(SOGGETTO,new BsonString(doc.getString(SOGGETTO))); -// imgDocument.putIfAbsent(RegisteredFileSet.CREATION_INFO,this.getInfo().getCreationInfo()); -// imgDocument.putIfAbsent(RegisteredFileSet.CREATION_INFO,new BsonDocument(new Document())); -// imgDocument.putIfAbsent(RegisteredFileSet.ACCESS,this.getInfo().getAccess()); -// Access absAccess=rel.get(RegisteredFileSet.ACCESS,Access.class); -// absAccess.setLicense(ConstraintCheck.defaultFor(absAccess.getLicense(),"CC-BY-4.0").evaluate()); -// absAccess.setPolicy(ConstraintCheck.defaultFor(absAccess.getPolicy(), AccessPolicy.OPEN).evaluate()); - } - } - } } diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManagerI.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManagerI.java index 986e2c4..7668631 100644 --- a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManagerI.java +++ b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/ConcessioniManagerI.java @@ -2,7 +2,7 @@ package org.gcube.application.geoportal.client.legacy; import org.gcube.application.geoportal.common.model.legacy.*; import org.gcube.application.geoportal.common.rest.MongoConcessioni; -import org.gcube.application.geoportal.common.rest.TempFile; +import org.gcube.application.geoportal.common.model.rest.TempFile; public interface ConcessioniManagerI extends MongoConcessioni{ diff --git a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java index 70bb6af..3460bbc 100644 --- a/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java +++ b/geoportal-client/src/main/java/org/gcube/application/geoportal/client/legacy/StatefulMongoConcessioni.java @@ -9,7 +9,7 @@ import org.gcube.application.geoportal.client.DefaultMongoConcessioni; import org.gcube.application.geoportal.common.model.legacy.*; import org.gcube.application.geoportal.common.utils.FileSets; import org.gcube.application.geoportal.common.model.legacy.Concessione.Paths; -import org.gcube.application.geoportal.common.rest.TempFile; +import org.gcube.application.geoportal.common.model.rest.TempFile; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.common.clients.delegates.ProxyDelegate; diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/StorageTests.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/StorageTests.java index 87f4801..8be06bb 100644 --- a/geoportal-client/src/test/java/org/gcube/application/geoportal/StorageTests.java +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/StorageTests.java @@ -1,19 +1,10 @@ package org.gcube.application.geoportal; -import org.apache.commons.io.IOUtils; import org.gcube.application.cms.tests.TokenSetter; -import org.gcube.application.geoportal.common.rest.TempFile; -import org.gcube.application.geoportal.common.utils.Files; import org.gcube.application.geoportal.common.utils.StorageUtils; -import org.gcube.common.storagehub.client.dsl.StorageHubClient; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; public class StorageTests { diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/BasicVreTests.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/BasicVreTests.java index 4016eb1..6764444 100644 --- a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/BasicVreTests.java +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/BasicVreTests.java @@ -7,9 +7,9 @@ public class BasicVreTests { @BeforeClass public static void setScope(){ -// TokenSetter.set("/pred4s/preprod/preVRE"); + TokenSetter.set("/pred4s/preprod/preVRE"); // TokenSetter.set("/d4science.research-infrastructures.eu/D4OS/GeoNA-Prototype"); - TokenSetter.set("/gcube/devsec/devVRE"); + // TokenSetter.set("/gcube/devsec/devVRE"); } diff --git a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/StatefulClientTests.java b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/StatefulClientTests.java index f8e861b..07bac9a 100644 --- a/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/StatefulClientTests.java +++ b/geoportal-client/src/test/java/org/gcube/application/geoportal/clients/StatefulClientTests.java @@ -13,8 +13,7 @@ import org.gcube.application.geoportal.client.legacy.ConcessioniManagerI; import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.common.model.legacy.*; import org.gcube.application.geoportal.common.model.legacy.report.ValidationReport.ValidationStatus; -import org.gcube.application.geoportal.common.rest.TempFile; -import org.gcube.application.geoportal.common.utils.Files; +import org.gcube.application.geoportal.common.model.rest.TempFile; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException; import org.junit.Test; diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java index 46d22df..04ee294 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/ProfiledDocument.java @@ -14,7 +14,7 @@ import org.bson.types.ObjectId; @ToString public class ProfiledDocument { - public static final String _ID="_id"; + public static final String ID="_id"; public static final String VERSION="version"; public static final String INFO="info"; public static final String PROFILE_ID="profileID"; @@ -47,8 +47,5 @@ public class ProfiledDocument { private Document theDocument; - public void setDefaults(){ - // TODO APPLY DEFAULTS ?? - }; } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/DataAccessPolicy.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/DataAccessPolicy.java new file mode 100644 index 0000000..659cc3b --- /dev/null +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/DataAccessPolicy.java @@ -0,0 +1,51 @@ +package org.gcube.application.geoportal.common.model.profile; + +import lombok.*; +import org.bson.Document; + +import java.util.List; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@ToString +public class DataAccessPolicy { + + public static final String POLICY = "policy"; + public static final String ROLES = "roles"; + public static final String ENFORCER = "enforcer"; + + @NoArgsConstructor + @AllArgsConstructor + @Getter + @Setter + @ToString + public static class Policy { + public static final String WRITE="write"; + public static final String READ="read"; + + public static enum Type{ + OWN,NONE,ANY + } + + private Type write; + private Type read; + } + + + @NoArgsConstructor + @AllArgsConstructor + @Getter + @Setter + @ToString + public static class PolicyEnforcer { + public static final String FILTER="filter"; + private Document filter; + } + + + private Policy policy; + private List roles; + private PolicyEnforcer enforcer; +} diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Field.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Field.java index 98782c5..daa780f 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Field.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Field.java @@ -12,7 +12,11 @@ public class Field extends Document { public static final String CHILDREN="_children"; public static final String MAX_CARDINALITY="_max"; public static final String MIN_CARDINALITY="_min"; + public static final String LABEL="_label"; + public String getLabel(){ + return this.getString(LABEL); + } public String getType(){ return this.getString(TYPE); @@ -22,6 +26,11 @@ public class Field extends Document { return this.get(CHILDREN,List.class); } + public Boolean isCollection() { + Integer maxCard=this.getMaxCardinality(); + return (maxCard>1||maxCard<0); // Negative values for unbounded + } + public Integer getMaxCardinality(){ return (Integer) this.getOrDefault(MAX_CARDINALITY,1); } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Profile.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Profile.java index d60c130..649e9de 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Profile.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/profile/Profile.java @@ -31,6 +31,9 @@ public class Profile{ private List handlers; + + private List dataAccessPolicies; + /** * Returns map Type -> Handler Declaration * @return diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/AddSectionToConcessioneRequest.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/AddSectionToConcessioneRequest.java index 4606c34..a864a21 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/AddSectionToConcessioneRequest.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/AddSectionToConcessioneRequest.java @@ -10,12 +10,12 @@ import lombok.NoArgsConstructor; import org.bson.Document; import org.gcube.application.geoportal.common.faults.InvalidRequestException; import org.gcube.application.geoportal.common.model.legacy.Concessione; -import org.gcube.application.geoportal.common.rest.TempFile; @XmlRootElement @Data @AllArgsConstructor @NoArgsConstructor +@Deprecated public class AddSectionToConcessioneRequest { private String destinationPath; diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/RegisterFileSetRequest.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/RegisterFileSetRequest.java new file mode 100644 index 0000000..4fbd5eb --- /dev/null +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/RegisterFileSetRequest.java @@ -0,0 +1,39 @@ +package org.gcube.application.geoportal.common.model.rest; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.bson.Document; +import org.gcube.application.geoportal.common.faults.InvalidRequestException; + +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RegisterFileSetRequest { + + /** Behavior for existing JSON Object at @destinationPath + * + * REPLACE_EXISTING : removes previously defined attributes (only on single match) + * MERGE_EXISTING : merges the provided attributes with the matching ones (only on single match) + * APPEND : appends the object to the existing collection (only if field is multiple) + */ + public static enum ClashOptions { + REPLACE_EXISTING,MERGE_EXISTING, APPEND + } + + private String fieldPath; + private String destinationPath; + private List streams; + private Document attributes; + + private ClashOptions clashOption; + + public void validate()throws InvalidRequestException { + if(streams==null || streams.isEmpty()) throw new InvalidRequestException("No Temp File declared"); + for(TempFile t : streams) t.validate(); + } +} diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/StepExecutionRequest.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/StepExecutionRequest.java similarity index 84% rename from geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/StepExecutionRequest.java rename to geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/StepExecutionRequest.java index 4790186..198757e 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/StepExecutionRequest.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/StepExecutionRequest.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.common.rest; +package org.gcube.application.geoportal.common.model.rest; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/TempFile.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/TempFile.java similarity index 90% rename from geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/TempFile.java rename to geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/TempFile.java index 4276512..5cfe276 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/rest/TempFile.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/rest/TempFile.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.common.rest; +package org.gcube.application.geoportal.common.model.rest; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/FileSets.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/FileSets.java index a70421d..b7fd726 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/FileSets.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/FileSets.java @@ -1,8 +1,8 @@ package org.gcube.application.geoportal.common.utils; import org.gcube.application.geoportal.common.model.legacy.InputStreamDescriptor; -import org.gcube.application.geoportal.common.model.rest.AddSectionToConcessioneRequest; -import org.gcube.application.geoportal.common.rest.TempFile; +import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; +import org.gcube.application.geoportal.common.model.rest.TempFile; import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException; import java.io.File; @@ -13,7 +13,7 @@ import java.util.ArrayList; public class FileSets { public static class RequestBuilder { - AddSectionToConcessioneRequest theRequest=new AddSectionToConcessioneRequest(); + RegisterFileSetRequest theRequest=new RegisterFileSetRequest(); public RequestBuilder add(TempFile... f){ if(theRequest.getStreams()==null) @@ -39,7 +39,7 @@ public class FileSets { - public AddSectionToConcessioneRequest getTheRequest(){return theRequest;} + public RegisterFileSetRequest getTheRequest(){return theRequest;} } @@ -62,7 +62,7 @@ public class FileSets { return toReturn.toArray(new TempFile[toReturn.size()]); } - public static AddSectionToConcessioneRequest prepareRequestFromFolder(StorageUtils storage, String path, File directory) throws FileNotFoundException { + public static RegisterFileSetRequest prepareRequestFromFolder(StorageUtils storage, String path, File directory) throws FileNotFoundException { File[] children =directory.listFiles(); System.out.println("Found "+children+ " files to push"); @@ -71,7 +71,7 @@ public class FileSets { } - public static AddSectionToConcessioneRequest prepareRequest(StorageUtils storage, String path, File... toUpload) throws FileNotFoundException { + public static RegisterFileSetRequest prepareRequest(StorageUtils storage, String path, File... toUpload) throws FileNotFoundException { FileSets.RequestBuilder builder = FileSets.build(path); for (File f : toUpload) { diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/JSONPathWrapper.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/JSONPathWrapper.java index d90461e..4e75137 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/JSONPathWrapper.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/JSONPathWrapper.java @@ -1,12 +1,14 @@ package org.gcube.application.geoportal.common.utils; + import com.jayway.jsonpath.*; +import com.jayway.jsonpath.spi.json.JacksonJsonProvider; +import com.jayway.jsonpath.spi.json.JsonProvider; +import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider; +import com.jayway.jsonpath.spi.mapper.MappingProvider; import lombok.Getter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; +import java.util.*; public class JSONPathWrapper { @@ -14,11 +16,33 @@ public class JSONPathWrapper { public static Configuration JSON_PATH_PATHS_CONFIGURATION=null; static { + Configuration.setDefaults(new Configuration.Defaults() { + private JsonProvider jacksonProvider = new JacksonJsonProvider(); + + private final MappingProvider mappingProvider = new JacksonMappingProvider(); + @Override + public JsonProvider jsonProvider() { + return jacksonProvider; + } + + @Override + public Set