/*******************************************************************************
 * 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.xml.ui.internal.validation;

import java.io.InputStream;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.xml.core.internal.validation.XMLValidationReport;
import org.eclipse.wst.xml.core.internal.validation.core.ValidationMessage;
import org.eclipse.wst.xml.ui.internal.Logger;

                
/**
 * This class managers the 'UI' related details of validation
 * Here's a quick overview of the details : 
 *   - manages Marker creation based on the results of the validation
 *   - (optionally) displays dialog to summarize the results of validation
 * 
 * @author Craig Salter, IBM
 * @author Lawrence Mandel, IBM
 */
public class ValidateAction extends org.eclipse.wst.xml.ui.internal.validation.core.ValidateAction
{ 
  //dw private static final String _UI_MESSAGE_LIMITE_EXCEEDED = "_UI_MESSAGE_LIMITE_EXCEEDED";
  
  private InputStream inputStream;
  

  /**
   * Constructor.
   * 
   * @param file The file to validate.
   * @param showDialog Whether to display a dialog after validation.
   */
  public ValidateAction(IFile file, boolean showDialog)
  {   
    super(file, showDialog);
  }  

  /*
   * Store additional information in the message parameters
   * param[0] = the column number of the error
   * param[1] = the 'squiggle selection strategy' for which DOM part to squiggle
   * param[2] = the name or value of what is to be squiggled
   */
  protected void addInfoToMessage(ValidationMessage validationMessage, IMessage message)
  { 
    if (inputStream != null)
    {
      XMLMessageInfoHelper messageInfoHelper = new XMLMessageInfoHelper();
      String[] messageInfo = messageInfoHelper.createMessageInfo(validationMessage.getKey(), validationMessage.getMessageArguments());
      
	  message.setAttribute(COLUMN_NUMBER_ATTRIBUTE, new Integer(validationMessage.getColumnNumber()));
	  message.setAttribute(SQUIGGLE_SELECTION_STRATEGY_ATTRIBUTE, messageInfo[0]);
	  message.setAttribute(SQUIGGLE_NAME_OR_VALUE_ATTRIBUTE, messageInfo[1]);
    }  
  }
  
  protected void validate(final IFile file)
  {      
    final XMLValidationOutcome valoutcome = new XMLValidationOutcome();
    IPath path = file.getLocation();
    final String uri = createURIForFilePath(path.toString());

    IWorkspaceRunnable op = new IWorkspaceRunnable() 
    {
      public void run(IProgressMonitor progressMonitor) throws CoreException 
      {         
        XMLValidator validator = XMLValidator.getInstance();

        clearMarkers(file);
        XMLValidationReport valreport = null;
        if (inputStream != null)
        {
          valreport = validator.validate(uri, inputStream);
        }
        else
        {
          valreport = validator.validate(uri);
        }
        
        valoutcome.isValid = valreport.isValid();
        if(valreport.getValidationMessages().length == 0)
        {
          valoutcome.hasMessages = false;
        }
        else
        {
          valoutcome.hasMessages = true;
        }
        valoutcome.isGrammarEncountered = valreport.isGrammarEncountered();
        createMarkers(file, valreport.getValidationMessages());
        
        file.setSessionProperty(ValidationMessage.ERROR_MESSAGE_MAP_QUALIFIED_NAME, valreport.getNestedMessages());
      }
    };    

    
    try
    {
      ResourcesPlugin.getWorkspace().run(op, null);
//      String internalErrorMessage = null;
//      if (validator.getInternalError() != null)
//      {
//        internalErrorMessage =  XMLValidatePlugin.getString("_UI_VALIDATION_INTERNAL_ERROR");
//        internalErrorMessage += " : " + validator.getInternalError();
//      }
                 
      if (showDialog)
      {
        // The file is invalid.
        if (!valoutcome.isValid)
        {
          String title = XMLValidationUIMessages._UI_VALIDATION_FAILED;
          String message = XMLValidationUIMessages._UI_THE_XML_FILE_IS_NOT_VALID;
          openErrorDialog(title, message);
        }
        else
        {
          // The file is valid however warnings were issued.
          if(valoutcome.hasMessages)
          {
            String title = XMLValidationUIMessages._UI_VALIDATION_SUCEEDED;
            String message = valoutcome.isGrammarEncountered ?
            			XMLValidationUIMessages._UI_THE_XML_FILE_IS_VALID_WITH_WARNINGS : 
            				XMLValidationUIMessages._UI_THE_XML_FILE_IS_WELL_FORMED_WITH_WARNINGS + 
            				XMLValidationUIMessages._UI_NO_GRAMMAR_WARNING;                             
            
            openWarningDialog(title, message);
          }
          // The file is valid with no warnings.
          else
          {
            String title = XMLValidationUIMessages._UI_VALIDATION_SUCEEDED;
            String message = valoutcome.isGrammarEncountered ?
            			XMLValidationUIMessages._UI_THE_XML_FILE_IS_VALID : 
            				XMLValidationUIMessages._UI_THE_XML_FILE_IS_WELL_FORMED + 
            				XMLValidationUIMessages._UI_NO_GRAMMAR_WARNING;                             
            
            openValidDialog(title, message);
          }
        }
      }
    }

    catch (CoreException e)
    {
      Logger.logException(e);
    }                           
  } 
  
  /**
   * An XML specific validation outcome that includes whether a grammar 
   * was encountered.
   * 
   * @author Lawrence Mandel, IBM
   */
  protected class XMLValidationOutcome extends ValidationOutcome
  {
    public boolean isGrammarEncountered = false;
  }
  public void setInputStream(InputStream inputStream)
  { this.inputStream = inputStream;
  }
}
