diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/LifecycleManager.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/LifecycleManager.java index 5777d12..25f68a5 100644 --- a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/LifecycleManager.java +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/LifecycleManager.java @@ -19,4 +19,6 @@ public interface LifecycleManager extends InitializablePlugin{ public Configuration getCurrentConfiguration() throws ConfigurationException; public EventExecutionReport onEvent(EventExecutionRequest request) throws EventException; + + public void setPluginManager(PluginManagerInterface manager); } diff --git a/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginManagerInterface.java b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginManagerInterface.java new file mode 100644 index 0000000..1a0c2f4 --- /dev/null +++ b/cms-plugin-framework/src/main/java/org/gcube/application/cms/plugins/PluginManagerInterface.java @@ -0,0 +1,10 @@ +package org.gcube.application.cms.plugins; + +import org.gcube.application.cms.plugins.Plugin; +import org.gcube.application.geoportal.common.model.rest.ConfigurationException; + +public interface PluginManagerInterface { + + public Plugin getById(String pluginID) throws ConfigurationException; + +} 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 6d2adb2..0944db8 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 @@ -1,5 +1,6 @@ package org.gcube.application.cms.concessioni.plugins; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.bson.BsonDocument; import org.bson.BsonString; @@ -9,6 +10,7 @@ import org.gcube.application.cms.concessioni.sdi.SDIManager; import org.gcube.application.cms.concessioni.sdi.faults.SDIInteractionException; import org.gcube.application.cms.plugins.InitializablePlugin; import org.gcube.application.cms.plugins.MaterializationPlugin; +import org.gcube.application.cms.plugins.PluginManagerInterface; import org.gcube.application.cms.plugins.faults.EventException; import org.gcube.application.cms.plugins.reports.*; import org.gcube.application.cms.plugins.requests.EventExecutionRequest; @@ -42,6 +44,9 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { DESCRIPTOR.setVersion(new ComparableVersion("1.0.0")); } + @Setter + PluginManagerInterface pluginManager; + // TODO DISCOVER MaterializationPlugin plugin = new SDIMaterializerPlugin(); @@ -49,21 +54,8 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { public InitializationReport initInContext() throws InitializationException { InitializationReport report = new InitializationReport(); try{ - InitializationReport matPluginReport = plugin.initInContext(); - switch(matPluginReport.getStatus()){ - case OK: { - report.setStatus(Report.Status.OK); - report.putMessage("Initialized "+plugin.getDescriptor().getId()+" in current context"); - break; - } - default :{ - report.setStatus(Report.Status.WARNING); - report.putMessage("Unable to initialize "+plugin.getDescriptor().getId()); - matPluginReport.getMessages().forEach(s -> - report.putMessage(plugin.getDescriptor().getId()+" : "+s)); - } - } - } catch (InitializationException e) { + report.setStatus(Report.Status.OK); + } catch (Throwable e) { log.error("Unable to initialize plugins in {} ",ContextUtils.getCurrentScope(),e); report.setStatus(Report.Status.WARNING); report.putMessage("Unable to initialize plugins in "+ ContextUtils.getCurrentScope()+" : "+e.getMessage()); @@ -75,21 +67,10 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { public InitializationReport init() throws InitializationException { InitializationReport report = new InitializationReport(); try{ - InitializationReport matPluginReport = plugin.init(); - switch(matPluginReport.getStatus()){ - case OK: { - report.setStatus(Report.Status.OK); - report.putMessage("Initialized "+plugin.getDescriptor().getId()); - break; - } - default :{ - report.setStatus(Report.Status.WARNING); - report.putMessage("Unable to initialize "+plugin.getDescriptor().getId()); - matPluginReport.getMessages().forEach(s -> - report.putMessage(plugin.getDescriptor().getId()+" : "+s)); - } - } - } catch (InitializationException e) { + report.setStatus(Report.Status.OK); + plugin= (MaterializationPlugin) pluginManager.getById("SDI-Default-Materializer"); + if(plugin == null ) throw new InitializationException("SDI-Default-Materializer not found"); + } catch (Throwable e) { log.error("Unable to initialize plugins ",e); report.setStatus(Report.Status.WARNING); report.putMessage("Unable to initialize plugins : "+e.getMessage()); @@ -214,6 +195,8 @@ public class ConcessioniLifeCycleManager implements LifecycleManager { return report; } + + @Override public Configuration getCurrentConfiguration() throws ConfigurationException { return null; 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 6672fd3..c1e8490 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,6 +1,8 @@ package org.gcube.application.cms.concessioni.plugins; import lombok.Data; +import lombok.Getter; +import lombok.Synchronized; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.cms.concessioni.sdi.SDIManager; @@ -24,7 +26,9 @@ import org.gcube.application.geoportal.common.model.profile.HandlerDeclaration; import org.gcube.application.geoportal.common.model.profile.Profile; import org.gcube.application.geoportal.common.utils.ContextUtils; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Slf4j public class SDIMaterializerPlugin implements MaterializationPlugin { @@ -35,14 +39,23 @@ public class SDIMaterializerPlugin implements MaterializationPlugin { private String documentPath; } - SDIManager sdiManager; + Map sdiManagerMap=null; + + + private SDIManager getSDIManager(){ + return sdiManagerMap.get(ContextUtils.getCurrentScope()); + } @Override + @Synchronized public InitializationReport initInContext() throws InitializationException { InitializationReport report = new InitializationReport(); try{ - log.info("Initializing in "+ ContextUtils.getCurrentScope()); - sdiManager=new SDIManager(); + if(getSDIManager()==null) { + String context = ContextUtils.getCurrentScope(); + log.info("Initializing in " + context); + sdiManagerMap.put(context,new SDIManager()); + } report.setStatus(Report.Status.OK); report.putMessage("Initialized SDI Manager"); } catch (SDIInteractionException e) { @@ -52,8 +65,10 @@ public class SDIMaterializerPlugin implements MaterializationPlugin { } @Override + @Synchronized public InitializationReport init() throws InitializationException { InitializationReport report = new InitializationReport(); + sdiManagerMap=new HashMap<>(); report.setStatus(Report.Status.OK); return report; } @@ -116,7 +131,7 @@ public class SDIMaterializerPlugin implements MaterializationPlugin { requestArguments.putIfAbsent("layerTitle",fs.getString(requestArguments.getString("titleField"))); else requestArguments.putIfAbsent("layerTitle",fs.getUUID()); - RegisteredFileSet obtained = sdiManager.materializeLayer(fs,requestArguments); + RegisteredFileSet obtained = getSDIManager().materializeLayer(fs,requestArguments); log.debug("Obtained {} ",obtained); documentNavigator.setElement("$..[?(@.uuid == "+fs.getUUID()+")]",obtained); } 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 65d77a9..98f74a6 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 @@ -2,7 +2,9 @@ package org.gcube.application.geoportal.service.engine.providers; import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.plugins.InitializablePlugin; +import org.gcube.application.cms.plugins.LifecycleManager; import org.gcube.application.cms.plugins.Plugin; +import org.gcube.application.cms.plugins.PluginManagerInterface; import org.gcube.application.cms.plugins.faults.InitializationException; import org.gcube.application.cms.plugins.faults.ShutDownException; import org.gcube.application.cms.plugins.reports.InitializationReport; @@ -15,9 +17,10 @@ import org.reflections.util.FilterBuilder; import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; @Slf4j -public class PluginManager extends AbstractScopedMap>{ +public class PluginManager extends AbstractScopedMap> implements PluginManagerInterface { Map implementations=new HashMap<>(); @@ -37,6 +40,9 @@ public class PluginManager extends AbstractScopedMap>{ Plugin plugin = pluginClass.newInstance(); log.debug("Loading {} descriptiorn : ", plugin, plugin.getDescriptor()); implementations.put(plugin.getDescriptor().getId(), plugin); + + if(plugin instanceof LifecycleManager) + ((LifecycleManager)plugin).setPluginManager(this); }catch (Throwable t){ log.warn("Unable to instantiate Plugin "+pluginClass,t); } @@ -52,8 +58,7 @@ public class PluginManager extends AbstractScopedMap>{ log.info("INIT Plugin {}",id); try { InitializablePlugin ip=(InitializablePlugin) p; - InitializationReport rep=ip.init(); - log.info("INIT REPORT : {}",rep); + logReport(ip,ip.init()); }catch (InitializationException e){ log.error("Failed to initialize "+id,e); }catch(Throwable t){ @@ -72,8 +77,7 @@ public class PluginManager extends AbstractScopedMap>{ log.info("INIT Plugin {} in context {} ",id, ContextUtils.getCurrentScope()); try { InitializablePlugin ip=(InitializablePlugin) p; - InitializationReport rep=ip.initInContext(); - log.info("INIT REPORT : {}",rep); + logReport(ip,ip.initInContext()); }catch (InitializationException e){ log.error("Failed to initialize "+id,e); }catch(Throwable t){ @@ -106,4 +110,25 @@ public class PluginManager extends AbstractScopedMap>{ public void init() { } + + @Override + public Plugin getById(String pluginID) throws ConfigurationException { + return getObject().get(pluginID); + } + + 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()); + } + } + } }