com.hazelcast.osgi
Class OSGiScriptEngineManager
java.lang.Object
javax.script.ScriptEngineManager
com.hazelcast.osgi.OSGiScriptEngineManager
public class OSGiScriptEngineManager
- extends ScriptEngineManager
This class acts as a delegate for all the available ScriptEngineManagers. Unluckily, the standard did not
define it as an interface, so we need to extend it to allow polymorphism. However, no calls to super are used.
It wraps all available ScriptEngineManagers in the OSGi ServicePlatform into a merged ScriptEngineManager.
Internally, what this class does is creating ScriptEngineManagers for each bundle
that contains a ScriptEngineFactory and includes a META-INF/services/javax.script.ScriptEngineFactory file.
It assumes that the file contains a list of ScriptEngineFactory
classes. For each bundle, it creates a
ScriptEngineManager, then merges them. ScriptEngineFactory
objects are wrapped
into @link OSGiScriptEngineFactory objects to deal with problems of context class loader:
Those scripting engines that rely on the ContextClassloader for finding resources need to use this wrapper
and the @link OSGiScriptFactory. Mainly, jruby does.
Note that even if no context classloader issues arose, it would still be needed to search manually for the
factories and either use them directly (losing the mimeType/extension/shortName mechanisms for finding engines
or manually registering them) or still use this class, which would be smarter. In the latter case,
it would only be needed to remove the hack that temporarily sets the context classloader to the appropriate,
bundle-related, class loader.
Caveats:
-
All factories are wrapped with an
OSGiScriptEngineFactory
. As Engines are not wrapped,
calls like
ScriptEngineManager osgiManager=new OSGiScriptEngineManager(context);
ScriptEngine engine=osgiManager.getEngineByName("ruby");
ScriptEngineFactory factory=engine.getFactory() //this does not return the OSGiFactory wrapper
factory.getScriptEngine(); //this might fail, as it does not use OSGiScriptEngineFactory wrapper
might result in unexpected errors. Future versions may wrap the ScriptEngine with a OSGiScriptEngine to solve this
issue, but for the moment it is not needed.
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
OSGiScriptEngineManager
public OSGiScriptEngineManager(org.osgi.framework.BundleContext context)
reloadManagers
public void reloadManagers()
- This method is the only one that is visible and not part of the ScriptEngineManager class.
Its purpose is to find new managers that weren't available before, but keeping the globalScope bindings
set.
If you want to clean the bindings you can either get a fresh instance of OSGiScriptManager or
setting up a new bindings object.
This can be done with:
ScriptEngineManager manager=new OSGiScriptEngineManager(context);
(...)//do stuff
osgiManager=(OSGiScriptEngineManager)manager;//cast to ease reading
osgiManager.reloadManagers();
manager.setBindings(new OSGiBindings());//or you can use your own bindings implementation
get
public Object get(String key)
- Overrides:
get
in class ScriptEngineManager
getBindings
public Bindings getBindings()
- Overrides:
getBindings
in class ScriptEngineManager
setBindings
public void setBindings(Bindings bindings)
- Follows the same behavior of @link javax.script.ScriptEngineManager#setBindings(Bindings)
This means that the same bindings are applied to all the underlying managers.
- Overrides:
setBindings
in class ScriptEngineManager
- Parameters:
bindings
-
getEngineByExtension
public ScriptEngine getEngineByExtension(String extension)
- Overrides:
getEngineByExtension
in class ScriptEngineManager
getEngineByMimeType
public ScriptEngine getEngineByMimeType(String mimeType)
- Overrides:
getEngineByMimeType
in class ScriptEngineManager
getEngineByName
public ScriptEngine getEngineByName(String shortName)
- Overrides:
getEngineByName
in class ScriptEngineManager
getEngineFactories
public List<ScriptEngineFactory> getEngineFactories()
- Overrides:
getEngineFactories
in class ScriptEngineManager
put
public void put(String key,
Object value)
- Overrides:
put
in class ScriptEngineManager
registerEngineExtension
public void registerEngineExtension(String extension,
ScriptEngineFactory factory)
- Overrides:
registerEngineExtension
in class ScriptEngineManager
registerEngineMimeType
public void registerEngineMimeType(String type,
ScriptEngineFactory factory)
- Overrides:
registerEngineMimeType
in class ScriptEngineManager
registerEngineName
public void registerEngineName(String name,
ScriptEngineFactory factory)
- Overrides:
registerEngineName
in class ScriptEngineManager
Copyright © 2015 Hazelcast, Inc.. All Rights Reserved.