blob: c63bbef58b8be386e21e9953b942f2314e06530c [file] [log] [blame]
/*********************************************************************************************************************
* Copyright (c) 2008, 2015 Empolis Information Management GmbH and brox IT Solutions GmbH. All rights reserved.
* This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
**********************************************************************************************************************/
package org.eclipse.smila.scripting.internal;
import java.net.URI;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.smila.blackboard.BlackboardFactory;
import org.eclipse.smila.processing.PipeletTracker;
import org.eclipse.wst.jsdt.debug.rhino.debugger.RhinoDebugger;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ContextFactory;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
import org.mozilla.javascript.commonjs.module.ModuleScriptProvider;
import org.mozilla.javascript.commonjs.module.provider.ModuleSourceProvider;
import org.mozilla.javascript.commonjs.module.provider.StrongCachingModuleScriptProvider;
import org.mozilla.javascript.commonjs.module.provider.UrlModuleSourceProvider;
import org.mozilla.javascript.tools.shell.Global;
import org.osgi.framework.BundleContext;
/**
* Some helper functions around Rhino classes to hide details.
*/
public final class RhinoUtils {
private static final String SCRIPT_LOG_CATEGORY = JavascriptEngine.BUNDLE_NAME + ".js";
private RhinoUtils() {
throw new UnsupportedOperationException("RhinoUtils must not be instantiated.");
}
/**
* Print some information about the Rhino engine to the given log.
*
* @param log
* logger to use.
*/
public static void printEngineInfo(final Log log) {
final Context cx = Context.enter();
try {
log.info("Javascript engine is " + cx.getImplementationVersion());
log.info("Language version " + cx.getLanguageVersion());
log.info("Optimization level " + cx.getOptimizationLevel());
log.info("Interpreter locale " + cx.getLocale());
} finally {
Context.exit();
}
}
/**
* Creates and start the Eclipse JSDT debugger interface for Rhino.
*
* @param connectionString
* see https://wiki.eclipse.org/JSDT/Debug/Rhino/Embedding_Rhino_Debugger#The_Connection_String
* @throws Exception
* error starting the debugger.
*/
public static void startDebugger(final String connectionString) throws Exception {
final RhinoDebugger debugger = new RhinoDebugger(connectionString);
debugger.start();
ContextFactory.getGlobal().addListener(debugger);
}
/**
* Creates a ModuleScriptProvider that loads scripts from the given directory only.
*
* @param scriptDirectory
* base script directory.
* @return script provider.
*/
public static ModuleScriptProvider createScriptProvider(final Path scriptDirectory) {
final List<URI> scriptDirsAsURIs = Arrays.asList(scriptDirectory.toUri());
final ModuleSourceProvider sourceProvider = new UrlModuleSourceProvider(scriptDirsAsURIs, null, null, null);
return new StrongCachingModuleScriptProvider(sourceProvider);
}
/**
* Creates a Rhino base scope for SMILA script processing. The scope will already contain:
* <ul>
* <li>the Rhino Shell Globals as provided by {@link Global}.</li>
* <li>a {@link PipeletBuilder} as "pipelets".</li>
* <li>a {@link ServiceAccessor} as "services".</li>
* <li>a default logger as "log"</li>
* <li>a LogFactory as "LogFactory".</li>
*
* The scope will be sealed so that it cannot be modified by scripts.
*
* @param bundleContext
* bundle context for lookup of service references.
* @param pipeletTracker
* the pipelet tracker service.
* @param blackboardFactory
* the blackboard factory service, needed to support pipelet invocations.
* @return
*/
public static Scriptable createBaseScope(final BundleContext bundleContext, final PipeletTracker pipeletTracker,
final BlackboardFactory blackboardFactory) {
final Context context = Context.enter();
try {
final ScriptableObject baseScope = context.initStandardObjects(null, true);
final Global global = new Global(context);
baseScope.setPrototype(global);
final PipeletBuilder pipeletBuilder = new PipeletBuilder(pipeletTracker, blackboardFactory, baseScope);
final ServiceAccessor serviceAccessor = new ServiceAccessor(bundleContext);
final Log scriptLog = LogFactory.getLog(SCRIPT_LOG_CATEGORY);
final LogFactory logFactory = LogFactory.getFactory();
ScriptableObject.putProperty(baseScope, "pipelets", Context.javaToJS(pipeletBuilder, baseScope));
ScriptableObject.putProperty(baseScope, "services", Context.javaToJS(serviceAccessor, baseScope));
ScriptableObject.putProperty(baseScope, "log", Context.javaToJS(scriptLog, baseScope));
ScriptableObject.putProperty(baseScope, "LogFactory", Context.javaToJS(logFactory, baseScope));
baseScope.sealObject();
return baseScope;
} finally {
Context.exit();
}
}
}