&gt; <span style="font-family:arial,sans-serif;font-size:12.727272033691406px">- relaxing NodeBuilderDefinedContext and adding the new contract on it</span><div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br>

</span></div><div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">I wouldn&#39;t really like that as it reduces safety of the AP</span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">I.</span></div>

<div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">&gt; </span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">- an explicit new method deprecating addNode</span></div>

<div><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></span></div><div><font face="arial, sans-serif">Related to this is </font><span style="font-family:arial,sans-serif">BVAL-336 [1]. We&#39;ve added Node#getDescriptor(), so the question is what should that return for nodes created by the user via the node builder API?</span></div>
<div><span style="font-family:arial,sans-serif"><br></span></div><div><span style="font-family:arial,sans-serif">We could have a new method</span></div><div><span style="font-family:arial,sans-serif"><br></span></div><div>
<span style="font-family:arial,sans-serif">addNode(String name, ElementDescriptor descriptor) or even </span></div><div><span style="font-family:arial,sans-serif">addNode(ElementDescriptor descriptor)</span></div><div><span style="font-family:arial,sans-serif"><br>
</span></div><div><span style="font-family:arial,sans-serif">Leaves the question where does the user get the descriptor from? One way could be to provide access to BeanDescriptor via </span>ConstraintValidatorContext. For nodes added via the deprecated method getDescriptor() we would likely have to return null.</div>
<div><br></div><div>--Gunnar</div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">[1] <a href="https://hibernate.onjira.com/browse/BVAL-336">https://hibernate.onjira.com/browse/BVAL-336</a></font></div>
<div class="gmail_extra">
<br><br><div class="gmail_quote">2012/11/23 Emmanuel Bernard <span dir="ltr">&lt;<a href="mailto:emmanuel@hibernate.org" target="_blank">emmanuel@hibernate.org</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

I guess you always learn something new every day :)<br>
This is indeed only working if we use interception types.<br>
<br>
The question is do we want to do that or lean towards one of the<br>
alternative methods:<br>
<br>
- an explicit new method deprecating addNode<br>
- relaxing NodeBuilderDefinedContext and adding the new contract on it<br>
<span><font color="#888888"><br>
Emmanuel<br>
</font></span><div><div><br>
On Fri 2012-11-23 12:57, Gunnar Morling wrote:<br>
&gt; Hi,<br>
&gt;<br>
&gt; &gt; Another approach would be to make NodeBuilderCustomizableContext a sub<br>
&gt; insterface of NodeBuilderDefinedContext.<br>
&gt;<br>
&gt; I think changing the return type of ConstraintViolationBuilder#addNode()<br>
&gt; to NodeBuilderCustomizableContext is a problem.<br>
&gt;<br>
&gt; While that change is source compatible (code using addNode() can be<br>
&gt; compiled against the new API version without having to be adapted) it is<br>
&gt; not binary compatible. That is, code compiled against the previous version<br>
&gt; will fail at runtime:<br>
&gt;<br>
&gt; java.lang.NoSuchMethodError:<br>
&gt; javax.validation.ConstraintValidatorContext$ConstraintViolationBuilder.addNode(Ljava/lang/String;)Ljavax/validation/ConstraintValidatorContext$ConstraintViolationBuilder$NodeBuilderDefinedContext;<br>
&gt;<br>
&gt; This error occurs, no matter wether the result of addNode() is assigned to<br>
&gt; a variable or not.<br>
&gt;<br>
&gt; What we might try to do is to return an intersection type from<br>
&gt; ConstraintViolationBuilder#addNode() like this:<br>
&gt;<br>
&gt; interface ConstraintViolationBuilder {<br>
&gt;<br>
&gt;     &lt;T extends NodeBuilderDefinedContext &amp; NodeBuilderCustomizableContext&gt;<br>
&gt; T addNode(String name);<br>
&gt;<br>
&gt;     ConstraintValidatorContext addConstraintViolation();<br>
&gt; }<br>
&gt;<br>
&gt; This is source compatible and AFAICS it&#39;s also binary compatible because<br>
&gt; the erasure of T is its leftmost bound, that is NodeBuilderDefinedContext.<br>
&gt; That way code compiled against the old API can still dispatch the addNode()<br>
&gt; method, while code written against the new version can invoke all methods<br>
&gt; defined on NodeBuilderDefinedContext and NodeBuilderCustomizableContext.<br>
&gt;<br>
&gt; Btw. I stumbled upon [1] which gives a very good overview on the<br>
&gt; compatibility of all sorts of API changes.<br>
&gt;<br>
&gt; --Gunnar<br>
&gt;<br>
&gt; [1]<br>
&gt; <a href="http://wiki.eclipse.org/Evolving_Java-based_APIs_2#Evolving_API_Interfaces" target="_blank">http://wiki.eclipse.org/Evolving_Java-based_APIs_2#Evolving_API_Interfaces</a><br>
&gt;<br>
&gt;<br>
&gt; 2012/11/22 Emmanuel Bernard &lt;<a href="mailto:emmanuel@hibernate.org" target="_blank">emmanuel@hibernate.org</a>&gt;<br>
&gt;<br>
&gt; &gt; Unless anyone has concern, I plan to go for option 3 on<br>
&gt; &gt; <a href="http://beanvalidation.org/proposals/BVAL-221/" target="_blank">http://beanvalidation.org/proposals/BVAL-221/</a><br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; beanvalidation-dev mailing list<br>
&gt; &gt; <a href="mailto:beanvalidation-dev@lists.jboss.org" target="_blank">beanvalidation-dev@lists.jboss.org</a><br>
&gt; &gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/beanvalidation-dev</a><br>
&gt; &gt;<br>
<br>
&gt; _______________________________________________<br>
&gt; beanvalidation-dev mailing list<br>
&gt; <a href="mailto:beanvalidation-dev@lists.jboss.org" target="_blank">beanvalidation-dev@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/beanvalidation-dev</a><br>
<br>
_______________________________________________<br>
beanvalidation-dev mailing list<br>
<a href="mailto:beanvalidation-dev@lists.jboss.org" target="_blank">beanvalidation-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/beanvalidation-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/beanvalidation-dev</a><br>
</div></div></blockquote></div><br></div>