All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.earcam.utilitarian.site.search.offline.Javascript Maven / Gradle / Ivy

/*-
 * #%L
 * io.earcam.utilitarian.site.search.offline
 * %%
 * Copyright (C) 2017 earcam
 * %%
 * SPDX-License-Identifier: (BSD-3-Clause OR EPL-1.0 OR Apache-2.0 OR MIT)
 *
 * You must choose to accept, in full - any individual or combination of
 * the following licenses:
 * 
 * #L%
 */
package io.earcam.utilitarian.site.search.offline;

import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.ServiceLoader.load;
import static java.util.stream.StreamSupport.stream;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptException;

import io.earcam.unexceptional.Exceptional;

final class Javascript {

	private static final String ECMA_SCRIPT = "ECMAScript";
	private static final Charset CHARSET = UTF_8;


	private Javascript()
	{
		throw new IllegalStateException("nope");
	}


	public static Invocable createJavascriptEngine(InputStream... scripts)
	{
		return createScriptEngine(ECMA_SCRIPT, scripts);
	}


	public static Invocable createScriptEngine(String language, InputStream... scripts)
	{
		ScriptEngine engine = stream(load(ScriptEngineFactory.class).spliterator(), false)
				.filter(f -> f.getLanguageName().equals(language))
				.findAny()
				.orElseThrow(ScriptRuntimeException::engineNotFound)
				.getScriptEngine();

		for(InputStream script : scripts) {
			try {
				engine.eval(new InputStreamReader(script, CHARSET));
			} catch(ScriptException e) {
				throw new ScriptRuntimeException(e);
			}
		}
		return (Invocable) engine;
	}


	public static Object invokeFunction(Invocable engine, String name, Object... args)
	{
		return Exceptional.apply(engine::invokeFunction, name, args);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy