001
002 /*
003 * Copyright (C) 2012 Archie L. Cobbs. All rights reserved.
004 *
005 * $Id: PersistentObjectValidationException.java 250 2012-01-20 22:50:33Z archie.cobbs $
006 */
007
008 package org.dellroad.stuff.pobj;
009
010 import java.util.Set;
011
012 import javax.validation.ConstraintViolation;
013
014 /**
015 * Runtime exception thrown during {@link PersistentObject} operations.
016 */
017 @SuppressWarnings("serial")
018 public class PersistentObjectValidationException extends PersistentObjectException {
019
020 private final Set<ConstraintViolation<?>> violations;
021
022 /**
023 * Constructor.
024 *
025 * @param violations set of violations
026 * @throws IllegalArgumentException if {@code violations} is null
027 */
028 public PersistentObjectValidationException(Set<ConstraintViolation<?>> violations) {
029 super(PersistentObjectValidationException.generateMessage(violations));
030 this.violations = violations;
031 }
032
033 /**
034 * Get the set of constraint violations.
035 */
036 public Set<ConstraintViolation<?>> getViolations() {
037 return this.violations;
038 }
039
040 private static String generateMessage(Set<ConstraintViolation<?>> violations) {
041 if (violations == null)
042 throw new IllegalArgumentException("null violations");
043 StringBuilder buf = new StringBuilder("object failed to validate with " + violations.size() + " violation(s): ");
044 boolean first = true;
045 for (ConstraintViolation<?> violation : violations) {
046 if (first)
047 first = false;
048 else
049 buf.append("; ");
050 buf.append("[" + violation.getPropertyPath() + "]: " + violation.getMessage());
051 }
052 return buf.toString();
053 }
054 }
055