/*
 * Created on Aug 18, 2008 (C) Copyright TANDBERG Television Ltd.
 */

package com.tandbergtv.watchpoint.pmm.util.validation;

import java.util.ArrayList;
import java.util.List;

/**
 * Exception indicating that validation has failed.
 * 
 * @author Vijay Silva
 */
public class ValidationException extends RuntimeException {

	/* Serialization UID */
	private static final long serialVersionUID = 4530695438426588152L;

	/* the validation messages */
	private List<ValidationMessage> validationMessages;

	/**
	 * Default Constructor
	 */
	public ValidationException(List<ValidationMessage> messages) {
		super();
		this.setValidationMessages(messages);
	}

	/**
	 * @param message The detail message
	 * @param cause the cause
	 * @param messages the list of validation messages
	 */
	public ValidationException(String message, Throwable cause, List<ValidationMessage> messages) {
		super(message, cause);
		this.setValidationMessages(messages);
	}

	/**
	 * @param message A detail message
	 * @param messages The list of validation messages
	 */
	public ValidationException(String message, List<ValidationMessage> messages) {
		super(message);
		this.setValidationMessages(messages);
	}

	/**
	 * @param cause The Cause of this exception
	 * @param messages the list of validation messages
	 */
	public ValidationException(Throwable cause, List<ValidationMessage> messages) {
		super(cause);
		this.setValidationMessages(messages);
	}

	/**
	 * @return the validationMessages associated with this exception
	 */
	public List<ValidationMessage> getValidationMessages() {
		return validationMessages;
	}

	/** Set the validation messages */
	protected void setValidationMessages(List<ValidationMessage> messages) {
		if (messages == null)
			messages = new ArrayList<ValidationMessage>();

		this.validationMessages = messages;
	}

	@Override
	public String getMessage() {
		StringBuilder msg = new StringBuilder();
		if (super.getMessage() != null) {
			msg.append(super.getMessage());
			msg.append(" ");
		}
		
		msg.append("There are " + this.validationMessages.size() + " validation errors present.");
		msg.append(System.getProperty("line.separator"));
		for (ValidationMessage validationMessage : this.validationMessages) {
			msg.append(validationMessage.getCode());
			msg.append(": ");
			msg.append(validationMessage.getProperties());
			msg.append(System.getProperty("line.separator"));
		}

		return msg.toString();
	}
}
