I spent a long time scrutinizing the spec for exception cases. This email list exceptional cases and propose to associate specific exceptions to them or not. Please review and tell me:
 - if you think I forgot cases that needs additional consideration.
 - which model you favor (see B)


A. EXCEPTION CASES

I described the error cases and a fine grained Exception model (see B) and have a few questions see ???

1. Error report

Use for other frameworks to report violation reports

**
 * Report the result of constraint violations
 *
 * @author Emmanuel Bernard
 */
public class ConstraintViolationException extends ValidationException {
private final Set<ConstraintViolation> constraintViolations;

/**
 * Creates a constraint violation report
 *
 * @param message error message
 * @param constraintViolations Set of ConstraintViolation
 */
public ConstraintViolationException(String message, Set<ConstraintViolation> constraintViolations) {
super( message );
this.constraintViolations = constraintViolations;
}

/**
 * Creates a constraint violation report
 *
 * @param constraintViolations Set of ConstraintViolation
 */
public ConstraintViolationException(Set<ConstraintViolation> constraintViolations) {
super();
this.constraintViolations = constraintViolations;
}

/**
 * Set of constraint violations reported during a validation
 *
 * @return Set of CosntraintViolation
 */
public Set<ConstraintViolation> getConstraintViolations() {
return constraintViolations;
}
}

2. Execution exceptions

ie during validator.validate(...);


Constraint Declaration
These can be found a compilation time with an annotation processor or an IDE
???    UnsupportedTypeException or should it be AmbiguousConstraintUsageException
        More than one ConstraintValidator targeting the same type
        declared property type property has too many matches
    UnsupportedTypeException   
        declared property type property has no match
    ConstraintDefinitionException
        composition parameter overriding (name, composing constraint or incompatible parameter types)
        constraint composed of itself

  
Constraint implementation
    ConstraintInitializationException
???        initialize() must raise a RTE will be wrapped OR should we not wrap
    UnsupportedTypeException
         isValid incompatible type (detected by impl) => same as "declared property type property has no match"
    ConstraintExcecutionException
         isValid throws a RTE will be wrapped into ConstraintValidatorExecutionException
    ConstraintCreationException
         ConstraintValidatorFactory fails with RTE. Wraps it.

???  should we collapse that into a ConstraintExecutionException or even ValidationException

Groups
      Can be checked at built time by an IDE or an AnnotationProcessor
      GroupDefinitionException
           cyclic dependency between groups sequences and group inheritance
           missing group X on a Default group overriding
           Group sequence name used in a constraint declaration
           group is not an interface
    
Various
    IllegalArgumentException 
         if object to validate is null, or empty set?
???    Calls to SPi like MessageInterpolator / TraversableResolver should be wrapped?
    

3. Bootstrap

ProviderNotFoundException      
    cannot find matching provider
    cannot find any provider

ConfigurationException
  cannot read XML cong
  more than one XML conf
  no no-arg constructor on classes described by XML

MappingException
  cannot read XML mapping
  entity described more than once
  field/getter described more than once
  Wrong class / field  / getter name
  Wrong constraint declaration
  Wrong constraint definition

  
B. EXCEPTION MODEL

We have three approaches:

1. specialize an exception when the application can do something about it
In this case all exceptions are ValidationException except ConstraintViolationException

2. specialize exceptions to provide informations to the user
ValidationException (root)
ConstraintViolationException
AmbiguousConstraintUsageException
UnsupportedTypeException
ConstraintDefinitionException
ConstraintInitializationException
ConstraintExcecutionException
ConstraintCreationException
GroupDefinitionException
ProviderNotFoundException
ConfigurationException
MappingException

3. a man in the middle approach with some exception collapsing

ValidationException (root)
ConstraintViolationException
ConstraintDeclarationException (instead of UnsupportedTypeException and AmbiguousConstraintUsageException)
ConstraintDefinitionException
ConstraintExcecutionException
GroupDefinitionException
ConfigurationException