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

import java.util.Iterator;
import java.util.Vector;

import javax.wsdl.Binding;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.soap.SOAPBinding;

import org.eclipse.wst.wsi.internal.WSIConstants;
import org.eclipse.wst.wsi.internal.WSIException;
import org.eclipse.wst.wsi.internal.profile.TestAssertion;
import org.eclipse.wst.wsi.internal.profile.validator.EntryContext;
import org.eclipse.wst.wsi.internal.profile.validator.impl.AssertionProcess;
import org.eclipse.wst.wsi.internal.report.AssertionResult;
import org.eclipse.wst.wsi.internal.util.Utils;


/**
 * BP2019.
 * <context>For a candidate wsdl:binding element, if the contained soap:binding element has a "style" attribute equal to "document" and soap:operations have "use" attribute equal to "literal":</context>
 * <assertionDescription>The "namespace" attribute is not specified in any contained soapbind:body, soapbind:header, soapbind::headerfault, soapbind:fault elements </assertionDescription>
 * @version 1.0.1 27.06.2003
 * @author Vitali Fedosenko
 */
public class BP2019 extends AssertionProcess
{
  private final WSDLValidatorImpl validator;

  /**
   * @param WSDLValidatorImpl
   */
  public BP2019(WSDLValidatorImpl impl)
  {
    super(impl);
    this.validator = impl;
  }

  /* Validates the test assertion.
   * @see org.wsi.test.profile.validator.impl.BaseValidatorImpl.AssertionProcess#validate(org.wsi.test.profile.TestAssertion, org.wsi.test.profile.validator.EntryContext)
   */
  public AssertionResult validate(
    TestAssertion testAssertion,
    EntryContext entryContext)
    throws WSIException
  {
    boolean docLitFound = false;
    String errantElements = new String("");
    String soapExtensibleWithNamespace = null;

    // Get the binding from the entry context
    Binding binding = (Binding) entryContext.getEntry().getEntryDetail();

    // Try to get the SOAP binding
    SOAPBinding soapBinding = WSDLValidatorImpl.getSoapBinding(binding);

    if (soapBinding != null)
    {
      String style =
        (soapBinding.getStyle() == null)
          ? WSIConstants.ATTRVAL_SOAP_BIND_STYLE_DOC
          : soapBinding.getStyle();
      if (style.equals(WSIConstants.ATTRVAL_SOAP_BIND_STYLE_DOC))
      {
        Vector soapElements = Utils.arrayToVector(this.validator.getSoapBodies(binding));
        soapElements.addAll(Utils.arrayToVector(this.validator.getSoapFaults(binding)));
        soapElements.addAll(Utils.arrayToVector(this.validator.getSoapHeaders(binding)));
        soapElements.addAll(
          Utils.arrayToVector(this.validator.getSoapHeaderFaults(binding)));

        Iterator i = soapElements.iterator();
        while (i.hasNext())
        {
          ExtensibilityElement soapElement =
            (ExtensibilityElement) (i.next());
          try
          {
            if (this.validator.isLiteral(soapElement))
            {
              docLitFound = true;
              if (this.validator.namespaceFoundInSoapLiteral(soapElement))
              {
                errantElements += "\n--- " + (soapElement.toString());
              }
            }
          }
          catch (Exception e)
          {
          } // continue with clenched teeth
        }
      }
    }

    if (!docLitFound)
    {
      result = AssertionResult.RESULT_NOT_APPLICABLE;
    }
    else
    {
      // If a namespace was not found then test assertion passed
      if (errantElements.length() != 0)
      {
        result = AssertionResult.RESULT_FAILED;
        failureDetail =
          this.validator.createFailureDetail(
            "Failing elements:" + errantElements,
            entryContext);
      }
    }

    // Return assertion result
    return validator.createAssertionResult(testAssertion, result, failureDetail);
  }
}