From 4a0eb44b412747f24df97e8e4e7f0b434c121319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 28 Feb 2011 13:14:26 +0100 Subject: [PATCH] Show summary of validation errors This way the stack trace will have more information when a ValidationException happens. FEA: ItEr71S04BugFixing --- .../business/common/BaseEntity.java | 8 +++- .../exceptions/ValidationException.java | 37 ++++++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/BaseEntity.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/BaseEntity.java index 74b0b177f..ddd0ee8ef 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/BaseEntity.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/BaseEntity.java @@ -111,8 +111,7 @@ public abstract class BaseEntity implements INewObject { @Override public String toString() { try { - return super.toString() + "[ id: " + getId() + ", newObject: " - + isNewObject() + "]"; + return super.toString() + getExtraInformation(); } catch (Exception e) { final String message = "error doing toString"; LOG.error(message, e); @@ -120,4 +119,9 @@ public abstract class BaseEntity implements INewObject { } } + public String getExtraInformation() { + return "[ id: " + getId() + ", newObject: " + + isNewObject() + "]"; + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/exceptions/ValidationException.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/exceptions/ValidationException.java index c08ccd062..a7a38f06f 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/exceptions/ValidationException.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/exceptions/ValidationException.java @@ -23,6 +23,7 @@ package org.navalplanner.business.common.exceptions; import org.apache.commons.lang.Validate; import org.hibernate.validator.InvalidValue; +import org.navalplanner.business.common.BaseEntity; /** * Encapsulates some validation failure
@@ -30,6 +31,38 @@ import org.hibernate.validator.InvalidValue; */ public class ValidationException extends RuntimeException { + private static String getValidationErrorSummary( + InvalidValue... invalidValues) { + StringBuilder builder = new StringBuilder(); + for (InvalidValue each : invalidValues) { + builder.append(summaryFor(each)); + builder.append("; "); + } + if (invalidValues.length > 0) { + builder.delete(builder.length() - 2, builder.length()); + } + return builder.toString(); + } + + private static String summaryFor(InvalidValue invalidValue) { + return "at " + asString(invalidValue.getBean()) + " " + + invalidValue.getPropertyPath() + ": " + + invalidValue.getMessage(); + } + + private static String asString(Object bean) { + if (bean == null) { + // this shouldn't happen, just in case + return "null"; + } + if (bean instanceof BaseEntity) { + BaseEntity entity = (BaseEntity) bean; + return bean.getClass().getSimpleName() + " " + + entity.getExtraInformation(); + } + return bean.toString(); + } + private InvalidValue[] invalidValues; public InvalidValue[] getInvalidValues() { @@ -37,7 +70,7 @@ public class ValidationException extends RuntimeException { } public ValidationException(InvalidValue invalidValue) { - super(); + super(getValidationErrorSummary(invalidValue)); storeInvalidValues(toArray(invalidValue)); } @@ -48,7 +81,7 @@ public class ValidationException extends RuntimeException { } public ValidationException(InvalidValue[] invalidValues) { - super(); + super(getValidationErrorSummary(invalidValues)); storeInvalidValues(invalidValues); }