package org.deephacks.westty.internal.sockjs; import org.vertx.java.core.Handler; import org.vertx.java.core.eventbus.EventBus; import org.vertx.java.core.eventbus.Message; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.Alternative; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Set; @Alternative public class SockJsEndpoints { private static final HashMap<String, Method> sockjsToEndpoint = new HashMap<>(); private BeanManager beanManager; public SockJsEndpoints(BeanManager beanManager) { this.beanManager = beanManager; } public void put(String address, Method method) { sockjsToEndpoint.put(address, method); } public void start(EventBus bus) { for (String address : sockjsToEndpoint.keySet()) { try { final Method method = sockjsToEndpoint.get(address); Class<?> methodDeclaringClass = method.getDeclaringClass(); Set<Bean<?>> protoBeans = beanManager.getBeans(methodDeclaringClass); Bean<?> protoBean = beanManager.resolve(protoBeans); CreationalContext<?> cc = beanManager.createCreationalContext(protoBean); final Object endpoint = beanManager.getReference(protoBean, Object.class, cc); Handler handler = new Handler<Message<?>>() { @Override public void handle(Message<?> event) { try { method.invoke(endpoint, event); } catch (Exception e) { throw new RuntimeException(e); } } }; bus.registerHandler(address, handler); } catch (Exception e) { throw new RuntimeException(e); } } } }