ch.tatool.core.module.initializer.SpringExecutorInitializer.java Source code

Java tutorial

Introduction

Here is the source code for ch.tatool.core.module.initializer.SpringExecutorInitializer.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Michael Ruflin, Andr Locher, Claudia von Bastian.
 * 
 * This file is part of Tatool.
 * 
 * Tatool is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published 
 * by the Free Software Foundation, either version 3 of the License, or 
 * (at your option) any later version.
 * 
 * Tatool 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 Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with Tatool. If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
package ch.tatool.core.module.initializer;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Collections;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ByteArrayResource;

import ch.tatool.core.data.DataUtils;
import ch.tatool.core.element.DefaultExecutionStrategy;
import ch.tatool.core.module.creator.CreationException;
import ch.tatool.data.Module;
import ch.tatool.element.Element;
import ch.tatool.exec.Executor;
import ch.tatool.export.DataExporter;
import ch.tatool.module.ExecutorInitializer;

/**
 * ExecutorConfiguration which loads the elements from a Spring context file. 
 * 
 * @author Michael Ruflin
 */
public class SpringExecutorInitializer implements ExecutorInitializer {

    private static final String ROOT_ELEMENT = "moduleHierarchy";

    /** Logger used by the service. */
    Logger logger = LoggerFactory.getLogger(SpringExecutorInitializer.class);

    public static final String SPRING_ELEMENT_CONFIGURATION_XML_PROPERTY = "SpringXmlElementConfig";

    /** Configures the executor with the given module. */
    public void initialize(Executor executor, Module module) {
        // load the root execution element
        Element element = fetchRootElement(module);
        executor.getExecutionTree().setRootElement(element);

        // instantiate the execution strategy
        setupExecutionStrategy(executor, module);
    }

    protected void setupExecutionStrategy(Executor executor, Module module) {
        // TODO: make this configurable through a module property
        executor.setExecutionStrategy(new DefaultExecutionStrategy());
    }

    /**
     * Loads the data contained in the configuration file into the module and binary module properties.
     * 
     * This method can be used to get data required for a module creation.
     */
    public boolean loadModuleConfiguration(File configurationXmlFile, Map<String, String> moduleProperties,
            Map<String, byte[]> binaryModuleProperties, Map<String, DataExporter> moduleExporters) {
        // load the file into a String
        String configurationXML = null;
        try {
            configurationXML = FileUtils.readFileToString(configurationXmlFile, "UTF-8");
            return loadModuleConfiguration(configurationXML, moduleProperties, binaryModuleProperties,
                    moduleExporters);
        } catch (IOException ioe) {
            logger.error("Unable to load Tatool file.", ioe);
            return false;
        }
    }

    public boolean loadModuleConfiguration(String configurationXML, Map<String, String> moduleProperties,
            Map<String, byte[]> binaryModuleProperties, Map<String, DataExporter> moduleExporters) {
        // fetch the module properties
        Map<String, String> setupProperties = getModuleSetupProperties(configurationXML);
        moduleProperties.putAll(setupProperties);

        // fetch the module exporters
        Map<String, DataExporter> exporterList = getModuleExporters(configurationXML);
        moduleExporters.putAll(exporterList);

        // test-wise load configuration to ensure all classes are valid
        loadRootElementFromSpringXML(configurationXML);

        // write the configuration file and configuration class into the properties too
        try {
            moduleProperties.put(Module.PROPERTY_MODULE_EXECUTION_INITIALIZER_CLASS, this.getClass().getName());
            binaryModuleProperties.put(SPRING_ELEMENT_CONFIGURATION_XML_PROPERTY,
                    configurationXML.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            logger.error("Unable to load Tatool file.", e);
            throw new RuntimeException(e);
        }

        return true;
    }

    @SuppressWarnings("unchecked")
    protected Map<String, String> getModuleSetupProperties(String configurationXML) {
        // try loading the configuration
        XmlBeanFactory beanFactory = null;
        try {
            beanFactory = new XmlBeanFactory(new ByteArrayResource(configurationXML.getBytes()));
        } catch (BeansException be) {
            logger.error("Unable to load Tatool file.", be);
            String[] errors = be.getMessage().split(";");
            throw new CreationException(errors[errors.length - 1]);
        }

        // see whether we have properties
        if (beanFactory.containsBean("moduleProperties")) {
            Map<String, String> properties = (Map<String, String>) beanFactory.getBean("moduleProperties");
            return properties;
        } else {
            return Collections.emptyMap();
        }
    }

    @SuppressWarnings("unchecked")
    protected Map<String, DataExporter> getModuleExporters(String configurationXML) {
        // try loading the configuration
        XmlBeanFactory beanFactory = null;
        try {
            beanFactory = new XmlBeanFactory(new ByteArrayResource(configurationXML.getBytes()));
        } catch (BeansException be) {
            logger.error("Unable to load Tatool file.", be);
            throw new RuntimeException("Unable to load Tatool file.", be);
        }

        // see whether we have properties
        if (beanFactory.containsBean("moduleExporters")) {
            Map<String, DataExporter> exporters = (Map<String, DataExporter>) beanFactory
                    .getBean("moduleExporters");
            return exporters;
        } else {
            return Collections.emptyMap();
        }
    }

    /**
     * Loads the persisted module configuration
     */
    protected Element fetchRootElement(Module module) {
        // fetch the configuration
        String configXML = DataUtils.getStringBinaryModuleProperty(module,
                SPRING_ELEMENT_CONFIGURATION_XML_PROPERTY);
        if (configXML == null) {
            // TODO: inform user that module is broken
            throw new RuntimeException("Unable to load Tatool file. Configuration is missing!");
        }

        // load the configuration
        return loadRootElementFromSpringXML(configXML);
    }

    /**
     * Checks whether a configuration xml is valid or not.
     */
    protected Element loadRootElementFromSpringXML(String configXML) {
        // try loading the configuration
        XmlBeanFactory beanFactory = null;
        try {
            beanFactory = new XmlBeanFactory(new ByteArrayResource(configXML.getBytes()));
        } catch (BeansException be) {
            logger.error("Unable to load Tatool file.", be);
            throw new RuntimeException("Unable to load Tatool file.");
        }

        // check whether we have the mandatory beans (rootElement)
        if (!beanFactory.containsBean(ROOT_ELEMENT)) {
            logger.error("Unable to load Tatool file. Root element missing!");
            throw new CreationException("Unable to load Tatool file. Root element missing!");
        }

        // fetch the rootElement
        try {
            Element root = (Element) beanFactory.getBean(ROOT_ELEMENT);
            return root;
        } catch (RuntimeException e) {
            String[] errors = e.getMessage().split(";");
            throw new CreationException(errors[errors.length - 1]);
        }
    }
}