package org.transgalactica.fwk.validation;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.util.Assert;
import org.transgalactica.fwk.validation.exception.ExceptionUtils;
import org.transgalactica.fwk.validation.exception.MultipleErrorsException;
public class MultipleErrors implements Serializable {
private static final long serialVersionUID = 1L;
private List<MessageSourceResolvable> errors = new ArrayList<MessageSourceResolvable>(2);
public MultipleErrors() {
}
public void add(String messageCode) {
Assert.hasText(messageCode);
errors.add(new DefaultMessageSourceResolvable(new String[] { messageCode }, messageCode));
}
public void add(List<MessageSourceResolvable> messages) {
Assert.notNull(messages);
errors.addAll(messages);
}
public void add(MessageSourceResolvable... messages) {
Assert.notNull(messages);
errors.addAll(Arrays.asList(messages));
}
public void add(MultipleErrors someErrors) {
if (someErrors != null) {
errors.addAll(someErrors.getAllErrorMessages());
}
}
/**
* <p>
* Convert an exception into an error message and add it to the error list.
* <ul>
* <li>If the exception class is <code>MultipleErrorsException</code> then
* get the error messages and simply concatenate it to the current list.</li>
* <li>For other AbstractException, the error is built on arguments and
* class hierarchy.</li>
* <li>For other exception, the error is built on message and class
* hierarchy.</li>
* </ul>
*/
public void add(Exception e) {
Assert.notNull(e);
if (e instanceof MultipleErrorsException) {
MultipleErrorsException mex = (MultipleErrorsException) e;
add(mex.getErrors());
}
else {
MessageSourceResolvable message = ExceptionUtils.getMessageSourceResolvable(e);
add(message);
}
}
public boolean hasErrors() {
return !errors.isEmpty();
}
public List<MessageSourceResolvable> getAllErrorMessages() {
return errors;
}
public void clearErrors() {
errors.clear();
}
public void checkErrors() {
if (hasErrors()) {
throw new MultipleErrorsException(getAllErrorMessages());
}
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("MultipleErrors : { ");
for (MessageSourceResolvable error : errors) {
sb.append(error.toString());
sb.append(',');
}
sb.append("} ");
return sb.toString();
}
}