package org.apache.hadoop.mapreduce.v2.api.records.impl.pb;


import org.apache.hadoop.mapreduce.v2.api.records.Counters;
import org.apache.hadoop.mapreduce.v2.api.records.Phase;
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptId;
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptReport;
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptState;
import org.apache.hadoop.mapreduce.v2.proto.MRProtos.CountersProto;
import org.apache.hadoop.mapreduce.v2.proto.MRProtos.PhaseProto;
import org.apache.hadoop.mapreduce.v2.proto.MRProtos.TaskAttemptIdProto;
import org.apache.hadoop.mapreduce.v2.proto.MRProtos.TaskAttemptReportProto;
import org.apache.hadoop.mapreduce.v2.proto.MRProtos.TaskAttemptReportProtoOrBuilder;
import org.apache.hadoop.mapreduce.v2.proto.MRProtos.TaskAttemptStateProto;
import org.apache.hadoop.mapreduce.v2.util.MRProtoUtils;
import org.apache.hadoop.yarn.api.records.ProtoBase;


    
public class TaskAttemptReportPBImpl extends ProtoBase<TaskAttemptReportProto> implements TaskAttemptReport {
  TaskAttemptReportProto proto = TaskAttemptReportProto.getDefaultInstance();
  TaskAttemptReportProto.Builder builder = null;
  boolean viaProto = false;
  
  private TaskAttemptId taskAttemptId = null;
  private Counters counters = null;
  
  
  public TaskAttemptReportPBImpl() {
    builder = TaskAttemptReportProto.newBuilder();
  }

  public TaskAttemptReportPBImpl(TaskAttemptReportProto proto) {
    this.proto = proto;
    viaProto = true;
  }
  
  public TaskAttemptReportProto getProto() {
      mergeLocalToProto();
    proto = viaProto ? proto : builder.build();
    viaProto = true;
    return proto;
  }

  private void mergeLocalToBuilder() {
    if (this.taskAttemptId != null) {
      builder.setTaskAttemptId(convertToProtoFormat(this.taskAttemptId));
    }
    if (this.counters != null) {
      builder.setCounters(convertToProtoFormat(this.counters));
    }
  }

  private void mergeLocalToProto() {
    if (viaProto) 
      maybeInitBuilder();
    mergeLocalToBuilder();
    proto = builder.build();
    viaProto = true;
  }

  private void maybeInitBuilder() {
    if (viaProto || builder == null) {
      builder = TaskAttemptReportProto.newBuilder(proto);
    }
    viaProto = false;
  }
    
  
  @Override
  public Counters getCounters() {
    TaskAttemptReportProtoOrBuilder p = viaProto ? proto : builder;
    if (this.counters != null) {
      return this.counters;
    }
    if (!p.hasCounters()) {
      return null;
    }
    this.counters = convertFromProtoFormat(p.getCounters());
    return this.counters;
  }

  @Override
  public void setCounters(Counters counters) {
    maybeInitBuilder();
    if (counters == null) 
      builder.clearCounters();
    this.counters = counters;
  }
  @Override
  public long getStartTime() {
    TaskAttemptReportProtoOrBuilder p = viaProto ? proto : builder;
    return (p.getStartTime());
  }

  @Override
  public void setStartTime(long startTime) {
    maybeInitBuilder();
    builder.setStartTime((startTime));
  }
  @Override
  public long getFinishTime() {
    TaskAttemptReportProtoOrBuilder p = viaProto ? proto : builder;
    return (p.getFinishTime());
  }

  @Override
  public void setFinishTime(long finishTime) {
    maybeInitBuilder();
    builder.setFinishTime((finishTime));
  }
  @Override
  public TaskAttemptId getTaskAttemptId() {
    TaskAttemptReportProtoOrBuilder p = viaProto ? proto : builder;
    if (this.taskAttemptId != null) {
      return this.taskAttemptId;
    }
    if (!p.hasTaskAttemptId()) {
      return null;
    }
    this.taskAttemptId = convertFromProtoFormat(p.getTaskAttemptId());
    return this.taskAttemptId;
  }

