/*******************************************************************************
 * Copyright (c) 2001, 2004 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 Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.wst.wsdl.validation.internal.wsdl11;

import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Vector;

import javax.wsdl.Definition;
import javax.wsdl.WSDLException;

import org.apache.xerces.xs.XSModel;
import org.eclipse.wst.wsdl.validation.internal.IWSDLValidator;
import org.eclipse.wst.wsdl.validation.internal.ValidationInfo;
import org.eclipse.wst.wsdl.validation.internal.exception.ValidateWSDLException;
import org.eclipse.wst.wsdl.validation.internal.util.MessageGenerator;
import org.w3c.dom.Document;

import com.ibm.wsdl.Constants;

/**
 * The validator controller is the head of validation. 
 */
public class WSDL11ValidatorController implements IWSDLValidator
{
  protected final String _WARN_NO_VALDIATOR = "_WARN_NO_VALDIATOR";
//  protected final int ERROR_MESSAGE = 0;
//  protected final int WARNING_MESSAGE = 1;
//  protected String fileURI;
//  protected List schemas = new Vector();
//  protected Definition wsdlDefinition;
  protected MessageGenerator messagegenerator = null;
  //protected ValidationController validationController;
  protected ValidatorRegistry ver = ValidatorRegistry.getInstance();

  /**
   * Constructor.
   */
  public WSDL11ValidatorController()
  {
  }


  /* (non-Javadoc)
   * @see org.eclipse.wsdl.validate.IWSDLValidator#validate(org.w3c.dom.Document, org.eclipse.wsdl.validate.ValidationInfo)
   */
  public void validate(Document domModel, ValidationInfo valInfo) throws ValidateWSDLException
  {
    // reset the variables
//    reset();
//    fileURI = valInfo.getFileURI();
    //this.validationController = validationcontroller;

    WSDL11ValidationInfo wsdlvalinfo = new WSDL11ValidationInfoImpl(valInfo);
    WSDLDocument[] wsdlDocs = readWSDLDocument(domModel, valInfo.getFileURI(), getMessageGenerator(), wsdlvalinfo);
    // Don't validate an null definitions element. Either the file is emtpy and valid or
    // had an error when reading.
    if(wsdlDocs != null)
    {  
      int numWSDLDocs = wsdlDocs.length;
      for(int i = 0; i < numWSDLDocs; i++)
      {
        WSDLDocument tempDoc = wsdlDocs[i];
        Definition wsdlDefinition = tempDoc.getDefinition();
        // Register the schemas.
        List xsdList = tempDoc.getSchemas();
        Iterator xsdIter = xsdList.iterator();
        while (xsdIter.hasNext())
        {
          wsdlvalinfo.addSchema((XSModel)xsdIter.next());
        }
        // Set the element locations table.
        wsdlvalinfo.setElementLocations(tempDoc.getElementLocations());
        // Set any reader errors. This needs to be done after the element locations table is set.
        List readerErrors = tempDoc.getReaderErrors();
        if (readerErrors != null)
        {
          Iterator readerErrorsI = readerErrors.iterator();
          while (readerErrorsI.hasNext())
          {
            ReaderError re = (ReaderError)readerErrorsI.next();
            wsdlvalinfo.addError(re.getError(), re.getObject());
          }
        }
        List readerWarnings = tempDoc.getReaderWarnings();
        if (readerWarnings != null)
        {
          Iterator readerWarningsI = readerWarnings.iterator();
          while (readerWarningsI.hasNext())
          {
            ReaderError re = (ReaderError)readerWarningsI.next();
            wsdlvalinfo.addWarning(re.getError(), re.getObject());
          }
        }
        validateWSDLElement(Constants.NS_URI_WSDL, wsdlDefinition, new Vector(), wsdlvalinfo);
        wsdlvalinfo.clearSchemas();
      }
    }
    
  }
  
