// Path: binarypig/src/main/java/com/endgame/binarypig/util/ProgramExector.java
// public class ProgramExector extends Thread 
// {
// 	int retVal = -1;
// 	long endtime;
// 	boolean timedOut = false;
// 	
// 	Process proc;
// 	OutputStream stdin;
// 	InputStream stdout;
// 	InputStream stderr;
// 	
// 	public ProgramExector(String[] cmd, long timeoutMS) throws IOException{
// 		if(timeoutMS <= 0 || (System.currentTimeMillis() + timeoutMS) <= 0){
// 			this.endtime = Long.MAX_VALUE;
// 		}
// 		else{
// 			this.endtime = (System.currentTimeMillis() + timeoutMS);
// 		}
// 		
// 		proc = Runtime.getRuntime().exec(cmd);
// 		stdin = new BufferedOutputStream(proc.getOutputStream());
// 		stdout = proc.getInputStream();
// 		stderr = proc.getErrorStream();
// 	}
// 	
// 	@Override
// 	public void run() {
// 		while(true)
// 		{
// 			try {
// 				retVal = proc.exitValue();
// 				// process finished!
// 				break;
// 			} catch (IllegalThreadStateException e) 
// 			{
// 				// process is still running...
// 				if(System.currentTimeMillis() >= endtime){
// 					// Process timed out
// 					timedOut = true;
// 					proc.destroy();
// 					retVal = -1;
// 					break;
// 				}
// 				else
// 				{
// 					try {
// 						Thread.sleep(10);
// 					} catch (InterruptedException e1) {
// 						throw new RuntimeException(e1);
// 					}
// 				}
// 			}
// 		}
// 	}
// 	
// 	public boolean isTimedOut() {
// 		return timedOut;
// 	}
// 	
// 	public InputStream getStderr() {
// 		return stderr;
// 	}
// 	
// 	public OutputStream getStdin() {
// 		return stdin;
// 	}
// 	
// 	public InputStream getStdout() {
// 		return stdout;
// 	}
// 	
// 	public int getRetVal() {
// 		return retVal;
// 	}
// 	
// 	public void closeStreams()
// 	{
// 		IOUtils.closeStream(getStderr());
// 		IOUtils.closeStream(getStdin());
// 		IOUtils.closeStream(getStdout());
// 	}
// }
// 
// Path: binarypig/src/main/java/com/endgame/binarypig/util/StreamUtils.java
// public class StreamUtils {
// 
// 	public static String drainInputStream(InputStream stream)
// 	{	
// 		StringBuilder buf = new StringBuilder();
// 		try {
// 			while(stream.available() > 0)
// 			{
// 				buf.append((char)stream.read());
// 			}
// 		} catch (IOException e) {}
// 		return buf.toString();
// 	}
// 
// 	public static void writeToFile(BytesWritable value, File binaryFile) throws IOException
// 	{
// 		FileOutputStream fileOut = new FileOutputStream(binaryFile);
// 		fileOut.write(value.getBytes(), 0, value.getLength());
// 		fileOut.close();
// 	}
// 
// }


