blob: 646ff0cd4cefe5752fd8fa80d400954e68cf4fd1 [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 javax.script;
import java.io.*;
import java.lang.annotation.AnnotationFormatError;
import java.net.URL;
import java.util.*;
public class ScriptEngineManager {
private final Set engineSpis = new HashSet();
private final Map<String, ScriptEngineFactory> byName = new HashMap<String, ScriptEngineFactory>();
private final Map<String, ScriptEngineFactory> registeredByName = new HashMap();
private final Map<String, ScriptEngineFactory> byExtension = new HashMap<String, ScriptEngineFactory>();
private final Map<String, ScriptEngineFactory> registeredByExtension = new HashMap<String, ScriptEngineFactory>();
private final Map<String, ScriptEngineFactory> byMimeType = new HashMap<String, ScriptEngineFactory>();
private final Map<String, ScriptEngineFactory> registeredByMimeType = new HashMap<String, ScriptEngineFactory>();
private Bindings globalScope;
public ScriptEngineManager() {
this(Thread.currentThread().getContextClassLoader());
}
public ScriptEngineManager(ClassLoader classLoader) {
try
{
for (Enumeration factoryResources = classLoader.getResources("META-INF/services/javax.script.ScriptEngineFactory");
factoryResources.hasMoreElements();) {
URL url = (URL) factoryResources.nextElement();
for (String className : getClassNames(url)) {
try {
Class factoryClass = classLoader.loadClass(className);
Object object = factoryClass.newInstance();
if (object instanceof ScriptEngineFactory) {
ScriptEngineFactory factory = (ScriptEngineFactory) object;
for (String name : factory.getNames()) {
byName.put(name, factory);
}
for (String extension : factory.getExtensions()) {
byExtension.put(extension, factory);
}
for (String mimeType : factory.getMimeTypes()) {
byMimeType.put(mimeType, factory);
}
engineSpis.add(factory);
}
} catch(ClassNotFoundException doNothing) {
} catch(IllegalAccessException doNothing) {
} catch(InstantiationException doNothing) {
} catch(LinkageError doNothing) {
} catch(AnnotationFormatError doNothing) {
}
}
}
} catch(IOException doNothing) {
}
}
public Bindings getGlobalScope() {
return globalScope;
}
public void setGlobalScope(Bindings globalScope) {
this.globalScope = globalScope;
}
// Added JSR 223 API
public Bindings getBindings() {
return getGlobalScope();
}
public void setBindings(Bindings bindings) {
setGlobalScope(bindings);
}
public void put(String key, Object value) {
if (globalScope != null) {
globalScope.put(key, value);
}
}
public Object get(String key) {
if (globalScope != null) {
return globalScope.get(key);
} else {
return null;
}
}
public ScriptEngine getEngineByName(String shortName) {
ScriptEngineFactory factory = null;
List<Class<? extends ScriptEngineFactory>> factoryClasses = org.apache.servicemix.specs.locator.OsgiLocator.locateAll(javax.script.ScriptEngineFactory.class);
for (Class<? extends ScriptEngineFactory> factoryClass : factoryClasses) {
try {
ScriptEngineFactory f = factoryClass.newInstance();
if (f.getNames().contains(shortName)) {
factory = f;
break;
}
} catch (Throwable doNothing) {
}
}
if (factory == null) {
factory = registeredByName.get(shortName);
}
if (factory == null) {
factory = byName.get(shortName);
}
if (factory == null) {
return null;
} else {
ScriptEngine engine = factory.getScriptEngine();
engine.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE);
return engine;
}
}
public ScriptEngine getEngineByExtension(String extension) {
ScriptEngineFactory factory = null;
List<Class<? extends ScriptEngineFactory>> factoryClasses = org.apache.servicemix.specs.locator.OsgiLocator.locateAll(javax.script.ScriptEngineFactory.class);
for (Class<? extends ScriptEngineFactory> factoryClass : factoryClasses) {
try {
ScriptEngineFactory f = factoryClass.newInstance();
if (f.getExtensions().contains(extension)) {
factory = f;
break;
}
} catch (Throwable doNothing) {
}
}
if (factory == null) {
factory = registeredByExtension.get(extension);
}
if (factory == null) {
factory = byExtension.get(extension);
}
if (factory == null) {
return null;
} else {
ScriptEngine engine = factory.getScriptEngine();
engine.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE);
return engine;
}
}
public ScriptEngine getEngineByMimeType(String mimeType) {
ScriptEngineFactory factory = null;
List<Class<? extends ScriptEngineFactory>> factoryClasses = org.apache.servicemix.specs.locator.OsgiLocator.locateAll(javax.script.ScriptEngineFactory.class);
for (Class<? extends ScriptEngineFactory> factoryClass : factoryClasses) {
try {
ScriptEngineFactory f = factoryClass.newInstance();
if (f.getMimeTypes().contains(mimeType)) {
factory = f;
break;
}
} catch (Throwable doNothing) {
}
}
if (factory == null) {
factory = registeredByMimeType.get(mimeType);
}
if(factory == null) {
factory = byMimeType.get(mimeType);
}
if (factory == null) {
return null;
} else {
ScriptEngine engine = factory.getScriptEngine();
engine.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE);
return engine;
}
}
public List<ScriptEngineFactory> getEngineFactories() {
List<ScriptEngineFactory> factories = new ArrayList();
List<Class<? extends ScriptEngineFactory>> factoryClasses = org.apache.servicemix.specs.locator.OsgiLocator.locateAll(javax.script.ScriptEngineFactory.class);
for (Class<? extends ScriptEngineFactory> factoryClass : factoryClasses) {
try {
factories.add((ScriptEngineFactory) factoryClass.newInstance());
} catch (Throwable doNothing) {
}
}
factories.addAll(engineSpis);
return factories;
}
public void registerEngineName(String name, ScriptEngineFactory factory) {
registeredByName.put(name, factory);
}
public void registerEngineMimeType(String type, ScriptEngineFactory factory) {
registeredByMimeType.put(type, factory);
}
public void registerEngineExtension(String extension, ScriptEngineFactory factory) {
registeredByExtension.put(extension, factory);
}
private Iterable<String> getClassNames(URL url) {
Stack<String> stack = new Stack<String>();
try {
BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while ((line = r.readLine()) != null) {
int comment = line.indexOf('#');
if (comment != -1) {
line = line.substring(0, comment);
}
stack.push(line.trim());
}
} catch(IOException doNothing) {
}
return stack;
}
}