/*******************************************************************************
 * 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.List;
import java.util.Map;

import javax.wsdl.Definition;
import javax.wsdl.Types;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.UnknownExtensibilityElement;

import org.eclipse.wst.wsi.internal.WSIException;
import org.eclipse.wst.wsi.internal.WSITag;
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.xml.XMLUtils;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;


/**
 * BP2102.
 * <context>For a candidate wsdl:types element, with XML schema import elements</context>
 * <assertionDescription>Each XML schema import statement (xsd:import) is only used to directly reference an XML schema definition, which has "schema" from XML namespace "http://www.w3.org/2001/XMLSchema" as root element.  It does not contain a reference to another document embedding the XML schema definition (e.g. WSDL).</assertionDescription>
 */
public class BP2102 extends AssertionProcess implements WSITag
{
  private final WSDLValidatorImpl validator;

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

  private boolean importFound = false;

  /* 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
  {
    result = AssertionResult.RESULT_PASSED;

    // parse WSDL as XML
    try
    {
      Types t = (Types) entryContext.getEntry().getEntryDetail();
      List exts = t.getExtensibilityElements();

      Definition definition = null;
      if ((definition = validator.analyzerContext.getCandidateInfo().getDefinition(t))
        == null)
      {
        throw new WSIException("Could not find types definition in any WSDL document.");
      }

      if (exts != null)
      {
        Iterator it = exts.iterator();
        while (it.hasNext())
        {
          ExtensibilityElement el = (ExtensibilityElement) it.next();
          if (el instanceof UnknownExtensibilityElement
            && el.getElementType().equals(ELEM_XSD_SCHEMA))
            testNode(((UnknownExtensibilityElement) el).getElement(),
              definition.getDocumentBaseURI());

          if (result.equals(AssertionResult.RESULT_FAILED))
          {
            failureDetail =
              this.validator.createFailureDetail(failureDetailMessage, entryContext);
          }
        }
      }

      if (!importFound)
        result = AssertionResult.RESULT_NOT_APPLICABLE;
    }

    catch (Throwable tt)
    {
      result = AssertionResult.RESULT_NOT_APPLICABLE;
      failureDetail =
        this.validator.createFailureDetail(
          "WSDL document can not be processed",
          entryContext);
    }

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

  /*
   * Check node is xsd import and it is 
   * only used to directly reference an XML schema definition, which has "schema" 
   * from XML namespace "http://www.w3.org/2001/XMLSchema" as root element.  
   * And it does not contain a reference to another document embedding the XML schema 
   * definition (e.g. WSDL).
  * @param n - Unknown extensibility element
  */
  private void testNode(Node n, String context)
  {
    while (n != null)
    {
      // searches for xsd:import element
      if (Node.ELEMENT_NODE == n.getNodeType())
      {
        if (XMLUtils.equals(n, ELEM_XSD_IMPORT))
        {
          importFound = true;

          Element im = (Element) n;
          // Getting the schemaLocation and the namespace attributes
          Attr schemaLocation =
            XMLUtils.getAttribute(im, ATTR_XSD_SCHEMALOCATION);
          Attr namespace = XMLUtils.getAttribute(im, ATTR_XSD_NAMESPACE);
          // If there is only the namespace attribute of import element
          if (schemaLocation == null && namespace != null)
          {
            // Getting all the inline schemas of the wsdl definition
            Map schemasMap = validator.wsdlDocument.getSchemas();
            // If an inline schema imported is defined
            if (schemasMap.keySet().contains(namespace.getValue()))
            {
              // If an inline schema imported is defined
              // (that means the schema is valid),
              // continue with the next element
              n = n.getNextSibling();
              continue;
            }

            // no schemaLocation so try the namespace 
            schemaLocation = namespace;
          }

          // try to parse imported XSD
          if (schemaLocation != null && schemaLocation.getValue() != null)
          {
            try
            {
              // if any error or root element is not XSD schema -> error
              // !! ATTENTION
              // root XSD SCHEMA SCHEMA is not valid                            
              //Document schema = XMLUtils.parseXMLDocumentURL(schemaLocation.getValue(), XSD_SCHEMALOCATION, context);
              Document schema =
                validator.parseXMLDocumentURL(schemaLocation.getValue(), context);

              // If the import is valid, then check its contents
              if (XMLUtils
                .equals(schema.getDocumentElement(), ELEM_XSD_SCHEMA))
              {
                // Check content of imported document
                testNode(schema.getDocumentElement().getFirstChild(),
                  XMLUtils.createURLString(schemaLocation.getValue(), context));
              }

              else
              {
                throw new Exception();
              }
            }
            catch (Throwable t)
            {
              result = AssertionResult.RESULT_FAILED;
              failureDetailMessage = schemaLocation.getValue();
              break;
            }
          }
          else
          {
            //result = AssertionResult.RESULT_FAILED;
            result = AssertionResult.RESULT_NOT_APPLICABLE;
            failureDetailMessage =
              "schemaLocation == null and namespace == null";
            break;
          }
        }
        testNode(n.getFirstChild(), context);
      }
      n = n.getNextSibling();
    }
  }
}