blob: 6889d93feaff61759a9449da689dd489557ebf0e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sling.scripting.api;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
/**
* This abstract class can be used for own script engine
* factory implementations.
*/
public abstract class AbstractScriptEngineFactory
implements ScriptEngineFactory {
/** The engine name. */
private String engineName;
/** The version of the engine. */
private String engineVersion;
/** List of extensions. */
private List<String> extensions;
/** List of mime types. */
private List<String> mimeTypes;
/** List of names. */
private List<String> names;
protected AbstractScriptEngineFactory() {
String name = null;
String version = null;
// try to get the manifest
Manifest manifest = null;
InputStream ins = null;
try {
ins = getClass().getResourceAsStream("/META-INF/MANIFEST.MF");
if (ins != null) {
manifest = new Manifest(ins);
Attributes attrs = manifest.getMainAttributes();
name = attrs.getValue("ScriptEngine-Name");
version = attrs.getValue("ScriptEngine-Version");
}
} catch (IOException ioe) {
// might want to log ?
} finally {
if (ins != null) {
try {
ins.close();
} catch (IOException ignore) {
}
}
}
// fall back to class name and version zero
if (name == null) {
String className = getClass().getName();
name = className.substring(className.lastIndexOf('.') + 1);
}
if (version == null) {
version = "0";
}
setEngineName(name);
setEngineVersion(version);
setExtensions((String[]) null);
setMimeTypes((String[]) null);
setNames((String[]) null);
}
/**
* @see javax.script.ScriptEngineFactory#getEngineName()
*/
public String getEngineName() {
return engineName;
}
/**
* Set the engine name.
* @param engineName The new engine name
*/
protected void setEngineName(String engineName) {
this.engineName = engineName;
}
/**
* @see javax.script.ScriptEngineFactory#getEngineVersion()
*/
public String getEngineVersion() {
return engineVersion;
}
/**
* Set the engine version
* @param engineVersion The version string
*/
protected void setEngineVersion(String engineVersion) {
this.engineVersion = engineVersion;
}
/**
* @see javax.script.ScriptEngineFactory#getExtensions()
*/
public List<String> getExtensions() {
return extensions;
}
/**
* Set the extensions
* @param extensions The array of extensions
*/
protected void setExtensions(String... extensions) {
if (extensions == null) {
this.extensions = Collections.emptyList();
} else {
this.extensions = Arrays.asList(extensions);
}
}
/**
* @see javax.script.ScriptEngineFactory#getMimeTypes()
*/
public List<String> getMimeTypes() {
return mimeTypes;
}
/**
* Set the mime types
* @param mimeTypes The array of mime types
*/
protected void setMimeTypes(String... mimeTypes) {
if (mimeTypes == null) {
this.mimeTypes = Collections.emptyList();
} else {
this.mimeTypes = Arrays.asList(mimeTypes);
}
}
/**
* @see javax.script.ScriptEngineFactory#getNames()
*/
public List<String> getNames() {
return names;
}
/**
* Set the names
* @param names The array of names.
*/
protected void setNames(String... names) {
if (names == null) {
this.names = Collections.emptyList();
} else {
this.names = Arrays.asList(names);
}
}
/**
* @see javax.script.ScriptEngineFactory#getMethodCallSyntax(java.lang.String, java.lang.String, java.lang.String[])
*/
public String getMethodCallSyntax(String obj, String m, String... args) {
StringBuilder callSyntax = new StringBuilder();
callSyntax.append(obj).append('.').append(m).append('(');
for (int i = 0; args != null && i < args.length; i++) {
if (i > 0) callSyntax.append(',');
callSyntax.append(args[i]);
}
callSyntax.append(')');
return callSyntax.toString();
}
/**
* @see javax.script.ScriptEngineFactory#getOutputStatement(java.lang.String)
*/
public String getOutputStatement(String value) {
return "out.print(" + value + ")";
}
/**
* @see javax.script.ScriptEngineFactory#getParameter(java.lang.String)
*/
public Object getParameter(String name) {
if (ScriptEngine.ENGINE.equals(name)) {
return getEngineName();
} else if (ScriptEngine.ENGINE_VERSION.equals(name)) {
return getEngineVersion();
} else if (ScriptEngine.NAME.equals(name)) {
return getNames();
} else if (ScriptEngine.LANGUAGE.equals(name)) {
return getLanguageName();
} else if (ScriptEngine.LANGUAGE_VERSION.equals(name)) {
return getLanguageVersion();
}
return null;
}
/**
* @see javax.script.ScriptEngineFactory#getProgram(java.lang.String[])
*/
public String getProgram(String... arg0) {
return null;
}
}