content: /* The contents of this file are subject to the terms
   * of the Common Development and Distribution License
   * (the License). You may not use this file except in
   * compliance with the License.
   *
   * You can obtain a copy of the License at
   * http://www.sun.com/cddl/cddl.html or
   * install_dir/legal/LICENSE
   * See the License for the specific language governing
   * permission and limitations under the License.
   *
   * When distributing Covered Code, include this CDDL
   * Header Notice in each file and include the License file
   * at install_dir/legal/LICENSE.
   * If applicable, add the following below the CDDL Header,
   * with the fields enclosed by brackets [] replaced by
   * your own identifying information:
   * "Portions Copyrighted [year] [name of copyright owner]"
   *
   * $Id$
   *
   * Copyright 2005-2009 Sun Microsystems Inc. All Rights Reserved
   */
  package com.sun.faban.harness.webclient;
  
  import com.sun.faban.harness.common.Config;
  import org.xml.sax.SAXException;
  import org.xml.sax.SAXParseException;
  
  import javax.servlet.ServletContext;
  import javax.servlet.ServletException;
  import javax.servlet.ServletOutputStream;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import javax.xml.parsers.ParserConfigurationException;
  import javax.xml.parsers.SAXParser;
  import javax.xml.parsers.SAXParserFactory;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.io.InputStream;
  
  /**
   * A servlet to read the sometimes incomplete log file, complete it, and
   * translate it into readable html format. This servlet does not currntly
   * contain any log filtering options but these can be added in the future.
   *
   * @author Akara Sucharitakul
   */
  public class LogReader extends HttpServlet {
  
      ServletContext ctx;
  
      public void init() throws ServletException {
          ctx = getServletContext();
      }
  
      public void doGet(HttpServletRequest request,
                           HttpServletResponse response)
              throws ServletException, IOException {
          String runId = request.getParameter("runId");
          String startId = request.getParameter("startId");
          String exString = request.getParameter("exception");
  
          // Check that either startId or exception has to be specified.
          if (startId != null && exString != null)
              throw new ServletException("Either the startId or exception " +
                      "parameter has to be specified, but not both!");
  
          // Check the input file
          if (runId == null) {
              response.sendError(HttpServletResponse.SC_BAD_REQUEST,
                      "runId parameter not specified");
              return;
          }
  
          String logFilePath = Config.OUT_DIR + runId +
                  File.separator + Config.LOG_FILE;
          InputStream is = new FileInputStream(logFilePath);
          if (is == null) {
              response.sendError(HttpServletResponse.SC_NOT_FOUND,
                      "Logfile " + logFilePath + " not found");
              return;
          }
  
          // Check the start line
          long start = -1l;
          if (startId == null)
              start = 0;
          else if (!"end".equals(startId))
              start = Long.parseLong(startId);
  
          // Check the exception to display
          boolean showException = false;
          if (exString != null) {
              start = Long.parseLong(exString);
              showException = true;
          }
  
          ServletOutputStream out = response.getOutputStream();
          LogParseHandler handler = null;
  
          try {
              SAXParserFactory sFact = SAXParserFactory.newInstance();
              sFact.setFeature("http://xml.org/sax/features/validation", false);
              sFact.setFeature("http://apache.org/xml/features/" +
                      "allow-java-encodings", true);
              sFact.setFeature("http://apache.org/xml/features/nonvalidating/" +
                      "load-dtd-grammar", false);
              sFact.setFeature("http://apache.org/xml/features/nonvalidating/" +
                      "load-external-dtd", false);
              SAXParser parser = sFact.newSAXParser();
              if (!showException)
                  handler = new TableHandler(start, request, out, runId);
              else
                  handler = new RecordHandler(start, request, out, runId);
              parser.parse(is, handler);
              handler.xmlComplete = true; // If we get here, the XML is good.
          } catch (ParserConfigurationException e) {
              throw new ServletException(e);
          } catch (SAXParseException e) {
              Throwable t = e.getCause();
              // If it is caused by an IOException, we'll just throw it.
              if (t != null && t instanceof IOException)
                  throw (IOException) t;
              // Otherwise if the XML enclosure is missing, we'll just ignore.
              handler.xmlComplete = false;
          } catch (SAXException e) {
              throw new ServletException(e);
          }
  
          response.setContentType("text/html");
          handler.printHtml();
          out.flush();
          out.close();
          response.flushBuffer();
      }
  }