ScriptEngine.java

/**
 * @(#)ScriptEngineDriver.java
 * Copyright (C) 2008-2011 delhezi.com
 *
 * This class is released under the:
 * GNU Lesser General Public License (LGPL) version 3 or later.
 * http://www.gnu.org/copyleft/lesser.html
 */
package com.delhezi.ga.utility;

import com.delhezi.ga.exception.GeneticAlgorithmException;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.FileReader;
import javax.script.Invocable;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

//http://www.java2s.com/Code/Java/JDK-6/CatchScriptException.htm
/**
 * <code>FitnessFunction</code>: Silnik skryptów.
 * @version 1.0 2009-12-10
 * @author <a href="mailto:wojciech.wolszczak@delhezi.com">
 * Wojciech Wolszczak</a>
 */
public class ScriptEngine {

    /** Logger object. */
    private static final Logger LOGGER =
        Logger.getLogger(ScriptEngine.class.getName());

    /** Delhezi Error Code. */
    private static final String DERC = "1-9-1-";

    /** */
    private Invocable invokeEngine;

    /** */
    private String scriptEnginName;

    /** */
    private String scriptPath;

    /** */
    private String scriptFile;


    /**
     * Konstruktor.
     * @param scriptEnginName Nazwa silnika skryptów. Przykładowe wartości:
     *                        [js, rhino, JavaScript, javascript,
     *                        ECMAScript, ecmascript].
     * @param scriptPath  Bezwzględna ścieżka zakończona "/" do katalogu w
     * którym składowane są skrytpy.
     * @param scriptFile  Naza pliku ze skrytem.
     * @throws GeneticAlgorithmException DERC-1-9-1-1, DERC-1-9-1-2, DERC-1-9-1-3
     * @since 1.0
     */
    public ScriptEngine(final String scriptEnginName,
                        final String scriptPath,
                        final String scriptFile)
    throws GeneticAlgorithmException {
        this.scriptEnginName = scriptEnginName;
        this.scriptPath = scriptPath;
        this.scriptFile = scriptFile;


        ScriptEngineManager manager = new ScriptEngineManager();
        javax.script.ScriptEngine engine =
            manager.getEngineByName(scriptEnginName);

        FileReader reader;
        try {
            reader = new FileReader(scriptPath + scriptFile);
        } catch (FileNotFoundException e) {
            String errMessage =
                "DERC-" + DERC + "1: The script " + scriptPath
                + scriptFile
                + " does not exist, is a directory rather than a regular file,"
                + " or for some other reason cannot be opened for reading.";
            LOGGER.log(Level.WARNING, errMessage, e);
            throw new GeneticAlgorithmException(errMessage);
        }
        try {
            engine.eval(reader);
        } catch (ScriptException e) {
            String errMessage =
                "DERC-" + DERC + "2: Error occurrs in script "
                + scriptPath + scriptFile + ".";
            LOGGER.log(Level.WARNING, errMessage, e);
            throw new GeneticAlgorithmException(errMessage);
        }
        try {
            reader.close();
        } catch (IOException e) {
            String errMessage =
                "DERC-" + DERC + "3: Nie udało się zamknąć uchwytu do pliku.";
            LOGGER.log(Level.WARNING, errMessage, e);
            throw new GeneticAlgorithmException(errMessage);
        }
        invokeEngine = (Invocable) engine;
    }

    /**
     * Wywołuje funkcję zdefiniowaną w skrypcie.
     * @param functionName Nazwa funkcji zdefiniowanej w skrypcie.
     * @param args Argumenty do przekazania do wywoływanej funkcji.
     * @return Wartość zwrócona przez wywoływaną funkcję.
     * @throws GeneticAlgorithmException DERC-1-9-1-4, DERC-1-9-1-5
     * @since 1.0
     */
    public Object invoke(final String functionName,
                         final Object... args) throws GeneticAlgorithmException {
        Object o = null;
        try {
            o = invokeEngine.invokeFunction(functionName, args);
        } catch (ScriptException e) {
            String errMessage =
                "DERC-" + DERC + "4: Error occurrs during invocation of the method.";
            LOGGER.log(Level.WARNING, errMessage, e);
            throw new GeneticAlgorithmException(errMessage);
        } catch (NoSuchMethodException e) {
            String errMessage =
                "DERC-" + DERC + "5: Method with given name or matching argument types cannot be found.";
            LOGGER.log(Level.WARNING, errMessage, e);
            throw new GeneticAlgorithmException(errMessage);
        }
        return o;
    }

    /**
     * Zwraca nazwę silnika skryptów.
     * @return Nazwa silnika skryptów.
     * @since 1.0
     */
    public final String getScriptEnginName() {
        return this.scriptEnginName;
    }

    /**
     * Zwraca bezwzględną ścieżkę do katalogu w którym składowane są skrytpy.
     * @return Ścieżka do katalogu.
     */
    public final String getScriptPath() {
        return this.scriptPath;
    }

    /**
     * Zwraca nazwę pliku z wykonywanym skrytem.
     * @return Nazwa pliku z wykonywanym skrytem.
     * @since 1.0
     */
    public final String getScriptFile() {
        return this.scriptFile;
    }
}