org.xenmaster.App.java Source code

Java tutorial

Introduction

Here is the source code for org.xenmaster.App.java

Source

/*
 * App.java
 * Copyright (C) 2011,2012 Wannes De Smet
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.xenmaster;

import java.net.URL;
import net.wgr.core.access.Authorize;
import net.wgr.core.data.DataPool;
import net.wgr.server.application.DefaultApplication;
import net.wgr.server.http.Server;
import net.wgr.server.web.handling.ServerHook;
import net.wgr.server.web.hooks.SinglePageHook;
import net.wgr.settings.Settings;
import net.wgr.utility.GlobalExecutorService;
import org.apache.commons.daemon.Daemon;
import org.apache.commons.daemon.DaemonContext;
import org.apache.commons.daemon.DaemonInitException;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.*;
import org.xenmaster.api.util.CachingFacility;
import org.xenmaster.controller.Controller;
import org.xenmaster.monitoring.MonitoringAgent;
import org.xenmaster.pool.Pool;
import org.xenmaster.setup.debian.Bootstrapper;
import org.xenmaster.web.Hook;
import org.xenmaster.web.SetupHook;
import org.xenmaster.web.TemplateHook;
import org.xenmaster.web.VNCHook;

public class App implements Daemon {

    protected Server server;
    public static final String CONSOLE_LOGPATTERN = "%d{HH:mm:ss,SSS} | %-5p | %t | %c{1.} %m%n";
    public static final String FILE_LOGPATTERN = "%d{HH:mm:ss,SSS} | %-5p | %t | %c | %m%n";

    public static void main(String[] args) {
        try {
            final App app = new App();
            app.init(null);
            app.start();
        } catch (Exception ex) {
            Logger.getLogger(App.class).error("An unhandled exception ocurred", ex);
        }
    }

    @Override
    public void init(DaemonContext context) throws DaemonInitException, Exception {
        Logger root = Logger.getRootLogger();
        root.setLevel(Level.INFO);
        root.addAppender(new ConsoleAppender(new EnhancedPatternLayout(CONSOLE_LOGPATTERN)));

        if (context != null) {
            Logger.getLogger(getClass()).info("Starting XenMaster service");
            if (context.getArguments() != null && context.getArguments()[0] != null) {
                Settings.loadFromFile(context.getArguments()[0]);
            }
        }

        // Reconfigure logging with correct settings
        root.setLevel(Level.toLevel(Settings.getInstance().getString("Logging.Level")));
        if (Settings.getInstance().keyExists("Logging.File")) {
            root.addAppender(new DailyRollingFileAppender(new EnhancedPatternLayout(FILE_LOGPATTERN),
                    Settings.getInstance().getString("Logging.File"), "'.'yyyy-MM-dd"));
        }

        if (context == null) {
            Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        stop();
                    } catch (Exception ex) {
                        Logger.getLogger(App.class).error("Failed to shut down", ex);
                    }
                }
            }));
        }
    }

    @Override
    public void start() throws Exception {
        Settings s = Settings.getInstance();
        DataPool.simpleBoot(s.getString("Cassandra.PoolName"), s.getString("Cassandra.Host"),
                s.getString("Cassandra.Keyspace"));
        Bootstrapper b = new Bootstrapper();
        b.boot();

        Controller.build(new URL(s.getString("Xen.URL")));
        Controller.getSession().loginWithPassword(s.getString("Xen.User"), s.getString("Xen.Password"));

        server = new Server();
        server.boot();

        CachingFacility.instance(false);
        Authorize.disable();

        if (Controller.getSession().getReference() == null) {
            Logger.getLogger(getClass()).error("Failed to connect to XAPI instance, running in bootstrap mode");

            ServerHook sh = new ServerHook("/*");
            sh.addWebHook(new SetupHook());
            sh.addWebHook(new SinglePageHook(
                    IOUtils.toString(getClass().getResourceAsStream("/content/error.html")),
                    "Failed to connect to the Xen server."
                            + "<br /><a href=\"http://wiki.xen-master.org/wiki/Bootstrap\">Bootstrap</a> only mode has been engaged."));
            sh.hookIntoServer(server);
            server.start();

            b.waitForServerToQuit();
            return;
        }

        Pool.get().boot();
        MonitoringAgent.get().boot();
        MonitoringAgent.get().start();

        server = new Server();
        server.boot();

        DefaultApplication da = DefaultApplication.create("/", Settings.getInstance().getString("WebContentPath"));
        ServerHook sh = new ServerHook("/*", da);

        sh.addWebHook(new Hook());
        sh.addWebHook(new TemplateHook());
        sh.addWebHook(new SetupHook());
        sh.addWebHook(new VNCHook());

        server.addServlet(sh.getHttpHandler());
        server.addServlet(sh.getWebSocketHandler());
        server.start();
    }

    @Override
    public void stop() throws Exception {
        server.stop();
        Pool.get().stop();
        DataPool.stop();
        CachingFacility.instance().stop();
        GlobalExecutorService.get().shutdownNow();
    }

    @Override
    public void destroy() {
        server = null;
    }
}