/**
* Copyright 2015 Eediom Inc.
*
* 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.araqne.logdb.nashorn.impl;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Provides;
import org.araqne.logdb.nashorn.NashornQueryScript;
import org.araqne.logdb.nashorn.NashornQueryScriptRegistry;
import org.osgi.framework.BundleContext;
@Component(name = "logdb-nashorn-query-script-registry")
@Provides
public class NashornQueryScriptRegistryImpl implements NashornQueryScriptRegistry {
private ScriptEngineManager factory;
private File scriptDir;
private BundleContext bc;
public NashornQueryScriptRegistryImpl(BundleContext bc) {
this.bc = bc;
this.scriptDir = ScriptPaths.getPath("query_scripts");
this.factory = new ScriptEngineManager();
}
@Override
public NashornQueryScript newScript(String scriptName) {
ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
File file = new File(scriptDir, scriptName + ".js");
String path = file.getAbsolutePath();
try {
Thread.currentThread().setContextClassLoader(NashornQueryScript.class.getClassLoader());
ScriptEngine nashornEngine = factory.getEngineByName("nashorn");
if (nashornEngine == null)
throw new IllegalStateException("cannot load nashorn engine for javascript " + scriptName);
nashornEngine.eval("var QueryScript = Java.type(\"org.araqne.logdb.nashorn.NashornQueryScript\");");
nashornEngine.eval(new FileReader(file));
NashornQueryScript script = (NashornQueryScript) nashornEngine.eval("new " + scriptName + "();");
script.setBundleContext(bc);
return script;
} catch (FileNotFoundException e) {
throw new IllegalStateException("javascript parser script not found: " + path, e);
} catch (ScriptException e) {
throw new IllegalStateException("cannot eval parser script: " + path + ", cause: " + e.toString(), e);
} finally {
Thread.currentThread().setContextClassLoader(oldLoader);
}
}
}