<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>I spent a long time&nbsp;scrutinizing&nbsp;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:</div><div>&nbsp;- if you think I forgot cases that needs additional consideration.</div><div>&nbsp;- which model you favor (see B)</div><div><br></div><div><br></div><div><b>A. EXCEPTION CASES</b></div><div><b><br></b></div><div>I described the error cases and a fine grained Exception model (see B) and have a few questions see ???</div><div><b><br></b></div><div><b>1. Error report</b></div><div><br></div><div>Use for other frameworks to report violation reports</div><div><br></div><div><div>**</div><div>&nbsp;* Report the result of constraint violations</div><div>&nbsp;*</div><div>&nbsp;* @author Emmanuel Bernard</div><div>&nbsp;*/</div><div>public class ConstraintViolationException extends ValidationException {</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>private final Set&lt;ConstraintViolation> constraintViolations;</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>/**</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;* Creates a constraint violation report</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;*</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;* @param message error message</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;* @param constraintViolations Set of ConstraintViolation</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;*/</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>public ConstraintViolationException(String message, Set&lt;ConstraintViolation> constraintViolations) {</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>super( message );</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>this.constraintViolations = constraintViolations;</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>/**</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;* Creates a constraint violation report</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;*</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;* @param constraintViolations Set of ConstraintViolation</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;*/</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>public ConstraintViolationException(Set&lt;ConstraintViolation> constraintViolations) {</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>super();</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>this.constraintViolations = constraintViolations;</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>/**</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;* Set of constraint violations reported during a validation</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;*</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;* @return Set of CosntraintViolation</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>&nbsp;*/</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>public Set&lt;ConstraintViolation> getConstraintViolations() {</div><div><span class="Apple-tab-span" style="white-space: pre; ">                </span>return constraintViolations;</div><div><span class="Apple-tab-span" style="white-space: pre; ">        </span>}</div><div>}</div></div><div><br></div><div><b>2. Execution exceptions</b></div><div><br></div><div>ie during validator.validate(...);</div><div><br></div><div><br></div><div><i>Constraint Declaration</i></div><div>These can be found a compilation time with an annotation processor or an IDE</div><div>??? &nbsp; &nbsp;<span class="Apple-style-span" style="font-style: italic; ">UnsupportedTypeException&nbsp;</span>or should it be<span class="Apple-style-span" style="font-style: italic; ">&nbsp;AmbiguousConstraintUsageException</span></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;More than one ConstraintValidator targeting the same type</div><div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;declared property type property has too many matches</div></div><div><i>&nbsp;&nbsp; &nbsp;UnsupportedTypeException</i>&nbsp;&nbsp;&nbsp;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;declared property type property has no match</div><div>&nbsp;&nbsp; &nbsp;<i>ConstraintDefinitionException</i></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;composition parameter overriding (name, composing constraint or incompatible parameter types)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;constraint composed of itself</div><div><br></div><div>&nbsp;&nbsp;</div><div><i>Constraint implementation</i></div><div>&nbsp;&nbsp; &nbsp;<i>ConstraintInitializationException</i></div><div>??? &nbsp; &nbsp; &nbsp; &nbsp;initialize() must raise a RTE will be wrapped OR should we not wrap</div><div>&nbsp;&nbsp; &nbsp;<span class="Apple-style-span" style="font-style: italic; ">UnsupportedTypeException</span></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; isValid incompatible type (detected by impl) => same as "declared property type property has no match"</div><div><i>&nbsp;&nbsp; &nbsp;ConstraintExcecutionException</i></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; isValid throws a RTE will be wrapped into ConstraintValidatorExecutionException</div><div><i>&nbsp;&nbsp; &nbsp;ConstraintCreationException</i></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ConstraintValidatorFactory fails with RTE. Wraps it.</div><div><br></div><div>??? &nbsp;should we collapse that into a&nbsp;<i>ConstraintExecutionException</i>&nbsp;or even&nbsp;<i>ValidationException</i></div><div><br></div><div><div><i>Groups</i></div><div>&nbsp;&nbsp; &nbsp; &nbsp;Can be checked at built time by an IDE or an AnnotationProcessor</div><div><i>&nbsp;&nbsp; &nbsp; &nbsp;GroupDefinitionException</i></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cyclic dependency between groups sequences and group inheritance</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; missing group X on a Default group overriding</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Group sequence name used in a constraint declaration</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; group is not an interface</div></div><div>&nbsp;&nbsp; &nbsp;</div><div><i>Various</i></div><div>&nbsp;&nbsp; &nbsp;<i>IllegalArgumentException</i>&nbsp;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if object to validate is null, or empty set?</div><div>??? &nbsp; &nbsp;Calls to SPi like MessageInterpolator / TraversableResolver should be wrapped?</div><div>&nbsp;&nbsp; &nbsp;</div><div><br></div><div><b>3. Bootstrap</b></div><div><br></div><div><i>ProviderNotFoundException</i>&nbsp;&nbsp; &nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp;cannot find matching provider</div><div>&nbsp;&nbsp; &nbsp;cannot find any provider</div><div><br></div><div><i>ConfigurationException</i></div><div>&nbsp;&nbsp;cannot read XML cong</div><div>&nbsp;&nbsp;more than one XML conf</div><div>&nbsp;&nbsp;no no-arg constructor on classes described by XML</div><div><br></div><div><i>MappingException</i></div><div>&nbsp;&nbsp;cannot read XML mapping</div><div>&nbsp;&nbsp;entity described more than once</div><div>&nbsp;&nbsp;field/getter described more than once</div><div>&nbsp;&nbsp;Wrong class / field &nbsp;/ getter name</div><div>&nbsp;&nbsp;Wrong constraint declaration</div><div>&nbsp;&nbsp;Wrong constraint definition</div><div><br></div><div>&nbsp;&nbsp;</div><div><b>B. EXCEPTION MODEL</b></div><div><br></div><div>We have three approaches:</div><div><br></div><div>1. specialize an exception when the application can do something about it</div><div>In this case all exceptions are&nbsp;<i>ValidationException</i>&nbsp;except&nbsp;<i>ConstraintViolationException</i></div><div><br></div><div>2. specialize exceptions to provide informations to the user</div><div><i>ValidationException</i>&nbsp;(root)</div><div><i>ConstraintViolationException</i></div><div><i>AmbiguousConstraintUsageException</i></div><div><i>UnsupportedTypeException</i></div><div><i>ConstraintDefinitionException</i></div><div><i>ConstraintInitializationException</i></div><div><i><span class="Apple-style-span" style="font-style: normal; "><div><span class="Apple-style-span" style="font-style: italic; ">ConstraintExcecutionException</span></div><div><span class="Apple-style-span" style="font-style: italic; ">ConstraintCreationException</span></div></span></i></div><div><span class="Apple-style-span" style="font-style: italic; ">GroupDefinitionException</span></div><div><span class="Apple-style-span" style="font-style: italic; ">ProviderNotFoundException</span></div><div><span class="Apple-style-span" style="font-style: italic; ">ConfigurationException</span></div><div><span class="Apple-style-span" style="font-style: italic; ">MappingException</span></div><div><i><br></i></div><div>3. a man in the middle approach with some exception collapsing</div><div><br></div><div><div><i>ValidationException</i>&nbsp;(root)</div><div><i>ConstraintViolationException</i></div><div><i>ConstraintDeclarationException (instead of&nbsp;UnsupportedTypeException and&nbsp;AmbiguousConstraintUsageException)</i></div><div><i>ConstraintDefinitionException</i></div><div><span class="Apple-style-span" style="font-style: italic; ">ConstraintExcecutionException</span></div><div><i><span class="Apple-style-span" style="font-style: normal; "><div><span class="Apple-style-span" style="font-style: italic; ">GroupDefinitionException</span></div></span></i></div><div><span class="Apple-style-span" style="font-style: italic; ">ConfigurationException</span></div><div><i><br></i></div><div>&nbsp;&nbsp; &nbsp; &nbsp;</div></div><div>&nbsp;&nbsp; &nbsp;</div><div><br></div></div></body></html>