/*
 * ServletOpenSocket.java
 *
 * Created on 17 août 2001, 14:09
 */

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

/**
 *
 * @author  ehugonne
 * @version
 */
public class ServletOpenSocket extends HttpServlet
{
  
  /** Initializes the servlet.
   */
  public void init(ServletConfig config) throws ServletException
  {
    super.init(config);
    
  }
  
  /** Destroys the servlet.
   */
  public void destroy()
  {
  }
  
  /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
   * @param request servlet request
   * @param response servlet response
   */
  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, java.io.IOException
  {
    response.setContentType("text/xml");
    BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream()));
    int read = -1;

    char[] buffer = new char[8];
    char[] old = new char[]{'0','0','0','0','0','0','0','0'};
    int end = -1;
    while(end == -1 && (read = in.read(buffer)) != -1)
    {
      end = endOfDoc(old, buffer);

      if(end != -1)
      {
        for(int j = 0; j < end; j++)
          System.out.print(buffer[j]);
      }
      else
        System.out.print(buffer);
      old = buffer;
    }
    System.out.println("\n");
    Writer out = new OutputStreamWriter(response.getOutputStream());    
    System.out.println("QueryString : " + request.getQueryString());
    ArrayList parameters = new ArrayList();
    ArrayList headers = new ArrayList();
    Enumeration enum = request.getAttributeNames();
    while(enum.hasMoreElements())  
      parameters.add(enum.nextElement());
    enum = request.getHeaderNames();
    while(enum.hasMoreElements())      
      headers.add(enum.nextElement());
    Iterator iter = parameters.iterator();
    System.out.println("Attributes ");
    while(iter.hasNext())
    {
      String  param = (String) iter.next();
      System.out.println(param + " " + request.getAttribute(param)); 
    }
    iter = headers.iterator();
    System.out.println("Headers ");
    while(iter.hasNext())
    {
      String  header = (String) iter.next();
      System.out.println(header + " " + request.getHeader(header)); 
    }
    out.write("<message><sender>Manu</sender><content>The connection was opened</content></message>\t\t\n");
    out.flush();
        
    System.out.println("Reponse sent");
    System.out.println("Second message :");
    buffer = new char[8];
    old = new char[]{'0','0','0','0','0','0','0','0'};
    end = -1;
    while((end == -1) && ((read = in.read(buffer)) != -1))
    {
      end = endOfDoc(old, buffer);
      if(end != -1)
      {
        for(int j = 0; j < end; j++)
          System.out.print(buffer[j]);
      }
      else
        System.out.print(buffer);
      old = buffer;
    }
    System.out.println("\n");
    out.close();
  }
  
  /** Handles the HTTP <code>GET</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, java.io.IOException
  {
    processRequest(request, response);
  }
  
  /** Handles the HTTP <code>POST</code> method.
   * @param request servlet request
   * @param response servlet response
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, java.io.IOException
  {
    processRequest(request, response);
  }
  
  /** Returns a short description of the servlet.
   */
  public String getServletInfo()
  {
    return "Short description";
  }
  
  private int endOfDoc(char[] old, char[] current) throws ServletException, 
      IOException
  {
    char[] all = new char[old.length + current.length];
    CharArrayWriter buffer = new CharArrayWriter(all.length);
    buffer.write(old);
    buffer.write(current);
    all = buffer.toCharArray();
    for(int i = 0; i < all.length-1; i++)
    {
      if(all[i] == '\t'&& all[i+1] == '\t')
        return i+1;
    }
    return -1;
  }
  
}
