<%--
/**
 * @@@ START COPYRIGHT @@@  
 *
 * (C) Copyright 2015 Hewlett-Packard Development Company, L.P.                 
 *                                                                             
 * Licensed 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.                                                
 *                                                                                 
 * @@@ END COPYRIGHT @@@     
 */
--%>
<%@ page contentType="text/html;charset=UTF-8"
  import="java.io.*"
  import="java.util.*"
  import="java.sql.*"
  import="org.apache.hadoop.conf.Configuration"
  import="org.trafodion.dcs.master.DcsMaster"
  import="org.trafodion.dcs.util.DcsConfiguration"
  import="org.trafodion.dcs.Constants"
  import="org.trafodion.dcs.util.Bytes"
  import="org.trafodion.dcs.util.JdbcT4Util"
  import="org.codehaus.jettison.json.JSONArray"
  import="org.codehaus.jettison.json.JSONException"
  import="org.codehaus.jettison.json.JSONObject"
 %>
<% 

  java.sql.Connection connection = null;
  java.sql.Statement stmt = null;
  java.sql.ResultSet rs = null;
  
  try {
     DcsMaster master = (DcsMaster)getServletContext().getAttribute(DcsMaster.MASTER);
     Configuration conf = master.getConfiguration();
     boolean readOnly = conf.getBoolean("dcs.master.ui.readonly", false);
     String masterServerName = master.getServerName();
     int masterInfoPort = master.getInfoPort();
     String trafodionHome = master.getTrafodionHome();
     boolean trafodionLogs = conf.getBoolean(Constants.DCS_MASTER_TRAFODION_LOGS, Constants.DEFAULT_DCS_MASTER_TRAFODION_LOGS);
     String queryText = conf.get(Constants.TRAFODION_REPOS_METRIC_SESSION_TABLE_QUERY,Constants.DEFAULT_TRAFODION_REPOS_METRIC_SESSION_TABLE_QUERY);
     JSONArray metricSessionJson = null;
     JdbcT4Util jdbcT4Util = master.getServerManager().getJdbcT4Util();
     connection = jdbcT4Util.getConnection();
     stmt = connection.createStatement();
     rs = stmt.executeQuery(queryText);
     metricSessionJson = jdbcT4Util.convertResultSetToJSON(rs);
     rs.close();
     stmt.close();
     connection.close();
     response.setContentType("application/json");
     response.getWriter().print(metricSessionJson);
  } catch (SQLException e) {
      SQLException nextException = e;
      StringBuilder sb = new StringBuilder();
      do {
          sb.append(nextException.getMessage());
          sb.append("\nSQLState   " + nextException.getSQLState());
          sb.append("\nError Code " + nextException.getErrorCode());
      } while ((nextException = nextException.getNextException()) != null);
      response.setContentType("text/plain");
      response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
      response.getWriter().print(sb.toString());
  } catch (Exception e) {
      response.setContentType("text/plain");
      response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
      response.getWriter().print(e.getMessage());
  } finally {
      if (rs != null)
        rs.close();
      if (stmt != null)
        stmt.close();
      if (connection != null)
        connection.close();
  }  
%>