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

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;

/**
 * A class for holding validation message information. Holds the message and the
 * message location.
 */
public class ValidationMessage
{
  public static final QualifiedName ERROR_MESSAGE_MAP_QUALIFIED_NAME = new QualifiedName("org.eclipse.wst.xml.validation", "errorMessageMap"); //$NON-NLS-1$ //$NON-NLS-2$
  protected String message;
  protected int lineNumber;
  protected int columnNumber;
  protected String uri;
  protected List nestedErrors;
  protected String key;
  protected Object[] messageArguments;
  protected int startOffset;
  protected int severity = IMessage.NORMAL_SEVERITY;
  public static int SEV_HIGH = IMessage.HIGH_SEVERITY;
  public static int SEV_NORMAL = IMessage.NORMAL_SEVERITY;
  public static int SEV_LOW = IMessage.LOW_SEVERITY;

  /**
   * Constructor.
   * 
   * @param message The message for the validation message.
   * @param lineNumber The line location of the message.
   * @param columnNumber The column location of the message.
   */
  public ValidationMessage(String message, int lineNumber, int columnNumber)
  {
    this(message, lineNumber, columnNumber, null);
  }

  /** 
   * Constructor.
   * 
   * @param message The message for the validation message.
   * @param lineNumber The line location of the message.
   * @param columnNumber The column location of the message.
   * @param uri The uri of the file the message is for.
   */
   public ValidationMessage(String message, int lineNumber, int columnNumber, String uri)
  {
     this(message, lineNumber, columnNumber, uri, null, null);
  }
   
   /** 
    * Constructor.
    * 
    * @param message The message for the validation message.
    * @param lineNumber The line location of the message.
    * @param columnNumber The column location of the message.
    * @param uri The uri of the file the message is for.
    * @param key a unique string representing the error
    * @param messageArguments the arguments Xerces uses to create the message
    */
    public ValidationMessage(String message, int lineNumber, int columnNumber, String uri, String key, Object[] messageArguments)
   {
     this.message = message;
     this.lineNumber = lineNumber;
     this.columnNumber = columnNumber;
     this.uri = uri;
     this.key = key;
	 this.messageArguments = messageArguments;
     this.startOffset = 0;    
   }
   

  /**
   * Get the message for this valiation message.
   * 
   * @return The message for this validation message.
   */
  public String getMessage()
  {
    return message;
  }

  /**
   * Get the column location.
   * 
   * @return The column number.
   */
  public int getColumnNumber()
  {
    return columnNumber;
  }

  /**
   * Get the line location.
   * 
   * @return The line number.
   */
  public int getLineNumber()
  {
    return lineNumber;
  }

  /**
   * Get the uri for the file that contains the message.
   * 
   * @return The uri of the file that contains the message.
   */
  public String getUri()
  {
    return uri;
  }
  
  /**
   * Add a nested validation message to this validation message.
   * 
   * @param validationMessage The validation message to add as a nested message.
   */
  public void addNestedMessage(ValidationMessage validationMessage)
  {
    if (nestedErrors == null)
    {
      nestedErrors = new ArrayList();
    }
    nestedErrors.add(validationMessage);
    int validaitonmessageSeverity = validationMessage.getSeverity();
    if(validaitonmessageSeverity == SEV_NORMAL || validaitonmessageSeverity == SEV_HIGH)
    {
      setSeverity(SEV_NORMAL);
    }
  }

  /**
   * Get the list of nested validation messages.
   * 
   * @return The list of nested validation messages.
   */
  public List getNestedMessages()
  {
    return nestedErrors != null ? nestedErrors : Collections.EMPTY_LIST;
  }
  
  /**
   * Get the severity of the defect.
   * 
   * @return The severity of the defect.
   */
  public int getSeverity()
  {
  	return severity;
  }
  
  /**
   * Set the severity of the message.
   * 
   * @param sev The severity to set.
   */
  public void setSeverity(int sev)
  {
  	severity = sev;
  }
  
  public void setStartOffset(int offset)
  {
    this.startOffset = offset;
  }
  
  /**
   * @return Returns the key.
   */
  public String getKey()
  {
    return key;
  }
  
  public Object[] getMessageArguments()
  {
	  return this.messageArguments;
  }
  

  public void setMessage(String message)
  {
    this.message = message;
  }  
                                     
}
