/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.utils.scripting;
/**
* Enumeration of all supported scripting languages. Usually the set of
* supported languages should be determined dynamically based on the registered
* script engines, but as the configuration environment for scripts might be
* decoupled from their runtime environment, the set of languages available at
* runtime are not determinable by the configuration facilities (GUIs for
* example). Therefore a common set of possibly supported languages has to be
* preset.
*
* @author Christian Weiss
*/
public enum ScriptLanguage {
/** Jython. */
Jython("Jython", "py"),
/** JavaScript. */
JavaScript("JavaScript", "js"),
/** Python. */
Python("Python", "py");
private final String name;
private final String extension;
ScriptLanguage(final String name, final String extension) {
this.name = name;
this.extension = extension;
}
public String getName() {
return name;
}
public String getExtension() {
return extension;
}
/**
* Returns the enum constant with the specified name.
*
* @param name
* the name of the enum constant to return
* @return the enum constant with the specified name
* @throws IllegalArgumentException
* if the specified name is unknown
*/
public static ScriptLanguage getByName(final String name) throws IllegalArgumentException {
assert name != null && !name.isEmpty();
ScriptLanguage result = null;
for (final ScriptLanguage language : values()) {
if (language.name.equals(name)) {
result = language;
break;
}
}
/*
final List<ScriptEngineFactory> factories = ENGINE_MANAGER
.getEngineFactories();
factoriesLoop:
for (final ScriptEngineFactory factory : factories) {
if (factory.getNames().contains(name)) {
for (final ScriptLanguage language : values()) {
if (factory.getNames().contains(language.getName())) {
result = language;
break factoriesLoop;
}
}
}
}
*/
if (result == null) {
throw new IllegalArgumentException();
}
return result;
}
/**
* Returns the enum constant with the specified extension.
*
* @param extension
* the extension of the enum constant to return
* @return the enum constant with the specified extension
* @throws IllegalArgumentException
* if the specified extension is unknown
*/
public static ScriptLanguage getByExtension(final String extension)
throws IllegalArgumentException {
assert extension != null && !extension.isEmpty();
assert extension.matches("^[-_a-zA-Z0-9]+$");
ScriptLanguage result = null;
for (final ScriptLanguage language : values()) {
if (language.extension.equals(extension)) {
result = language;
break;
}
}
if (result == null) {
throw new IllegalArgumentException();
}
return result;
}
/**
* {@link Exception} to signal, that no {@link javax.script.ScriptEngine} is
* registered to handle scripts of a language.
*
* @author Christian Weiss
*/
public static class NoEngineException extends RuntimeException {
private static final long serialVersionUID = -593738405021184970L;
private final ScriptLanguage language;
public NoEngineException(final ScriptLanguage language) {
this.language = language;
}
public NoEngineException(final ScriptLanguage language,
final Throwable cause) {
super(cause);
this.language = language;
}
public NoEngineException(final String message,
final ScriptLanguage language) {
super(message);
this.language = language;
}
public NoEngineException(final String message, final Throwable cause,
final ScriptLanguage language) {
super(message, cause);
this.language = language;
}
public ScriptLanguage getLanguage() {
return language;
}
}
}