com.crushpaper.Main.java Source code

Java tutorial

Introduction

Here is the source code for com.crushpaper.Main.java

Source

/*
Copyright 2015 CrushPaper.com.
    
This file is part of CrushPaper.
    
CrushPaper is free software: you can redistribute it and/or modify
it under the terms of version 3 of the GNU Affero General Public
License as published by the Free Software Foundation.
    
CrushPaper is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.
    
You should have received a copy of the GNU Affero General Public License
along with CrushPaper.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.crushpaper;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;

import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

/**
 * Contains the main method that parses command line arguments and starts the
 * HTTP server.
 */
public class Main {
    public static void main(String[] args) throws IOException {
        Options options = new Options();
        options.addOption("help", false, "print this message");
        options.addOption("properties", true, "file system path to the crushpaper properties file");

        // Parse the command line.
        CommandLineParser parser = new BasicParser();
        CommandLine commandLine = null;

        try {
            commandLine = parser.parse(options, args);
        } catch (ParseException e) {
            System.err.println("crushpaper: Sorry, could not parse command line because `" + e.getMessage() + "`.");
            System.exit(1);
        }

        if (commandLine == null || commandLine.hasOption("help")) {
            HelpFormatter formatter = new HelpFormatter();
            formatter.printHelp("crushpaper", options);
            return;
        }

        // Get the properties path.
        String properties = null;
        if (commandLine.hasOption("properties")) {
            properties = commandLine.getOptionValue("properties");
        }

        if (properties == null || properties.isEmpty()) {
            System.err.println("crushpaper: Sorry, the `properties` command argument must be specified.");
            System.exit(1);
        }

        Configuration configuration = new Configuration();
        if (!configuration.load(new File(properties))) {
            System.exit(1);
        }

        // Get values.
        File databaseDirectory = configuration.getDatabaseDirectory();
        File keyStorePath = configuration.getKeyStoreFile();
        Integer httpPort = configuration.getHttpPort();
        Integer httpsPort = configuration.getHttpsPort();
        Integer httpsProxiedPort = configuration.getHttpsProxiedPort();
        String keyStorePassword = configuration.getKeyStorePassword();
        String keyManagerPassword = configuration.getKeyManagerPassword();
        File temporaryDirectory = configuration.getTemporaryDirectory();
        String singleUserName = configuration.getSingleUserName();
        Boolean allowSelfSignUp = configuration.getAllowSelfSignUp();
        Boolean allowSaveIfNotSignedIn = configuration.getAllowSaveIfNotSignedIn();
        File logDirectory = configuration.getLogDirectory();
        Boolean loopbackIsAdmin = configuration.getLoopbackIsAdmin();
        File sessionStoreDirectory = configuration.getSessionStoreDirectory();
        Boolean isOfficialSite = configuration.getIsOfficialSite();
        File extraHeaderFile = configuration.getExtraHeaderFile();

        // Validate the values.
        if (httpPort != null && httpsPort != null && httpPort.equals(httpsPort)) {
            System.err.println("crushpaper: Sorry, `" + configuration.getHttpPortKey() + "` and `"
                    + configuration.getHttpsPortKey() + "` must not be set to the same value.");
            System.exit(1);
        }

        if ((httpsPort == null) != (keyStorePath == null)) {
            System.err.println("crushpaper: Sorry, `" + configuration.getHttpsPortKey() + "` and `"
                    + configuration.getKeyStoreKey() + "` must either both be set or not set.");
            System.exit(1);
        }

        if (httpsProxiedPort != null && httpsPort == null) {
            System.err.println("crushpaper: Sorry, `" + configuration.getHttpsProxiedPortKey()
                    + "` can only be set if `" + configuration.getHttpsPortKey() + "` is set.");
            System.exit(1);
        }

        if (databaseDirectory == null) {
            System.err.println("crushpaper: Sorry, `" + configuration.getDatabaseDirectoryKey() + "` must be set.");
            System.exit(1);
        }

        if (singleUserName != null && !AccountAttributeValidator.isUserNameValid(singleUserName)) {
            System.err.println(
                    "crushpaper: Sorry, the username in `" + configuration.getSingleUserKey() + "` is not valid.");
            return;
        }

        if (allowSelfSignUp == null || allowSaveIfNotSignedIn == null || loopbackIsAdmin == null) {
            System.exit(1);
        }

        String extraHeader = null;
        if (extraHeaderFile != null) {
            extraHeader = readFile(extraHeaderFile);
            if (extraHeader == null) {
                System.err.println("crushpaper: Sorry, the file `" + extraHeaderFile.getPath() + "` set in `"
                        + configuration.getExtraHeaderKey() + "` could not be read.");
                System.exit(1);
            }
        }

        final DbLogic dbLogic = new DbLogic(databaseDirectory);
        dbLogic.createDb();
        final Servlet servlet = new Servlet(dbLogic, singleUserName, allowSelfSignUp, allowSaveIfNotSignedIn,
                loopbackIsAdmin, httpPort, httpsPort, httpsProxiedPort, keyStorePath, keyStorePassword,
                keyManagerPassword, temporaryDirectory, logDirectory, sessionStoreDirectory, isOfficialSite,
                extraHeader);
        servlet.run();
    }

    /** Returns the contents of the file as a string or null. */
    static String readFile(File file) {
        byte[] encoded;

        try {
            encoded = Files.readAllBytes(file.toPath());
        } catch (IOException e) {
            return null;
        }

        return new String(encoded, Charset.forName("UTF-8"));
    }
}