/*******************************************************************************
 * 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.Log;
import org.eclipse.wst.wsi.internal.core.log.LogWriter;
import org.eclipse.wst.wsi.internal.core.log.MessageEntry;

import java.io.*;
import java.util.*;

/**
 * This class is the queue that is used to write request and response messages
 * to the log file in the correct order.
 *
 * @version 1.0.1
 * @author Peter Brittenham (peterbr@us.ibm.com)
 */
public class MessageEntryQueue
{
  /**
   * Request type message entry queue.
   */
  protected Vector requestList = new Vector();

  /**
   * Response type message entry queue.
   */
  protected Vector responseList = new Vector();

  /**
   * Monitor.
   */
  protected Monitor monitor = null;

  /**
   * Log file.
   */
  protected Log log = null;

  /**
   * Log writer.
   */
  protected LogWriter logWriter = null;

  /**
   * List lock.
   */
  protected String listLock = "listLock";

  /**
   * Message ID which is incremented when a new log entry is added to the log file.
   */
  protected int messageId = 1;

  /**
   * Create message entry queue.
   * @param monitor a monitor.
   * @param log the log.
   * @param logWriter a log writer.
   */
  public MessageEntryQueue(Monitor monitor, Log log, LogWriter logWriter)
  {
    // Save input references
    this.monitor = monitor;
    this.log = log;
    this.logWriter = logWriter;
  }

  /**
   * Add log entry to queue.
   * @param messageEntry a message entry.
   * @throws WSIException is there is a problem adding the log 
   *         entry to the queue.
   */
  public synchronized void addMessageEntry(MessageEntry messageEntry)
    throws WSIException
  {
    synchronized (listLock)
    {
      // If this is a request type of message entry, then add to request list
      if (messageEntry.getType().equals(MessageEntry.TYPE_REQUEST))
      {
        requestList.add(messageEntry);
      }

      // Otherwise this is a response type of message entry
      else
      {
        responseList.add(messageEntry);
      }
    }

    // Tell the log entry writer thread to run
    writeFromQueue();
  }

  /**
   * Determine if any log entries need to be written.
   * @throws WSIException is there is a problem adding log entries.
  
   */
  public synchronized void writeFromQueue() throws WSIException
  {
    MessageEntry requestMessageEntry = null;
    MessageEntry responseMessageEntry = null;
    boolean responseFound = false;

    // Create array that will contain list of index to remove from request list
    int[] requestIndexList = new int[requestList.size()];
    int reqIndexCount = 0;

    synchronized (listLock)
    {
      // If there are entries in the request queue,
      // then try to match them with entries in the response queue
      for (int reqIndex = 0; reqIndex < requestList.size(); reqIndex++)
      {
        // Get request log entry
        requestMessageEntry = (MessageEntry) requestList.elementAt(reqIndex);

        // Check each response log entry to see if the conversationId matches
        responseFound = false;
        for (int respIndex = 0;
          respIndex < responseList.size() && !responseFound;
          respIndex++)
        {
          // Get response log entry
          responseMessageEntry =
            (MessageEntry) responseList.elementAt(respIndex);

          // If the request and response have the same conversationId,
          // then write them out to the log file
          if (requestMessageEntry
            .getConversationId()
            .equals(responseMessageEntry.getConversationId()))
          {
            responseFound = true;

            // Set the id for the log entries
            requestMessageEntry.setId(getNextMessageId());
            responseMessageEntry.setId(getNextMessageId());

            // Write out request and then response
            //==== SS start : what this line is used for??? - causes memory leak, as no removeLogEntry is called ====
            //            log.addLogEntry(requestMessageEntry);
            //==== SS end ===
            StringReader requestReader =
              new StringReader(requestMessageEntry.toXMLString(""));
            logWriter.write(requestReader);

            // Display message
            printMessage(requestMessageEntry);

            // Write out response
            //==== SS start : what this line is used for??? - causes memory leak, as no removeLogEntry is called ====
            //            log.addLogEntry(responseMessageEntry);
            //==== SS end ===
            StringReader responseReader =
              new StringReader(responseMessageEntry.toXMLString(""));
            logWriter.write(responseReader);

            // Display message
            printMessage(responseMessageEntry);

            // Add request to list so that it can be removed later
            requestIndexList[reqIndexCount++] = reqIndex;

            // Remove log entry from response list
            responseList.remove(respIndex);
          }
        }
      }

      // Remove requests that were written out
      for (int count = 0; count < reqIndexCount; count++)
        requestList.remove(requestIndexList[count]);
    }
  }

  /**
   * Get the next message identifier.
   * @return the next message identifier.
   */
  protected synchronized String getNextMessageId()
  {
    return String.valueOf(messageId++);
  }

  /**
   * Display message.
   * @param messageEntry a message entry.
   */
  protected void printMessage(MessageEntry messageEntry)
  {
    // Display message
    monitor.printMessage(
      "log01",
      messageEntry.getId()
        + ", "
        + messageEntry.getType()
        + ", "
        + messageEntry.getSenderHostAndPort(),
      "Log message entry -  ID: "
        + messageEntry.getId()
        + ", Type: "
        + messageEntry.getType()
        + ", Sender: "
        + messageEntry.getSenderHostAndPort());
  }
}
