/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.scripting.internal;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import org.python.jsr223.PyScriptEngineFactory;
import de.rcenvironment.core.scripting.ScriptingService;
import de.rcenvironment.core.scripting.python.PythonScriptEngineFactory;
import de.rcenvironment.core.utils.scripting.ScriptLanguage;
import de.rcenvironment.core.utils.scripting.ScriptLanguage.NoEngineException;
/**
* Default implementation of {@link ScriptingService}.
*
* @author Christian Weiss
* @author Robert Mischke (make Jython available from OSGi import)
* @author Sascha Zur (get script engine by name not extention, because jython and python have the same)
* @author Doreen Seider (added JVM options for Jython 2.7.0 support)
*/
public class ScriptingServiceImpl implements ScriptingService {
private final ScriptEngineManager engineManager = new ScriptEngineManager();
public ScriptingServiceImpl() {
// assertion: Jython should not be registered yet
if (!supportsScriptLanguage(ScriptLanguage.Jython)) {
// ScriptingUtils.setJVMPropertiesForJython270Support();
engineManager.registerEngineName(ScriptLanguage.Jython.getName(), new PyScriptEngineFactory());
}
if (!supportsScriptLanguage(ScriptLanguage.Python)) {
engineManager.registerEngineName(ScriptLanguage.Python.getName(), new PythonScriptEngineFactory());
}
}
@Override
public boolean supportsScriptLanguage(final ScriptLanguage language) {
final String name = language.getName();
final boolean result = supportsScriptLanguageByName(name);
return result;
}
@Override
public ScriptEngine createScriptEngine(final ScriptLanguage language) throws NoEngineException {
assert supportsScriptLanguage(language);
final String name = language.getName();
try {
final ScriptEngine result = engineManager.getEngineByName(name);
return result;
} catch (NoEngineException e) {
throw new NoEngineException(language, e);
}
}
protected boolean supportsScriptLanguageByName(final String name) {
final ScriptEngine engine = engineManager.getEngineByName(name);
final boolean result = engine != null;
return result;
}
protected boolean supportsScriptLanguageExtension(final String extension) {
final ScriptEngine engine = engineManager.getEngineByExtension(extension);
final boolean result = engine != null;
return result;
}
protected ScriptEngine createScriptEngineByExtension(final String extension) {
assert ScriptLanguage.getByExtension(extension) != null;
assert supportsScriptLanguageExtension(extension);
final ScriptEngine result = engineManager.getEngineByExtension(extension);
if (result == null) {
final ScriptLanguage language = ScriptLanguage.getByExtension(extension);
throw new NoEngineException(language);
}
return result;
}
protected ScriptEngine createScriptEngineByName(final String name) {
assert ScriptLanguage.getByName(name) != null;
assert supportsScriptLanguageByName(name);
final ScriptEngine result = engineManager.getEngineByName(name);
if (result == null) {
final ScriptLanguage language = ScriptLanguage.getByName(name);
throw new NoEngineException(language);
}
return result;
}
}