<?xml version="1.0" encoding="UTF-8"?>
<!--
/*
 * 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.
 */
-->
<cluster xmlns:jsp="http://java.sun.com/JSP/Page">
  <jsp:directive.page contentType="text/xml; charset=UTF-8" session="false" />
  <jsp:directive.page import="java.util.Date" />
  <jsp:directive.page import="java.util.List" />
  <jsp:directive.page import="org.apache.hadoop.mapreduce.server.jobtracker.JobTrackerJspHelper" />
  <jsp:directive.page import="org.apache.hadoop.util.*" />
  <jsp:directive.page import="org.apache.hadoop.mapreduce.*" />
  <jsp:directive.page import="org.apache.hadoop.mapred.JSPUtil" />

  <jsp:declaration>
  private static final long serialVersionUID = 1L;
  </jsp:declaration>

  <jsp:scriptlet>
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-Control", "no-store");
    response.setDateHeader("Expires", -1);
  </jsp:scriptlet>
  <jsp:scriptlet>
    JobTracker tracker = (JobTracker) application.getAttribute("job.tracker");
    String trackerName = StringUtils.simpleHostname(tracker.getJobTrackerMachine());
    JobTrackerJspHelper jspHelper = new JobTrackerJspHelper();

    List&lt;JobInProgress&gt; runningJobs = tracker.getRunningJobs();
    List&lt;JobInProgress&gt; completedJobs = tracker.getCompletedJobs();
    List&lt;JobInProgress&gt; failedJobs = tracker.getFailedJobs();
  </jsp:scriptlet>

    <tracker_name><jsp:expression>trackerName</jsp:expression></tracker_name>

    <tracker>
      <state><jsp:expression>tracker.getClusterStatus().getJobTrackerStatus()</jsp:expression></state>
      <started><jsp:expression>new Date(tracker.getStartTime())</jsp:expression></started>
      <version><jsp:expression>VersionInfo.getVersion()</jsp:expression></version>
      <revision><jsp:expression>VersionInfo.getRevision()</jsp:expression></revision>
      <compiled_at><jsp:expression>VersionInfo.getDate()</jsp:expression></compiled_at>
      <compiled_by><jsp:expression>VersionInfo.getUser()</jsp:expression></compiled_by>
      <identifier><jsp:expression>tracker.getTrackerIdentifier()</jsp:expression></identifier>
    </tracker>

    <cluster_summary>
      <jsp:scriptlet>
        jspHelper.generateSummaryTable(out, tracker);
      </jsp:scriptlet>
    </cluster_summary>

    <running_jobs>
      <jsp:scriptlet>
        jspHelper.generateJobTable(out, "running", runningJobs);
      </jsp:scriptlet>
    </running_jobs>

    <completed_jobs>
      <jsp:scriptlet>
        jspHelper.generateJobTable(out, "completed", completedJobs);
      </jsp:scriptlet>
    </completed_jobs>

    <failed_jobs>
      <jsp:scriptlet>
        jspHelper.generateJobTable(out, "failed", failedJobs);
      </jsp:scriptlet>
    </failed_jobs>

    <retired_jobs>
      <jsp:scriptlet>
        JSPUtil.generateRetiredJobXml(out, tracker,
            runningJobs.size() + completedJobs.size() + failedJobs.size());
      </jsp:scriptlet>
    </retired_jobs>
</cluster>