  /**
   * Validate an imported WSDL document. Allows the calling class to have access to the internal
   * components of the validation.
   * 
   * @param wsdlvalinfo The WSDL 1.1 validation info object to use.
   * @return The definitions element for the import.
   * @throws ValidateWSDLException
   */
//  protected Definition validateImport(WSDL11ValidationInfo wsdlvalinfo)
//  {
//    WSDLDocument[] wsdlDocs = null;
//    try
//    {
//      wsdlDocs = readWSDLDocument(null, wsdlvalinfo.getFileURI(), getMessageGenerator(), wsdlvalinfo);
//    }
//    catch(ValidateWSDLException e)
//    {
//      // supress any validation issues with imported documents
//    }
//    // Don't validate an null definitions element. Either the file is emtpy and valid or
//    // had an error when reading.
//    if(wsdlDocs != null)
//     {  
//      validateWSDLElement(Constants.NS_URI_WSDL, wsdlDefinition, new Vector(), wsdlvalinfo);
//    }
//    return wsdlDefinition;
//  }
  
  /**
   * Read in the WSDL document and set the model and imported schemas.
   * 
   * @param domModel A DOM model of the document to be read.
   * @param file The file to read.
   * @param messagegenerator The messagegenerator the reader should use for any messages produced.
   * @param wsdlvalinfo The validation information for the current validation.
   * @return The definitions element for the WSDL document.
   * @throws ValidateWSDLException
   */
  protected WSDLDocument[] readWSDLDocument(Document domModel, String file, MessageGenerator messagegenerator, WSDL11ValidationInfo wsdlvalinfo) throws ValidateWSDLException
  {
    WSDLDocument[] wsdlDocs = null;
    try
    {

      WSDLReaderImpl wsdlReader = new WSDLReaderImpl(wsdlvalinfo);
      wsdlReader.setMessageGenerator(messagegenerator);
      if(domModel != null)
      {
        wsdlDocs = wsdlReader.readWSDL(file, domModel);
      }
      else
      {  
        wsdlDocs = wsdlReader.readWSDL(file);
      }
      //wsdlvalinfo.setElementLocations(wsdlReader.getElementLocationsHashtable());
//      List readerErrors = wsdlReader.getReaderErrors();
//      if (readerErrors != null)
//       {
//        Iterator readerErrorsI = readerErrors.iterator();
//        while (readerErrorsI.hasNext())
//         {
//          ReaderError re = (ReaderError)readerErrorsI.next();
//          wsdlvalinfo.addError(re.getError(), re.getObject());
//        }
//      }
//      if (wsdlReader.hasImportSchemas())
//      {
//        List xsdList = wsdlReader.getImportSchemas();
//        Iterator xsdIter = xsdList.iterator();
//        while (xsdIter.hasNext())
//        {
//          wsdlvalinfo.addSchema((XSModel)xsdIter.next());
//        }
//
//      }

    }
    catch (WSDLException e)
    {
      throw new ValidateWSDLException(e.getMessage() + " " + e.getFaultCode());
    }

    catch (Exception e)
    {
      throw new ValidateWSDLException("unable to read file" + e.getMessage() + " " + e.toString());
    }
    return wsdlDocs;
  }

  /**
   * Given a WSDL element, call ValidateElement for it.
   * 
   * @param namespace The namespace of the element to validate.
   * @param element The element to validate.
   * @param parents The list of parents for this element.
   */
  public void validateWSDLElement(String namespace, Object element, List parents, WSDL11ValidationInfo wsdlvalinfo)
  {
    IWSDL11Validator val = ver.queryValidatorRegistry(namespace);
    if (val != null)
    {
      val.validate(element, parents, wsdlvalinfo);
    }
    else
    {
      wsdlvalinfo.addWarning(messagegenerator.getString(_WARN_NO_VALDIATOR, namespace), element);
    }
  }

  /**
   * Add a schema to the list of schemas.
   * 
   * @param xsModel The schema to add.
   */
//  public void addSchema(XSModel xsModel)
//  {
//    if (xsModel != null)
//    {
//      schemas.add(xsModel);
//    }
//  }

  /**
   * Return the list containing the schemas.
   * 
   * @return The list of schemas.
   */
//  public List getSchemas()
//  {
//    return schemas;
//  }

  /**
  	* Get the ResourceBundle for this ValidatorManager.
  	* 
  	* @return The resource bundle registered for this controller.
  	* @see #setResourceBundle
  	*/
//  public ResourceBundle getResourceBundle()
//  {
//    return resourcebundle;
//  }

