/*******************************************************************************
 * Copyright (c) 2002-2005 IBM Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   IBM - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsi.internal.core.monitor;

import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.log.MessageEntry;
import org.eclipse.wst.wsi.internal.core.log.MimeParts;
import org.eclipse.wst.wsi.internal.core.monitor.config.Redirect;
import org.eclipse.wst.wsi.internal.core.util.Utils;

import java.net.Socket;
import java.util.*; // SS

/**
 * A socket connection.
 *
 * @author Peter  Brittenham (peterbr@us.ibm.com)
 * @version 1.0.1
 */
public class SocketConnection extends Thread
{
  protected Monitor monitor;
  protected Redirect redirect;
  protected Socket inSocket;
  protected Socket outSocket;

  protected String httpProxyHost = null;
  protected int httpProxyPort;

  protected SocketHandler requestSocketHandler = null;
  protected SocketHandler responseSocketHandler = null;

  private Vector listeners = new Vector(); // SS

  /**
   * Create socket connection.
   * @param monitor  a Monitor object.
   * @param redirect a Redirect object.
   * @param inSocket in socket.
   */
  public SocketConnection(Monitor monitor, Redirect redirect, Socket inSocket)
  {
    this.monitor = monitor;
    this.redirect = redirect;
    this.inSocket = inSocket;

    // Start processing the connection
    start();
  }

  /**
   * Process the socket connection.
   */
  public void run()
  {
    // Get the HTTP proxy settings if there are any set (not used currently)
    loadHttpProxySettings();

    try
    {
      // Open the connection to the server
      this.outSocket = new Socket(redirect.getToHost(), redirect.getToPort());

      // Set the read timeout for the input socket
      this.inSocket.setSoTimeout(redirect.getReadTimeoutSeconds() * 1000);

      // Get the next conversation ID
      int conversationId = monitor.getNextConversationId();

      // Create the socket handlers which are used to send the data from
      // the client to the server
      requestSocketHandler =
        new SocketHandler(
          this,
          MessageEntry.TYPE_REQUEST,
          conversationId,
          redirect.getToHost(),
          this.inSocket,
          this.outSocket,
          redirect.getReadTimeoutSeconds());
      responseSocketHandler =
        new SocketHandler(
          this,
          MessageEntry.TYPE_RESPONSE,
          conversationId,
          redirect.getToHost(),
          this.outSocket,
          this.inSocket,
          redirect.getReadTimeoutSeconds());

      // Tell each socketHandler about the other one
      requestSocketHandler.setPairedSocketHandler(responseSocketHandler);
      responseSocketHandler.setPairedSocketHandler(requestSocketHandler);
    }

    catch (Exception e)
    {
      Monitor.staticPrintMessage(
        "error04",
        redirect.getToHost(),
        "Monitor cannot connect to a redirect host:");

      shutdown();

      try
      {
        this.inSocket.close();
      }
      catch (Throwable t)
      {
      }
    }
  }

  /**
   * Log message.
   * @param conversationID      the coversation id.
   * @param connectionType      the connection type.
   * @param timestamp           the timestamp.
   * @param senderHostAndPort   the sender host and port.
   * @param receiverHostAndPort the receiver host and port.
   * @param messageBuffer       the message.
   * @param bom                 the BOM.
   * @param encoding            the encoding.
   * @throws WSIException if  there is a problem logging message.
  */
  public void logMessage(
    int conversationID,
    String connectionType,
    String timestamp,
    String senderHostAndPort,
    String receiverHostAndPort,
    StringBuffer messageBuffer,
    int bom,
    String encoding)
    throws WSIException
  {
    MessageEntry messageEntry = null;

    // Create message entry
    messageEntry =
      createMessageEntry(
        conversationID,
        connectionType,
        timestamp,
        senderHostAndPort,
        receiverHostAndPort,
        messageBuffer.toString(),
        bom,
        encoding);

    // DEBUG:
    //debug("logMessage", " messageEntry: " + messageEntry);

    // Add entry to the queue
    monitor.getMessageEntryQueue().addMessageEntry(messageEntry);
  }

