/* * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. You may obtain a * copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package org.apache.geode.modules.session; import java.io.File; import java.net.MalformedURLException; import javax.security.auth.message.config.AuthConfigFactory; import javax.servlet.ServletException; import org.apache.catalina.Context; import org.apache.catalina.Engine; import org.apache.catalina.Host; import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleListener; import org.apache.catalina.Valve; import org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl; import org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider; import org.apache.catalina.connector.Connector; import org.apache.catalina.core.StandardEngine; import org.apache.catalina.core.StandardHost; import org.apache.catalina.core.StandardService; import org.apache.catalina.core.StandardWrapper; import org.apache.catalina.loader.WebappLoader; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.valves.ValveBase; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.geode.modules.session.catalina.JvmRouteBinderValve; /** * */ public class EmbeddedTomcat8 { private String contextPath = null; private Tomcat container = null; private Log logger = LogFactory.getLog(getClass()); /** * The port to run the Tomcat server on. */ private int port = 8089; /** * The classes directory for the web application being run. */ private String classesDir = "target/classes"; private Context rootContext = null; private Engine engine; /** * The web resources directory for the web application being run. */ private String webappDir = ""; public EmbeddedTomcat8(String contextPath, int port, String jvmRoute) throws MalformedURLException { this.contextPath = contextPath; this.port = port; // create server container = new Tomcat(); container.setBaseDir(System.getProperty("user.dir") + "/tomcat"); Host localHost = container.getHost();// ("127.0.0.1", new File("").getAbsolutePath()); localHost.setDeployOnStartup(true); localHost.getCreateDirs(); try { new File(localHost.getAppBaseFile().getAbsolutePath()).mkdir(); new File(localHost.getCatalinaBase().getAbsolutePath(), "logs").mkdir(); rootContext = container.addContext("", localHost.getAppBaseFile().getAbsolutePath()); } catch (Exception e) { throw new Error(e); } // Otherwise we get NPE when instantiating servlets rootContext.setIgnoreAnnotations(true); AuthConfigFactory factory = new AuthConfigFactoryImpl(); new SimpleAuthConfigProvider(null, factory); AuthConfigFactory.setFactory(factory); // create engine engine = container.getEngine(); engine.setName("localEngine"); engine.setJvmRoute(jvmRoute); // create http connector container.setPort(port); Connector httpConnector = container.getConnector();// ((InetAddress) null, port, false); // Create the JVMRoute valve for session failover ValveBase valve = new JvmRouteBinderValve(); ((StandardEngine) engine).addValve(valve); } /** * Starts the embedded Tomcat server. */ public void startContainer() throws LifecycleException { // start server container.start(); // add shutdown hook to stop server Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { stopContainer(); } }); } /** * Stops the embedded Tomcat server. */ public void stopContainer() { try { if (container != null) { container.stop(); logger.info("Stopped container"); } } catch (LifecycleException exception) { logger.warn("Cannot Stop Tomcat" + exception.getMessage()); } } public StandardWrapper addServlet(String path, String name, String clazz) throws ServletException { StandardWrapper servlet = (StandardWrapper) rootContext.createWrapper(); servlet.setName(name); servlet.setServletClass(clazz); servlet.setLoadOnStartup(1); rootContext.addChild(servlet); rootContext.addServletMapping(path, name); servlet.setParent(rootContext); // servlet.load(); return servlet; } public Tomcat getEmbedded() { return container; } public void addLifecycleListener(LifecycleListener lifecycleListener) { container.getServer().addLifecycleListener(lifecycleListener); } public Context getRootContext() { return rootContext; } public String getPath() { return contextPath; } public void setPath(String path) { this.contextPath = path; } public int getPort() { return port; } public void addValve(Valve valve) { ((StandardEngine) engine).addValve(valve); } }