package com.github.aesteve.vertx.nubes.reflections.visitors;
import com.github.aesteve.vertx.nubes.Config;
import com.github.aesteve.vertx.nubes.services.ServiceRegistry;
import io.vertx.ext.web.Router;
import java.lang.reflect.Field;
abstract class BaseVisitor<T> {
protected T instance;
protected final Class<T> clazz;
protected final Router router;
protected final Config config;
protected String path;
BaseVisitor(Class<T> clazz, Config config, Router router) {
this.clazz = clazz;
this.config = config;
this.router = router;
}
void injectServices() throws IllegalAccessException {
final ServiceRegistry serviceRegistry = config.getServiceRegistry();
for (Field field : instance.getClass().getDeclaredFields()) {
Object service = serviceRegistry.get(field);
setFieldAccessible(router, instance, service, field);
}
for (Field field : instance.getClass().getSuperclass().getDeclaredFields()) {
Object service = serviceRegistry.get(field);
setFieldAccessible(router, instance, service, field);
}
}
private void setFieldAccessible(Router router, Object instance, Object service, Field field) throws IllegalAccessException {
if (service != null) {
field.setAccessible(true);
field.set(instance, service);
} else if (field.getType().equals(Router.class)) {
field.setAccessible(true);
field.set(instance, router);
}
}
void normalizePath() {
if (!path.endsWith("/*")) {
if (path.endsWith("/")) {
path += "*";
} else {
path += "/*";
}
}
}
}