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