package hall;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

/** 
 *  Part of tutorial on servlets and JSP that appears at
 *  http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/
 *  1999 Marty Hall; may be freely used or adapted.
 */

public class PrimeNumbers extends HttpServlet {
  private static PrimeList primeList;
  
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
    log("Entered PrimeNumbers!");
    int numPrimes =
      ServletUtilities.getIntParameter(request, "numPrimes", 50);
    int numDigits =
      ServletUtilities.getIntParameter(request, "numDigits", 120);
    int numPrimesPrinted =
      ServletUtilities.getIntParameter(request, "numPrimesPrinted", -1);
    if (numPrimesPrinted > numPrimes)
      numPrimesPrinted = 0;
    if ((numPrimesPrinted == -1) || (primeList == null)) {
      primeList = new PrimeList(numPrimes, numDigits, true);
    }
    Vector currentPrimes = primeList.getPrimes();
    int numCurrentPrimes = currentPrimes.size();
    if (true || (numPrimesPrinted < numCurrentPrimes))
      buildPrimeTable(response, numPrimes, numDigits,
                      currentPrimes, numCurrentPrimes);
    else {
      String url = "http://hallmr1/servlet/hall.PrimeNumbers?" +
                   "numPrimes=" + numPrimes +
                   "&numDigits=" + numDigits +
                   "&numPrimesPrinted=" + currentPrimes.size();
      response.setHeader("Refresh", "5; URL=" + url);
      response.setHeader("Retry-After", "5");
      response.setHeader("Location", url);
      response.setStatus(response.SC_NO_CONTENT);
      //response.setStatus(response.SC_RESET_CONTENT);
    }
  }

  public void buildPrimeTable(HttpServletResponse response,
                              int numPrimes,
                              int numDigits,
                              Vector currentPrimes,
                              int numCurrentPrimes)
      throws IOException {
    int numPrimesRemaining = (numPrimes - numCurrentPrimes);
    boolean isLastResult = (numPrimesRemaining == 0);
    if (!isLastResult) {
      // TO DO: How to build URL to self? 
      String url = "http://hallmr1/servlet/hall.PrimeNumbers?" +
                   "numPrimes=" + numPrimes +
                   "&numDigits=" + numDigits +
                   "&numPrimesPrinted=" + currentPrimes.size();
      response.setHeader("Refresh", "5; URL=" + url);
    }
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String title = "Some " + numDigits + "-Digit Prime Numbers (back to 204)";
    
    out.println(ServletUtilities.headWithTitle(title) +
                "<BODY BGCOLOR=\"#FDF5E6\">\n" +
                "<H2 ALIGN=CENTER>" + title + "</H1>\n" +
                "<H3>Primes found with  " + numDigits +
                " or more digits: " + numCurrentPrimes + ".</H3>");
    if (isLastResult)
      out.println("<B>Done searching.</B>");
    else
      out.println("<B>Still looking for " + numPrimesRemaining +
                  " more<BLINK>...</BLINK></B>");
    out.println("<OL>");
    for(int i=0; i<numCurrentPrimes; i++) {
      out.println("  <LI>" + currentPrimes.elementAt(i));
    }
    out.println("</OL>");
    out.println("</BODY></HTML>");
  }

  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
}
