package org.mortbay.jetty.servlet.wadi; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codehaus.wadi.core.contextualiser.InvocationException; import org.codehaus.wadi.web.impl.WebInvocation; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.HttpException; import org.mortbay.jetty.Server; import org.mortbay.jetty.SessionManager; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.DefaultHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.jetty.security.HashUserRealm; import org.mortbay.jetty.servlet.SessionHandler; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.log.Log; public class WadiSessionHandler extends SessionHandler { public WadiSessionHandler(SessionManager sessionManager) { super(sessionManager); } public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException { setRequestedId(request, dispatch); WadiClusteredInvocation invocation = new WadiClusteredInvocation(target,request,response,dispatch); try { invocation.invoke(); } catch (Exception e) { Log.warn(e); Throwable cause = e.getCause(); if (cause instanceof HttpException) { throw (HttpException) cause; } else if (cause instanceof IOException) { throw (IOException) cause; } else { throw (IOException) new IOException().initCause(cause); } } } protected class WadiClusteredInvocation { protected final String target; protected final HttpServletRequest request; protected final HttpServletResponse response; protected final int dispatch; protected WadiClusteredInvocation(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) { this.target = target; this.request = request; this.response = response; this.dispatch = dispatch; } public void invoke() throws Exception { WebInvocation invocation = new WebInvocation(); invocation.setDoNotExecuteOnEndProcessing(true); FilterChain chainAdapter = new FilterChain() { public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { try { invokeLocally(); } catch (Exception e) { throw (IOException) new IOException().initCause(e); } } }; invocation.init(request, response, chainAdapter); try { WadiSessionManager wSessionManager = (WadiSessionManager)getSessionManager(); wSessionManager.getClusteredManager().contextualise(invocation); } catch (InvocationException e) { Throwable throwable = e.getCause(); if (throwable instanceof IOException) { throw new Exception(throwable); } else if (throwable instanceof ServletException) { throw new Exception(throwable); } else { throw new Exception(e); } } } protected void invokeLocally() throws Exception { WadiSessionHandler.super.handle(target, request, response, dispatch); } public String getRequestedSessionId() { return request.getRequestedSessionId(); } } public static void main(String args[]) throws Exception { String jetty_home=System.getProperty("jetty.home","../../.."); String jetty_port=System.getProperty("jetty.port", "8080"); String node_name=System.getProperty("node.name", "red"); Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setPort(Integer.parseInt(jetty_port)); server.setConnectors(new Connector[]{connector}); HandlerCollection handlers = new HandlerCollection(); ContextHandlerCollection contexts = new ContextHandlerCollection(); //TODO: find a way to dynamically get the endpoint url WadiCluster wadiCluster = new WadiCluster("CLUSTER", node_name, "http://localhost:"+jetty_port+"/test"); wadiCluster.doStart(); WadiSessionManager wadiManager = new WadiSessionManager(wadiCluster, 2, 24, 360); WadiSessionHandler wSessionHandler = new WadiSessionHandler(wadiManager); WebAppContext wah = new WebAppContext(null, wSessionHandler, null, null); wah.setContextPath("/test"); wah.setResourceBase(jetty_home+"/webapps/test"); contexts.setHandlers(new Handler[]{wah}); handlers.setHandlers(new Handler[]{contexts,new DefaultHandler()}); server.setHandler(handlers); HashUserRealm hur = new HashUserRealm(); hur.setName("Test Realm"); hur.setConfig(jetty_home+"/etc/realm.properties"); wah.getSecurityHandler().setUserRealm(hur); server.start(); server.join(); } }