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


import java.util.HashMap;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

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

/**
 * <p>
 * Default implementation of the IMessage interface, provided for the convenience of the
 * IValidators. If an IValidator needs to run in both AAT and WSAD then this IMessage implementation
 * should be used; if the IValidator runs in WSAD alone, the WSAD LocalizedMessage may be used in
 * place of this implementation.
 * <p>
 * @see org.eclipse.wst.validation.internal.provisional.core.IMessage
 * 
 * [issue: CS - I'd suggest splitting this class into Message and BundleMessage (where the latter inherits
 * from the former.  We have many messages that come (from xerces) pretranslated and don't require 'bundle'
 * related fields and methods. Splitting this class would make it easier to understand where bundle related
 * function is coming into play. Below I've listed out what would go into BundleMessage to demonstrate how 
 * we can simplify the 'Message' class by factoring out the bundle related details.
 * 
 * Message
 *	private Object targetObject = null;
 *	private String groupName = null;
 *	private int lineNumber = IMessage.LINENO_UNSET;
 *	private int length = IMessage.OFFSET_UNSET;
 *	private int offset = IMessage.OFFSET_UNSET;
 *
 *    
 * BundleMessage
 *	private String id = null;
 *	private String[] params = null;
 *	private String bundleName = null;
 *   
 *   - getId()
 *   - getBundle(...)
 *   - getBundleName()
 *   - getParams()
 *   - getText(Locale)
 *   - getText(ClassLoader)
 *   - getText(Locale, ClassLoader)
 *   - setId(String)
 *   - setBundleName(String)
 *   - setParams(String[])
 * ]
 */
public class Message implements IMessage {
	private String id = null;
	private String[] params = null;
	private int severity = MessageFilter.ANY_SEVERITY;
	private Object targetObject = null;
	private String bundleName = null;
	private String groupName = null;
	private int lineNumber = IMessage.LINENO_UNSET;
	private int length = IMessage.OFFSET_UNSET;
	private int offset = IMessage.OFFSET_UNSET;
	private HashMap messageAttributes;

	/**
	 * <p>
	 * Creates a default instance of the Message
	 * </p>
	 */
	public Message() {
		super();
	}

	/**
	 * <p>
	 * Creates a Message object with bundle name, severity and a unique id
	 * </p>
	 * 
	 * @param aBundleName 
	 * 			Must not be null or the empty string (""). 
	 * @param aSeverity 
	 * 			Must be one of the severities specified in IMessage. 
	 * @param anId 
	 * 			Must not be null or the empty string ("").
	 */
	public Message(String aBundleName, int aSeverity, String anId) {
		this(aBundleName, aSeverity, anId, null, null);
	}

	/**
	 * <p>
	 * Creates a Message object with bundle name, severity, a unique id, and 
	 * a list of parameters. 
	 * </p>
	 * 
	 * @param aBundleName 
	 * 			Must not be null or the empty string (""). 
	 * @param aSeverity 
	 * 			Must be one of the severities specified in IMessage.
	 * @param anId 
	 * 			Must not be null or the empty string ("").
	 * @param aParams 
	 * 			May be null, if there are no parameters in the message.
	 */
	public Message(String aBundleName, int aSeverity, String anId, String[] aParams) {
		this(aBundleName, aSeverity, anId, aParams, null);
	}
	
	/**
	 * <p>
	 * Creates a Message object with bundle name, severity, a unique id, and 
	 * a list of parameters and the target object.
	 * </p>
	 * 
	 * @param aBundleName 
	 * 			Must not be null or the empty string (""). 
	 * @param aSeverity 
	 * 			Must be one of the severities specified in IMessage.
	 * @param anId 
	 * 			Must not be null or the empty string ("").
	 * @param aParams 
	 * 			May be null, if there are no parameters in the message.
	 * @param targetObject 
	 * 			May be null, if the message does not pertain to a particular 
	 * 			object.
	 */
	public Message(String aBundleName, int aSeverity, String anId, String[] aParams, Object aTargetObject) {
		bundleName = aBundleName;
		severity = aSeverity;
		id = anId;
		params = aParams;
		targetObject = aTargetObject;
	}
	
	public Message(String aBundleName, int aSeverity, String anId, String[] aParams, Object aTargetObject, String aGroupName) {
		bundleName = aBundleName;
		severity = aSeverity;
		id = anId;
		params = aParams;
		targetObject = aTargetObject;
		groupName = aGroupName;
	}

