Print

Print


Author: [log in to unmask]
Date: Thu Aug 27 18:43:05 2015
New Revision: 3429

Log:
Updates to run web app.

Added:
    java/trunk/run-webapp/src/main/java/org/hps/runweb/
    java/trunk/run-webapp/src/main/java/org/hps/runweb/DatabaseUtilities.java
    java/trunk/run-webapp/src/main/java/org/hps/runweb/EpicsDataServlet.java
    java/trunk/run-webapp/src/main/java/org/hps/runweb/RunSummaryServlet.java
    java/trunk/run-webapp/src/main/java/org/hps/runweb/RunsServlet.java
    java/trunk/run-webapp/src/main/java/org/hps/runweb/ScalerDataServlet.java
Removed:
    java/trunk/run-webapp/src/main/java/org/hps/run/
Modified:
    java/trunk/run-webapp/pom.xml
    java/trunk/run-webapp/src/main/webapp/WEB-INF/web.xml
    java/trunk/run-webapp/src/main/webapp/css/style.css
    java/trunk/run-webapp/src/main/webapp/runEpics.jsp
    java/trunk/run-webapp/src/main/webapp/runSummary.jsp
    java/trunk/run-webapp/src/main/webapp/runTable.jsp

Modified: java/trunk/run-webapp/pom.xml
 =============================================================================
--- java/trunk/run-webapp/pom.xml	(original)
+++ java/trunk/run-webapp/pom.xml	Thu Aug 27 18:43:05 2015
@@ -35,6 +35,7 @@
         </dependency>        
     </dependencies>
     <build>
+        <defaultGoal>war:war tomcat7:redeploy</defaultGoal>
         <finalName>hps-run-webapp</finalName>
         <plugins>
             <plugin>

Added: java/trunk/run-webapp/src/main/java/org/hps/runweb/DatabaseUtilities.java
 =============================================================================
--- java/trunk/run-webapp/src/main/java/org/hps/runweb/DatabaseUtilities.java	(added)
+++ java/trunk/run-webapp/src/main/java/org/hps/runweb/DatabaseUtilities.java	Thu Aug 27 18:43:05 2015
@@ -0,0 +1,23 @@
+package org.hps.runweb;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.sql.DataSource;
+
+public final class DatabaseUtilities {
+
+    private static String DATASOURCE_CONTEXT = "java:comp/env/jdbc/hps_run_db_dev";
+    
+    public static DataSource getDataSource() {
+        DataSource dataSource = null;
+        try {
+            dataSource = (DataSource) new InitialContext().lookup(DATASOURCE_CONTEXT);
+        } catch (final NamingException e) {
+            throw new RuntimeException("Error creating data source.");
+        }
+        if (dataSource == null) {
+            throw new IllegalStateException("Data source not found");
+        }
+        return dataSource;
+    }
+}

Added: java/trunk/run-webapp/src/main/java/org/hps/runweb/EpicsDataServlet.java
 =============================================================================
