/* * Copyright 2005 The Apache Software Foundation * * Licensed 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 org.apache.felix.mishell; import java.util.List; import javax.script.ScriptEngine; import javax.script.ScriptEngineFactory; /** * This is a wrapper class for the ScriptEngineFactory class that deals with context class loader issues * It is necessary because engines (at least ruby) use the context classloader to find their resources (i.e., their "native" classes) * */ public class OSGiScriptEngineFactory implements ScriptEngineFactory{ private ScriptEngineFactory factory; private ClassLoader contextClassLoader; public OSGiScriptEngineFactory (ScriptEngineFactory factory, ClassLoader contextClassLoader){ this.factory=factory; this.contextClassLoader=contextClassLoader; } public String getEngineName() { return factory.getEngineName(); } public String getEngineVersion() { return factory.getEngineVersion(); } public List<String> getExtensions() { return factory.getExtensions(); } public String getLanguageName() { return factory.getLanguageName(); } public String getLanguageVersion() { return factory.getLanguageVersion(); } public String getMethodCallSyntax(String obj, String m, String... args) { return factory.getMethodCallSyntax(obj, m, args); } public List<String> getMimeTypes() { return factory.getMimeTypes(); } public List<String> getNames() { return factory.getNames(); } public String getOutputStatement(String toDisplay) { return factory.getOutputStatement(toDisplay); } public Object getParameter(String key) { return factory.getParameter(key); } public String getProgram(String... statements) { return factory.getProgram(statements); } public ScriptEngine getScriptEngine() { ScriptEngine engine=null; if(contextClassLoader!=null){ ClassLoader old=Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(contextClassLoader); engine=factory.getScriptEngine(); Thread.currentThread().setContextClassLoader(old); } else engine=factory.getScriptEngine(); return engine; } }