/*******************************************************************************
 * 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.IValidationInfo;
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, IValidationInfo valInfo) throws ValidateWSDLException
  {
    // reset the variables
//    reset();
//    fileURI = valInfo.getFileURI();
    //this.validationController = validationcontroller;

    IWSDL11ValidationInfo 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, IWSDL11ValidationInfo 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, IWSDL11ValidationInfo wsdlvalinfo)
  {
    IWSDL11Validator val = ver.queryValidatorRegistry(namespace);
    if (val != null)
    {
      val.validate(element, parents, wsdlvalinfo);
    }
    else
    {
	  //TODO: Add this as a preference.
      //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;
//  }
}
