com.hazelcast.osgi
Class OSGiScriptEngineManager

java.lang.Object
  extended by javax.script.ScriptEngineManager
      extended by 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:


Constructor Summary
OSGiScriptEngineManager(org.osgi.framework.BundleContext context)
           
 
Method Summary
 Object get(String key)
           
 Bindings getBindings()
           
 ScriptEngine getEngineByExtension(String extension)
           
 ScriptEngine getEngineByMimeType(String mimeType)
           
 ScriptEngine getEngineByName(String shortName)
           
 List<ScriptEngineFactory> getEngineFactories()
           
 void put(String key, Object value)
           
 void registerEngineExtension(String extension, ScriptEngineFactory factory)
           
 void registerEngineMimeType(String type, ScriptEngineFactory factory)
           
 void registerEngineName(String name, ScriptEngineFactory factory)
           
 void reloadManagers()
          This method is the only one that is visible and not part of the ScriptEngineManager class.
 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.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

OSGiScriptEngineManager

public OSGiScriptEngineManager(org.osgi.framework.BundleContext context)
Method Detail

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.