--- java/trunk/run-webapp/src/main/java/org/hps/runweb/EpicsDataServlet.java	(added)
+++ java/trunk/run-webapp/src/main/java/org/hps/runweb/EpicsDataServlet.java	Thu Aug 27 18:43:05 2015
@@ -0,0 +1,82 @@
+package org.hps.runweb;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.List;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
+
+import org.hps.record.epics.EpicsData;
+import org.hps.rundb.EpicsDataDao;
+import org.hps.rundb.EpicsType;
+import org.hps.rundb.EpicsVariable;
+import org.hps.rundb.EpicsVariableDao;
+import org.hps.rundb.RunDatabaseDaoFactory;
+
+/**
+ * Setup session state for JSP that shows a run's EPICS data.
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+@SuppressWarnings("serial")
+public class EpicsDataServlet extends HttpServlet {
+
+    private final DataSource dataSource;
+
+    public EpicsDataServlet() {
+        this.dataSource = DatabaseUtilities.getDataSource();
+    }
+
+    @Override
+    public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,
+    IOException {
+        if (!request.getParameterMap().containsKey("run")) {
+            throw new RuntimeException("Missing required run parameter.");
+        }
+        final Integer run = Integer.parseInt(request.getParameterValues("run")[0]);
+        EpicsDataDao epicsDataDao = null;
+        Connection connection = null;
+        List<EpicsData> epicsDataList = null;
+
+        EpicsType epicsType = EpicsType.EPICS_1S;
+        if (request.getParameterMap().containsKey("epicsBankType")) {
+            epicsType = EpicsType.valueOf(request.getParameter("epicsBankType"));
+        }
+
+        List<EpicsVariable> epicsVariables = null;
+
+        try {
+            connection = dataSource.getConnection();
+
+            final RunDatabaseDaoFactory dbFactory = new RunDatabaseDaoFactory(connection);
+
+            epicsDataDao = dbFactory.createEpicsDataDao();
+            epicsDataList = epicsDataDao.getEpicsData(epicsType, run);
+
+            final EpicsVariableDao epicsVariableDao = dbFactory.createEpicsVariableDao();
+            epicsVariables = epicsVariableDao.getEpicsVariables(epicsType);
+
+        } catch (final SQLException e) {
+            throw new IllegalStateException("Failed to setup data source connection.", e);
+        } finally {
+            if (connection != null) {
+                try {
+                    connection.close();
+                } catch (final SQLException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        request.setAttribute("EpicsDataList", epicsDataList);
+        request.setAttribute("EpicsType", epicsType);
+        request.setAttribute("EpicsVariables", epicsVariables);
+        final RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/runEpics.jsp");
+        dispatcher.forward(request, response);
+    }
+}

Added: java/trunk/run-webapp/src/main/java/org/hps/runweb/RunSummaryServlet.java
 =============================================================================
--- java/trunk/run-webapp/src/main/java/org/hps/runweb/RunSummaryServlet.java	(added)
+++ java/trunk/run-webapp/src/main/java/org/hps/runweb/RunSummaryServlet.java	Thu Aug 27 18:43:05 2015
@@ -0,0 +1,82 @@
+package org.hps.runweb;
+
+import java.io.IOException;
+import java.sql.Connection;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
+
+import org.hps.rundb.RunManager;
+import org.hps.rundb.RunSummary;
+
+/**
+ * Setup state for JSP that shows run summary.
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+@SuppressWarnings("serial")
+public class RunSummaryServlet extends HttpServlet {
+
+    /**
+     * JSP target page.
+     */
+    private static final String JSP_TARGET = "/runSummary.jsp";
+
+    /**
+     * Attribute in the request which will have the run summary object.
+     */
+    private static final String RUN_SUMMARY_ATTRIBUTE = "RunSummary";
+
+    /**
+     * The data source with the database connection.
+     */
+    private final DataSource dataSource;
+
+    /**
+     * Create a new runs servlet.
+     * <p>
+     * This will initialize the data source with the db connection.
+     */
+    public RunSummaryServlet() {
+        this.dataSource = DatabaseUtilities.getDataSource();
+    }
+
+    /**
+     * Setup servlet state by loading the run summaries and then forward to the JSP page for display.
+     */
+    @Override
+    public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,
+            IOException {
+        if (!request.getParameterMap().containsKey("run")) {
+            throw new RuntimeException("Missing required run parameter.");
+        }
+        final Integer run = Integer.parseInt(request.getParameterValues("run")[0]);
+        final RunSummary runSummary = this.getRunSummary(run);
+        request.setAttribute(RUN_SUMMARY_ATTRIBUTE, runSummary);
+        final RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher(JSP_TARGET);
+        dispatcher.forward(request, response);
+    }
+
+    /**
+     * Get a run summary for the given run number.
+     *
+     * @param run the run number
+     * @return the run summary
+     */
+    private RunSummary getRunSummary(final Integer run) {
+        final RunManager runManager = new RunManager();
+        RunSummary runSummary = null;
+        try (Connection connection = this.dataSource.getConnection()) {
+            runManager.setConnection(connection);
+            runManager.setRun(run);
+            runSummary = runManager.getRunSummary();
+        } catch (final Exception e) {
+            throw new RuntimeException(e);
+        }
+        return runSummary;
+    }
+}

Added: java/trunk/run-webapp/src/main/java/org/hps/runweb/RunsServlet.java
 =============================================================================
