net.jawr.web.test.JawrIntegrationServer.java Source code

Java tutorial

Introduction

Here is the source code for net.jawr.web.test.JawrIntegrationServer.java

Source

/**
 * Copyright 2010-2013 Ibrahim Chaehoi
 * 
 * Licensed 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 net.jawr.web.test;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
import java.util.Properties;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.webapp.WebAppClassLoader;
import org.mortbay.jetty.webapp.WebAppContext;

/**
 * @author Ibrahim Chaehoi
 *
 */
public class JawrIntegrationServer {

    /** The logger */
    private static Logger LOGGER = Logger.getLogger(JawrIntegrationServer.class);

    /** The properties file name */
    private static final String PROP_FILE_NAME = "jawr-integration-server.properties";

    /** The port property name */
    private static final String PORT_PROPERTY_NAME = "port";

    /** The webapp property name */
    private static final String WEBAPP_PROPERTY_NAME = "webapp-name";

    /** The default webapp name */
    private static final String DEFAULT_WEBAPP_NAME = "jawr-integration-test";

    /** The port */
    protected static String DEFAULT_PORT = "8080";

    /** The property indicating if we must use the empty context path */
    private static String USE_DEFAULT_CONTEXT_PATH_PROPERTY_NAME = "use-empty-context-path";

    /** The default value for the use of default context path */
    private static String DONT_USE_DEFAULT_CONTEXT_PATH = "false";

    /** The application URL */
    public static final String SERVER_URL = "http://localhost:" + DEFAULT_PORT;

    /** The target root directory */
    private static final String TARGET_ROOT_DIR = "target/";

    /** The flag indicating if we have configured the web application for all the tests of the current test case class */
    private static boolean webAppConfigInitialized = false;

    /** The Jawr integration HTTP Server */
    private static JawrIntegrationServer instance = new JawrIntegrationServer();

    /** The Jetty server */
    private Server server;

    /** The web app context path */
    private int serverPort;

    /** The web app dir */
    private String webAppRootDir;

    /** The web application context */
    private WebAppContext jettyWebAppContext;

    public JawrIntegrationServer() {

        Properties prop = new Properties();
        InputStream inStream = getClass().getClassLoader().getResourceAsStream(PROP_FILE_NAME);
        if (inStream != null) {
            try {
                prop.load(inStream);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            IOUtils.closeQuietly(inStream);
        }

        serverPort = Integer.parseInt(prop.getProperty(PORT_PROPERTY_NAME, DEFAULT_PORT));
        server = new Server(serverPort);
        server.setStopAtShutdown(true);
        String webappName = prop.getProperty(WEBAPP_PROPERTY_NAME, DEFAULT_WEBAPP_NAME);
        try {
            webAppRootDir = new File(TARGET_ROOT_DIR + webappName).getCanonicalFile().getAbsolutePath();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        boolean useEmptyContextPath = Boolean.parseBoolean(
                prop.getProperty(USE_DEFAULT_CONTEXT_PATH_PROPERTY_NAME, DONT_USE_DEFAULT_CONTEXT_PATH));
        String webAppCtx = "";
        if (!useEmptyContextPath) {
            webAppCtx = "/" + webappName;
        }

        jettyWebAppContext = new WebAppContext(webAppRootDir, webAppCtx);
        jettyWebAppContext.setConfigurationClasses(new String[] { "org.mortbay.jetty.webapp.WebInfConfiguration",
                "org.mortbay.jetty.webapp.WebXmlConfiguration", });
    }

    public static JawrIntegrationServer getInstance() {
        return instance;
    }

    /**
     * Returns the Jetty webapp context
     * @return the Jetty webapp context
     */
    public WebAppContext getJettyWebAppContext() {
        return jettyWebAppContext;
    }

    /**
     * Returns the webapp context path
     * @return the webapp context path
     */
    public String getServerUrlPrefix() {
        return "http://localhost:" + serverPort;
    }

    /**
     * Returns the webapp context path
     * @return the webapp context path
     */
    public String getContextPath() {
        return jettyWebAppContext.getContextPath();
    }

    /**
     * Returns the webapp root dir
     * @return the webapp root dir
     */
    public String getWebAppRootDir() {
        return webAppRootDir;
    }

    /**
     * Initialize the application server before the test
     * 
     * @throws IOException
     */
    public void initBeforeTestCase() throws IOException {

        LOGGER.info("Init Jawr integration server before testcase");
        webAppConfigInitialized = false;
        // Set default locale to en_US
        Locale.setDefault(new Locale("en", "US"));
    }

    public void setup() throws Exception {

        LOGGER.info(
                "Jawr integration server " + (webAppConfigInitialized ? "is already started" : "will start now."));
        if (!webAppConfigInitialized) {
            // Starts the web application 
            startWebApplication();

            webAppConfigInitialized = true;
        }
    }

    /**
     * Starts the web application.
     * The web application root directory will be define in target/jawr-integration-test, the directory used for the war generation.
     * 
     * @throws Exception if an exception occurs
     */
    public void startWebApplication() throws Exception {

        // Create a new class loader to take in account the changes of the jawr config file in the WEB-INF/classes
        WebAppClassLoader webAppClassLoader = new WebAppClassLoader(jettyWebAppContext);
        jettyWebAppContext.setClassLoader(webAppClassLoader);

        server.setHandler(jettyWebAppContext);

        if (server.isStopped()) {
            LOGGER.info("Start jetty server....");
            server.start();
        }
        if (jettyWebAppContext.isStopped()) {
            LOGGER.info("Start jetty webApp context....");
            jettyWebAppContext.start();
        }

    }

    /**
     * Resets the test configuration.
     * 
     * @throws Exception
     *             if an exception occurs
     */
    public void resetTestConfiguration() throws Exception {

        webAppConfigInitialized = false;
        // Stop the web application context at the end of the tests associated
        // to the current class.
        LOGGER.info("Stop jetty webApp context....");
        jettyWebAppContext.stop();
    }

}