/**
* Copyright (c) 2015, Lucee Assosication Switzerland. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
package lucee.runtime.jsr223;
import java.util.List;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import lucee.commons.lang.StringUtil;
import lucee.loader.engine.CFMLEngine;
import lucee.runtime.config.ConfigImpl;
import lucee.runtime.config.ConfigWebUtil;
import lucee.runtime.config.Constants;
import lucee.runtime.engine.ThreadLocalPageContext;
import lucee.runtime.type.util.ListUtil;
public class ScriptEngineFactoryImpl implements ScriptEngineFactory {
final CFMLEngine engine;
final boolean tag;
final int dialect;
final boolean isCFML;
public ScriptEngineFactoryImpl(CFMLEngine engine, boolean tag, int dialect){
this.engine=engine;
this.tag=tag;
this.dialect=dialect;
this.isCFML=dialect==CFMLEngine.DIALECT_CFML;
}
@Override
public List<String> getExtensions() {
return ListUtil.arrayToList(isCFML?Constants.getCFMLExtensions():Constants.getLuceeExtensions());
}
@Override
public List<String> getMimeTypes() {
return ListUtil.arrayToList(isCFML?Constants.CFML_MIMETYPES:Constants.LUCEE_MIMETYPES);
}
@Override
public List<String> getNames() {
return ListUtil.arrayToList(
dialect==CFMLEngine.DIALECT_CFML?Constants.CFML_ALIAS_NAMES:Constants.LUCEE_ALIAS_NAMES);
}
@Override
public Object getParameter(String key) {
if(key.equalsIgnoreCase(ScriptEngine.NAME))
return ConfigWebUtil.toDialect(dialect, "");
if(key.equalsIgnoreCase(ScriptEngine.ENGINE))
return Constants.NAME+" (dialect:"+ConfigWebUtil.toDialect(dialect, "")+")";
if(key.equalsIgnoreCase(ScriptEngine.ENGINE_VERSION) || key.equalsIgnoreCase(ScriptEngine.LANGUAGE_VERSION))
return engine.getInfo().getVersion().toString();
if(key.equalsIgnoreCase(ScriptEngine.LANGUAGE))
return (isCFML?Constants.CFML_NAME:Constants.LUCEE_NAME).toLowerCase()+(tag?"-tag":"");
if(key.equalsIgnoreCase("THREADING")) return "THREAD-ISOLATED";
throw new IllegalArgumentException("Invalid key");
}
@Override
public String getMethodCallSyntax(String obj, String m, String... args) {
StringBuilder sb = new StringBuilder();
if(tag) sb.append("<").append(getSetTagName()).append(" ");
sb.append(obj).append('.').append(m).append('(');
if(args!=null)for (int i = 0; i < args.length; i++) {
sb.append("'");
sb.append(escape(args[i]));
sb.append("'");
if (i == args.length - 1) sb.append(')');
else sb.append(',');
}
if(tag) sb.append(">");
else sb.append(";");
return sb.toString();
}
@Override
public String getOutputStatement(String toDisplay) {
StringBuilder sb = new StringBuilder();
if(tag) sb.append("<").append(getSetTagName()).append(" ");
sb.append("echo(").append("'").append(escape(toDisplay)).append("'").append(")");
if(tag) sb.append(">");
else sb.append(";");
return sb.toString();
}
@Override
public String getProgram(String... statements) {
//String name=getScriptTagName();
StringBuilder sb = new StringBuilder()
/*.append("<")
.append(name)
.append(">\n")*/;
int len = statements.length;
for (int i = 0; i < len; i++) {
sb.append(statements[i]).append(";\n");
}
//sb.append("</").append(name).append(">");
return sb.toString();
}
private String getScriptTagName() {
String prefix = ((ConfigImpl)ThreadLocalPageContext.getConfig()).getCoreTagLib(dialect).getNameSpaceAndSeparator();
return prefix+(dialect==CFMLEngine.DIALECT_CFML?Constants.CFML_SCRIPT_TAG_NAME:Constants.LUCEE_SCRIPT_TAG_NAME);
}
private String getSetTagName() {
String prefix = ((ConfigImpl)ThreadLocalPageContext.getConfig()).getCoreTagLib(dialect).getNameSpaceAndSeparator();
return prefix+(dialect==CFMLEngine.DIALECT_CFML?Constants.CFML_SET_TAG_NAME:Constants.LUCEE_SET_TAG_NAME);
}
@Override
public ScriptEngine getScriptEngine() {
return new ScriptEngineImpl(this);
}
private Object escape(String str) {
return StringUtil.replace(str, "'", "''", false);
}
public String getName() {
return (String)getParameter(ScriptEngine.NAME);
}
@Override
public String getEngineName() {
return (String)getParameter(ScriptEngine.ENGINE);
}
@Override
public String getEngineVersion() {
return (String)getParameter(ScriptEngine.ENGINE_VERSION);
}
@Override
public String getLanguageName() {
return (String)getParameter(ScriptEngine.LANGUAGE);
}
@Override
public String getLanguageVersion() {
return (String)getParameter(ScriptEngine.LANGUAGE_VERSION);
}
}