--- java/trunk/run-webapp/src/main/java/org/hps/runweb/RunsServlet.java	(added)
+++ java/trunk/run-webapp/src/main/java/org/hps/runweb/RunsServlet.java	Thu Aug 27 18:43:05 2015
@@ -0,0 +1,92 @@
+package org.hps.runweb;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
+
+import org.hps.rundb.RunDatabaseDaoFactory;
+import org.hps.rundb.RunSummary;
+import org.hps.rundb.RunSummaryDao;
+
+/**
+ * Loads the list of {@link org.hps.rundb.RunSummary} objects to setup state for the <code>runTable.jsp</code> page.
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+@SuppressWarnings("serial")
+public final class RunsServlet extends HttpServlet {
+
+    /**
+     * The JSP page to which the servlet will forward the request.
+     */
+    private static final String JSP_TARGET = "/runTable.jsp";
+
+    /**
+     * Attribute for list of run summaries that will set on the request object.
+     */
+    private static final String RUN_SUMMARIES_ATTRIBUTE = "RunSummaries";
+
+    /**
+     * The data source with the database connection.
+     */
+    private final DataSource dataSource;
+
+    /**
+     * Create a new runs servlet.
+     * <p>
+     * This will initialize the data source with the db connection.
+     */
+    public RunsServlet() {
+        this.dataSource = DatabaseUtilities.getDataSource();
+    }
+
+    /**
+     * Setup servlet state by loading the run summaries and then forward to the JSP page for display.
+     */
+    @Override
+    public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,
+            IOException {
+
+        final List<RunSummary> runSummaries = this.getRunSummaries();
+        request.setAttribute(RUN_SUMMARIES_ATTRIBUTE, runSummaries);
+        final RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher(JSP_TARGET);
+        dispatcher.forward(request, response);
+    }
+
+    /**
+     * Read the full list of run summaries from the db.
+     *
+     * @return the list of run summaries
+     */
+    private List<RunSummary> getRunSummaries() {
+        List<RunSummary> runSummaries = new ArrayList<RunSummary>();
+        Connection connection = null;
+        try {
+            connection = this.dataSource.getConnection();
+            final RunSummaryDao runSummaryDao = new RunDatabaseDaoFactory(connection).createRunSummaryDao();
+
+            // This does a shallow read of all run summaries but does not load their complex state.
+            runSummaries = runSummaryDao.getRunSummaries();
+        } catch (final SQLException e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (connection != null) {
+                try {
+                    connection.close();
+                } catch (final Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return runSummaries;
+    }
+}

Added: java/trunk/run-webapp/src/main/java/org/hps/runweb/ScalerDataServlet.java
 =============================================================================
--- java/trunk/run-webapp/src/main/java/org/hps/runweb/ScalerDataServlet.java	(added)
+++ java/trunk/run-webapp/src/main/java/org/hps/runweb/ScalerDataServlet.java	Thu Aug 27 18:43:05 2015
@@ -0,0 +1,72 @@
+package org.hps.runweb;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.util.List;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
+
+import org.hps.record.scalers.ScalerData;
+import org.hps.rundb.RunDatabaseDaoFactory;
+import org.hps.rundb.ScalerDataDao;
+
+/**
+ * Setup session state for JSP that shows a run's scaler data.
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+@SuppressWarnings("serial")
+public class ScalerDataServlet extends HttpServlet {
+
+    /**
+     * JSP target page.
+     */
+    private static final String JSP_TARGET = "/runScalers.jsp";
+
+    /**
+     * Attribute in the request which will have the run summary object.
+     */
+    private static final String SCALAR_DATA_ATTRIBUTE = "ScalerDataList";
+
+    /**
+     * The data source with the database connection.
+     */
+    private final DataSource dataSource;
+
+    /**
+     * Create a new runs servlet.
+     * <p>
+     * This will initialize the data source with the db connection.
+     */
+    public ScalerDataServlet() {
+        this.dataSource = DatabaseUtilities.getDataSource();
+    }
+
+    /**
+     * Setup servlet state by loading the run summaries and then forward to the JSP page for display.
+     */
+    @Override
+    public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,
+    IOException {
+        if (!request.getParameterMap().containsKey("run")) {
+            throw new RuntimeException("Missing required run parameter.");
+        }
+        final Integer run = Integer.parseInt(request.getParameterValues("run")[0]);
+        List<ScalerData> scalerDataList = null;
+        try (Connection connection = this.dataSource.getConnection()) {
+            final ScalerDataDao scalarDataDao = new RunDatabaseDaoFactory(connection).createScalerDataDao();
+            scalerDataList = scalarDataDao.getScalerData(run);
+        } catch (final Exception e) {
+            throw new RuntimeException(e);
+        }
+        request.setAttribute(SCALAR_DATA_ATTRIBUTE, scalerDataList);
+        final RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher(JSP_TARGET);
+        dispatcher.forward(request, response);
+    }
+
+}

Modified: java/trunk/run-webapp/src/main/webapp/WEB-INF/web.xml
 =============================================================================
--- java/trunk/run-webapp/src/main/webapp/WEB-INF/web.xml	(original)
+++ java/trunk/run-webapp/src/main/webapp/WEB-INF/web.xml	Thu Aug 27 18:43:05 2015
@@ -22,7 +22,7 @@
             
     <servlet>
         <servlet-name>RunsServlet</servlet-name>
-        <servlet-class>org.hps.run.web.RunsServlet</servlet-class>
+        <servlet-class>org.hps.runweb.RunsServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
@@ -34,7 +34,7 @@
     
     <servlet>
         <servlet-name>RunSummaryServlet</servlet-name>
-        <servlet-class>org.hps.run.web.RunSummaryServlet</servlet-class>
+        <servlet-class>org.hps.runweb.RunSummaryServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
@@ -46,7 +46,7 @@
     
     <servlet>
         <servlet-name>EpicsDataServlet</servlet-name>
-        <servlet-class>org.hps.run.web.EpicsDataServlet</servlet-class>
+        <servlet-class>org.hps.runweb.EpicsDataServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
@@ -58,12 +58,18 @@
     
     <servlet>
         <servlet-name>ScalerDataServlet</servlet-name>
-        <servlet-class>org.hps.run.web.ScalerDataServlet</servlet-class>
+        <servlet-class>org.hps.runweb.ScalerDataServlet</servlet-class>
     </servlet>
     
     <servlet-mapping>
         <servlet-name>ScalerDataServlet</servlet-name>
         <url-pattern>/scalers</url-pattern>
     </servlet-mapping>
-        
+
+<!--     
+    <welcome-file-list>
+        <welcome-file>path.jsp</welcome-file>
+    </welcome-file-list>
+ -->    
+               
 </web-app>     

Modified: java/trunk/run-webapp/src/main/webapp/css/style.css
 =============================================================================
--- java/trunk/run-webapp/src/main/webapp/css/style.css	(original)
+++ java/trunk/run-webapp/src/main/webapp/css/style.css	Thu Aug 27 18:43:05 2015
@@ -4,4 +4,5 @@
     border-top: 1px solid rgba(0, 0, 0, 0.1); 
     border-bottom: 1px solid 
     rgba(255, 255, 255, 0.3);
-}
+}
+

