package com.aol.micro.server.module;
import com.aol.micro.server.Plugin;
import com.aol.micro.server.PluginLoader;
import com.aol.micro.server.auto.discovery.Rest;
import com.aol.micro.server.auto.discovery.RestResource;
import com.aol.micro.server.config.Classes;
import com.aol.micro.server.servers.model.ServerData;
import cyclops.Streams;
import cyclops.collections.ListX;
import cyclops.collections.SetX;
import cyclops.collections.immutable.PMapX;
import cyclops.collections.immutable.PSetX;
import cyclops.collections.immutable.PStackX;
import cyclops.stream.ReactiveSeq;
import org.springframework.util.StringUtils;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;
import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestListener;
import java.lang.annotation.Annotation;
import java.util.*;
import java.util.function.Consumer;
public interface Module {
default Set<Object> getJaxRsResourceObjects() {
return PluginLoader.INSTANCE.plugins.get()
.flatMap(Plugin::jaxRsResourceObjects)
.toPSetX();
}
default Map<String, Object> getServerProperties() {
return PMapX.empty();
}
default <T> Consumer<WebServerProvider<T>> getServerConfigManager() {
return server -> {
};
}
default <T> Consumer<JaxRsProvider<T>> getResourceConfigManager() {
return rc -> {
};
}
default List<String> getPackages() {
return PStackX.empty();
}
default Map<String, String> getPropertyOverrides() {
return PMapX.empty();
}
default Set<Class<?>> getSpringConfigurationClasses() {
return PSetX.of(Classes.CORE_CLASSES.getClasses());
}
default Set<Class<?>> getRestResourceClasses() {
return PSetX.of(RestResource.class);
}
default Set<Class<? extends Annotation>> getRestAnnotationClasses() {
return SetX.of(Rest.class);
}
default List<String> getDefaultJaxRsPackages() {
return PluginLoader.INSTANCE.plugins.get()
.stream()
.filter(module -> module.servletContextListeners() != null)
.flatMapI(Plugin::jaxRsPackages)
.toPStackX();
}
default List<Class<?>> getDefaultResources() {
return PluginLoader.INSTANCE.plugins.get()
.stream()
.flatMapI(Plugin::jaxRsResources)
.toPStackX();
}
default List<ServletContextListener> getListeners(ServerData data) {
List<ServletContextListener> list = new ArrayList<>();
if (data.getRootContext() instanceof WebApplicationContext) {
list.add(new ContextLoaderListener(
(WebApplicationContext) data.getRootContext()));
}
ListX<Plugin> modules = PluginLoader.INSTANCE.plugins.get();
PStackX<ServletContextListener> listeners = modules.stream()
.filter(module -> module.servletContextListeners() != null)
.flatMapI(Plugin::servletContextListeners)
.map(fn -> fn.apply(data))
.toPStackX();
return listeners.plusAll(list);
}
default List<ServletRequestListener> getRequestListeners(ServerData data) {
return PluginLoader.INSTANCE.plugins.get()
.stream()
.filter(module -> module.servletRequestListeners() != null)
.flatMapI(Plugin::servletRequestListeners)
.map(fn -> fn.apply(data))
.toPStackX();
}
default Map<String, Filter> getFilters(ServerData data) {
Map<String, Filter> map = new HashMap<>();
ReactiveSeq.fromStream(PluginLoader.INSTANCE.plugins.get()
.stream())
.filter(module -> module.filters() != null)
.map(module -> module.filters()
.apply(data))
.forEach(pluginMap -> map.putAll(pluginMap));
return PMapX.fromMap(map);
}
default Map<String, Servlet> getServlets(ServerData data) {
Map<String, Servlet> map = new HashMap<>();
ReactiveSeq.fromStream(PluginLoader.INSTANCE.plugins.get()
.stream())
.filter(module -> module.servlets() != null)
.map(module -> module.servlets()
.apply(data))
.forEach(pluginMap -> map.putAll(pluginMap));
return PMapX.fromMap(map);
}
default String getJaxWsRsApplication() {
List<String> jaxRsApplications = ReactiveSeq.fromStream(PluginLoader.INSTANCE.plugins.get()
.stream())
.filter(module -> module.jaxWsRsApplication() != null)
.map(Plugin::jaxWsRsApplication)
.flatMap(Streams::optionalToStream)
.toList();
if (jaxRsApplications.size() > 1) {
throw new IncorrectJaxRsPluginsException(
"ERROR! Multiple jax-rs application plugins found, a possible solution is to remove micro-jackson or other jax-rs application provider from your classpath. "
+ jaxRsApplications);
} else if (jaxRsApplications.size() == 0) {
throw new IncorrectJaxRsPluginsException(
"ERROR! No jax-rs application plugins found, a possible solution is to add micro-jackson to your classpath. ");
}
return jaxRsApplications.get(0);
}
default String getProviders() {
String additional = ReactiveSeq.fromStream(PluginLoader.INSTANCE.plugins.get()
.stream())
.peek(System.out::println)
.filter(module -> module.providers() != null)
.flatMapI(Plugin::providers)
.join(",");
if (StringUtils.isEmpty(additional))
return "com.aol.micro.server.rest.providers";
return "com.aol.micro.server.rest.providers," + additional;
}
public String getContext();
}