  /**
   * Create a log entry from all of the data that was gathered.
   */
  private MessageEntry createMessageEntry(
    int conversationID,
    String messageType,
    String timestamp,
    String senderHostAndPort,
    String receiverHostAndPort,
    String message,
    int bom,
    String encoding)
    throws WSIException
  {
    // Create log entry object
    MessageEntry messageEntry = monitor.getLog().createLogEntry();

    // Set input information in log entry
    // NOTE:  The ID is set just before the log entry is written to the log file in LogEntryQueue
    //logEntry.setId(id);
    messageEntry.setConversationId(String.valueOf(conversationID));
    messageEntry.setType(messageType);
    messageEntry.setTimestamp(timestamp);
    messageEntry.setSenderHostAndPort(senderHostAndPort);
    messageEntry.setReceiverHostAndPort(receiverHostAndPort);
    messageEntry.setEncoding(encoding);

    // Get HTTP headers from full message
    String httpHeaders = Utils.getHTTPHeaders(message);
    messageEntry.setHTTPHeaders(httpHeaders);
	
   if (Utils.isMultipartRelatedMessage(httpHeaders))
    {
    	MimeParts mimeParts = Utils.parseMultipartRelatedMessage(message, httpHeaders, encoding);
    	if (mimeParts == null)
    	{
    	  // problem creating Mimeparts -- treat it as simple SOAP message
    	  String content = Utils.getContent(message);
    	  messageEntry.setMessage(content);
    	  messageEntry.setMimeContent(false);
    	}
    	else
    	{
          messageEntry.setMimeParts(mimeParts);
          messageEntry.setMimeContent(true);
    	}
    }
    else
    {
      // Get the message content
      String content = Utils.getContent(message);
      messageEntry.setMessage(content);
      messageEntry.setMimeContent(false);
    }

    // Set the BOM, if there is one
    if (bom != 0)
      messageEntry.setBOM(bom);

    return messageEntry;
  }

  /**
   * Load HTTP proxy settings.
   */
  public void loadHttpProxySettings()
  {
    // Get the HTTP proxy host setting
    this.httpProxyHost = System.getProperty("http.proxyHost");
    if (this.httpProxyHost != null && httpProxyHost.equals(""))
      this.httpProxyHost = null;

    // If there was an HTTP proxy host setting, then get the port
    if (this.httpProxyHost != null)
    {
      String portString = System.getProperty("http.proxyPort");

      // Set default to 80
      if (portString == null || portString.equals(""))
        this.httpProxyPort = 80;
      else
        httpProxyPort = Integer.parseInt(portString);
    }
  }

  Monitor getMonitor()
  {
    return this.monitor;
  }

  synchronized void wakeUp()
  {
    fireConnectionClosed(); // SS
    notifyAll();
  }

  /**
   * Shutdown.
   */
  public void shutdown()
  {
    if (this.requestSocketHandler != null)
      this.requestSocketHandler.shutdown();
    if (this.responseSocketHandler != null)
      this.responseSocketHandler.shutdown();
  }

  // ==== SS start ====
  /**
   * Add connection event listener.
   * @param listener event listener.
   * @see #removeConnectionListener
   */
  public void addConnectionListener(ConnectionListener listener)
  {
    listeners.add(listener);
  }
  /**
   * Remove connection event listener.
   * @param listener event listener.
   * @see #addConnectionListener
   */
  public void removeConnectionListener(ConnectionListener listener)
  {
    listeners.remove(listener);
  }
  /**
   * Notify listeners on connection close.
   */
  private void fireConnectionClosed()
  {
    for (Iterator i = listeners.iterator(); i.hasNext();)
    {
      ConnectionListener listener = (ConnectionListener) i.next();
      listener.connectionClosed(this);
    }
  }
  // ==== SS end ====
}
