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;