/*******************************************************************************
 * 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.profile.validator;

import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.analyzer.AnalyzerContext;
import org.eclipse.wst.wsi.internal.core.log.MessageEntry;
import org.eclipse.wst.wsi.internal.core.log.MimePart;
import org.eclipse.wst.wsi.internal.core.report.Entry;
import org.eclipse.wst.wsi.internal.core.util.EntryType;
import org.eclipse.wst.wsi.internal.core.wsdl.WSDLDocument;
import org.eclipse.wst.wsi.internal.core.xml.XMLUtils;

import org.w3c.dom.Document;

/**
 * This class contains the target information needed by a test assertion.
 * 
 * @version 1.0.1
 * @author Peter Brittenham  (peterbr@us.ibm.com)
 * @author Graham Turrell (gturrell@uk.ibm.com)
 */
public class EntryContext
{
  protected Entry entry = null;

  protected MessageEntry request = null;
  protected MessageEntry response = null;
  protected MessageEntry messageEntry = null;

  protected Document requestDocument = null;
  protected Document responseDocument = null;
  protected Document messageEntryDocument = null;

  protected WSDLDocument wsdlDocument = null;

  protected AnalyzerContext analyzerContext = null;

  /**
   * Create entry context.
   * @param entry    a message entry.
   * @param request  the request.
   * @param response the response.
   */
  public EntryContext(Entry entry, MessageEntry request, MessageEntry response)
  {
    this(entry, request, response, null);
  }

  /**
   * Create entry context.
   * @param entry           a message entry.
   * @param request         the request.
   * @param response        the response.
   * @param analyzerContext the analyzerContext.
   */
  public EntryContext(
    Entry entry,
    MessageEntry request,
    MessageEntry response,
    AnalyzerContext analyzerContext)
  {
    this.entry = entry;
    this.request = request;
    this.response = response;
    this.analyzerContext = analyzerContext;

    try
    {
      // Parse all documents
      if(request.isMimeContent()) 
      {
      	MimePart part = request.getMimeParts().getRootPart();
        if ((part != null) && (part.getContent().length() > 0))
          requestDocument = XMLUtils.parseXML(part.getContent());
      }
      else 
      {
        if (request.getMessage().length() > 0)
          requestDocument = XMLUtils.parseXML(request.getMessage());
      }

      if(response.isMimeContent()) 
      {
      	MimePart part = response.getMimeParts().getRootPart();
      	if ((part != null) && (part.getContent().length() > 0))
          responseDocument = XMLUtils.parseXML(part.getContent());
      }
      else 
      {
        if (response.getMessage().length() > 0)
          responseDocument = XMLUtils.parseXML(response.getMessage());
      }
    }

    catch (WSIException we)
    {
    }

    // need some exception handling in here and more careful checking
    if (entry.getEntryType().equals(EntryType.ENTRY_TYPE_REQUEST))
    {
      this.messageEntry = request;
      this.messageEntryDocument = requestDocument;
    }
    else
    {
      this.messageEntry = response;
      this.messageEntryDocument = responseDocument;
    }
  }

  /**
   * Create entry context.
   * @param entry a message entry.
   * @param wsdlDocument a WSDL document.
   */
  public EntryContext(Entry entry, WSDLDocument wsdlDocument)
  {
    this.entry = entry;
    this.wsdlDocument = wsdlDocument;
  }

  /**
   * Create entry context.
   * @param entry a message entry.
   * @param analyzerContext the analyzerContext.
   */
  public EntryContext(Entry entry, AnalyzerContext analyzerContext)
  {
    this.entry = entry;
    this.analyzerContext = analyzerContext;
  }

  /**
   * Returns the entry. 
   * @return the entry. 
   */
  public Entry getEntry()
  {
    return this.entry;
  }

  /**
   * Returns the request.
   * @return the request.
   */
  public MessageEntry getRequest()
  {
    return request;
  }

  /**
   * Returns the response.
   * @return the response.
   */
  public MessageEntry getResponse()
  {
    return response;
  }

  /**
   * Returns the log entry which is not null.
   * @return the log entry.
   */
  public MessageEntry getMessageEntry()
  {
    return messageEntry;
  }

  /**
   * Returns the request.
   * @return MessageEntry
   */
  public Document getRequestDocument()
  {
    return requestDocument;
  }

  /**
   * Returns the response.
   * @return the response.
   */
  public Document getResponseDocument()
  {
    return responseDocument;
  }

  /**
   * Returns the log entry which is not null.
   * @return the log entry.
   */
  public Document getMessageEntryDocument()
  {
    return messageEntryDocument;
  }

  /**
   * Returns the WSDL document.
   * @return the WSDL document.
   */
  public WSDLDocument getWSDLDocument()
  {
    return wsdlDocument;
  }

  /**
   * Returns analyzerContext.
   * @return analyzerContext
   */
  public AnalyzerContext getAnalyzerContext()
  {
    return this.analyzerContext;
  }
}