import com.endgame.binarypig.util.ProgramExector;
import com.endgame.binarypig.util.StreamUtils;
import com.google.common.base.Stopwatch;
import java.io.File;
import java.io.IOException;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigSplit;
import org.apache.pig.data.Tuple;
		ensureProgramFilePermissions();
	}
	
	public void ensureProgramFilePermissions()
	{
		programFile = new File(workingDir, this.script);
		if(programFile.exists()) {
			programFile.setExecutable(true);
			programFile.setReadable(true);
		}
		else{
			throw new RuntimeException("Program doesn't exist: "+programFile);
		}
	}
	
	String[] getCommand(File inputFile)
	{
		return new String[]{programFile.getPath(), inputFile.getPath()};
	}
	
	public void dumpStats()
	{
		System.err.println("script      = "+script);
		System.err.println("programFile = "+programFile);
		super.dumpStats();
	}

	@Override
	public Tuple processFile(Text key, BytesWritable value, File binaryFile) throws IOException{
		
// Path: binarypig/src/main/java/com/endgame/binarypig/util/ProgramExector.java
// public class ProgramExector extends Thread 
// {
// 	int retVal = -1;
// 	long endtime;
// 	boolean timedOut = false;
// 	
// 	Process proc;
// 	OutputStream stdin;
// 	InputStream stdout;
// 	InputStream stderr;
// 	
// 	public ProgramExector(String[] cmd, long timeoutMS) throws IOException{
// 		if(timeoutMS <= 0 || (System.currentTimeMillis() + timeoutMS) <= 0){
// 			this.endtime = Long.MAX_VALUE;
// 		}
// 		else{
// 			this.endtime = (System.currentTimeMillis() + timeoutMS);
// 		}
// 		
// 		proc = Runtime.getRuntime().exec(cmd);
// 		stdin = new BufferedOutputStream(proc.getOutputStream());
// 		stdout = proc.getInputStream();
// 		stderr = proc.getErrorStream();
// 	}
// 	
// 	@Override
// 	public void run() {
// 		while(true)
// 		{
// 			try {
// 				retVal = proc.exitValue();
// 				// process finished!
// 				break;
// 			} catch (IllegalThreadStateException e) 
// 			{
// 				// process is still running...
// 				if(System.currentTimeMillis() >= endtime){
// 					// Process timed out
// 					timedOut = true;
// 					proc.destroy();
// 					retVal = -1;
// 					break;
// 				}
// 				else
// 				{
// 					try {
// 						Thread.sleep(10);
// 					} catch (InterruptedException e1) {
// 						throw new RuntimeException(e1);
// 					}
// 				}
// 			}
// 		}
// 	}
// 	
// 	public boolean isTimedOut() {
// 		return timedOut;
// 	}
// 	
// 	public InputStream getStderr() {
// 		return stderr;
// 	}
// 	
// 	public OutputStream getStdin() {
// 		return stdin;
// 	}
// 	
// 	public InputStream getStdout() {
// 		return stdout;
// 	}
// 	
// 	public int getRetVal() {
// 		return retVal;
// 	}
// 	
// 	public void closeStreams()
// 	{
// 		IOUtils.closeStream(getStderr());
// 		IOUtils.closeStream(getStdin());
// 		IOUtils.closeStream(getStdout());
// 	}
// }
// 
// Path: binarypig/src/main/java/com/endgame/binarypig/util/StreamUtils.java
// public class StreamUtils {
// 
// 	public static String drainInputStream(InputStream stream)
// 	{	
// 		StringBuilder buf = new StringBuilder();
// 		try {
// 			while(stream.available() > 0)
// 			{
// 				buf.append((char)stream.read());
// 			}
// 		} catch (IOException e) {}
// 		return buf.toString();
// 	}
// 
// 	public static void writeToFile(BytesWritable value, File binaryFile) throws IOException
// 	{
// 		FileOutputStream fileOut = new FileOutputStream(binaryFile);
// 		fileOut.write(value.getBytes(), 0, value.getLength());
// 		fileOut.close();
// 	}
// 
// }


// Path: binarypig/src/main/java/com/endgame/binarypig/loaders/AbstractExecutingLoader.java
import com.endgame.binarypig.util.ProgramExector;
import com.endgame.binarypig.util.StreamUtils;
import com.google.common.base.Stopwatch;
import java.io.File;
import java.io.IOException;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigSplit;
import org.apache.pig.data.Tuple;

		ensureProgramFilePermissions();
	}
	
	public void ensureProgramFilePermissions()
	{
		programFile = new File(workingDir, this.script);
		if(programFile.exists()) {
			programFile.setExecutable(true);
			programFile.setReadable(true);
		}
		else{
			throw new RuntimeException("Program doesn't exist: "+programFile);
		}
	}
	
	String[] getCommand(File inputFile)
	{
		return new String[]{programFile.getPath(), inputFile.getPath()};
	}
	
	public void dumpStats()
	{
		System.err.println("script      = "+script);
		System.err.println("programFile = "+programFile);
		super.dumpStats();
	}

	@Override
	public Tuple processFile(Text key, BytesWritable value, File binaryFile) throws IOException{
		
		ProgramExector exec = new ProgramExector(getCommand(binaryFile), timeoutMS);