From 85ceecda12697b9f660f946de1d989a7114a225d Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Mon, 14 Feb 2022 15:00:59 +0100 Subject: [PATCH] Concessioni Lifecycle invocation to SDI Materialization Plugin --- .../reports/MaterializationReport.java | 6 ++ .../requests/StepExecutionRequest.java | 4 ++ .../plugins/ConcessioniLifeCycleManager.java | 56 +++++++-------- .../plugins/SDIMaterializerPlugin.java | 68 ++++++++++++++++--- .../document/filesets/RegisteredFileSet.java | 2 + 5 files changed, 96 insertions(+), 40 deletions(-) diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/MaterializationReport.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/MaterializationReport.java index 1d409ba..f52adcf 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/MaterializationReport.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/reports/MaterializationReport.java @@ -1,5 +1,11 @@ package org.gcube.application.cms.plugins.reports; +import lombok.Data; +import org.gcube.application.geoportal.common.model.document.ProfiledDocument; + +@Data public class MaterializationReport extends Report{ + private ProfiledDocument resultDocument; + } diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/StepExecutionRequest.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/StepExecutionRequest.java index 2bcb157..c230f19 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/StepExecutionRequest.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/requests/StepExecutionRequest.java @@ -3,6 +3,8 @@ package org.gcube.application.cms.plugins.requests; import lombok.Data; import org.bson.Document; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.model.document.accounting.Context; +import org.gcube.application.geoportal.common.model.document.accounting.User; import org.gcube.application.geoportal.common.model.profile.Profile; @Data @@ -22,4 +24,6 @@ public class StepExecutionRequest { ProfiledDocument document; String step; Document callParameters; + User user; + Context context; } 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 1d6499b..af03548 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 @@ -5,9 +5,11 @@ import org.bson.BsonDocument; import org.bson.BsonString; import org.bson.BsonValue; import org.bson.Document; +import org.gcube.application.cms.plugins.MaterializationPlugin; import org.gcube.application.cms.plugins.faults.EventException; -import org.gcube.application.cms.plugins.reports.EventExecutionReport; +import org.gcube.application.cms.plugins.reports.*; import org.gcube.application.cms.plugins.requests.EventExecutionRequest; +import org.gcube.application.cms.plugins.requests.MaterializationRequest; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione; import org.gcube.application.cms.plugins.LifecycleManager; @@ -15,8 +17,6 @@ import org.gcube.application.cms.plugins.faults.InitializationException; import org.gcube.application.cms.plugins.faults.ShutDownException; import org.gcube.application.cms.plugins.faults.StepException; import org.gcube.application.cms.plugins.model.PluginDescriptor; -import org.gcube.application.cms.plugins.reports.StepExecutionReport; -import org.gcube.application.cms.plugins.reports.InitializationReport; import org.gcube.application.cms.plugins.requests.StepExecutionRequest; import org.gcube.application.geoportal.common.model.document.*; import org.gcube.application.geoportal.common.model.document.access.Access; @@ -27,6 +27,7 @@ import org.gcube.application.geoportal.common.model.document.lifecycle.Triggered import org.gcube.application.geoportal.common.model.legacy.report.ConstraintCheck; import org.gcube.application.geoportal.common.model.rest.Configuration; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; +import org.gcube.application.geoportal.common.utils.Files; @Slf4j public class ConcessioniLifeCycleManager implements LifecycleManager { @@ -65,29 +66,28 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { try { switch (request.getStep()) { - - case StepExecutionRequest.Steps.ON_MATERIALIZE_DOCUMENT: { - // SDI Create Layers - break; - } - case StepExecutionRequest.Steps.ON_DEMATERIALIZE_DOCUMENT: { - // SDI Remove Layers - break; - } - case StepExecutionRequest.Steps.ON_DEINDEX_DOCUMENT: { - // SDI Remove from centroids - break; - } - case StepExecutionRequest.Steps.ON_INDEX_DOCUMENT: { - // SDI Add to centroids - break; - } - case "SUBMIT-FOR-REVIEW" :{ - //Checks - //Materialize layers - //Index-confidential - //Notifications + + //TODO Checks + //Materialize layers + MaterializationRequest matReq = new MaterializationRequest(); + matReq.setDocument(request.getDocument()); + matReq.setProfile(request.getProfile()); + Document params = new Document(); + String workspace = request.getProfile().getId() + request.getContext().getId(); + params.put("workspace", Files.fixFilename(workspace)); + + matReq.setParameters(params); + MaterializationReport matRep = new SDIMaterializerPlugin().materialize(matReq); + + if (!matRep.getStatus().equals(Report.Status.OK)) { + info.setLastOperationStatus(LifecycleInformation.Status.ERROR); + for(String msg : matRep.getMessages()) + info.addErrorMessage(msg); + } + //TODO Index-confidential + //TODO Notifications + break; } @@ -98,6 +98,7 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { } case "APPROVE DRAFT":{ + // Index-published break; } @@ -160,11 +161,6 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { } - // Materialization - private static final void materialize(){ - - } - // STATIC ROUTINES diff --git a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/SDIMaterializerPlugin.java b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/SDIMaterializerPlugin.java index 36ccd8e..61e7a9b 100644 --- a/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/SDIMaterializerPlugin.java +++ b/concessioni-lifecycle/src/main/java/org/gcube/application/cms/concessioni/plugins/SDIMaterializerPlugin.java @@ -1,8 +1,11 @@ package org.gcube.application.cms.concessioni.plugins; +import com.mongodb.util.JSON; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.cms.concessioni.sdi.SDIManager; +import org.gcube.application.cms.concessioni.sdi.faults.SDIInteractionException; import org.gcube.application.cms.plugins.MaterializationPlugin; import org.gcube.application.cms.plugins.faults.InitializationException; import org.gcube.application.cms.plugins.faults.MaterializationException; @@ -10,16 +13,29 @@ import org.gcube.application.cms.plugins.faults.ShutDownException; import org.gcube.application.cms.plugins.model.PluginDescriptor; import org.gcube.application.cms.plugins.reports.InitializationReport; import org.gcube.application.cms.plugins.reports.MaterializationReport; +import org.gcube.application.cms.plugins.reports.Report; import org.gcube.application.cms.plugins.requests.MaterializationRequest; +import org.gcube.application.cms.serialization.Serialization; +import org.gcube.application.geoportal.common.model.JSONPathWrapper; +import org.gcube.application.geoportal.common.model.document.filesets.Materialization; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet; +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 java.util.List; + @Slf4j public class SDIMaterializerPlugin implements MaterializationPlugin { + @Data + public static class MaterializationConfig{ + private String schemaField; + private String documentPath; + } + SDIManager sdiManager; @Override @@ -37,10 +53,19 @@ public class SDIMaterializerPlugin implements MaterializationPlugin { } + /** + * Expected params : + * -workspace MANDATORY + * -titleField + * + * @param request + * @return + * @throws MaterializationException + */ @Override public MaterializationReport materialize(MaterializationRequest request) throws MaterializationException { log.info("Materializer {} : Performing {} ",this.getDescriptor().getId(),request); - ProfiledDocument doc=request.getDocument(); + ProfiledDocument profiledDocument=request.getDocument(); Profile profile = request.getProfile(); Document configuration=request.getParameters(); Document profileConfiguration =null; @@ -50,22 +75,45 @@ public class SDIMaterializerPlugin implements MaterializationPlugin { } } + MaterializationReport report= new MaterializationReport(); + log.debug("Profile Configuration is {} ",profileConfiguration); try{ - // for each - RegisteredFileSet fileSet=null; - sdiManager.materializeLayer() + JSONPathWrapper documentNavigator=new JSONPathWrapper(profiledDocument.getTheDocument().toJson()); + JSONPathWrapper profileNavigator=new JSONPathWrapper(profile.getSchema().toJson()); + for(Object fsConfigObj : configuration.get("registeredFileSetPaths", List.class)){ + log.debug("Managing {} ",fsConfigObj); + MaterializationConfig fsConfig=Serialization.convert(fsConfigObj,MaterializationConfig.class); + Field f = profileNavigator.getByPath(fsConfig.getSchemaField(), Field.class).get(0); + // TODO Check if schema points to RegisteredFileSet - }catch (MaterializationException e){ - throw e; + for(RegisteredFileSet fs : documentNavigator.getByPath(fsConfig.getDocumentPath(),RegisteredFileSet.class)){ + log.debug("Found {} ",fs); + configuration.putIfAbsent("basePersistencePath",profile.getId()); + configuration.putIfAbsent("documentID",profiledDocument.get_id()); + if(configuration.containsKey("titleField")) + configuration.putIfAbsent("layerTitle",fs.getString(configuration.getString("titleField"))); + RegisteredFileSet obtained = sdiManager.materializeLayer(fs,configuration); + log.debug("Obtained {} ",obtained); + documentNavigator.set("$..[?(@.uuid == "+fs.getUUID()+")]",obtained); + } + } + + profiledDocument.setTheDocument(Document.parse(documentNavigator.getCtx().json())); + report.setResultDocument(profiledDocument); + report.setStatus(Report.Status.OK); + }catch (SDIInteractionException e){ + log.error("Unable to materialize "+request,e); + report.setStatus(Report.Status.ERROR); + report.putMessage(e.getMessage()); }catch (Throwable t){ - log.error("Unable to execute on event "+request.getEvent(),t); - info.setLastOperationStatus(LifecycleInformation.Status.ERROR); - info.addErrorMessage("Unable to execute on event "+request.getEvent()+". Error was "+t.getMessage()); + log.error("Unable to materialize "+request,t); + report.setStatus(Report.Status.ERROR); + report.putMessage(t.getMessage()); }finally{ - + return report; } } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/RegisteredFileSet.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/RegisteredFileSet.java index 0328ca4..c11291f 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/RegisteredFileSet.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/model/document/filesets/RegisteredFileSet.java @@ -9,6 +9,8 @@ import java.util.List; @ToString (callSuper = true) public class RegisteredFileSet extends Document { + + public static final String UUID="uuid"; public static final String CREATION_INFO="creationInfo"; public static final String ACCESS="access";