common-smartgears-app/src/main/java/org/gcube/smartgears/ContextListener.java

98 lines
3.5 KiB
Java
Raw Permalink Normal View History

package org.gcube.smartgears;
import java.util.HashSet;
import java.util.Set;
2024-02-21 12:05:21 +01:00
import java.util.stream.Collectors;
2024-03-12 14:25:51 +01:00
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;
import org.gcube.smartgears.annotations.ManagedBy;
2022-02-07 09:43:30 +01:00
import org.gcube.smartgears.application.manager.AppManagerObserver;
import org.gcube.smartgears.context.application.ApplicationContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2024-02-21 12:05:21 +01:00
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfo;
import io.github.classgraph.ClassInfoList;
import io.github.classgraph.ScanResult;
@WebListener
public class ContextListener implements ServletContextListener {
private static Logger log = LoggerFactory.getLogger(ContextListener.class);
2022-02-07 09:43:30 +01:00
AppManagerObserver observer;
@Override
public void contextInitialized(ServletContextEvent sce) {
2022-02-07 09:43:30 +01:00
ApplicationContext context = (ApplicationContext) sce.getServletContext().getAttribute(Constants.context_attribute);
if (context==null) {
String msg = sce.getServletContext().getContextPath()+" is a gCube-aware application but is not managed as a gCube resource: missing or invalid context attribute "+Constants.context_attribute;
throw new RuntimeException(msg);
2024-02-21 12:05:21 +01:00
}
log.info("configuring context provider for {}",context.name());
ContextProvider.set(context);
retrieveAndRegisterManagers(context);
2024-02-21 12:05:21 +01:00
}
private void retrieveAndRegisterManagers(ApplicationContext context) {
2022-02-07 09:43:30 +01:00
ApplicationManagerProvider.init(context);
2024-02-21 12:05:21 +01:00
Set<Class<?>> annotatedManaged;
try (ScanResult result = new ClassGraph().enableClassInfo().enableAnnotationInfo().scan()) {
ClassInfoList classInfos = result.getClassesWithAnnotation(ManagedBy.class.getName());
annotatedManaged = classInfos.stream().map(ClassInfo::loadClass)
.collect(Collectors.toSet());
}
/*
Collection<URL> urls = ClasspathHelper.forJavaClassPath();
urls.removeIf(url -> url.toString().endsWith(".so") || url.toString().endsWith(".zip") );
2024-02-21 12:05:21 +01:00
ConfigurationBuilder reflectionConf = new ConfigurationBuilder().addUrls(urls).addClassLoaders(Thread.currentThread().getContextClassLoader()).setScanners(new TypeAnnotationsScanner(), new SubTypesScanner());
Reflections reflection = new Reflections(reflectionConf);
Set<Class<?>> toInitialize = reflection.getTypesAnnotatedWith(ManagedBy.class);
2024-02-21 12:05:21 +01:00
*/
2024-02-22 15:41:40 +01:00
log.debug("annotated managed are {} for {}", annotatedManaged.size(),context.name());
Set<Class<? extends ApplicationManager>> managers = new HashSet<Class<? extends ApplicationManager>>();
2024-02-21 12:05:21 +01:00
for (Class<?> initializer: annotatedManaged ){
ManagedBy manageBy = initializer.getAnnotation(ManagedBy.class);
2022-06-22 18:26:37 +02:00
log.info("ApplicationManager added {} to {} @ {}", manageBy.value().getSimpleName(), initializer.getSimpleName(), context.name());
managers.add(manageBy.value());
}
if (managers.size()>0){
2022-02-07 09:43:30 +01:00
observer = ApplicationManagerProvider.instance.getObserver();
observer.setAuthorizationProvider(context.container().authorizationProvider());
2022-02-07 09:43:30 +01:00
observer.setApplicationManagerClasses(managers);
observer.register();
context.events().subscribe(observer);
}
2024-02-22 15:41:40 +01:00
else {
2024-03-12 14:25:51 +01:00
log.info("no application managers found for {}",context.name());
2024-02-22 15:41:40 +01:00
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
if (observer!=null){
ApplicationContext context = (ApplicationContext) sce.getServletContext().getAttribute(Constants.context_attribute);
context.events().unsubscribe(observer);
observer.onStop(context);
}
}
}