2021-12-07 16:12:43 +01:00
|
|
|
package org.gcube.application.geoportal.service.engine.providers;
|
|
|
|
|
2022-02-18 15:34:22 +01:00
|
|
|
import lombok.AllArgsConstructor;
|
|
|
|
import lombok.Getter;
|
2022-01-12 18:42:22 +01:00
|
|
|
import lombok.extern.slf4j.Slf4j;
|
2022-02-18 14:41:41 +01:00
|
|
|
import org.gcube.application.cms.caches.AbstractScopedMap;
|
2022-02-24 18:09:30 +01:00
|
|
|
import org.gcube.application.cms.plugins.*;
|
2022-01-12 18:42:22 +01:00
|
|
|
import org.gcube.application.cms.plugins.faults.InitializationException;
|
|
|
|
import org.gcube.application.cms.plugins.faults.ShutDownException;
|
|
|
|
import org.gcube.application.cms.plugins.reports.InitializationReport;
|
2022-02-18 15:34:22 +01:00
|
|
|
import org.gcube.application.geoportal.common.model.profile.Profile;
|
2022-01-12 18:42:22 +01:00
|
|
|
import org.gcube.application.geoportal.common.utils.ContextUtils;
|
2022-02-04 17:45:47 +01:00
|
|
|
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
|
2021-12-07 16:12:43 +01:00
|
|
|
|
2022-01-12 18:42:22 +01:00
|
|
|
import org.reflections.Reflections;
|
|
|
|
import org.reflections.util.ConfigurationBuilder;
|
|
|
|
import org.reflections.util.FilterBuilder;
|
|
|
|
|
2022-02-23 17:13:22 +01:00
|
|
|
import java.lang.reflect.Modifier;
|
2022-01-12 18:42:22 +01:00
|
|
|
import java.util.HashMap;
|
2021-12-07 16:12:43 +01:00
|
|
|
import java.util.Map;
|
|
|
|
|
2022-01-12 18:42:22 +01:00
|
|
|
@Slf4j
|
2022-02-18 15:34:22 +01:00
|
|
|
public class PluginManager extends AbstractScopedMap<PluginManager.PluginMap> implements PluginManagerInterface {
|
2021-12-07 16:12:43 +01:00
|
|
|
|
2022-02-18 15:34:22 +01:00
|
|
|
|
|
|
|
public static class PluginMap extends HashMap<String,Plugin>{
|
|
|
|
}
|
|
|
|
|
|
|
|
PluginMap implementations=new PluginMap();
|
2021-12-07 16:12:43 +01:00
|
|
|
|
|
|
|
|
2022-01-12 18:42:22 +01:00
|
|
|
public PluginManager(){
|
|
|
|
super("Plugin Cache");
|
|
|
|
// reflections
|
|
|
|
|
2022-02-24 18:09:30 +01:00
|
|
|
implementations.putAll(PluginsReflections.load());
|
|
|
|
log.info("Loaded {} plugins",implementations.keySet().size());
|
2022-01-12 18:42:22 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Init plugins
|
|
|
|
implementations.forEach((id,p)->{
|
2022-02-24 18:09:30 +01:00
|
|
|
log.info("Registering plugin Manager ");
|
|
|
|
if(p instanceof LifecycleManager) {
|
|
|
|
log.debug("Registering plugin Manager to {} ",id);
|
|
|
|
((LifecycleManager) p).setPluginManager(this);
|
|
|
|
}
|
|
|
|
|
2022-01-12 18:42:22 +01:00
|
|
|
if(p instanceof InitializablePlugin){
|
|
|
|
log.info("INIT Plugin {}",id);
|
|
|
|
try {
|
|
|
|
InitializablePlugin ip=(InitializablePlugin) p;
|
2022-02-16 18:29:34 +01:00
|
|
|
logReport(ip,ip.init());
|
2022-01-12 18:42:22 +01:00
|
|
|
}catch (InitializationException e){
|
|
|
|
log.error("Failed to initialize "+id,e);
|
|
|
|
}catch(Throwable t){
|
|
|
|
log.error("Unable to initialize "+id,t);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-12-07 16:12:43 +01:00
|
|
|
}
|
|
|
|
|
2022-01-12 18:42:22 +01:00
|
|
|
|
2021-12-07 16:12:43 +01:00
|
|
|
@Override
|
2022-02-18 15:34:22 +01:00
|
|
|
protected PluginMap retrieveObject() throws ConfigurationException {
|
2022-02-24 18:09:30 +01:00
|
|
|
String context=ContextUtils.getCurrentScope();
|
|
|
|
log.warn("PLUGIN INITIALIZTIONS IN CONTEXT {} ",context);
|
2022-01-12 18:42:22 +01:00
|
|
|
// Init plugins
|
|
|
|
implementations.forEach((id,p)->{
|
|
|
|
if(p instanceof InitializablePlugin){
|
2022-02-24 18:09:30 +01:00
|
|
|
log.info("INIT Plugin {} in context {} ",id, context);
|
2022-01-12 18:42:22 +01:00
|
|
|
try {
|
|
|
|
InitializablePlugin ip=(InitializablePlugin) p;
|
2022-02-16 18:29:34 +01:00
|
|
|
logReport(ip,ip.initInContext());
|
2022-01-12 18:42:22 +01:00
|
|
|
}catch (InitializationException e){
|
|
|
|
log.error("Failed to initialize "+id,e);
|
|
|
|
}catch(Throwable t){
|
|
|
|
log.error("Unable to initialize "+id,t);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return implementations;
|
|
|
|
}
|
2021-12-07 16:12:43 +01:00
|
|
|
|
2022-01-12 18:42:22 +01:00
|
|
|
@Override
|
2022-02-18 15:34:22 +01:00
|
|
|
protected void dispose(PluginMap toDispose) {
|
2022-01-12 18:42:22 +01:00
|
|
|
// ShutDown plugins
|
|
|
|
implementations.forEach((id,p)->{
|
|
|
|
if(p instanceof InitializablePlugin){
|
|
|
|
log.info("Shutting down Plugin {}",id);
|
|
|
|
try {
|
|
|
|
InitializablePlugin ip=(InitializablePlugin) p;
|
|
|
|
ip.shutdown();
|
|
|
|
}catch (ShutDownException e){
|
|
|
|
log.error("Failed to shutdown "+id,e);
|
|
|
|
}catch(Throwable t){
|
|
|
|
log.error("Unable to shutdown "+id,t);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-12-07 16:12:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2022-01-12 18:42:22 +01:00
|
|
|
public void init() {
|
|
|
|
|
2021-12-07 16:12:43 +01:00
|
|
|
}
|
2022-02-16 18:29:34 +01:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public Plugin getById(String pluginID) throws ConfigurationException {
|
2022-02-18 18:11:34 +01:00
|
|
|
Plugin toReturn = getObject().get(pluginID);
|
|
|
|
if(toReturn == null ) throw new ConfigurationException("Plugin "+pluginID+" not found ");
|
|
|
|
return toReturn;
|
2022-02-16 18:29:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-12-07 16:12:43 +01:00
|
|
|
}
|