package org.develnext.jphp.scripting;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class JPHPScriptEngineFactory implements ScriptEngineFactory {
private static List<String> names;
private static List<String> extensions;
private static List<String> mimeTypes;
private static final ThreadLocal<JPHPScriptEngine> engines
= new ThreadLocal<JPHPScriptEngine>();
static {
names = new ArrayList<String>(2);
names.add("jphp");
names.add("php");
names = Collections.unmodifiableList(names);
extensions = new ArrayList<String>(1);
extensions.add("php");
extensions = Collections.unmodifiableList(extensions);
mimeTypes = new ArrayList<String>(4);
mimeTypes.add("text/php");
mimeTypes.add("text/x-php");
mimeTypes.add("application/php");
mimeTypes.add("application/x-php");
mimeTypes = Collections.unmodifiableList(mimeTypes);
}
@Override
public String getEngineName() {
return getScriptEngine().get(ScriptEngine.ENGINE).toString();
}
@Override
public String getEngineVersion() {
return getScriptEngine().get(ScriptEngine.ENGINE_VERSION).toString();
}
@Override
public List<String> getExtensions() {
return extensions;
}
@Override
public List<String> getMimeTypes() {
return mimeTypes;
}
@Override
public List<String> getNames() {
return names;
}
@Override
public String getLanguageName() {
return getScriptEngine().get(ScriptEngine.LANGUAGE).toString();
}
@Override
public String getLanguageVersion() {
return getScriptEngine().get(ScriptEngine.LANGUAGE_VERSION).toString();
}
@Override
public Object getParameter(String key) {
return getScriptEngine().get(key).toString();
}
@Override
public String getMethodCallSyntax(String obj, String m, String... args) {
StringBuilder buf = new StringBuilder();
buf.append('$');
buf.append(obj);
buf.append("->");
buf.append(m);
buf.append('(');
if (args.length != 0) {
int i = 0;
for (; i < args.length - 1; i++) {
buf.append('$');
buf.append(args[i] + ", ");
}
buf.append('$');
buf.append(args[i]);
}
buf.append(')');
return buf.toString();
}
@Override
public String getOutputStatement(String toDisplay) {
StringBuilder buf = new StringBuilder();
buf.append("print('");
int len = toDisplay.length();
for (int i = 0; i < len; i++) {
char ch = toDisplay.charAt(i);
switch (ch) {
case '\'':
buf.append("\\\'");
break;
case '\\':
buf.append("\\\\");
break;
default:
buf.append(ch);
break;
}
}
buf.append("')");
return buf.toString();
}
@Override
public String getProgram(String... statements) {
return null;
}
@Override
public ScriptEngine getScriptEngine() {
JPHPScriptEngine engine = engines.get();
if (engine == null) {
engine = new JPHPScriptEngine();
engine.setFactory(this);
engines.set(engine);
}
return engine;
}
}