Search in sources :

Example 1 with JavaTypeConverters

use of io.cdap.plugin.common.script.JavaTypeConverters in project hydrator-plugins by cdapio.

the class JavaScriptTransform method init.

private void init(@Nullable TransformContext context, FailureCollector collector) {
    ScriptEngineManager manager = new ScriptEngineManager();
    engine = manager.getEngineByName("JavaScript");
    try {
        engine.eval(ScriptConstants.HELPER_DEFINITION);
    } catch (ScriptException e) {
        // shouldn't happen
        collector.addFailure("Failed to define helper functions.", null);
        throw collector.getOrThrowException();
    }
    JavaTypeConverters js = ((Invocable) engine).getInterface(engine.get(ScriptConstants.HELPER_NAME), JavaTypeConverters.class);
    LookupConfig lookupConfig;
    try {
        lookupConfig = GSON.fromJson(config.lookup, LookupConfig.class);
    } catch (JsonSyntaxException e) {
        collector.addFailure("Invalid lookup config.", "Expected JSON map of string to string.").withConfigProperty(Config.LOOKUP);
        throw collector.getOrThrowException();
    }
    Arguments arguments = context == null ? null : context.getArguments();
    engine.put(CONTEXT_NAME, new ScriptContext(LOG, metrics, context, lookupConfig, js, arguments));
    try {
        // this is pretty ugly, but doing this so that we can pass the 'input' json into the transform function.
        // that is, we want people to implement
        // function transform(input) { ... }
        // rather than function transform() { ... } and have them access a global variable in the function
        String script = String.format("function %s() { return transform(%s, %s, %s); }\n%s", FUNCTION_NAME, VARIABLE_NAME, EMITTER_NAME, CONTEXT_NAME, config.script);
        engine.eval(script);
    } catch (ScriptException e) {
        collector.addFailure(String.format("Invalid script: %s.", e.getMessage()), null).withConfigProperty(Config.SCRIPT);
    }
    invocable = (Invocable) engine;
    if (config.schema != null) {
        try {
            schema = Schema.parseJson(config.schema);
        } catch (IOException e) {
            collector.addFailure(String.format("Invalid schema: %s.", e.getMessage()), "Output schema must be JSON parseable.").withConfigProperty(Config.SCHEMA);
        }
    }
    collector.getOrThrowException();
}
Also used : ScriptException(javax.script.ScriptException) Invocable(javax.script.Invocable) JsonSyntaxException(com.google.gson.JsonSyntaxException) JavaTypeConverters(io.cdap.plugin.common.script.JavaTypeConverters) ScriptEngineManager(javax.script.ScriptEngineManager) Arguments(io.cdap.cdap.etl.api.Arguments) ScriptContext(io.cdap.plugin.common.script.ScriptContext) IOException(java.io.IOException) LookupConfig(io.cdap.cdap.etl.api.LookupConfig)

Aggregations

JsonSyntaxException (com.google.gson.JsonSyntaxException)1 Arguments (io.cdap.cdap.etl.api.Arguments)1 LookupConfig (io.cdap.cdap.etl.api.LookupConfig)1 JavaTypeConverters (io.cdap.plugin.common.script.JavaTypeConverters)1 ScriptContext (io.cdap.plugin.common.script.ScriptContext)1 IOException (java.io.IOException)1 Invocable (javax.script.Invocable)1 ScriptEngineManager (javax.script.ScriptEngineManager)1 ScriptException (javax.script.ScriptException)1