diff --git a/geoportal-service/pom.xml b/geoportal-service/pom.xml index cc3c96a..658cc1a 100644 --- a/geoportal-service/pom.xml +++ b/geoportal-service/pom.xml @@ -93,6 +93,13 @@ + + + net.postgis + postgis-jdbc + 2.5.0 + + org.gcube.spatial.data @@ -100,12 +107,6 @@ [2.4.6,3.0.0) - - - net.postgis - postgis-jdbc - 2.5.0 - @@ -216,6 +217,12 @@ test + + org.gcube.application.cms + sdi-plugins + test + + junit junit diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfileManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfileManager.java new file mode 100644 index 0000000..e12f3b1 --- /dev/null +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfileManager.java @@ -0,0 +1,22 @@ +package org.gcube.application.geoportal.service.engine.mongo; + +import org.bson.Document; +import org.gcube.application.cms.caches.Engine; +import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.model.profile.Profile; +import org.gcube.application.geoportal.common.model.rest.QueryRequest; + +import java.util.Iterator; + +public interface ProfileManager { + + public Profile create(Document toCreate); + + public Iterable query(QueryRequest request); + + public void deleteById(String id,boolean force); + + public Profile update(String ID, Document toSet); + + public Profile getById(String id); +} 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 da98e4b..134efa8 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 @@ -312,7 +312,11 @@ public class ProfiledMongoManager extends MongoManager implements MongoManagerI< if(matchingPaths.isEmpty()) throw new WebApplicationException("PArent path not found at "+request.getParentPath(),Response.Status.BAD_REQUEST); String parentMatchingPath = matchingPaths.get(0); - Document parent = Serialization.asDocument(docWrapper.getByPath(parentMatchingPath).get(0)); + List foundElementsByMatchingPaths = docWrapper.getByPath(parentMatchingPath); + if(foundElementsByMatchingPaths == null || foundElementsByMatchingPaths.isEmpty()) + throw new WebApplicationException("No element found at "+ parentMatchingPath,Response.Status.BAD_REQUEST); + + Document parent = Serialization.asDocument(foundElementsByMatchingPaths.get(0)); // PREPARE REGISTERED FS diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisDBManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisDBManager.java index b7bff44..341027e 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisDBManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/postgis/PostgisDBManager.java @@ -25,8 +25,8 @@ public class PostgisDBManager implements PostgisDBManagerI { // TODO GENERIC DatabaseConnection defaultConfiguration= - ((ISUtils)ImplementationProvider.get().getEngineByClass(ISInterface.class)) - .queryForDB("postgis", "Concessioni"); + ImplementationProvider.get().getEngineByClass(ISInterface.class) + .queryForDatabase("Database","postgis", "GNA_DB","Concessioni"); log.debug("Found configuration : "+defaultConfiguration); config=defaultConfiguration; diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/PluginManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/PluginManager.java index 43b9e6c..bf6f411 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/PluginManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/providers/PluginManager.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.caches.AbstractScopedMap; import org.gcube.application.cms.plugins.*; import org.gcube.application.cms.plugins.faults.InitializationException; +import org.gcube.application.cms.plugins.faults.PluginExecutionException; import org.gcube.application.cms.plugins.faults.ShutDownException; import org.gcube.application.cms.plugins.reports.InitializationReport; import org.gcube.application.geoportal.common.model.profile.Profile; @@ -115,18 +116,26 @@ public class PluginManager extends AbstractScopedMap im } private static final void logReport(Plugin p, InitializationReport report){ - switch(report.getStatus()){ - case ERROR: { - log.error("Plugin [{}] STATUS : {}, INFO {} ",p.getDescriptor().getId(),report.getStatus(),report.getMessages()); - break; - } - case WARNING: { - log.warn("Plugin [{}] STATUS : {}, INFO {} ",p.getDescriptor().getId(),report.getStatus(),report.getMessages()); - break; - } - default :{ - log.info("Plugin [{}] STATUS : {}, INFO {} ",p.getDescriptor().getId(),report.getStatus(),report.getMessages()); + if(report==null) + log.warn("WARNING : Initialization Report by {} IS null ",p.getDescriptor().getId()); + else + try { + report.validate(); + switch (report.getStatus()) { + case ERROR: { + log.error("Plugin [{}] STATUS : {}, INFO {} ", p.getDescriptor().getId(), report.getStatus(), report.getMessages()); + break; + } + case WARNING: { + log.warn("Plugin [{}] STATUS : {}, INFO {} ", p.getDescriptor().getId(), report.getStatus(), report.getMessages()); + break; + } + default: { + log.info("Plugin [{}] STATUS : {}, INFO {} ", p.getDescriptor().getId(), report.getStatus(), report.getMessages()); + } } + }catch (PluginExecutionException e) { + log.warn("Invalid report provided by {} ",p.getDescriptor().getId(),e); } } } diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/UseCaseDescriptors.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/UseCaseDescriptors.java new file mode 100644 index 0000000..83297ac --- /dev/null +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/rest/UseCaseDescriptors.java @@ -0,0 +1,94 @@ +package org.gcube.application.geoportal.service.rest; + +import lombok.extern.slf4j.Slf4j; +import org.bson.Document; +import org.gcube.application.cms.serialization.Serialization; +import org.gcube.application.geoportal.common.model.document.ProfiledDocument; +import org.gcube.application.geoportal.common.model.profile.Profile; +import org.gcube.application.geoportal.common.rest.InterfaceConstants; +import org.gcube.application.geoportal.service.engine.mongo.ProfileManager; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; + +@Path(InterfaceConstants.Methods.PROFILES) +@Slf4j +public class UseCaseDescriptors { + + private ProfileManager profileEngine; + + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Profile createNew(Document toCreate) { + return new GuardedMethod() { + @Override + protected Profile run() throws Exception, WebApplicationException { + log.info("Creating new Profile ({})",toCreate); + Profile toReturn= profileEngine.create(toCreate); + log.info("Created new Profile (ID {})",toReturn.getId()); + return toReturn; + } + }.execute().getResult(); + } + + @PUT + @Path("{"+InterfaceConstants.Parameters.PROFILE_ID+"}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Profile update(@PathParam(InterfaceConstants.Parameters.PROFILE_ID) String profileId, Document d) { + return new GuardedMethod() { + @Override + protected Profile run() throws Exception, WebApplicationException { + log.warn("Updating Profile ({})",profileId); + return profileEngine.update(profileId,d); + } + }.execute().getResult(); + } + + + @DELETE + @Produces(MediaType.APPLICATION_JSON) + @Path("{"+InterfaceConstants.Parameters.PROFILE_ID+"}") + public Boolean delete(@PathParam(InterfaceConstants.Parameters.PROFILE_ID) String id, + @DefaultValue("false") + @QueryParam(InterfaceConstants.Parameters.FORCE) Boolean force) { + return new GuardedMethod() { + @Override + protected Boolean run() throws Exception, WebApplicationException { + log.warn("Deleting Profile (ID {}). Force is {}",id,force); + profileEngine.deleteById(id,force); + return true; + } + }.execute().getResult(); + } + + + // BY ID + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("{"+InterfaceConstants.Parameters.PROFILE_ID+"}") + public Profile getById(@PathParam(InterfaceConstants.Parameters.PROFILE_ID) String id) { + return new GuardedMethod() { + @Override + protected Profile run() throws Exception, WebApplicationException { + return profileEngine.getById(id); + } + }.execute().getResult(); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/"+InterfaceConstants.Methods.QUERY_PATH) + public Iterable query(String queryString){ + return new GuardedMethod>() { + @Override + protected Iterable run() throws Exception, WebApplicationException { + return profileEngine.query(Serialization.parseQuery(queryString)); + } + }.execute().getResult(); + } + +} diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProfiledDocumentTest.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProfiledDocumentTest.java index 81155f3..bd625a1 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProfiledDocumentTest.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/DummyProfiledDocumentTest.java @@ -92,79 +92,79 @@ public class DummyProfiledDocumentTest extends AbstractProfiledDocumentsTests{ } - @Test - public void testSDI() throws Exception { - // Create new - ProfiledDocument doc = createNew(new Document("posizionamentoScavo",new Document("title","Mio pos"))); - - // register filesets - doc = upload( - new StorageUtils(), - doc.getId(), - "posizionamentoScavo","fileset", - "posizionamentoScavo."+Field.CHILDREN+"[?(@.fileset)]", - null, - RegisterFileSetRequest.ClashOptions.REPLACE_EXISTING, - "pos.shp","pos.shx"); - - System.out.println("Registered posizionamento, result is "+ Serialization.write(doc)); - - // invoke step SUBMIT-FOR-REVIEW - StepExecutionRequest req=new StepExecutionRequest(); - req.setStepID("SUBMIT-FOR-REVIEW"); - doc=step(doc.getId(),req); - System.out.println(doc); - if(doc.getLifecycleInformation().getErrorMessages()!=null) { - System.out.println("ERROR MESSAGES"); - doc.getLifecycleInformation().getErrorMessages().forEach(s -> System.out.println(s)); - } - if(doc.getLifecycleInformation().getWarningMessages()!=null) { - System.out.println("WARNING MESSAGES"); - doc.getLifecycleInformation().getWarningMessages().forEach(s -> System.out.println(s)); - } - - assertTrue(doc.getLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)); - - JSONPathWrapper wrapper = new JSONPathWrapper(doc.getTheDocument().toJson()); - RegisteredFileSet fs = Serialization.convert(wrapper.getByPath("$..fileset").get(0),RegisteredFileSet.class); - assertTrue(fs!=null); - assertTrue(fs.getPayloads().size()==2); - assertTrue(fs.getMaterializations().size()>0); - - - for(Object matObj : wrapper.getByPath("$..[?(@."+ Materialization.TYPE +" == '"+GCubeSDILayer.GCUBE_SDY_LAYER_TYPE+"' )]")){ - GCubeSDILayer layer = Serialization.convert(matObj, GCubeSDILayer.class); - System.out.println("Checking Layer : "+layer); - assertTrue(layer.getType().equals(GCubeSDILayer.GCUBE_SDY_LAYER_TYPE)); - assertTrue(layer.getOGCLinks().size()>0); - assertTrue(layer.getPlatformInfo().size()>0); - assertTrue(layer.getBBox()!=null); - } - - // Checking platform info GeoServer - for(Object platformObj : wrapper.getByPath("$..[?(@."+ Materialization.TYPE +" == 'GeoServer' )]")){ - Document platform=Serialization.asDocument(platformObj); - assertTrue(platform.containsKey("layerName")); - assertTrue(platform.containsKey("workspace")); - assertTrue(platform.containsKey("storeName")); - assertTrue(platform.containsKey("persistencePath")); - assertTrue(platform.get("files",List.class).size()==2); - } - - - req.setStepID("APPROVE DRAFT"); - doc=step(doc.getId(),req); - if(doc.getLifecycleInformation().getErrorMessages()!=null) { - System.out.println("ERROR MESSAGES"); - doc.getLifecycleInformation().getErrorMessages().forEach(s -> System.out.println(s)); - } - if(doc.getLifecycleInformation().getWarningMessages()!=null) { - System.out.println("WARNING MESSAGES"); - doc.getLifecycleInformation().getWarningMessages().forEach(s -> System.out.println(s)); - } - - assertTrue(doc.getLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)); - - } +// @Test +// public void testSDI() throws Exception { +// // Create new +// ProfiledDocument doc = createNew(new Document("posizionamentoScavo",new Document("title","Mio pos"))); +// +// // register filesets +// doc = upload( +// new StorageUtils(), +// doc.getId(), +// "posizionamentoScavo","fileset", +// "posizionamentoScavo."+Field.CHILDREN+"[?(@.fileset)]", +// null, +// RegisterFileSetRequest.ClashOptions.REPLACE_EXISTING, +// "pos.shp","pos.shx"); +// +// System.out.println("Registered posizionamento, result is "+ Serialization.write(doc)); +// +// // invoke step SUBMIT-FOR-REVIEW +// StepExecutionRequest req=new StepExecutionRequest(); +// req.setStepID("SUBMIT-FOR-REVIEW"); +// doc=step(doc.getId(),req); +// System.out.println(doc); +// if(doc.getLifecycleInformation().getErrorMessages()!=null) { +// System.out.println("ERROR MESSAGES"); +// doc.getLifecycleInformation().getErrorMessages().forEach(s -> System.out.println(s)); +// } +// if(doc.getLifecycleInformation().getWarningMessages()!=null) { +// System.out.println("WARNING MESSAGES"); +// doc.getLifecycleInformation().getWarningMessages().forEach(s -> System.out.println(s)); +// } +// +// assertTrue(doc.getLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)); +// +// JSONPathWrapper wrapper = new JSONPathWrapper(doc.getTheDocument().toJson()); +// RegisteredFileSet fs = Serialization.convert(wrapper.getByPath("$..fileset").get(0),RegisteredFileSet.class); +// assertTrue(fs!=null); +// assertTrue(fs.getPayloads().size()==2); +// assertTrue(fs.getMaterializations().size()>0); +// +// +// for(Object matObj : wrapper.getByPath("$..[?(@."+ Materialization.TYPE +" == '"+GCubeSDILayer.GCUBE_SDY_LAYER_TYPE+"' )]")){ +// GCubeSDILayer layer = Serialization.convert(matObj, GCubeSDILayer.class); +// System.out.println("Checking Layer : "+layer); +// assertTrue(layer.getType().equals(GCubeSDILayer.GCUBE_SDY_LAYER_TYPE)); +// assertTrue(layer.getOGCLinks().size()>0); +// assertTrue(layer.getPlatformInfo().size()>0); +// assertTrue(layer.getBBox()!=null); +// } +// +// // Checking platform info GeoServer +// for(Object platformObj : wrapper.getByPath("$..[?(@."+ Materialization.TYPE +" == 'GeoServer' )]")){ +// Document platform=Serialization.asDocument(platformObj); +// assertTrue(platform.containsKey("layerName")); +// assertTrue(platform.containsKey("workspace")); +// assertTrue(platform.containsKey("storeName")); +// assertTrue(platform.containsKey("persistencePath")); +// assertTrue(platform.get("files",List.class).size()==2); +// } +// +// +// req.setStepID("APPROVE DRAFT"); +// doc=step(doc.getId(),req); +// if(doc.getLifecycleInformation().getErrorMessages()!=null) { +// System.out.println("ERROR MESSAGES"); +// doc.getLifecycleInformation().getErrorMessages().forEach(s -> System.out.println(s)); +// } +// if(doc.getLifecycleInformation().getWarningMessages()!=null) { +// System.out.println("WARNING MESSAGES"); +// doc.getLifecycleInformation().getWarningMessages().forEach(s -> System.out.println(s)); +// } +// +// assertTrue(doc.getLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)); +// +// } } diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java index 30b64fd..0eb2df2 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/profiledDocuments/ProfiledConcessioniTests.java @@ -4,6 +4,7 @@ import org.bson.Document; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.geoportal.common.model.document.ProfiledDocument; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; +import org.gcube.application.geoportal.common.model.profile.Field; import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest; import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest; import org.gcube.application.geoportal.common.rest.InterfaceConstants; @@ -27,15 +28,21 @@ public class ProfiledConcessioniTests extends AbstractProfiledDocumentsTests{ @Test public void testSDI() throws Exception { // Create new - ProfiledDocument doc = createNew(new Document()); + Document theDoc=Document.parse("{\n" + + "\"posizionamentoScavo\" :{\n" + + "\t\"titolo\" : \"mio titolo\"}}"); + + ProfiledDocument doc = createNew(theDoc); + + // register filesets doc = upload( new StorageUtils(), doc.getId(), "posizionamentoScavo","fileset", - "posizionamentoScavo.children[?(@.fileset)]", - Document.parse("{\"titolo\" : \"mio titolo\",\"some\" : \"something\" }"), + "posizionamentoScavo."+ Field.CHILDREN+"[?(@.fileset)]", + null, RegisterFileSetRequest.ClashOptions.MERGE_EXISTING, "pos.shp");