HAMA-910: Web UI Improvement

git-svn-id: https://svn.apache.org/repos/asf/hama/trunk@1621061 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/core/src/main/java/org/apache/hama/manager/LogView.java b/core/src/main/java/org/apache/hama/manager/LogView.java
index 6a5aa8a..c9ccd82 100644
--- a/core/src/main/java/org/apache/hama/manager/LogView.java
+++ b/core/src/main/java/org/apache/hama/manager/LogView.java
@@ -37,7 +37,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
+import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -45,8 +47,16 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hama.bsp.BSPJobID;
+import org.apache.hama.bsp.BSPMaster;
+import org.apache.hama.bsp.ClusterStatus;
+import org.apache.hama.bsp.GroomServerStatus;
+import org.apache.hama.bsp.JobStatus;
 import org.apache.hama.manager.util.UITemplate;
 
+/**
+ * Log viewer class for for BSP Server.
+ */
 public class LogView {
 
   /**
@@ -196,11 +206,11 @@
 
       String logfilePath = logDirPath + "/" + fileName;
 
-      if (pageType.equals("download")) {
+      if (pageType.equals("download")) { // download log file
 
         LogView.downloadFile(response, logfilePath);
 
-      } else {
+      } else { // log viewer 
 
         response.setContentType("text/html");
         PrintWriter out = response.getWriter();
@@ -221,7 +231,7 @@
         out.println(uit.convert(tplHead, vars));
         vars.clear();
 
-        if (pageType.equals("list")) { // list page
+        if (pageType.equals("list")) { // list 
 
           String[] listArea = new String[4];
           listArea[0] = uit.getArea(tplfile, "list0");
@@ -259,7 +269,7 @@
           vars.clear();
           out.println(uit.convert(listArea[3], vars));
 
-        } else if (pageType.equals("detail")) { // detail page
+        } else if (pageType.equals("detail")) { // detail 
 
           String[] detailArea = new String[4];
           detailArea[0] = uit.getArea(tplfile, "detail0");
@@ -295,7 +305,7 @@
 
           out.println(uit.convert(detailArea[2], vars));
 
-        } else if (pageType.equals("tail")) { // tail page
+        } else if (pageType.equals("tail")) { // tail 
           String tailLine = request.getParameter("tailLine");
           tailLine = (tailLine == null) ? "100" : tailLine;
 
@@ -353,14 +363,53 @@
           vars.clear();
           out.println(uit.convert(tailArea[2], vars));
 
+        } else if (pageType.equals("tasklist")) { // job list
+          String jobId = request.getParameter("jobId");
+          String[] listArea = new String[3];
+          listArea[0] = uit.getArea(tplfile, "tasklist0");
+          listArea[1] = uit.getArea(tplfile, "tasklist1");
+          listArea[2] = uit.getArea(tplfile, "tasklist2");
+
+          ServletContext ctx = getServletContext();
+          BSPMaster tracker = (BSPMaster) ctx.getAttribute("bsp.master");
+          ClusterStatus status = tracker.getClusterStatus(true);
+          JobStatus jobStatus = tracker.getJobStatus(BSPJobID.forName(jobId));
+
+          vars.put("hamaLogDir", hamaLogDir);
+          vars.put("dirName", dirName);
+          vars.put("targetUri", targetUri);
+          vars.put("jobId", jobId);
+          vars.put("jobStatus", jobStatus.getState().toString());
+          vars.put("jobName", jobStatus.getName());
+
+          out.println(uit.convert(listArea[0], vars));
+          vars.clear();
+
+          for (Entry<String, GroomServerStatus> entry : status
+              .getActiveGroomServerStatus().entrySet()) {
+            vars.put("jobId", jobId);
+            vars.put("dirName", dirName);
+            vars.put("serverName", entry.getKey());
+            vars.put("hostName", entry.getValue().getGroomHostName());
+            vars.put("targetUri", targetUri);
+            vars.put("type", "dir");
+            out.println(uit.convert(listArea[1], vars));
+
+          }
+
+          vars.clear();
+          out.println(uit.convert(listArea[2], vars));
         }
 
-        vars.clear();
         out.println(tplTail);
       }
 
     }
 
+    /**
+     * Get Hama log Directory
+     * @return hama log directory
+     */
     private static String getLogHomeDir() {
       Map<String, String> env = System.getenv();
       String hamaHome = env.get("HAMA_HOME");
diff --git a/core/src/main/java/org/apache/hama/util/BSPServletUtil.java b/core/src/main/java/org/apache/hama/util/BSPServletUtil.java
index 02b9865..5bf039c 100644
--- a/core/src/main/java/org/apache/hama/util/BSPServletUtil.java
+++ b/core/src/main/java/org/apache/hama/util/BSPServletUtil.java
@@ -78,7 +78,9 @@
         sb.append("</td><td>");
         sb.append(new Date(status.getStartTime()));
         sb.append("</td><td>");
-        sb.append("<a href=\"/logView?dir=tasklogs/");
+        sb.append("<a href=\"/logView?type=tasklist&jobId=");
+        sb.append(status.getJobID());            
+        sb.append("&dir=tasklogs/");
         sb.append(status.getJobID());
         sb.append("\">view</a>");
         sb.append("</td></tr>\n");
diff --git a/core/src/main/resources/webapp/bspmaster/bspjob.jsp b/core/src/main/resources/webapp/bspmaster/bspjob.jsp
index efdb281..7d6a727 100644
--- a/core/src/main/resources/webapp/bspmaster/bspjob.jsp
+++ b/core/src/main/resources/webapp/bspmaster/bspjob.jsp
@@ -60,7 +60,7 @@
       <td>
         <% if(status.getFinishTime() != 0L) {out.write(new Date(status.getFinishTime()).toString());} %>
       </td>
-      <td><a href="/logView?dir=tasklogs/<%=idString%>">view</a></td>      
+      <td><a href="/logView?dir=tasklogs/<%=idString%>&jobId=<%=idString%>&type=tasklist">view</a></td>      
     </tr>
 
   </table>
@@ -110,9 +110,6 @@
   </div>
   <p/>
   <hr>
-    <h2>Job Logs</h2>
-    <a href="/logView?dir=tasklogs/<%=idString%>">Log</a> directory
-  <hr>
   <a href="bspmaster.jsp"><i>Back to BSPMaster</i></a>
 
   <%
diff --git a/core/src/main/resources/webapp/commons/tpl/tpl.logview.html b/core/src/main/resources/webapp/commons/tpl/tpl.logview.html
index a5d53e9..249f173 100644
--- a/core/src/main/resources/webapp/commons/tpl/tpl.logview.html
+++ b/core/src/main/resources/webapp/commons/tpl/tpl.logview.html
@@ -162,13 +162,55 @@
 </div>  
 <!--{area,end,logtail2}-->
 
+<!--{area,begin,tasklist0}-->
+<h2>${jobName}</h2>
+<div class="block-detail">
+<ul>
+    <li><span>Job ID : </span>${jobId}</li>
+    <li><span>Status : </span>${jobStatus}</li>
+</ul>
+</div>
+
+<hr>
+<div class="block-list-log">
+<table class="full-width">
+<thead>
+  <tr>
+    <th>Job ID</th>
+    <th>Server Name</th>
+    <th>Hostname</th>
+    <th>Directory</th>
+    <th>Type</th>    
+    <th>Etc</th>
+  </tr>
+</thead>  
+<tbody>
+<!--{area,end,tasklist0}-->
+
+<!--{area,begin,tasklist1}-->
+  <tr>
+    <td><a href="/bspjob.jsp?jobid=${jobId}">${jobId}</a></td>    
+    <td><a href="http://${serverName}/">${serverName}</a></td>
+    <td>${hostName}</td>    
+    <td><a href="http://${serverName}/logView?dir=${dirName}/${fileName}">/${dirName}</a></td>
+    <td>${type}</td>    
+    <td>
+      <a href="http://${serverName}/logView?dir=${dirName}/${fileName}" class="link-container"><span class="link-title">view</span></a>
+    </td>
+  </tr>
+<!--{area,end,tasklist1}-->
+
+<!--{area,begin,tasklist2}-->
+</tbody>
+</table>
+</div>
+<!--{area,end,tasklist2}-->
 
 <!--{area,begin,tail}-->
 <hr />
 <div id="footer" class="contents">
-<a href='http://hama.apache.org/'>Apache Hama</a>
+  <a href='http://hama.apache.org/'>Apache Hama</a>
 </div>
-</body></html>
 </body>
 </html>
 <!--{area,end,tail}-->
\ No newline at end of file