From 70287f45ef7f03a52216d08bb1537b47c9eca477 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Fri, 4 Dec 2020 18:37:15 +0100 Subject: [PATCH] Project interface --- CHANGELOG.md | 2 + pom.xml | 2 +- .../service/engine/ProfileMapCache.java | 7 +- .../service/engine/mongo/MongoManager.java | 14 +- .../engine/mongo/ProfiledMongoManager.java | 5 + .../geoportal/service/rest/Commons.java | 8 + .../geoportal/service/rest/GuardedMethod.java | 33 ++++ .../geoportal/service/rest/Projects.java | 143 ++++++++++++------ .../service/BasicServiceTestUnit.java | 51 +++++++ .../geoportal/service/ProjectTests.java | 79 ++++++++++ .../service/legacy/ConcessioniTest.java | 42 +---- .../geoportal/service/legacy/MongoTests.java | 10 +- 12 files changed, 292 insertions(+), 104 deletions(-) create mode 100644 src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java create mode 100644 src/main/java/org/gcube/application/geoportal/service/rest/Commons.java create mode 100644 src/main/java/org/gcube/application/geoportal/service/rest/GuardedMethod.java create mode 100644 src/test/java/org/gcube/application/geoportal/service/BasicServiceTestUnit.java create mode 100644 src/test/java/org/gcube/application/geoportal/service/ProjectTests.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 17c3b57..540cbc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [v1.0.1-SNAPSHOT] 2020-11-11 +Project interface + ## [v1.0.0] 2020-11-11 First release diff --git a/pom.xml b/pom.xml index 616e6aa..39d598a 100644 --- a/pom.xml +++ b/pom.xml @@ -96,7 +96,7 @@ org.gcube.application geoportal-logic - [1.0.4,2.0.0) + [1.0.4-SNAPSHOT,2.0.0) diff --git a/src/main/java/org/gcube/application/geoportal/service/engine/ProfileMapCache.java b/src/main/java/org/gcube/application/geoportal/service/engine/ProfileMapCache.java index 550d313..ca1281b 100644 --- a/src/main/java/org/gcube/application/geoportal/service/engine/ProfileMapCache.java +++ b/src/main/java/org/gcube/application/geoportal/service/engine/ProfileMapCache.java @@ -1,6 +1,5 @@ package org.gcube.application.geoportal.service.engine; -import java.util.Collections; import java.util.Map; import org.gcube.application.geoportal.common.model.profile.Profile; @@ -27,10 +26,8 @@ public class ProfileMapCache extends AbstractScopedMap> { @Override protected Map retrieveObject() throws ConfigurationException { - //TODO load from IS -// Profile fakeProfile=new Profile(); - - return Collections.singletonMap(null, null); + // TODO Auto-generated method stub + return null; } } diff --git a/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManager.java b/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManager.java index b373b86..68e7968 100644 --- a/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManager.java +++ b/src/main/java/org/gcube/application/geoportal/service/engine/mongo/MongoManager.java @@ -1,17 +1,17 @@ package org.gcube.application.geoportal.service.engine.mongo; + import org.bson.Document; import org.gcube.application.geoportal.common.model.profile.Profile; import org.gcube.application.geoportal.common.model.project.Project; import org.gcube.application.geoportal.model.fault.ConfigurationException; -import org.gcube.application.geoportal.service.engine.ImplementationProvider; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; -public class MongoManager { +public abstract class MongoManager { private MongoClient client=null; @@ -19,14 +19,16 @@ public class MongoManager { public MongoManager() throws ConfigurationException { - client=ImplementationProvider.get().getMongoClientProvider().getObject(); +// client=ImplementationProvider.get().getMongoClientProvider().getObject(); // init profile } - private MongoDatabase getDatabase() { - return client.getDatabase("gna-db"); - } +// private abstract MongoDatabase getDatabase() { +// return client.getDatabase("gna-db"); +// } + + protected abstract MongoDatabase getDatabase(); //*********** PROJECTS public void insert(Project proj, Profile profile) { diff --git a/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java b/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java new file mode 100644 index 0000000..55de3e1 --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/service/engine/mongo/ProfiledMongoManager.java @@ -0,0 +1,5 @@ +package org.gcube.application.geoportal.service.engine.mongo; + +public class ProfiledMongoManager { + +} diff --git a/src/main/java/org/gcube/application/geoportal/service/rest/Commons.java b/src/main/java/org/gcube/application/geoportal/service/rest/Commons.java new file mode 100644 index 0000000..cc3a81e --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/service/rest/Commons.java @@ -0,0 +1,8 @@ +package org.gcube.application.geoportal.service.rest; + +public class Commons { + + + + +} diff --git a/src/main/java/org/gcube/application/geoportal/service/rest/GuardedMethod.java b/src/main/java/org/gcube/application/geoportal/service/rest/GuardedMethod.java new file mode 100644 index 0000000..e6ca775 --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/service/rest/GuardedMethod.java @@ -0,0 +1,33 @@ +package org.gcube.application.geoportal.service.rest; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response.Status; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public abstract class GuardedMethod { + + + private T result=null; + + public GuardedMethod execute() throws WebApplicationException{ + try { + result=run(); + return this; + }catch(WebApplicationException e) { + throw e; + }catch(Throwable t) { + log.error("Unexpected error ",t); + throw new WebApplicationException("Unexpected internal error", t,Status.INTERNAL_SERVER_ERROR); + } + + } + + public T getResult() { + return result; + } + + + protected abstract T run() throws Exception,WebApplicationException; +} diff --git a/src/main/java/org/gcube/application/geoportal/service/rest/Projects.java b/src/main/java/org/gcube/application/geoportal/service/rest/Projects.java index 2704b8b..b4c481e 100644 --- a/src/main/java/org/gcube/application/geoportal/service/rest/Projects.java +++ b/src/main/java/org/gcube/application/geoportal/service/rest/Projects.java @@ -1,7 +1,11 @@ package org.gcube.application.geoportal.service.rest; +import java.util.Collections; +import java.util.List; + import javax.ws.rs.Consumes; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; @@ -9,6 +13,7 @@ import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; +import org.bson.Document; import org.gcube.application.geoportal.common.model.project.Project; import org.gcube.application.geoportal.common.rest.InterfaceConstants; @@ -18,61 +23,105 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class Projects { - // GET BY ID + //***************** GENERIC PROJECTS + // GET ALL @GET @Produces(MediaType.APPLICATION_JSON) - @Path("{"+InterfaceConstants.Parameters.PROJECT_ID+"}") - public Project getByID(@PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id) { - try { - log.info("Looking for profile [ID :{} ]",id); - throw new RuntimeException("Feature not yet available"); - }catch(WebApplicationException e){ - log.warn("Unable to serve request",e); - throw e; - }catch(Throwable e){ - log.warn("Unable to serve request",e); - throw new WebApplicationException("Unable to serve request", e); - } + public List getAll() { + return new GuardedMethod>() { + protected List run() throws Exception ,WebApplicationException { + return Collections.singletonList(new Project()); + }; + }.execute().getResult(); } - - - // GET ALL (Filters apply) - @GET + + @POST + @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Project getAll() { - try { - log.info("Loading all projects.."); - throw new RuntimeException("Feature not yet available"); - }catch(WebApplicationException e){ - log.warn("Unable to serve request",e); - throw e; - }catch(Throwable e){ - log.warn("Unable to serve request",e); - throw new WebApplicationException("Unable to serve request", e); - } + @Path("/search") + public List getFilteredAll(Document filter){ + return new GuardedMethod>() { + protected List run() throws Exception ,WebApplicationException { + return Collections.singletonList(new Project()); + }; + }.execute().getResult(); } - + + + //***************** BY PROFILE ID + // Create new Project @PUT @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) - public Project registerNew(Project toRegister) { - try { - log.info("Loading all projects.."); - throw new RuntimeException("Feature not yet available"); - }catch(WebApplicationException e){ - log.warn("Unable to serve request",e); - throw e; - }catch(Throwable e){ - log.warn("Unable to serve request",e); - throw new WebApplicationException("Unable to serve request", e); - } + @Path("{"+InterfaceConstants.Parameters.PROFILE_ID+"}") + public Project registerNew(@PathParam(InterfaceConstants.Parameters.PROFILE_ID)String profileId, + Document toRegister) { + return new GuardedMethod() { + @Override + protected Project run() throws Exception, WebApplicationException { + return new Project(); + } + }.execute().getResult(); + } + + + // GET ALL (Filters apply) + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/search/{"+InterfaceConstants.Parameters.PROFILE_ID+"}") + public List getFilteredAllInProfiles(@PathParam(InterfaceConstants.Parameters.PROFILE_ID)String profileId, + Document filters) { + return new GuardedMethod>() { + protected List run() throws Exception ,WebApplicationException { + return Collections.singletonList(new Project()); + }; + }.execute().getResult(); + } + + // GET ALL + @GET + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("{"+InterfaceConstants.Parameters.PROFILE_ID+"}") + public List getAllinProfile(@PathParam(InterfaceConstants.Parameters.PROFILE_ID)String profileId) { + return new GuardedMethod>() { + protected List run() throws Exception ,WebApplicationException { + return Collections.singletonList(new Project()); + }; + }.execute().getResult(); + } + + + //***************** BY PROFILE ID + PROJECT ID + // GET BY ID + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("{"+InterfaceConstants.Parameters.PROFILE_ID+"}/{"+InterfaceConstants.Parameters.PROJECT_ID+"}") + public Project getByID(@PathParam(InterfaceConstants.Parameters.PROFILE_ID) String profile, + @PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id) { + Project toReturn=new GuardedMethod() { + @Override + protected Project run() throws Exception ,WebApplicationException{ + return new Project(); + } + }.execute().getResult(); + return toReturn; + } + + @PUT + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("{"+InterfaceConstants.Parameters.PROFILE_ID+"}/{"+InterfaceConstants.Parameters.PROJECT_ID+"}") + public Project updateDocument(@PathParam(InterfaceConstants.Parameters.PROFILE_ID) String profile, + @PathParam(InterfaceConstants.Parameters.PROJECT_ID) String id,Document toSetDocument) { + Project toReturn=new GuardedMethod() { + @Override + protected Project run() throws Exception ,WebApplicationException{ + return new Project(); + } + }.execute().getResult(); + return toReturn; } - - - - - // Modify Project Document - - // Delete Project } diff --git a/src/test/java/org/gcube/application/geoportal/service/BasicServiceTestUnit.java b/src/test/java/org/gcube/application/geoportal/service/BasicServiceTestUnit.java new file mode 100644 index 0000000..61c9866 --- /dev/null +++ b/src/test/java/org/gcube/application/geoportal/service/BasicServiceTestUnit.java @@ -0,0 +1,51 @@ +package org.gcube.application.geoportal.service; + +import javax.persistence.EntityManagerFactory; +import javax.ws.rs.core.Application; + +import org.gcube.application.geoportal.managers.AbstractRecordManager; +import org.gcube.application.geoportal.model.fault.ConfigurationException; +import org.gcube.application.geoportal.service.engine.ImplementationProvider; +import org.gcube.application.geoportal.service.engine.ScopedEMFProvider; +import org.gcube.application.geoportal.service.engine.StorageClientProvider; +import org.gcube.application.geoportal.service.legacy.TokenSetter; +import org.gcube.contentmanagement.blobstorage.service.IClient; +import org.glassfish.jersey.test.JerseyTest; +import org.junit.BeforeClass; + +public class BasicServiceTestUnit extends JerseyTest { + + + + @Override + protected Application configure() { + return new GeoPortalService(); + } + + + + @BeforeClass + public static void init() { + String scope="/gcube/devsec/devVRE"; + AbstractRecordManager.setDefaultProvider( + + new ScopedEMFProvider(){ + + @Override + public EntityManagerFactory getFactory() { +// System.err.println("***********************SETTING DEBUG CONTEXT******************"); + TokenSetter.set(scope); + return super.getFactory(); + } + }); + + ImplementationProvider.get().setStorageProvider(new StorageClientProvider() { + @Override + public IClient getObject() throws ConfigurationException { + TokenSetter.set(scope); + return super.getObject(); + } + }); + + } +} diff --git a/src/test/java/org/gcube/application/geoportal/service/ProjectTests.java b/src/test/java/org/gcube/application/geoportal/service/ProjectTests.java new file mode 100644 index 0000000..b9b430c --- /dev/null +++ b/src/test/java/org/gcube/application/geoportal/service/ProjectTests.java @@ -0,0 +1,79 @@ +package org.gcube.application.geoportal.service; + +import java.util.Collections; +import java.util.List; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import org.bson.Document; +import org.gcube.application.geoportal.common.model.project.Project; +import org.gcube.application.geoportal.common.rest.InterfaceConstants; +import org.junit.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ProjectTests extends BasicServiceTestUnit{ + + String testProfileId="profiled_concessione"; + String projectId="asdlkjgdasfjklgadjhkl"; + + @Test + public void getAll() { + WebTarget target=target(InterfaceConstants.Methods.PROJECTS); + System.out.println(target.request(MediaType.APPLICATION_JSON).get(List.class)); + } + + @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 registerNew() { + WebTarget target=target(InterfaceConstants.Methods.PROJECTS); + Document document =new Document(Collections.singletonMap("key", "value")); + + System.out.println(target.path(testProfileId).request(MediaType.APPLICATION_JSON). + put(Entity.entity(document, MediaType.APPLICATION_JSON))); + } + + @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))); + } +} diff --git a/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java b/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java index 8cdbc07..1478edc 100644 --- a/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java +++ b/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java @@ -8,17 +8,14 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.util.Collection; -import javax.persistence.EntityManagerFactory; import javax.ws.rs.WebApplicationException; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.common.utils.Files; -import org.gcube.application.geoportal.managers.AbstractRecordManager; import org.gcube.application.geoportal.model.concessioni.Concessione; import org.gcube.application.geoportal.model.concessioni.LayerConcessione; import org.gcube.application.geoportal.model.content.AssociatedContent; @@ -26,58 +23,23 @@ import org.gcube.application.geoportal.model.content.UploadedImage; import org.gcube.application.geoportal.model.fault.ConfigurationException; import org.gcube.application.geoportal.model.report.PublicationReport; import org.gcube.application.geoportal.model.report.ValidationReport.ValidationStatus; -import org.gcube.application.geoportal.service.GeoPortalService; +import org.gcube.application.geoportal.service.BasicServiceTestUnit; import org.gcube.application.geoportal.service.engine.ImplementationProvider; -import org.gcube.application.geoportal.service.engine.ScopedEMFProvider; -import org.gcube.application.geoportal.service.engine.StorageClientProvider; import org.gcube.application.geoportal.service.model.internal.rest.AddSectionToConcessioneRequest; import org.gcube.application.geoportal.service.model.internal.rest.AddSectionToConcessioneRequest.SHUBFileDescriptor; import org.gcube.application.geoportal.service.model.internal.rest.AddSectionToConcessioneRequest.Section; import org.gcube.application.geoportal.service.utils.Serialization; import org.gcube.com.fasterxml.jackson.core.JsonProcessingException; -import org.gcube.contentmanagement.blobstorage.service.IClient; import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException; -import org.glassfish.jersey.test.JerseyTest; -import org.junit.BeforeClass; import org.junit.Test; import lombok.extern.slf4j.Slf4j; @Slf4j -public class ConcessioniTest extends JerseyTest { +public class ConcessioniTest extends BasicServiceTestUnit { - @Override - protected Application configure() { - return new GeoPortalService(); - } - - - @BeforeClass - public static void init() { - String scope="/gcube/devsec/devVRE"; - AbstractRecordManager.setDefaultProvider( - - new ScopedEMFProvider(){ - - @Override - public EntityManagerFactory getFactory() { -// System.err.println("***********************SETTING DEBUG CONTEXT******************"); - TokenSetter.set(scope); - return super.getFactory(); - } - }); - - ImplementationProvider.get().setStorageProvider(new StorageClientProvider() { - @Override - public IClient getObject() throws ConfigurationException { - TokenSetter.set(scope); - return super.getObject(); - } - }); - - } @Test public void readId() { diff --git a/src/test/java/org/gcube/application/geoportal/service/legacy/MongoTests.java b/src/test/java/org/gcube/application/geoportal/service/legacy/MongoTests.java index 25b5ae4..91742c6 100644 --- a/src/test/java/org/gcube/application/geoportal/service/legacy/MongoTests.java +++ b/src/test/java/org/gcube/application/geoportal/service/legacy/MongoTests.java @@ -40,11 +40,11 @@ public class MongoTests { @Test public void listProfiles() throws JsonProcessingException, IOException, ConfigurationException { - MongoManager manager=new MongoManager(); - Profile f=Serialization.mapper.readerFor(Profile.class).readValue( - Files.getFileFromResources("fakeProfile.json")); - - manager.iterate(new Document(),f).forEach(printBlock); +// MongoManager manager=new MongoManager(); +// Profile f=Serialization.mapper.readerFor(Profile.class).readValue( +// Files.getFileFromResources("fakeProfile.json")); +// +// manager.iterate(new Document(),f).forEach(printBlock); } // @Test