/**
   * Build an XML element with the task profile information
   *
   * @param taskProfile the task profile
   * @param doc the XML document
   * @param name the name of the element
   * @return the XML element
   */
  private Element buildTaskProfileElement(MRTaskProfile taskProfile, Document doc, String name) {

    // Add the task attributes
    Element task = doc.createElement(name);
    task.setAttribute(ID, taskProfile.getTaskId());
    task.setAttribute(NUM_TASKS, Integer.toString(taskProfile.getNumTasks()));

    // Add the task enum maps
    task.appendChild(buildEnumMapElement(taskProfile.getCounters(), doc, COUNTERS, COUNTER));
    task.appendChild(buildEnumMapElement(taskProfile.getStatistics(), doc, STATS, STAT));
    task.appendChild(buildEnumMapElement(taskProfile.getCostFactors(), doc, FACTORS, FACTOR));
    task.appendChild(buildEnumMapElement(taskProfile.getTimings(), doc, TIMINGS, TIMING));

    // Add the task auxiliary counters map
    if (taskProfile.containsAuxCounters()) {
      Element counters = doc.createElement(AUX_COUNTERS);
      for (Entry<String, Long> e : taskProfile.getAuxCounters().entrySet()) {
        Element counter = doc.createElement(AUX_COUNTER);
        counters.appendChild(counter);
        counter.setAttribute(KEY, e.getKey());
        counter.setAttribute(VALUE, e.getValue().toString());
      }
      task.appendChild(counters);
    }

    return task;
  }
 /**
  * Load the task profile timings from the XML element to the profile
  *
  * @param taskProf the task profile
  * @param task the task XML element
  */
 private void loadTaskProfileTimings(MRTaskProfile taskProf, Element task) {
   Element timings = (Element) task.getElementsByTagName(TIMINGS).item(0);
   NodeList timingList = timings.getElementsByTagName(TIMING);
   for (int j = 0; j < timingList.getLength(); ++j) {
     Element timing = (Element) timingList.item(j);
     taskProf.addTiming(
         MRTaskPhase.valueOf(timing.getAttribute(KEY)),
         Double.parseDouble(timing.getAttribute(VALUE)));
   }
 }
 /**
  * Load the task profile cost factor from the XML element to the profile
  *
  * @param taskProf the task profile
  * @param task the task XML element
  */
 private void loadTaskProfileCostFactors(MRTaskProfile taskProf, Element task) {
   Element factors = (Element) task.getElementsByTagName(FACTORS).item(0);
   NodeList factorList = factors.getElementsByTagName(FACTOR);
   for (int j = 0; j < factorList.getLength(); ++j) {
     Element factor = (Element) factorList.item(j);
     taskProf.addCostFactor(
         MRCostFactors.valueOf(factor.getAttribute(KEY)),
         Double.parseDouble(factor.getAttribute(VALUE)));
   }
 }
 /**
  * Load the task profile statistics from the XML element to the profile
  *
  * @param taskProf the task profile
  * @param task the task XML element
  */
 private void loadTaskProfileStatistics(MRTaskProfile taskProf, Element task) {
   Element stats = (Element) task.getElementsByTagName(STATS).item(0);
   NodeList statList = stats.getElementsByTagName(STAT);
   for (int j = 0; j < statList.getLength(); ++j) {
     Element stat = (Element) statList.item(j);
     taskProf.addStatistic(
         MRStatistics.valueOf(stat.getAttribute(KEY)),
         Double.parseDouble(stat.getAttribute(VALUE)));
   }
 }
 /**
  * Load the task profile counters from the XML element to the profile
  *
  * @param taskProf the task profile
  * @param task the task XML element
  */
 private void loadTaskProfileCounters(MRTaskProfile taskProf, Element task) {
   Element counters = (Element) task.getElementsByTagName(COUNTERS).item(0);
   NodeList counterList = counters.getElementsByTagName(COUNTER);
   for (int j = 0; j < counterList.getLength(); ++j) {
     Element counter = (Element) counterList.item(j);
     taskProf.addCounter(
         MRCounter.valueOf(counter.getAttribute(KEY)),
         Long.parseLong(counter.getAttribute(VALUE)));
   }
 }
  /**
   * Load the execution profile
   *
   * @param profile the task profile to load
   * @return true if the loading was successful
   */
  public boolean loadExecutionProfile(MRTaskProfile profile) {

    if (!this.profile.getTaskId().equalsIgnoreCase(profile.getTaskId())) {
      return false;
    } else if (loaded && this.profile == profile) {
      return true;
    }

    // Load the profile
    this.profile = profile;
    loaded = true;

    try {
      if (parseProfileFile()) {
        return loadExecutionProfile();
      } else {
        return false;
      }
    } catch (ProfileFormatException e) {
      System.err.println(e.getMessage());
      e.printStackTrace();
      return false;
    }
  }