package org.esmerilprogramming.overtown.server; import io.undertow.Handlers; import io.undertow.server.HttpHandler; import io.undertow.server.handlers.PathHandler; import io.undertow.servlet.api.DeploymentInfo; import io.undertow.servlet.api.DeploymentManager; import io.undertow.servlet.api.ServletContainer; import io.undertow.websockets.jsr.WebSocketDeploymentInfo; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.servlet.ServletException; import org.esmerilprogramming.overtown.annotation.BeforeTranslate; import org.esmerilprogramming.overtown.annotation.Controller; import org.esmerilprogramming.overtown.annotation.Page; import org.esmerilprogramming.overtown.http.OvertownRequest; import org.esmerilprogramming.overtown.scanner.ScannerResult; import org.jboss.logging.Logger; import org.xnio.ByteBufferSlicePool; public class PathHandlerMounter { private static final Logger LOGGER = Logger.getLogger(PathHandlerMounter.class); @Deprecated public PathHandler mount(ScannerResult scanResult) { PathHandler pathHandler = Handlers.path(); /* try { for (Class<?> handlerClass : scanResult.getHandlers()) { Constructor<?> constructor = handlerClass.getConstructor(); constructor.setAccessible(true); mountMethods(pathHandler, handlerClass); } pathHandler = mountServerEndpoints(pathHandler , scanResult.getServerEndpoints() ); } catch (Exception e) { LOGGER.error(e.getMessage()); }*/ return pathHandler; } protected PathHandler mountServerEndpoints(final PathHandler pathHandler , List<Class<?>> serverEndpoints) throws ServletException{ if(!serverEndpoints.isEmpty()){ DeploymentInfo builder = new DeploymentInfo() .setClassLoader(this.getClass().getClassLoader()) .setContextPath("/"); WebSocketDeploymentInfo wsDeployInfo = new WebSocketDeploymentInfo(); wsDeployInfo.setBuffers(new ByteBufferSlicePool(100, 1000)); for(Class<?> serverEndpoint : serverEndpoints ){ wsDeployInfo.addEndpoint( serverEndpoint ); } builder.addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, wsDeployInfo ); builder.setDeploymentName("websocketDeploy.war"); final ServletContainer container = ServletContainer.Factory.newInstance(); DeploymentManager manager = container.addDeployment(builder); manager.deploy(); pathHandler.addPrefixPath("/", manager.start() ); } return pathHandler; } protected PathHandler mountMethods(PathHandler pathHandler, final Class<?> handlerClass) { Controller controllerAnnotation = handlerClass.getAnnotation(Controller.class); Method[] methods = handlerClass.getMethods(); final List<Method> beforeTranslationMethods = identifyBeforeTranslationMethod(methods); for (final Method method : methods) { Page methodPagePath = method.getAnnotation(Page.class); if (methodPagePath != null) { HttpHandler h = new HandlerCreator() .forPageClass(handlerClass) .withPathMethod(method) .withExecuteBeforeMethods(beforeTranslationMethods) .mount(); String pageRoot = controllerAnnotation.path(); for (String methodRoot : methodPagePath.value()) { pathHandler.addExactPath(pageRoot + "/" + methodRoot, h); } } } return pathHandler; } protected List<Method> identifyBeforeTranslationMethod(Method[] methods) { List<Method> beforeTranslationMethods = new ArrayList<>(); for (Method method : methods) { List<Annotation> asList = Arrays.asList(method.getAnnotations()); for (Annotation annotation : asList) { if (annotation instanceof BeforeTranslate) { beforeTranslationMethods.add(method); } } } return beforeTranslationMethods; } @SuppressWarnings("unchecked") protected <T> T setParamater(Class<T> clazz, String parameterName, OvertownRequest request) { if (String.class.equals(clazz)) { return (T) request.getParameter(parameterName); } return null; } }