  @Override
  public void setTaskAttemptId(TaskAttemptId taskAttemptId) {
    maybeInitBuilder();
    if (taskAttemptId == null) 
      builder.clearTaskAttemptId();
    this.taskAttemptId = taskAttemptId;
  }
  @Override
  public TaskAttemptState getTaskAttemptState() {
    TaskAttemptReportProtoOrBuilder p = viaProto ? proto : builder;
    if (!p.hasTaskAttemptState()) {
      return null;
    }
    return convertFromProtoFormat(p.getTaskAttemptState());
  }

  @Override
  public void setTaskAttemptState(TaskAttemptState taskAttemptState) {
    maybeInitBuilder();
    if (taskAttemptState == null) {
      builder.clearTaskAttemptState();
      return;
    }
    builder.setTaskAttemptState(convertToProtoFormat(taskAttemptState));
  }
  @Override
  public float getProgress() {
    TaskAttemptReportProtoOrBuilder p = viaProto ? proto : builder;
    return (p.getProgress());
  }

  @Override
  public void setProgress(float progress) {
    maybeInitBuilder();
    builder.setProgress((progress));
  }
  @Override
  public String getDiagnosticInfo() {
    TaskAttemptReportProtoOrBuilder p = viaProto ? proto : builder;
    if (!p.hasDiagnosticInfo()) {
      return null;
    }
    return (p.getDiagnosticInfo());
  }

  @Override
  public void setDiagnosticInfo(String diagnosticInfo) {
    maybeInitBuilder();
    if (diagnosticInfo == null) {
      builder.clearDiagnosticInfo();
      return;
    }
    builder.setDiagnosticInfo((diagnosticInfo));
  }
  @Override
  public String getStateString() {
    TaskAttemptReportProtoOrBuilder p = viaProto ? proto : builder;
    if (!p.hasStateString()) {
      return null;
    }
    return (p.getStateString());
  }

  @Override
  public void setStateString(String stateString) {
    maybeInitBuilder();
    if (stateString == null) {
      builder.clearStateString();
      return;
    }
    builder.setStateString((stateString));
  }
  @Override
  public Phase getPhase() {
    TaskAttemptReportProtoOrBuilder p = viaProto ? proto : builder;
    if (!p.hasPhase()) {
      return null;
    }
    return convertFromProtoFormat(p.getPhase());
  }

  @Override
  public void setPhase(Phase phase) {
    maybeInitBuilder();
    if (phase == null) {
      builder.clearPhase();
      return;
    }
    builder.setPhase(convertToProtoFormat(phase));
  }

  private CountersPBImpl convertFromProtoFormat(CountersProto p) {
    return new CountersPBImpl(p);
  }

  private CountersProto convertToProtoFormat(Counters t) {
    return ((CountersPBImpl)t).getProto();
  }

  private TaskAttemptIdPBImpl convertFromProtoFormat(TaskAttemptIdProto p) {
    return new TaskAttemptIdPBImpl(p);
  }

  private TaskAttemptIdProto convertToProtoFormat(TaskAttemptId t) {
    return ((TaskAttemptIdPBImpl)t).getProto();
  }

  private TaskAttemptStateProto convertToProtoFormat(TaskAttemptState e) {
    return MRProtoUtils.convertToProtoFormat(e);
  }

  private TaskAttemptState convertFromProtoFormat(TaskAttemptStateProto e) {
    return MRProtoUtils.convertFromProtoFormat(e);
  }

  private PhaseProto convertToProtoFormat(Phase e) {
    return MRProtoUtils.convertToProtoFormat(e);
  }

  private Phase convertFromProtoFormat(PhaseProto e) {
    return MRProtoUtils.convertFromProtoFormat(e);
  }



}  
