From 5d3e56754f0fc52de7d30612bf1ecbb847b69f14 Mon Sep 17 00:00:00 2001 From: Fabio Sinibaldi Date: Thu, 7 Apr 2022 16:14:52 +0200 Subject: [PATCH] Engine startup --- .../ImplementationProvider.java | 49 +++++++++++++++++++ .../common/utils/tests/GCubeTest.java | 2 +- geoportal-service/pom.xml | 1 + .../geoportal/service/AppManager.java | 32 ++++++------ .../geoportal/service/GeoPortalService.java | 5 +- .../service/BasicServiceTestUnit.java | 12 ++++- .../service/engine/profiles/UCDCalls.java | 16 +++++- 7 files changed, 97 insertions(+), 20 deletions(-) diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ImplementationProvider.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ImplementationProvider.java index 455584d..9b243f8 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ImplementationProvider.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/implementations/ImplementationProvider.java @@ -2,14 +2,17 @@ package org.gcube.application.cms.implementations; import lombok.Synchronized; +import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.caches.Cache; import org.gcube.application.cms.caches.Engine; import org.gcube.application.geoportal.common.model.rest.ConfigurationException; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +@Slf4j public class ImplementationProvider { private static ImplementationProvider instance=null; @@ -45,4 +48,50 @@ public class ImplementationProvider { ); return toReturn; } + + private boolean isInit=false; + + @Synchronized + public void initEngines(){ + if(!isInit) { + log.info("INITIALIZING ENGINES. Size : {} ", implementationsRegistry.size()); + HashSet failed = new HashSet<>(); + implementationsRegistry.forEach((aClass, engine) -> { + log.info("Init : {} -> {}", engine.getClass().toGenericString(), aClass.getCanonicalName()); + try { + engine.init(); + } catch (Throwable t) { + failed.add(engine.getClass()); + log.error("Unable to start engine {} ", engine.getClass(), t); + } + }); + if (failed.isEmpty()) + log.info("INIT OK"); + else { + log.warn("!!!!! Following Engines FAILED INIT :"); + failed.forEach(aClass -> log.warn(String.valueOf(aClass))); + } + isInit = true; + }else log.info("Received Init request but Engines already started"); + } + + public void shutdownEngines(){ + log.info("SHUTTING DOWN ENGINES. Size : {} ",implementationsRegistry.size()); + HashSet failed= new HashSet<>(); + implementationsRegistry.forEach((aClass, engine) -> { + log.info("ShotDown : {} -> {}",engine.getClass().toGenericString(),aClass.getCanonicalName()); + try{ + engine.shutdown(); + }catch (Throwable t){ + failed.add(engine.getClass()); + log.error("Unable to shutdown engine {} ",engine.getClass(),t); + } + }); + if(failed.isEmpty()) + log.info("SHUTDOWN OK"); + else { + log.warn("!!!!! Following Engines FAILED SHUTDOWN :"); + failed.forEach(aClass->log.warn(String.valueOf(aClass))); + } + } } diff --git a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java index 20008ba..d351282 100644 --- a/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java +++ b/geoportal-common/src/main/java/org/gcube/application/geoportal/common/utils/tests/GCubeTest.java @@ -14,7 +14,7 @@ public class GCubeTest { // testContext = "/pred4s/preprod/preVRE"; - //testContext = "/gcube/devsec/devVRE"; + testContext = "/gcube/devsec/devVRE"; System.out.println("TEST CONTEXT = "+testContext); diff --git a/geoportal-service/pom.xml b/geoportal-service/pom.xml index 70bc908..9910686 100644 --- a/geoportal-service/pom.xml +++ b/geoportal-service/pom.xml @@ -49,6 +49,7 @@ common-smartgears + org.gcube.application.cms diff --git a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/AppManager.java b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/AppManager.java index 517218a..fe85154 100644 --- a/geoportal-service/src/main/java/org/gcube/application/geoportal/service/AppManager.java +++ b/geoportal-service/src/main/java/org/gcube/application/geoportal/service/AppManager.java @@ -1,18 +1,22 @@ package org.gcube.application.geoportal.service; -public class AppManager { - -// implements ApplicationManager{ -//} -// -// @Override -// public void onInit() { -// ImplementationProvider.get().shutdown(); -// } -// -// @Override -// public void onShutdown() { -// ImplementationProvider.get().shutdown(); -// } +import lombok.extern.slf4j.Slf4j; +import org.gcube.application.cms.implementations.ImplementationProvider; +import org.gcube.smartgears.ApplicationManager; + +@Slf4j +public class AppManager implements ApplicationManager { + + + + @Override + public void onInit() { + ImplementationProvider.get().initEngines(); + } + + @Override + public void onShutdown() { + ImplementationProvider.get().shutdownEngines(); + } } 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 255c948..e6cb36b 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 @@ -66,6 +66,7 @@ public class GeoPortalService extends ResourceConfig{ ImplementationProvider.get().getManagerList().forEach( (aClass, s) -> log.debug("{} serving {} ",aClass,s)); + ImplementationProvider.get().initEngines(); log.info("Initializing serialization"); JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider(); @@ -73,6 +74,8 @@ public class GeoPortalService extends ResourceConfig{ register(provider); } - + + + } 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 522e003..dcdff2f 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 @@ -1,5 +1,6 @@ package org.gcube.application.geoportal.service; +import com.fasterxml.jackson.databind.cfg.ContextAttributes; import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.caches.Engine; import org.gcube.application.cms.implementations.ImplementationProvider; @@ -11,6 +12,7 @@ import org.gcube.application.geoportal.service.engine.providers.ucd.ProfileMap; import org.gcube.application.geoportal.service.rest.GuardedMethod; import org.gcube.application.cms.serialization.Serialization; import org.glassfish.jersey.test.JerseyTest; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.opengis.annotation.Profile; @@ -25,7 +27,7 @@ import static org.junit.Assume.assumeTrue; @Slf4j public class BasicServiceTestUnit extends JerseyTest { - + protected static Boolean USE_LOCAL_FOLDER=false; @Override @@ -33,9 +35,12 @@ public class BasicServiceTestUnit extends JerseyTest { return new GeoPortalService(){ @Override public Map, Class> customImplementations() { + if(USE_LOCAL_FOLDER) return Collections.singletonMap((Engine) new LocalFolderProfileMapCache(TestProfiles.BASE_FOLDER.getAbsolutePath()),ProfileMap.class); + else return Collections.emptyMap(); } + }; } @@ -55,7 +60,10 @@ public class BasicServiceTestUnit extends JerseyTest { }); } - + @AfterClass + public static void shutdown(){ + ImplementationProvider.get().shutdownEngines(); + } protected static T check(Response resp, Class clazz) throws Exception { String resString=resp.readEntity(String.class); diff --git a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/profiles/UCDCalls.java b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/profiles/UCDCalls.java index 4c65d01..1047114 100644 --- a/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/profiles/UCDCalls.java +++ b/geoportal-service/src/test/java/org/gcube/application/geoportal/service/engine/profiles/UCDCalls.java @@ -19,6 +19,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.List; +import static junit.framework.Assert.fail; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; import static org.junit.Assume.assumeTrue; @@ -47,8 +48,19 @@ public class UCDCalls extends BasicServiceTestUnit { @Test public void getById() throws Exception { - String testProfileId="profiledConcessioni"; - check(baseTarget().path(testProfileId).request(MediaType.APPLICATION_JSON_TYPE).get(), UseCaseDescriptor.class); + List result=check(baseTarget().path(InterfaceConstants.Methods.QUERY_PATH).request(MediaType.APPLICATION_JSON_TYPE). + post(Entity.entity(Serialization.write(new QueryRequest()),MediaType.APPLICATION_JSON)), List.class); + + assertTrue("Existing UCDs : ",result.size()>0); + result.forEach(c->{ + try{ + UseCaseDescriptor d= Serialization.convert(c,UseCaseDescriptor.class); + check(baseTarget().path(d.getId()).request(MediaType.APPLICATION_JSON_TYPE).get(), UseCaseDescriptor.class); + } catch (Exception e) { + e.printStackTrace(System.err); + fail(e.getMessage()); + } + }); } @Test