/**
 * 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.hadoop.tools.rumen;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.mapreduce.jobhistory.JhCounters;

/**
 * This is a wrapper class around {@link LoggedTaskAttempt}. This provides
 * also the extra information about the task attempt obtained from
 * job history which is not written to the JSON trace file.
 */
public class ParsedTaskAttempt extends LoggedTaskAttempt {

  private static final Log LOG = LogFactory.getLog(ParsedTaskAttempt.class);

  private String diagnosticInfo;
  private String trackerName;
  private Integer httpPort, shufflePort;
  private Map<String, Long> countersMap = new HashMap<String, Long>();

  ParsedTaskAttempt() {
    super();
  }

  /** incorporate event counters */
  public void incorporateCounters(JhCounters counters) {

    Map<String, Long> countersMap =
      JobHistoryUtils.extractCounters(counters);
    putCounters(countersMap);

    super.incorporateCounters(counters);
  }

  /** Set the task attempt counters */
  public void putCounters(Map<String, Long> counters) {
    this.countersMap = counters;
  }

  /**
   * @return the task attempt counters
   */
  public Map<String, Long> obtainCounters() {
    return countersMap;
  }

  /** Set the task attempt diagnostic-info */
  public void putDiagnosticInfo(String msg) {
    diagnosticInfo = msg;
  }

  /**
   * @return the diagnostic-info of this task attempt.
   *         If the attempt is successful, returns null.
   */
  public String obtainDiagnosticInfo() {
    return diagnosticInfo;
  }

  void putTrackerName(String trackerName) {
    this.trackerName = trackerName;
  }

  public String obtainTrackerName() {
    return trackerName;
  }

  void putHttpPort(int port) {
    httpPort = port;
  }

  /**
   * @return http port if set. Returns null otherwise.
   */
  public Integer obtainHttpPort() {
    return httpPort;
  }

  void putShufflePort(int port) {
    shufflePort = port;
  }

  /**
   * @return shuffle port if set. Returns null otherwise.
   */
  public Integer obtainShufflePort() {
    return shufflePort;
  }

  /** Dump the extra info of ParsedTaskAttempt */
  void dumpParsedTaskAttempt() {
    LOG.info("ParsedTaskAttempt details:" + obtainCounters()
        + ";DiagnosticInfo=" + obtainDiagnosticInfo() + "\n"
        + obtainTrackerName() + ";" + obtainHttpPort() + ";"
        + obtainShufflePort() + ";rack=" + getHostName().getRackName()
        + ";host=" + getHostName().getHostName());
  }
}
