package com.github.aesteve.vertx.nubes.reflections;
import com.github.aesteve.vertx.nubes.Config;
import com.github.aesteve.vertx.nubes.annotations.services.Verticle;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.logging.Logger;
import io.vertx.core.logging.LoggerFactory;
import org.reflections.Reflections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class AnnotVerticleFactory {
private static final Logger LOG = LoggerFactory.getLogger(AnnotVerticleFactory.class);
private final Config config;
public AnnotVerticleFactory(Config config) {
this.config = config;
}
public Map<String, DeploymentOptions> scan() {
Map<String, DeploymentOptions> map = new HashMap<>();
String verticlePackage = config.getVerticlePackage();
if (verticlePackage == null) {
return map;
}
Reflections reflections = new Reflections(verticlePackage);
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(Verticle.class);
classes.forEach(clazz -> {
if (!io.vertx.core.Verticle.class.isAssignableFrom(clazz)) {
LOG.error("Cannot create verticle " + clazz.getName() + " since it's not a subclass of io.vertx.core.Verticle");
} else {
Verticle annot = clazz.getAnnotation(Verticle.class);
map.put(clazz.getName(), getDeploymentOptions(annot));
}
});
return map;
}
private DeploymentOptions getDeploymentOptions(Verticle annot) {
DeploymentOptions options = new DeploymentOptions();
if (annot.inheritsConfig()) {
options.setConfig(config.json());
}
if (annot.instances() > 0) {
options.setInstances(annot.instances());
}
if (!"".equals(annot.isolationGroup())) {
options.setIsolationGroup(annot.isolationGroup());
}
options.setHa(annot.ha());
options.setMultiThreaded(annot.multiThreaded());
options.setWorker(annot.worker());
return options;
}
}