Modified: java/trunk/run-webapp/src/main/webapp/runEpics.jsp
 =============================================================================
--- java/trunk/run-webapp/src/main/webapp/runEpics.jsp	(original)
+++ java/trunk/run-webapp/src/main/webapp/runEpics.jsp	Thu Aug 27 18:43:05 2015
@@ -1,4 +1,4 @@
-<%@ page contentType="text/html" import="java.util.*,java.text.SimpleDateFormat,org.hps.record.epics.*"%>
+<%@ page contentType="text/html" import="java.util.*,java.text.SimpleDateFormat,org.hps.record.epics.*,org.hps.rundb.*" %>
 <!DOCTYPE html>
 <html>
 <link rel="stylesheet" href="css/style.css" />
@@ -21,24 +21,12 @@
 
 <body>
     <%
-        // Get the run number.
-        int run = Integer.parseInt(request.getParameterValues("run")[0]);
-
-        // Get the EPICS variable names.
-        String epicsBankType = (String) request.getAttribute("EpicsBankType");
-        List<String> variableNames = null;
-        if (epicsBankType.equals("2s")) {
-            variableNames = new ArrayList<String>(Epics2sVariables.getVariables().keySet());
-        } else if (epicsBankType.equals("20s")) {
-            variableNames = new ArrayList<String>(Epics20sVariables.getVariables().keySet());
-        } else {
-            throw new RuntimeException("bad EpicsBankType attribute: " + request.getAttribute("EpicsBankType"));
-        }
-
-        // Get the list of EPICS data for this run.
+        int run = Integer.parseInt(request.getParameterValues("run")[0]);      
+        List<EpicsVariable> epicsVariables = (List<EpicsVariable>) request.getAttribute("EpicsVariables");
+        EpicsType epicsType = (EpicsType) request.getAttribute("EpicsType");
         List<EpicsData> epicsDataList = (List<EpicsData>) request.getAttribute("EpicsDataList");
     %>
-    <h1>HPS Run <%= run %> - EPICS <%= epicsBankType %> Data</h1>
+    <h1>HPS Run <%= run %> - EPICS <%= epicsType.getTypeCode() %>s Data</h1>
     <hr />
 
     <!--  
@@ -62,9 +50,9 @@
                 <th>Sequence</th>
                 <th>Timestamp</th>
                 <%
