/*
* This software is distributed under the terms of the FSF
* Gnu Lesser General Public License (see lgpl.txt).
*
* This program is distributed WITHOUT ANY WARRANTY. See the
* GNU General Public License for more details.
*/
package com.scooterframework.common.validation;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.scooterframework.common.util.ExpandedMessage;
import com.scooterframework.common.util.Message;
/**
* ValidationResults class contains results of validations.
*
* @author (Fei) John Chen
*/
public class ValidationResults implements Serializable
{
/**
* Generated serialVersionUID
*/
private static final long serialVersionUID = 1413365201819867894L;
/**
* Records a validation error message
*
* @param messageKey error message key or error message
*/
public void recordValidationException(String messageKey) {
recordValidationException(new ExpandedMessage(messageKey));
}
/**
* Records a validation error message for a key or a field
*
* @param key String key or field
* @param messageKey error message key or error message
*/
public void recordValidationException(String key, String messageKey) {
recordValidationException(new ExpandedMessage(key, messageKey));
}
/**
* Records a validation error message for a key or a field
*
* @param key String key or field
* @param messageKey error message key or error message
* @param value a value that can be used in the message
*/
public void recordValidationException(String key, String messageKey, Object value) {
recordValidationException(new ExpandedMessage(key, messageKey, value));
}
/**
* Records a validation error message for a key or a field
*
* @param key String key or field
* @param messageKey error message key or error message
* @param value0 a value that can be used in the message
* @param value1 a value that can be used in the message
*/
public void recordValidationException(String key, String messageKey, Object value0, Object value1) {
recordValidationException(new ExpandedMessage(key, messageKey, value0, value1));
}
/**
* Records a validation error message for a key or a field
*
* @param key String key or field
* @param messageKey error message key or error message
* @param value0 a value that can be used in the message
* @param value1 a value that can be used in the message
* @param value2 a value that can be used in the message
*/
public void recordValidationException(String key, String messageKey, Object value0, Object value1, Object value2) {
recordValidationException(new ExpandedMessage(key, messageKey, value0, value1, value2));
}
/**
* Records a validation error message for a key or a field
*
* @param key String key or field
* @param messageKey error message key or error message
* @param values an array of values that can be used in the message
*/
public void recordValidationException(String key, String messageKey, Object[] values) {
recordValidationException(new ExpandedMessage(key, messageKey, values));
}
/**
* Records a validation error message
*
* @param validationMessage a generic validation message
*/
public void recordValidationException(Message validationMessage) {
if (!errorMessageList.contains(validationMessage)) {
errorMessageList.add(validationMessage);
bFailed = true;
}
}
/**
* Checks the end result of a validation process
*
* @return boolean True if there is no validation failure
*/
public boolean failed() {
return bFailed;
}
/**
* Clears all errors.
*/
public void clear() {
bFailed = false;
errorMessageList.clear();
}
/**
* Gets error messages of validation
*
* @return Vector errorMessageList
*/
public List<Message> getErrorMessages() {
return errorMessageList;
}
/**
* Returns number of errors.
*
* @return int number of errors.
*/
public int count() {
return size();
}
/**
* Returns number of errors.
*
* @return int number of errors.
*/
public int size() {
return errorMessageList.size();
}
/**
* Returns a string array of all the contents of error messages.
*
* @return a string array
*/
public String[] getFullMessages() {
if (!failed()) return null;
int size = size();
String[] strary = new String[size];
for (int i=0; i<size; i++) {
Message message = errorMessageList.get(i);
if (message == null) continue;
strary[i] = message.getContent();
}
return strary;
}
/**
* Returns a string array of all the contents of error messages on a
* specific key (column).
*
* @return a string array
*/
public String[] getFullMessagesOn(String key) {
List<Message> errs = getErrorsOn(key);
if (errs == null || errs.size() == 0) return null;
int size = errs.size();
String[] strary = new String[size];
for (int i=0; i<size; i++) {
strary[i] = ((Message)errs.get(i)).getContent();
}
return strary;
}
/**
* Returns a list of errors on a specific key (column). Each item in the
* list is an ExpandedMessage instance.
*
* @param key a key to an error, usually is a column name
* @return list of errors
*/
public List<Message> getErrorsOn(String key) {
if (!failed() || key == null || "".equals(key)) return null;
List<Message> errs = new ArrayList<Message>();
int size = size();
for (int i=0; i<size; i++) {
Message message = errorMessageList.get(i);
if (message == null) continue;
if (key.equalsIgnoreCase(message.getId())) errs.add(message);
}
return errs;
}
/**
* Checks if there are errors associated with a specific key.
*
* @param key a key to an error, usually is a column name
* @return if there are errors associated with the key.
*/
public boolean hasErrorOn(String key) {
if (!failed() || key == null || "".equals(key)) return false;
boolean status = false;
int size = size();
for (int i=0; i<size; i++) {
Message message = (Message)errorMessageList.get(i);
if (message == null) continue;
if (key.equalsIgnoreCase(message.getId())) {
status = true;
break;
}
}
return status;
}
/**
* Returns a string representation of this object.
*
* @return String
*/
public String toString() {
String newLineMark = "\n\r";
StringBuilder sb = new StringBuilder();
sb.append(errorMessageList.size());
sb.append(" error(s).").append(newLineMark);
Iterator<Message> it = errorMessageList.iterator();
while(it.hasNext()) {
sb.append(it.next()).append(newLineMark);
}
return sb.toString();
}
/**
* Returns a xml representation of this object.
*
* <pre>
* Example:
* <?xml version="1.0" encoding="UTF-8"?>
* <errors>
* <error>Age must be within range of 0 and 5.</error>
* <error>Name must be unique.</error>
* </errors>
* </pre>
*
* @return String
*/
public String toXML() {
String newLine = "\r\n";
String indent = " ";//2 spaces
StringBuilder xml = new StringBuilder();
xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>").append(newLine);
xml.append("<errors>").append(newLine);
String[] messages = getFullMessages();
if (messages != null) {
int size = size();
for (int i=0; i<size; i++) {
xml.append(indent).append("<error>").append(messages[i]).append("</error>").append(newLine);
}
}
xml.append("</errors>").append(newLine);
return xml.toString();
}
private boolean bFailed = false;
private List<Message> errorMessageList = new ArrayList<Message>();
}