package azkaban.test.jobExecutor;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;

import org.apache.log4j.Logger;

import azkaban.jobExecutor.AbstractJob;
import azkaban.jobExecutor.ProcessJob;
import azkaban.utils.Props;

public class WordCountLocal extends AbstractJob {

  private String _input = null;
  private String _output = null;
  private Map<String, Integer> _dic = new HashMap<String, Integer>();

  public static void main(String[] args) throws Exception {
    String propsFile = System.getenv(ProcessJob.JOB_PROP_ENV);
    System.out.println("propsFile: " + propsFile);
    Props prop = new Props(null, propsFile);
    WordCountLocal instance = new WordCountLocal("", prop);
    instance.run();
  }

  public WordCountLocal(String id, Props prop) {
    super(id, Logger.getLogger(WordCountLocal.class));
    _input = prop.getString("input");
    _output = prop.getString("output");
  }

  public void run() throws Exception {

    if (_input == null)
      throw new Exception("input file is null");
    if (_output == null)
      throw new Exception("output file is null");
    BufferedReader in =
        new BufferedReader(new InputStreamReader(new FileInputStream(_input)));

    String line = null;
    while ((line = in.readLine()) != null) {
      StringTokenizer tokenizer = new StringTokenizer(line);
      while (tokenizer.hasMoreTokens()) {
        String word = tokenizer.nextToken();

        if (word.toString().equals("end_here")) { // expect an out-of-bound
                                                  // exception
          String[] errArray = new String[1];
          System.out.println("string in possition 2 is " + errArray[1]);
        }

        if (_dic.containsKey(word)) {
          Integer num = _dic.get(word);
          _dic.put(word, num + 1);
        } else {
          _dic.put(word, 1);
        }
      }
    }
    in.close();

    PrintWriter out = new PrintWriter(new FileOutputStream(_output));
    for (Map.Entry<String, Integer> entry : _dic.entrySet()) {
      out.println(entry.getKey() + "\t" + entry.getValue());
    }
    out.close();
  }

  @Override
  public Props getJobGeneratedProperties() {
    return new Props();
  }

  @Override
  public boolean isCanceled() {
    return false;
  }

}