-                    for (String variableName : variableNames) {
+                    for (EpicsVariable epicsVariable : epicsVariables) {
                 %>
-                <th><%= variableName %></th>
+                <th><%= epicsVariable.getVariableName() %></th>
                 <%
                     }
                 %>
@@ -73,22 +61,18 @@
         <tbody>
             <%
                 for (EpicsData epicsData : epicsDataList) {
-                    if (epicsData.hasKey(variableNames.get(0))) {
             %>
             <tr>
                 <td><%=epicsData.getEpicsHeader().getSequence()%></td>
                 <td><%=epicsData.getEpicsHeader().getTimestamp()%></td>
                 <%
-                    for (String variableName : variableNames) {
+                    for (EpicsVariable epicsVariable : epicsVariables) {
                 %>
-                <td><%=epicsData.getValue(variableName)%></td>
+                <td><%=epicsData.getValue(epicsVariable.getVariableName())%></td>
                 <%
                     }
                 %>
             </tr>
-            <%
-                }
-            %>
             <%
                 }
             %>

Modified: java/trunk/run-webapp/src/main/webapp/runSummary.jsp
 =============================================================================
--- java/trunk/run-webapp/src/main/webapp/runSummary.jsp	(original)
+++ java/trunk/run-webapp/src/main/webapp/runSummary.jsp	Thu Aug 27 18:43:05 2015
@@ -1,4 +1,4 @@
-<%@ page contentType="text/html" import="java.util.*,org.hps.record.run.RunSummary,java.text.SimpleDateFormat"%>
+<%@ page contentType="text/html" import="java.util.*,org.hps.rundb.*,java.text.SimpleDateFormat"%>
 <!DOCTYPE html>
 <html>
 <link rel="stylesheet" href="css/style.css" />
@@ -7,24 +7,24 @@
     <hr />
     <%
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
-        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+        dateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
         RunSummary runSummary = (RunSummary) request.getAttribute("RunSummary"); 
     %>
-    <p>run: <%= runSummary.getRun() %></p>
-    <p>start: <%= dateFormat.format(runSummary.getStartDate()) %></p>
-    <p>end: <%= dateFormat.format(runSummary.getEndDate()) %></p>
-    <p>events: <%= runSummary.getTotalEvents() %></p>
-    <p>files: <%= runSummary.getTotalFiles() %></p>
-    <p>end okay: <%= runSummary.getEndOkay() %></p>
-    <p>run okay: <%= runSummary.getRunOkay() %></p>
-    <p>updated: <%= dateFormat.format(runSummary.getUpdated()) %></p>
-    <p>created: <%= dateFormat.format(runSummary.getCreated()) %></p>	
+    <p><b>run:</b> <%= runSummary.getRun() %></p>
+    <p><b>start:</b> <%= dateFormat.format(runSummary.getStartDate()) %></p>
+    <p><b>end:</b> <%= dateFormat.format(runSummary.getEndDate()) %></p>
+    <p><b>events:</b> <%= runSummary.getTotalEvents() %></p>
+    <p><b>files:</b> <%= runSummary.getTotalFiles() %></p>
+    <p><b>end okay:</b> <%= runSummary.getEndOkay() %></p>
+    <p><b>run okay:</b> <%= runSummary.getRunOkay() %></p>
+    <p><b>updated:</b> <%= dateFormat.format(runSummary.getUpdated()) %></p>
+    <p><b>created:</b> <%= dateFormat.format(runSummary.getCreated()) %></p>
     <hr/>	
     <p>
-        <a href="epics?run=<%= runSummary.getRun() %>&epicsBankType=2s">EPICS 2s Data</a>        
+        <a href="epics?run=<%= runSummary.getRun() %>&epicsBankType=<%= EpicsType.EPICS_1S %>">EPICS 1s Data</a>        
     </p>		
     <p>
-        <a href="epics?run=<%= runSummary.getRun() %>&epicsBankType=20s">EPICS 20s Data</a>
+        <a href="epics?run=<%= runSummary.getRun() %>&epicsBankType=<%= EpicsType.EPICS_10S %>">EPICS 10s Data</a>
     </p>
     <p>
         <a href="scalers?run=<%= runSummary.getRun() %>">Scaler Data</a>

Modified: java/trunk/run-webapp/src/main/webapp/runTable.jsp
 =============================================================================
--- java/trunk/run-webapp/src/main/webapp/runTable.jsp	(original)
+++ java/trunk/run-webapp/src/main/webapp/runTable.jsp	Thu Aug 27 18:43:05 2015
@@ -1,4 +1,4 @@
-<%@ page contentType="text/html" import="java.util.*,org.hps.record.run.RunSummary,java.text.SimpleDateFormat"%>
+<%@ page contentType="text/html" import="java.util.*,org.hps.rundb.RunSummary,java.text.SimpleDateFormat"%>
 <!DOCTYPE html>
 <html>
 
@@ -28,8 +28,8 @@
 		<thead>
 			<tr>
 				<th>Run</th>
-				<th>Start Time UTC</th>
-				<th>End Time UTC</th>
+				<th>Start Date</th>
+				<th>End Date</th>
 				<th>Events</th>
 				<th>Files</th>
 				<th>End Okay</th>