  /**
   * Set the ResourceBundle for this ValidatorManager.
   * 
   * @param rb The resource bundle to set.
   * @see #getResourceBundle
   */
  public void setResourceBundle(ResourceBundle rb)
  {
    if (messagegenerator == null)
    {
      messagegenerator = new MessageGenerator(rb);
    }

  }
  
  /**
   * Set the message generator for this controller.
   * 
   * @param mesgen The message generator to set for this controller.
   */
  public void setMessageGenerator(MessageGenerator mesgen)
  {
    messagegenerator = mesgen;
  }

  /**
   * Get the message generator registered for this controller.
   * 
   * @return The message generator registered for this controller.
   */
  public MessageGenerator getMessageGenerator()
  {
    return messagegenerator;
  }

  /**
   * Return the filename for the file currently being validated. Some validators require this.
   * 
   * @return The filename for the file being validated.
   */
//  public String getFilename()
//  {
//    return fileURI;
//  }

  /**
   * Convenience method for extensibly validators to add error messages.
   * 
   * @param object The object to add the error for.
   * @param error The error to add.
   */
//  public void addErrorMessage(Object object, String error)
//  {
//    addValidationMessage(ERROR_MESSAGE, object, error);
//    errors = true;
//  }

  /**
   * Method for extensibly validators to add error messages when they know
   * line and column numbers.
   * 
   * @param line The line where the error message is located.
   * @param column The column where the error message is located.
   * @param error The error message.
   */
//  public void addErrorMessage(int line, int column, String error)
//  {
//    addValidationMessage(ERROR_MESSAGE, line, column, error);
//    errors = true;
//  }

  /**
   * Convenience method for extensibly validators to add warning messages.
   * 
   * @param object The object to add the warning message.
   * @param warning The warning message.
   */
//  public void addWarningMessage(Object object, String warning)
//  {
//    addValidationMessage(WARNING_MESSAGE, object, warning);
//  }

  /**
   * Method for extensibly validators to add warning messages when they know
   * line and column numbers.
   * 
   * @param line The line where the error message is located.
   * @param column The column where the error message is located.
   * @param warning The warning message.
   */
//  public void addWarningMessage(int line, int column, String warning)
//  {
//    addValidationMessage(WARNING_MESSAGE, line, column, warning);
//  }

  /**
   * If you have an object read in by the reader for this
   * validatorcontroller the object can be passed in here and the line and column
   * information will be abstracted from it.
   * 
   * @param type The type of message to add.
   * @param o The object that has the error (used to get the location).
   * @param message The message to add.
   */
//  protected void addValidationMessage(int type, Object o, String message)
//  {
//    int[] location;
//    if (elementLocations.containsKey(o))
//    {
//      location = (int[])elementLocations.get(o);
//    }
//    // if we give it an element that hasn't been defined we'll set the location
//    // at (0,0) so the error shows up but no line marker in the editor
//    else
//    {
//      location = new int[] { 0, 0 };
//    }
//    addValidationMessage(type, location[0], location[1], message);
//  }

  /**
    * Creates a validation message of the specified type.
    * 
  	* @param type The type of validation message to add.
  	* @param line The line where the error message is located.
  	* @param column The line where the column message is located.
  	* @param message The message to add.
  	*/
//  protected void addValidationMessage(int type, int line, int column, String message)
//  {
//    if (message != null)
//    {
//      if (type == ERROR_MESSAGE)
//      {
//        validationController.addErrorMessage(line, column, message);
//      }
//      else if (type == WARNING_MESSAGE)
//      {
//        validationController.addWarningMessage(line, column, message);
//      }
//    }
//  }

  /**
   * @see org.eclipse.wsdl.validate.controller.IWSDLValidator#isValid()
   */
//  public boolean isValid()
//  {
//    return !errors;
//  }

  /**
   * Reset the validator controller.
   */
//  protected void reset()
//  {
//    schemas = new Vector();
//    fileURI = "";
//    wsdlDefinition = null;
//    elementLocations = null;
//    resourcebundle = null;
//    //validationController = null;
//    errors = false;
//  }
}
