/******************************************************************************* * Copyright (c) 2011, 2012 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.tomcat; import java.io.File; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpSession; import org.apache.catalina.Engine; import org.apache.catalina.Session; import org.apache.catalina.Wrapper; import org.apache.catalina.core.StandardContext; import org.apache.catalina.servlets.DefaultServlet; import org.apache.catalina.session.ManagerBase; import org.apache.catalina.session.StandardManager; import org.apache.catalina.startup.Tomcat; 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.FileUtil; 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 TomcatEngine implements IServletEngine { static { TomcatLog.silence(); } private final Tomcat tomcat; private final StandardContext context; public TomcatEngine() { this( SocketUtil.getFreePort() ); } public TomcatEngine( int port ) { tomcat = new Tomcat(); configureTomcat( port ); context = ( StandardContext )tomcat.addContext( "/", tomcat.getHost().getAppBase() ); } private void configureTomcat( int port ) { tomcat.setSilent( true ); tomcat.setPort( port ); tomcat.setBaseDir( getBaseDir().getAbsolutePath() ); tomcat.getHost().setAppBase( getWebAppsDir().getAbsolutePath() ); // Seems that this must be unique among all embedded Tomcats tomcat.getEngine().setName( "Tomcat on port " + port ); } public void start( Class<? extends EntryPoint> entryPointClass ) throws Exception { prepareWebAppsDir(); configureContext( entryPointClass ); tomcat.start(); configureSessionSweepInterval(); configureSessionPersistence(); } public void stop() throws Exception { stop( 0 ); } public void stop( int timeout ) throws Exception { tomcat.getEngine().setCluster( null ); tomcat.stop(); tomcat.destroy(); FileUtil.deleteDirectory( getBaseDir() ); } public int getPort() { return tomcat.getConnector().getPort(); } public HttpSession[] getSessions() { Session[] sessions = context.getManager().findSessions(); HttpSession[] result = new HttpSession[ sessions.length ]; for( int i = 0; i < sessions.length; i++ ) { result[ i ] = sessions[ i ].getSession(); } return result; } Engine getEngine() { return tomcat.getEngine(); } private boolean prepareWebAppsDir() { return new File( tomcat.getHost().getAppBase() ).mkdirs(); } private void configureContext( Class<? extends EntryPoint> entryPointClass ) { if( tomcat.getEngine().getCluster() != null ) { context.setDistributable( true ); } context.setSessionTimeout( -1 ); context.setBackgroundProcessorDelay( 1 ); Object listener = RWTStartup.createServletContextListener( entryPointClass ); context.addApplicationLifecycleListener( listener ); Wrapper rwtServlet = addServlet( "rwtServlet", new RWTServlet() ); context.addServletMapping( IServletEngine.SERVLET_PATH, rwtServlet.getName() ); Wrapper defaultServlet = addServlet( "defaultServlet", new DefaultServlet() ); context.addServletMapping( "/", defaultServlet.getName() ); } private void configureSessionSweepInterval() { ManagerBase manager = ( ManagerBase )context.getManager(); manager.setProcessExpiresFrequency( 1 ); } private void configureSessionPersistence() { if( context.getManager() instanceof StandardManager ) { StandardManager standardManager = ( StandardManager )context.getManager(); standardManager.setPathname( null ); } } private Wrapper addServlet( String name, HttpServlet servlet ) { return Tomcat.addServlet( context, name, servlet ); } private File getBaseDir() { return FileUtil.getTempDir( toString() ); } private File getWebAppsDir() { return new File( getBaseDir(), "webapps" ); } }