001: /*
002: The contents of this file are subject to the Mozilla Public License Version 1.1
003: (the "License"); you may not use this file except in compliance with the
004: License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
005:
006: Software distributed under the License is distributed on an "AS IS" basis,
007: WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
008: for the specific language governing rights and
009: limitations under the License.
010:
011: The Original Code is "The Columba Project"
012:
013: The Initial Developers of the Original Code are Frederik Dietz and Timo Stich.
014: Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
015:
016: All Rights Reserved.
017: */
018: package org.columba.core.scripting.interpreter;
019:
020: import java.util.HashMap;
021: import java.util.Iterator;
022: import java.util.Map;
023: import java.util.logging.Level;
024: import java.util.logging.Logger;
025:
026: import org.columba.core.scripting.config.BeanshellConfig;
027: import org.columba.core.scripting.model.ColumbaScript;
028:
029: /**
030: This class manages and registers all available script interpreters,
031: which must implement the ScriptInterpreter interface.
032: The registration has to be hardcoded so, if you create an new
033: ScriptInterpreter class, do not forget to add it here.
034:
035: @author Celso Pinto (cpinto@yimports.com)
036: */
037: public class InterpreterManager {
038:
039: private static final Logger LOG = Logger
040: .getLogger(InterpreterManager.class.getName());
041:
042: /**
043: The interpreters Map has the format
044: key(script_extension) => value(ScriptInterpreter instance)
045: */
046: private final Map<String, ScriptInterpreter> interpreters;
047:
048: public InterpreterManager() {
049:
050: interpreters = new HashMap<String, ScriptInterpreter>();
051:
052: try {
053: registerInterpreter(new BshInterpreter());
054: } catch (Exception e) {
055: LOG
056: .warning("Failed to register the Beanshell script interpreter");
057: }
058:
059: try {
060: registerInterpreter(new JythonInterpreter());
061: } catch (Exception e) {
062: LOG
063: .warning("Failed to register the Jython script interpreter");
064: }
065:
066: try {
067: registerInterpreter(new GroovyInterpreter());
068: } catch (Exception e) {
069: LOG
070: .warning("Failed to register the Groovy script interpreter");
071: }
072:
073: }
074:
075: public void registerInterpreter(ScriptInterpreter interpreter) {
076:
077: LOG.entering("registerInterpreter", interpreter.getName());
078:
079: /* find out if the interpreter is already registered */
080: /* if so, remove it */
081: /*XXX this is not thread-safe, though luck. It isn't supposed to be. */
082: for (Iterator it = interpreters.entrySet().iterator(); it
083: .hasNext();) {
084:
085: Map.Entry entry = (Map.Entry) it.next();
086:
087: if (entry.getValue().getClass().isInstance(interpreter))
088: it.remove();
089:
090: }
091:
092: String[] extensions = interpreter.getSupportedExtensions();
093: for (int i = 0; i < extensions.length; i++) {
094: ScriptInterpreter previous = interpreters.put(
095: extensions[i], interpreter);
096: if (previous != null)
097: LOG.warning(previous.getClass().getName()
098: + " doesn't handle " + extensions[i]
099: + " anymore");
100: }
101:
102: LOG.exiting("registerInterpreter", interpreter.getName());
103:
104: }
105:
106: public void executeScript(ColumbaScript script) {
107: LOG.entering("executeScript", script.getPath());
108:
109: ScriptInterpreter interpreter = interpreters.get(script
110: .getExtension());
111:
112: if (interpreter == null) {
113: LOG.warning("No interpreter found for " + script.getPath());
114: return;
115: }
116:
117: Map vars = new HashMap();
118: vars.put(ScriptInterpreter.SCRIPT_PATH, BeanshellConfig
119: .getInstance().getPath().getPath());
120:
121: vars.put(ScriptInterpreter.SCRIPT_OBJ, script);
122:
123: try {
124: interpreter.execute(script, vars);
125: } catch (Exception ex) {
126: /* any errors that may occur cannot stop other scripts from running */
127: LOG.log(Level.SEVERE, "Exception caught in script:"
128: + script.getPath(), ex);
129: ex.printStackTrace();
130:
131: }
132:
133: LOG.exiting("executeScript", script.getPath());
134: }
135:
136: public String[] getSupportedExtensions() {
137: return (String[]) interpreters.keySet()
138: .toArray(new String[] {});
139: }
140: }
|