/** * Copyright (c) 2012-2016 André Bargull * Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms. * * <https://github.com/anba/es6draft> */ package com.github.anba.es6draft.scripting; import static java.util.Arrays.asList; import static java.util.Collections.unmodifiableList; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.List; import javax.script.ScriptEngine; import javax.script.ScriptEngineFactory; /** * Concrete implementation of the {@link ScriptEngineFactory} interface. */ public final class ScriptEngineFactoryImpl implements ScriptEngineFactory { @Override public String getEngineName() { return "es6draft"; } @Override public String getEngineVersion() { return getResourceInfo("/version", "<unknown version>"); } @Override public List<String> getExtensions() { // http://www.ietf.org/rfc/rfc4329.txt return unmodifiableList(asList("js", "es")); } @Override public List<String> getMimeTypes() { // http://www.ietf.org/rfc/rfc4329.txt return unmodifiableList( asList("application/javascript", "text/javascript", "application/ecmascript", "text/ecmascript")); } @Override public List<String> getNames() { return unmodifiableList(asList("es6draft", "ES6Draft", "JavaScript", "javascript", "ECMAScript", "ecmascript")); } @Override public String getLanguageName() { return "ECMAScript"; } @Override public String getLanguageVersion() { return "ECMAScript 2015"; } @Override public Object getParameter(String key) { switch (key) { case ScriptEngine.ENGINE: return getEngineName(); case ScriptEngine.ENGINE_VERSION: return getEngineVersion(); case ScriptEngine.NAME: return getNames().get(0); case ScriptEngine.LANGUAGE: return getLanguageName(); case ScriptEngine.LANGUAGE_VERSION: return getLanguageVersion(); case "THREADING": return null; default: return null; } } @Override public String getMethodCallSyntax(String obj, String m, String... args) { StringBuilder methodCall = new StringBuilder(); methodCall.append(obj).append('.').append(m).append('('); for (int i = 0, len = args.length; i < len; ++i) { if (i != 0) { methodCall.append(", "); } methodCall.append(args[i]); } return methodCall.append(')').toString(); } @Override public String getOutputStatement(String toDisplay) { String escapedDisplay = toDisplay.replaceAll("([\"\\\\])", "\\\\$1"); return "print(\"" + escapedDisplay + "\")"; } @Override public String getProgram(String... statements) { StringBuilder program = new StringBuilder(); for (String statement : statements) { program.append(statement).append(";\n"); } return program.toString(); } @Override public ScriptEngine getScriptEngine() { return new ScriptEngineImpl(this); } private static String getResourceInfo(String resourceName, String defaultValue) { try (BufferedReader reader = new BufferedReader(new InputStreamReader( ScriptEngineFactoryImpl.class.getResourceAsStream(resourceName), StandardCharsets.UTF_8))) { return reader.readLine(); } catch (IOException e) { return defaultValue; } } }