| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.pig.scripting.js; |
| |
| import java.io.IOException; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.apache.pig.scripting.BoundScript; |
| import org.apache.pig.scripting.Pig; |
| import org.apache.pig.scripting.ScriptEngine; |
| import org.mozilla.javascript.NativeFunction; |
| import org.mozilla.javascript.NativeObject; |
| |
| /** |
| * Pig entry point from javascript |
| * @author Julien Le Dem |
| * |
| */ |
| public class JSPig { |
| |
| /** |
| * I'm using composition instead of inheritance because javascript to java calls finds the existing bind() methods ambiguous |
| */ |
| private Pig pig; |
| |
| private JSPig(Pig pig) { |
| this.pig = pig; |
| } |
| |
| /** |
| * See {@link Pig} |
| * @param cmd Filesystem command to run along with its arguments as one string. |
| * @throws IOException |
| */ |
| public static int fs(String cmd) throws IOException { |
| return Pig.fs(cmd); |
| } |
| |
| /** |
| * See {@link Pig} |
| * @param jarfile Path of jar to include. |
| * @throws IOException if the indicated jarfile cannot be found. |
| */ |
| public static void registerJar(String jarfile) throws IOException { |
| Pig.registerJar(jarfile); |
| } |
| |
| /** |
| * See {@link Pig} |
| * @param udffile Path of the script UDF file |
| * @param namespace namespace of the UDFs |
| * @throws IOException |
| */ |
| public static void registerUDF(String udffile, String namespace) |
| throws IOException { |
| Pig.registerUDF(udffile, namespace); |
| } |
| |
| /** |
| * See {@link Pig} |
| * @param alias name of the defined alias |
| * @param definition string this alias is defined as |
| */ |
| public static void define(String alias, String definition) |
| throws IOException { |
| Pig.define(alias, definition); |
| } |
| |
| /** |
| * See {@link Pig} |
| * @param var variable to set |
| * @param value to set it to |
| */ |
| public static void set(String var, String value) throws IOException { |
| Pig.set(var, value); |
| } |
| |
| //------------------------------------------------------------------------- |
| |
| /** |
| * Define a Pig pipeline. |
| * @param pl Pig Latin definition of the pipeline. |
| * @return Pig object representing this pipeline. |
| * @throws IOException if the Pig Latin does not compile. |
| */ |
| public static JSPig compile(String pl) throws IOException { |
| return new JSPig(Pig.compile(pl)); |
| } |
| |
| /** |
| * Define a named portion of a Pig pipeline. This allows it |
| * to be imported into another pipeline. |
| * @param name Name that will be used to define this pipeline. |
| * The namespace is global. |
| * @param pl Pig Latin definition of the pipeline. |
| * @return Pig object representing this pipeline. |
| * @throws IOException if the Pig Latin does not compile. |
| */ |
| public static JSPig compile(String name, String pl) throws IOException { |
| return new JSPig(Pig.compile(name, pl)); |
| } |
| |
| /** |
| * Define a Pig pipeline based on Pig Latin in a separate file. |
| * @param filename File to read Pig Latin from. This must be a purely |
| * Pig Latin file. It cannot contain host language constructs in it. |
| * @return Pig object representing this pipeline. |
| * @throws IOException if the Pig Latin does not compile or the file |
| * cannot be found. |
| */ |
| public static JSPig compileFromFile(String filename) |
| throws IOException { |
| return new JSPig(Pig.compileFromFile(filename)); |
| } |
| |
| /** |
| * Define a named Pig pipeline based on Pig Latin in a separate file. |
| * This allows it to be imported into another pipeline. |
| * @param name Name that will be used to define this pipeline. |
| * The namespace is global. |
| * @param filename File to read Pig Latin from. This must be a purely |
| * Pig Latin file. It cannot contain host language constructs in it. |
| * @return Pig object representing this pipeline. |
| * @throws IOException if the Pig Latin does not compile or the file |
| * cannot be found. |
| */ |
| public static JSPig compileFromFile(String name, |
| String filename) throws IOException { |
| return new JSPig(Pig.compileFromFile(name, filename)); |
| } |
| |
| |
| /** |
| * javascript helper for binding parameters. |
| * See: {@link Pig#bind(Map)} |
| * @param o a javascript object to be converted into a Map |
| * @return the bound script |
| * @throws IOException if {@link Pig#bind(Map)} throws an IOException |
| */ |
| public BoundScript bind(Object o) throws IOException { |
| NativeObject vars = (NativeObject)o; |
| Map<String, Object> params = new HashMap<String, Object>(); |
| Object[] ids = vars.getIds(); |
| for (Object id : ids) { |
| if (id instanceof String) { |
| String name = (String) id; |
| Object value = vars.get(name, vars); |
| if (!(value instanceof NativeFunction) && value != null) { |
| params.put(name, value.toString()); |
| } |
| } |
| } |
| return pig.bind(params); |
| } |
| |
| /** |
| * See: {@link Pig#bind()} |
| * @throws IOException if host language variables are not found to resolve all |
| * Pig Latin parameters or if they contain unsupported types. |
| */ |
| public BoundScript bind() throws IOException { |
| return pig.bind(); |
| } |
| } |