Newer
Older
sklauncher / build-tools / src / main / java / com / skcraft / launcher / buildtools / LocalHttpServerBuilder.java
/*
 * SK's Minecraft Launcher
 * Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors
 * Please see LICENSE.txt for license information.
 */

package com.skcraft.launcher.buildtools;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.server.handler.gzip.GzipHandler;

import java.io.File;

public class LocalHttpServerBuilder {

    private File baseDir = new File(".");
    private int port = 28888;

    public File getBaseDir() {
        return baseDir;
    }

    public LocalHttpServerBuilder setBaseDir(File baseDir) {
        this.baseDir = baseDir;
        return this;
    }

    public int getPort() {
        return port;
    }

    public LocalHttpServerBuilder setPort(int port) {
        this.port = port;
        return this;
    }

    public Server build() throws Exception {
        Server server = new Server(port);

        ObjectMapper mapper = new ObjectMapper();

        ResourceHandler resourceHandler = new ResourceHandler();
        resourceHandler.setDirectoriesListed(true);
        resourceHandler.setResourceBase(baseDir.getAbsolutePath());
        resourceHandler.setMinMemoryMappedContentLength(-1); // Causes file locking on Windows

        ContextHandler rootContext = new ContextHandler();
        rootContext.setContextPath("/");
        rootContext.setHandler(resourceHandler);

        ContextHandler packagesContext = new ContextHandler("/packages.json");
        packagesContext.setAllowNullPathInfo(true);
        packagesContext.setHandler(new PackagesHandler(mapper, baseDir));

        ContextHandler latestContext = new ContextHandler("/latest.json");
        latestContext.setAllowNullPathInfo(true);
        latestContext.setHandler(new LatestHandler(mapper));

        ContextHandler newsContext = new ContextHandler("/news.html");
        newsContext.setAllowNullPathInfo(true);
        newsContext.setHandler(new NewsHandler());

        ContextHandlerCollection contexts = new ContextHandlerCollection();
        contexts.setHandlers(new Handler[]{packagesContext, latestContext, newsContext, rootContext});

        GzipHandler gzip = new GzipHandler();
        server.setHandler(gzip);
        gzip.setHandler(contexts);

        return server;
    }

}