org.cruxframework.crux.tools.server.JettyDevServer.java Source code

Java tutorial

Introduction

Here is the source code for org.cruxframework.crux.tools.server.JettyDevServer.java

Source

/*
 * Copyright 2014 cruxframework.org
 * 
 * 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 org.cruxframework.crux.tools.server;

import java.io.File;
import java.net.InetAddress;
import java.util.Collection;
import java.util.EnumSet;
import java.util.Map;

import javax.servlet.DispatcherType;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cruxframework.crux.core.declarativeui.filter.DeclarativeUIFilter;
import org.cruxframework.crux.core.server.CruxBridge;
import org.cruxframework.crux.core.server.DevModeInitializerListener;
import org.cruxframework.crux.core.server.InitializerListener;
import org.cruxframework.crux.core.server.development.ViewTester;
import org.cruxframework.crux.tools.parameters.ConsoleParameter;
import org.cruxframework.crux.tools.parameters.ConsoleParameterOption;
import org.cruxframework.crux.tools.parameters.ConsoleParametersProcessingException;
import org.cruxframework.crux.tools.parameters.ConsoleParametersProcessor;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.webapp.WebAppContext;

import com.google.gwt.core.ext.UnableToCompleteException;

/**
 * @author Thiago da Rosa de Bustamante
 *
 */
public class JettyDevServer {
    private static final Log logger = LogFactory.getLog(JettyDevServer.class);

    private String bindAddress = "localhost";
    private int port = getDefaultPort();

    private File appRootDir;
    private String pageOutputCharset = "UTF-8";
    private boolean addDevelopmentComponents = false;

    public JettyDevServer() {
        CruxBridge.getInstance().setSingleVM(true);
    }

    public void start() throws Exception {
        SelectChannelConnector connector = new SelectChannelConnector();
        connector.setHost(bindAddress);
        connector.setPort(port);
        connector.setReuseAddress(false);
        connector.setSoLingerTime(0);

        Server server = new Server();
        server.addConnector(connector);

        WebAppContext webContext = new WebAppContext();
        webContext.setWar(appRootDir.getCanonicalPath());
        webContext.setParentLoaderPriority(true);
        webContext.setContextPath("/");
        webContext.setClassLoader(Thread.currentThread().getContextClassLoader());
        webContext.getInitParams().put("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");

        server.setHandler(webContext);
        if (addDevelopmentComponents) {
            webContext.addFilter(DeclarativeUIFilter.class, "*.html", EnumSet.allOf(DispatcherType.class));
            webContext.addServlet(ViewTester.class, "/viewTester/*");
            if (!webContext.getInitParams().containsKey(DevModeInitializerListener.OUTPUT_CHARSET)) {
                webContext.setInitParameter(DevModeInitializerListener.OUTPUT_CHARSET, pageOutputCharset);
            }
            webContext.addEventListener(new InitializerListener());
            webContext.addEventListener(new DevModeInitializerListener());
        }
        try {
            server.start();
            server.join();
        } catch (Exception e) {
            logger.error("cannot start web server", e);
            throw new UnableToCompleteException();
        }
    }

    protected int getDefaultPort() {
        return 8080;
    }

    protected void processParameters(Collection<ConsoleParameter> parameters) {
        for (ConsoleParameter parameter : parameters) {
            if (parameter.getName().equals("-appRootDir")) {
                appRootDir = new File(parameter.getValue());
            } else if (parameter.getName().equals("-addDevelopmentComponents")) {
                this.addDevelopmentComponents = true;
            } else if (parameter.getName().equals("-pageOutputCharset")) {
                pageOutputCharset = parameter.getValue();
            } else if (parameter.getName().equals("-bindAddress")) {
                try {
                    InetAddress bindAddress = InetAddress.getByName(parameter.getValue());
                    if (bindAddress.isAnyLocalAddress()) {
                        this.bindAddress = InetAddress.getLocalHost().getHostAddress();
                    } else {
                        this.bindAddress = parameter.getValue();
                    }
                } catch (Exception e) {
                    //Use default
                }
            } else if (parameter.getName().equals("-port")) {
                port = Integer.parseInt(parameter.getValue());
            }
        }
    }

    protected ConsoleParametersProcessor createParametersProcessor() {
        ConsoleParameter parameter;
        ConsoleParametersProcessor parametersProcessor = new ConsoleParametersProcessor("JettyDevServer");

        parameter = new ConsoleParameter("-appRootDir", "The application web folder.", true, true);
        parameter.addParameterOption(new ConsoleParameterOption("dir", "root dir"));
        parametersProcessor.addSupportedParameter(parameter);

        parameter = new ConsoleParameter("-bindAddress",
                "The ip address of the code server. Defaults to 127.0.0.1.", false, true);
        parameter.addParameterOption(new ConsoleParameterOption("ip", "Ip address"));
        parametersProcessor.addSupportedParameter(parameter);

        parameter = new ConsoleParameter("-port", "The port where the jetty server will run.", false, true);
        parameter.addParameterOption(new ConsoleParameterOption("port", "Port"));
        parametersProcessor.addSupportedParameter(parameter);

        parameter = new ConsoleParameter("-pageOutputCharset", "Output charset for generated pages.", false, true);
        parameter.addParameterOption(new ConsoleParameterOption("dir", "Work dir"));
        parametersProcessor.addSupportedParameter(parameter);

        parameter = new ConsoleParameter("-addDevelopmentComponents",
                "If informed, Server will add all components required for development on application context.",
                false, false);
        parametersProcessor.addSupportedParameter(parameter);

        parametersProcessor
                .addSupportedParameter(new ConsoleParameter("-help", "Display the usage screen.", false, true));
        parametersProcessor
                .addSupportedParameter(new ConsoleParameter("-h", "Display the usage screen.", false, true));
        return parametersProcessor;
    }

    public static void main(String[] args) {
        try {
            JettyDevServer jettyServer = new JettyDevServer();
            ConsoleParametersProcessor parametersProcessor = jettyServer.createParametersProcessor();
            Map<String, ConsoleParameter> parameters = parametersProcessor.processConsoleParameters(args);

            if (parameters.containsKey("-help") || parameters.containsKey("-h")) {
                parametersProcessor.showsUsageScreen();
            } else {
                jettyServer.processParameters(parameters.values());
                jettyServer.start();
            }
        } catch (ConsoleParametersProcessingException e) {
            logger.error("Error processing program parameters: " + e.getLocalizedMessage() + ". Program aborted.",
                    e);
        } catch (Exception e) {
            logger.error("Error running code server: " + e.getLocalizedMessage() + ". Program aborted.", e);
        }
    }
}