/*******************************************************************************
* Copyright (c) 2011, 2017 EclipseSource and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource - initial API and implementation
******************************************************************************/
package org.eclipse.rap.rwt.cluster.testfixture.internal.jetty;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.http.HttpSession;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.rap.rwt.application.EntryPoint;
import org.eclipse.rap.rwt.cluster.testfixture.internal.server.RWTStartup;
import org.eclipse.rap.rwt.cluster.testfixture.internal.util.SocketUtil;
import org.eclipse.rap.rwt.cluster.testfixture.server.IServletEngine;
import org.eclipse.rap.rwt.engine.RWTServlet;
public class JettyEngine implements IServletEngine {
private final JettyController jettyController;
private final SessionTracker sessionTracker;
public JettyEngine() {
this( new SessionHandlerProvider() );
}
public JettyEngine( int port ) {
this( new SessionHandlerProvider(), port );
}
JettyEngine( ISessionHandlerProvider sessionHandlerProvider ) {
this( sessionHandlerProvider, SocketUtil.getFreePort() );
}
JettyEngine( ISessionHandlerProvider sessionHandlerProvider, int port ) {
this.jettyController = new JettyController( sessionHandlerProvider, port );
this.sessionTracker = new SessionTracker();
}
@Override
public void start( Class<? extends EntryPoint> entryPointClass ) throws Exception {
addEntryPoint( entryPointClass );
jettyController.start();
}
@Override
public void stop() throws Exception {
stop( 0 );
}
@Override
public void stop( int timeout ) throws Exception {
jettyController.stop( timeout );
}
@Override
public int getPort() {
return jettyController.getPort();
}
@Override
public HttpSession[] getSessions() {
return sessionTracker.getSessions();
}
private void addEntryPoint( Class<? extends EntryPoint> entryPointClass ) {
ServletContextHandler context = jettyController.createServletContext( "/" );
context.addServlet( new ServletHolder( new RWTServlet() ), IServletEngine.SERVLET_PATH );
addServletContextFilter( context, sessionTracker );
context.addEventListener( RWTStartup.createServletContextListener( entryPointClass ) );
}
private static void addServletContextFilter( ServletContextHandler context, Filter filter ) {
FilterHolder filterHolder = new FilterHolder( filter );
EnumSet<DispatcherType> dispatcherType = EnumSet.of( DispatcherType.REQUEST );
context.addFilter( filterHolder, IServletEngine.SERVLET_PATH, dispatcherType );
}
}