	/**
	 * @return the resource bundle which contains the messages, as identified by
	 * 
	 * @link #getBundleName()
	 */
	public ResourceBundle getBundle(Locale locale, ClassLoader classLoader) {
		ResourceBundle bundle = null;
		try {
			if (classLoader == null) {
				bundle = ResourceBundle.getBundle(getBundleName(), locale);
			} else {
				bundle = ResourceBundle.getBundle(getBundleName(), locale, classLoader);
			}
		} catch (MissingResourceException e) {
			e.printStackTrace();
		}
		return bundle;
	}

	/**
	 * @see IMessage#getBundleName()
	 */
	public String getBundleName() {
		return bundleName;
	}

	/**
	 * @see IMessage#getGroupName()
	 */
	public String getGroupName() {
		return groupName;
	}

	/**
	 * @see IMessage#getId()
	 */
	public String getId() {
		return id;
	}

	/**
	 * @see IMessage#getLength()
	 */
	public int getLength() {
		return length;
	}

	/**
	 * @see IMessage#getLineNumber()
	 */
	public int getLineNumber() {
		return lineNumber;
	}

	/**
	 * @see IMessage#getOffset()
	 */
	public int getOffset() {
		return offset;
	}

	/**
	 * @see IMessage#getParams()
	 */
	public String[] getParams() {
		return params;
	}

	/**
	 * @see IMessage#getSeverity()
	 */
	public int getSeverity() {
		return severity;
	}

	/**
	 * @see IMessage#getTargetObject()
	 */
	public Object getTargetObject() {
		return targetObject;
	}

	/**
	 * @see IMessage#getText()
	 */
	public String getText() {
		return getText(Locale.getDefault(), null);
	}

	/**
	 * @see IMessage#getText(ClassLoader)
	 */
	public String getText(ClassLoader classLoader) {
		return getText(Locale.getDefault(), classLoader);
	}

	/**
	 * @see IMessage#getText(Locale)
	 */
	public String getText(Locale locale) {
		return getText(locale, null);
	}

	/**
	 * @see IMessage#getText(Locale, ClassLoader)
	 */
	public java.lang.String getText(Locale locale, ClassLoader classLoader) {
		String message = ""; //$NON-NLS-1$

		if (locale == null) {
			return message;
		}

		ResourceBundle bundle = getBundle(locale, classLoader);
		if (bundle == null) {
			return message;
		}

		try {
			message = bundle.getString(getId());

			if (getParams() != null) {
				message = java.text.MessageFormat.format(message, getParams());
			}
		} catch (MissingResourceException exc) {
			System.err.println(exc.getMessage());
			System.err.println(getId());
		} catch (NullPointerException exc) {
			System.err.println(exc.getMessage());
			System.err.println(getId());
		}

		return message;
	}

	/**
	 * @see IMessage#setBundleName(String)
	 */
	public void setBundleName(String aBundleName) {
		bundleName = aBundleName;
	}

	/**
	 * @see IMessage#setGroupName(String)
	 */
	public void setGroupName(String name) {
		groupName = name;
	}

	/**
	 * @see IMessage#setId(String)
	 */
	public void setId(String newId) {
		id = newId;
	}

	/**
	 * @see IMessage#setLength(int)
	 */
	public void setLength(int length) {
		if (length < 0) {
			length = IMessage.OFFSET_UNSET;
		}
		this.length = length;
	}

	/**
	 * @see IMessage#setLineNo(int)
	 */
	public void setLineNo(int lineNumber) {
		if (lineNumber < 0) {
			this.lineNumber = IMessage.LINENO_UNSET;
		} else {
			this.lineNumber = lineNumber;
		}
	}

	/**
	 * @see IMessage#setOffset(int)
	 */
	public void setOffset(int offset) {
		if (offset < 0) {
			offset = IMessage.OFFSET_UNSET;
		}
		this.offset = offset;
	}

	/**
	 * @see IMessage#setParams(String[])
	 */
	public void setParams(String[] newParams) {
		params = newParams;
	}

	/**
	 * @see IMessage#setSeverity(int)
	 */
	public void setSeverity(int newSeverity) {
		severity = newSeverity;
	}

	/**
	 * @see IMessage#setTargetObject(Object)
	 */
	public void setTargetObject(Object obj) {
		targetObject = obj;
	}

	public Object getAttribute(String attributeName) {
		if(messageAttributes != null) {
			return messageAttributes.get(attributeName);
		}
		return null;
	}

	public void setAttribute(String attributeName, Object value) {
		if(messageAttributes == null) {
			messageAttributes = new HashMap();
		}
		messageAttributes.put(attributeName,value);
	}
}