tigase.osgi
Class OSGiScriptEngineManager

java.lang.Object
  extended by javax.script.ScriptEngineManager
      extended by tigase.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 @link ScriptEngineFactory classes. For each bundle, it creates a ScriptEngineManager, then merges them. @link 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: