Package hu.sztaki.ilab.longneck.bootstrap

Source Code of hu.sztaki.ilab.longneck.bootstrap.Bootstrap

package hu.sztaki.ilab.longneck.bootstrap;

import hu.sztaki.ilab.longneck.process.task.ProcessTester;
import hu.sztaki.ilab.longneck.process.task.ThreadManager;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.GenericApplicationContext;

/**
* Bootstraps the transformation process.
*
* @author Molnár Péter <molnarp@sztaki.mta.hu>
*/
public class Bootstrap {

    /** The properties to run with. */
    private Properties runtimeProperties;
    /** The application context. */
    private ClassPathXmlApplicationContext applicationContext;
    /** The process loader. */
    private SourceLoader sourceLoader;
    /** The thread manager. */
    private ThreadManager threadManager;

    public Bootstrap(Properties runtimeProperties) {

        this.runtimeProperties = runtimeProperties;

        try {
            // Prepare parent application context
            PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
            ppc.setProperties(runtimeProperties);

            // Preconfigured beans are installed into parent bean factory
            DefaultListableBeanFactory parentBeanFactory = new DefaultListableBeanFactory();
            parentBeanFactory.registerSingleton("runtime-properties", runtimeProperties);
            GenericApplicationContext parentContext = new GenericApplicationContext(
                parentBeanFactory);
            parentContext.refresh();

            // Create primary application context
            applicationContext = new ClassPathXmlApplicationContext(new String[] {
                "META-INF/longneck/spring/root.xml",
                "classpath*:META-INF/longneck/spring/*.xml" }, false, parentContext);
            applicationContext.addBeanFactoryPostProcessor(ppc);
            applicationContext.registerShutdownHook(); // needed for bean
                                                       // destroy methods

            applicationContext.refresh();

            // Load hooks from extensions
            List<Hook> hooks = new ArrayList<Hook>();
            hooks.addAll(applicationContext.getBeansOfType(Hook.class).values());
            for (Hook h : hooks) {
                h.init(runtimeProperties, applicationContext);
            }

            sourceLoader = (SourceLoader) applicationContext.getBean("source-loader");

        } catch (Exception ex) {
            throw new RuntimeException("Bootstrap initialization error.", ex);
        }
    }

    /**
     * Initializes and runs the Longneck process in a single or multithreaded
     * way
     */
    public void run() {
        CompactProcess process = sourceLoader.getCompactProcess(
            runtimeProperties.getProperty("processFile"), runtimeProperties);

        // Run tests

        String testingBehavior = PropertyUtils.getStringProperty(runtimeProperties,
            "testingBehavior", "normal");
        boolean testSuccess = false;

        if (!testingBehavior.equals("skip") &&
            !(process.getProcess().getTestCases() == null) &&
            !process.getProcess().getTestCases().isEmpty()) {
            ProcessTester tester = new ProcessTester(process,
                runtimeProperties.containsKey("verbose"));
            testSuccess = tester.testAll();
            if (testingBehavior.equals("normal") && !testSuccess) {
                System.err.println("Test failed, exiting.");
                System.exit(1);
            }
            if (testingBehavior.equals("alone")) {
                if (testSuccess) {
                    System.out.println("All tests passed.");
                    System.exit(0);
                } else {
                    System.err.println("Test failed, exiting.");
                    System.exit(1);
                }
            }
        }

        threadManager = new ThreadManager(runtimeProperties);

        // Set process
        threadManager.setProcess(process);

        // Start process
        threadManager.init();
        threadManager.addShutdownHook();
        threadManager.run();
    }

    public void close() {
        threadManager = null;
        sourceLoader = null;
        applicationContext.close();
        applicationContext = null;
        runtimeProperties = null;
    }

    public void setRuntimeProperties(Properties runtimeProperties) {
        this.runtimeProperties = runtimeProperties;
    }

    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public ThreadManager getThreadManager() {
        return threadManager;
    }

    public SourceLoader getSourceLoader() {
        return sourceLoader;
    }
}
TOP

Related Classes of hu.sztaki.ilab.longneck.bootstrap.Bootstrap

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.