/* * 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; } 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; } }