package com.aol.micro.server.spring; import java.util.Arrays; import java.util.HashSet; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import com.aol.cyclops2.util.ExceptionSoftener; import cyclops.stream.ReactiveSeq; import org.pcollections.HashTreePSet; import org.pcollections.PSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import com.aol.micro.server.InternalErrorCode; import com.aol.micro.server.Plugin; import com.aol.micro.server.PluginLoader; import com.aol.micro.server.config.Config; import com.aol.micro.server.config.Microserver; import lombok.AllArgsConstructor; import lombok.experimental.Wither; @AllArgsConstructor public class SpringContextFactory { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final PSet<Class> classes; private final Config config; @Wither private final SpringBuilder springBuilder; public SpringContextFactory(Config config, Class<?> c, Set<Class<?>> classes) { Set<Class> s = new HashSet<Class>( classes); s.addAll(config.getClasses()); s.add(c); Microserver microserver = c.getAnnotation(Microserver.class); final Set<Class> immutableS = s; s = Optional.ofNullable(microserver) .flatMap(ms -> Optional.ofNullable(ms.blacklistedClasses())) .map(bl -> { Set<Class> blacklistedClasses = Arrays.stream(bl) .collect(Collectors.toSet()); return immutableS.stream() .filter(clazz -> !blacklistedClasses.contains(clazz)) .collect(Collectors.toSet()); }) .orElse(immutableS); this.classes = HashTreePSet.from(s); this.config = config; springBuilder = ReactiveSeq.fromStream(PluginLoader.INSTANCE.plugins.get() .stream()) .filter(m -> m.springBuilder() != null) .map(Plugin::springBuilder) .findFirst() .orElse(new SpringApplicationConfigurator()); } public SpringContextFactory(SpringBuilder builder, Config config, Class<?> c, Set<Class<?>> classes) { Set<Class> s = new HashSet<Class>( classes); s.addAll(config.getClasses()); s.add(c); Microserver microserver = c.getAnnotation(Microserver.class); final Set<Class> immutableS = s; s = Optional.ofNullable(microserver) .flatMap(ms -> Optional.ofNullable(ms.blacklistedClasses())) .map(bl -> { Set<Class> blacklistedClasses = Arrays.stream(bl) .collect(Collectors.toSet()); return immutableS.stream() .filter(clazz -> !blacklistedClasses.contains(clazz)) .collect(Collectors.toSet()); }) .orElse(immutableS); this.classes = HashTreePSet.from(s); this.config = config; springBuilder = builder; } public ApplicationContext createSpringContext() { try { ApplicationContext springContext = springBuilder.createSpringApp(config, classes.toArray(new Class[0])); return springContext; } catch (Exception e) { logger.error(InternalErrorCode.STARTUP_FAILED_SPRING_INITIALISATION.toString(), e.getMessage()); ExceptionSoftener.throwSoftenedException(e); } return null; } }