com.google.jstestdriver.ui.MainUI.java Source code

Java tutorial

Introduction

Here is the source code for com.google.jstestdriver.ui.MainUI.java

Source

/*
 * Copyright 2009 Google Inc.
 *
 * 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 com.google.jstestdriver.ui;

import static java.awt.BorderLayout.CENTER;
import static java.awt.BorderLayout.NORTH;
import static java.awt.BorderLayout.SOUTH;

import com.google.jstestdriver.Action;
import com.google.jstestdriver.ActionFactory;
import com.google.jstestdriver.ActionParser;
import com.google.jstestdriver.ActionRunner;
import com.google.jstestdriver.CapturedBrowsers;
import com.google.jstestdriver.ConfigurationParser;
import com.google.jstestdriver.Flags;
import com.google.jstestdriver.FlagsImpl;
import com.google.jstestdriver.ServerStartupAction;

import org.apache.commons.logging.LogFactory;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.mortbay.log.Slf4jLog;

import java.awt.BorderLayout;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;

/**
 * Entry point for the Swing GUI of JSTestDriver.
 *
 * @author alexeagle@google.com (Alex Eagle)
 */
public class MainUI {

    private static final String JCL_LOG_CONFIG_ATTR = "org.apache.commons.logging.Log";
    private static final String JETTY_LOG_CLASS_PROP = "org.mortbay.log.class";
    private static final String JCL_SIMPLELOG_SHOWLOGNAME = "org.apache.commons.logging.simplelog.showlogname";
    private static final String JCL_SIMPLELOG_SHOW_SHORT_LOGNAME = "org.apache.commons.logging.simplelog.showShortLogname";
    private final ResourceBundle messageBundle;
    private final Flags flags;
    private LogPanel logPanel;
    private StatusBar statusBar;
    private CapturedBrowsersPanel capturedBrowsersPanel;
    private JPanel infoPanel;
    private final Logger logger = Logger.getLogger(MainUI.class.getCanonicalName());

    public MainUI(Flags flags, ResourceBundle bundle) {
        this.flags = flags;
        this.messageBundle = bundle;
    }

    public static void main(String[] args) {
        Flags flags = new FlagsImpl();
        CmdLineParser parser = new CmdLineParser(flags);
        try {
            parser.parseArgument(args);
        } catch (CmdLineException e) {
            System.err.println(e.getMessage());
            parser.printUsage(System.err);
        }

        configureLogging();
        ResourceBundle bundle = ResourceBundle.getBundle("com.google.jspuppet.ui.messages");
        new MainUI(flags, bundle).startUI();
    }

    private static void configureLogging() {
        // Configure commons logging to log to the Swing log panel logger
        LogFactory.getFactory().setAttribute(JCL_LOG_CONFIG_ATTR, LogPanelLog.class.getName());
        // Configure Jetty to log to SLF4J. Since slf4j-jcl.jar is in the classpath, SLF4J will be
        // configured to delegate logging to commons logging.
        System.setProperty(JETTY_LOG_CLASS_PROP, Slf4jLog.class.getName());
        System.setProperty(JCL_SIMPLELOG_SHOW_SHORT_LOGNAME, "false");
        System.setProperty(JCL_SIMPLELOG_SHOWLOGNAME, "false");
    }

    private void startUI() {
        statusBar = new StatusBar(StatusBar.Status.NOT_RUNNING, messageBundle);
        logPanel = new LogPanel();
        capturedBrowsersPanel = new CapturedBrowsersPanel();
        infoPanel = new InfoPanel(flags, messageBundle);
        LogPanelLog.LogPanelHolder.setLogPanel(logPanel);

        try {
            ActionFactory actionFactory = new ActionFactory();
            actionFactory.registerListener(ServerStartupAction.class, statusBar);
            actionFactory.registerListener(CapturedBrowsers.class, statusBar);
            actionFactory.registerListener(CapturedBrowsers.class, capturedBrowsersPanel);
            File config = new File(flags.getConfig());
            Set<String> fileSet = new LinkedHashSet<String>();
            String defaultServerAddress = null;

            if (flags.getTests().size() > 0 || flags.getReset() || !flags.getArguments().isEmpty()) {
                if (config.exists()) {
                    ConfigurationParser configParser = new ConfigurationParser(config.getParentFile());

                    try {
                        configParser.parse(new FileInputStream(flags.getConfig()));
                        fileSet = configParser.getFilesList();
                        defaultServerAddress = configParser.getServer();
                    } catch (FileNotFoundException e) {
                        System.err.println(e);
                        System.exit(1);
                    }
                }
            }
            List<Action> actions = new ActionParser(actionFactory).parseFlags(flags, fileSet, defaultServerAddress);
            ActionRunner runner = new ActionRunner(actions);
            runner.runActions();
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Failed to start the server: ", e);
        }

        JFrame appFrame = buildMainAppFrame();
        appFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        appFrame.pack();
        appFrame.setVisible(true);
    }

    private JFrame buildMainAppFrame() {
        return new JFrame("JSTestDriver Browser Manager") {
            {
                add(new JSplitPane(JSplitPane.VERTICAL_SPLIT) {
                    {
                        setTopComponent(new JPanel(new BorderLayout()) {
                            {
                                add(new JPanel(new BorderLayout()) {
                                    {
                                        add(statusBar, NORTH);
                                        add(infoPanel, CENTER);
                                        add(capturedBrowsersPanel, SOUTH);
                                    }
                                }, SOUTH);
                            }
                        });
                        setBottomComponent(logPanel);
                    }
                });
            }
        };
    }

}