package com.aol.micro.server.config; import com.aol.micro.server.Plugin; import com.aol.micro.server.PluginLoader; import cyclops.stream.ReactiveSeq; import org.pcollections.HashTreePMap; import org.pcollections.HashTreePSet; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; public class MicroserverConfigurer implements Configurer { public Config buildConfig(Class class1) { Microserver microserver = (Microserver) class1.getAnnotation(Microserver.class); if (microserver == null){ microserver = Microserver.Instance.class.getAnnotation(Microserver.class); } String[] basePackages=microserver.basePackages(); if(basePackages.length==0){ String[] basePackagesFromClass ={class1.getPackage().getName()}; basePackages = basePackagesFromClass; } List<Class> classes = buildClasses(class1, microserver); Map<String, String> properties = buildProperties(microserver); return Config.instance().withBasePackages(basePackages).withEntityScan(microserver.entityScan()).withClasses(HashTreePSet.from(classes)) .withPropertiesName(microserver.propertiesName()).withInstancePropertiesName(microserver.instancePropertiesName()) .withServiceTypePropertiesName(microserver.serviceTypePropertiesName()) .withAllowCircularReferences(microserver.allowCircularDependencies()).withProperties(HashTreePMap.from(properties)).set(); } private Map<String, String> buildProperties(Microserver microserver) { Map<String, String> properties = ReactiveSeq.of(microserver.properties()) .grouped(2) .toMap(prop -> prop.get(0), prop -> prop.get(1)); return properties; } private List<Class> buildClasses(Class class1, Microserver microserver) { List<Class> classes = new ArrayList(); classes.add(class1); if (microserver.classes() != null) classes.addAll(Arrays.asList(microserver.classes())); List<Plugin> modules = PluginLoader.INSTANCE.plugins.get(); if(modules.size()>0) classes.addAll(ReactiveSeq.fromStream(modules.stream()).flatMap(module -> module.springClasses().stream()).toList()); return classes; } }