/*******************************************************************************
 * 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");
  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;
  }
                                     
}
