<div dir="ltr">Answers inline.<br><div class="gmail_extra"><br><div class="gmail_quote">2013/1/30 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">The discussion was thankfully captured in BVAL-332<br>
<br>
&gt; We are agreeing that @ConvertGroup can only be defined when @Valid is defined. This solves the problem of defining @ConvertGroup several times in the class hierarchy and avoid the problem of violating the Liskov substitution principle:<br>

&gt; @Valid can only be defined at the top level for params as per the existing rules<br>
&gt; @Valid can be defined on return values<br>
&gt; We are adding a rule that enforce that @Valid can only be defined once per class hierarchy. This solves again the risk of defining it twice and thus being able to define @ConvertGroup twice which would trigger the Liskov BSOD.<br>

&gt; There is one remaining problem: In case of parallel interfaces defining the same method, the return value can host constraints which means we could define @Valid on both interfaces and thus have parallel @ConvertGroup rules and contradictions. The easy solution is to add a provision rule forbidding to have @ConvertGroup twice in this case.<br>

&gt; If we find a better solution over the week end we can change that<br>
<br>
To me defined in the same class hierarchy means a direct line between a<br>
method and an overridden method because we are precisely talking about<br>
methods and not the whole class. But two methods with the same sig in<br>
parallel interfaces implemented by a class does not seem to fall into<br>
this category.<br></blockquote><div><br></div><div style>Ah, ok, this definition of &quot;class hierarchy&quot; was not apparent to me. I assumed this would also cover the parallel interfaces case. Maybe we should explicitly mention this.</div>
<div style> </div><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">
<br>
    interface Baz1 {<br>
        @Valid<br>
        public Var getBar();<br>
    }<br>
<br>
    class Baz2 {<br>
        @Valid<br>
        public Var getBar();<br>
    }<br>
<br>
    class Baz3 extends Baz2 implements Baz1 {<br>
    }<br>
<br>
I do think this is a valid usage of @Valid but would be dangerous if<br>
compound with @ConvertGroup. That&#39;s why there is this special provision<br>
in 4.4.5<br>
<br>
&gt; Likewise, if a sub type overrides/implements a method originally<br>
&gt; defined in several parallel types of the hierarchy [...] and if that<br>
&gt; method&#39;s return value has been marked for cascading validation in one<br>
&gt; of the parallel types, no group conversion rule may be declared for<br>
&gt; that method&#39;s return value in the parallel types of the hierarchy.<br></blockquote><div> <br></div><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">

So what about your example, clearly it falls into that rule and this<br>
@ConvertGroup is not allowed but is it legal to @Override parallel<br>
methods marked with @Valid. I&#39;m tempted to say yes. Thoughts?<br></blockquote><div><br></div><div>Yes, that makes sense given the above definition of &quot;class hierarchy&quot;.</div><div><br></div><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">

But the crux is that I&#39;m not sure we can call these two parallel methods<br>
to be a single one and thus be defined several times in the class<br>
hierarchy even if it is overridden later in by Foo3.<br>
<br>
Anything I should change in the spec to make that clearer?<br></blockquote><div><br></div><div style>I think it would help to explicitly mention that several &quot;parallel&quot; return value @Valid annotations are legal in the rule in 4.5.5 (&quot;<span style="font-family:arial,sans-serif;font-size:13px">One must not mark a method return value for cascaded validation more than once in a class hierarchy...&quot;).</span></div>
<div style><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div style><span style="font-family:arial,sans-serif;font-size:13px">A related question is what the implications of these rules are for the specification of @Valid on properties (getter methods).</span></div>
<div style><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div style><span style="font-family:arial,sans-serif;font-size:13px">I think in 1.0 it was legal to annotate a super-type and an overriding getter both with @Valid (at least it wasn&#39;t explicitly declared illegal AFAICS), but we would change that in 1.1, at least in the context of method validation. Maybe we should add a note on this, too.</span></div>
<div style><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><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">

<span class=""><font color="#888888"><br>
Emmanuel<br></font></span></blockquote><div><br></div><div style>Thanks,</div><div style><br></div><div style>--Gunnar</div><div style> </div><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">
<span class=""><font color="#888888">
</font></span><div class=""><div class="h5"><br>
On Tue 2013-01-29  9:24, Gunnar Morling wrote:<br>
&gt; Ok, thanks. How is it with specifying @Valid on parallel types:<br>
&gt;<br>
&gt; interface IFoo1 {<br>
&gt;     @Valid<br>
&gt;     public Bar getBar() {}<br>
&gt; }<br>
&gt;<br>
&gt; interface IFoo2 {<br>
&gt;     @Valid<br>
&gt;     public Bar getBar() {}<br>
&gt; }<br>
&gt;<br>
&gt; class FooImpl implements IFoo1, IFoo2 {<br>
&gt;     @Override<br>
&gt;     public Bar getBar() {}<br>
&gt; }<br>
&gt;<br>
&gt; Is this legal? The wording in 4.5.5 seems a bit unclear:<br>
&gt;<br>
&gt; &gt; One must not mark a method return value for cascaded validation more than<br>
&gt; once in a class hierarchy.<br>
&gt;<br>
&gt; This would render the situation above illegal. But then it goes on:<br>
&gt;<br>
&gt; &gt; In other words, sub types (be it sub classes/interfaces or interface<br>
&gt; implementations) cannot mark the return value for cascaded validation if<br>
&gt; the return value has already been marked on a super type or interface.<br>
&gt;<br>
&gt; This describes only the subtype situation, not addressing the situation<br>
&gt; above and thus implying that it is legal. Maybe we just remove the second<br>
&gt; sentence? I think it is also understandable on its own right due to the<br>
&gt; other cases before.<br>
&gt;<br>
&gt; Note that constraint mappings are explicitly forbidden for parallel<br>
&gt; hierarchies in section 4.4.5.<br>
&gt;<br>
&gt; Emmanuel, what was our intention when forbidding to specify @Valid several<br>
&gt; times? Forbidding several occurrences of @ConvertGroup makes sense to me<br>
&gt; due to the LSP, but several @Valid don&#39;t seem problematic to me.<br>
&gt;<br>
&gt; Or was it to &quot;transitively&quot; cover the @ConvertGroup case since we also say<br>
&gt; that @ConvertGroup may only be given where @Valid is specified?<br>
&gt;<br>
&gt; I think it would make sense to either<br>
&gt;<br>
&gt; * Forbid several occurrences of @Valid (subtypes, parallel hierarchies);<br>
&gt; Allow @ConvertGroup only where @Valid is given; Don&#39;t have additional rules<br>
&gt; for @ConvertGroup<br>
&gt;<br>
&gt; OR<br>
&gt;<br>
&gt; * Allow several occurrences of @Valid; Allow @ConvertGroup only where<br>
&gt; @Valid is given; Forbid several occurrences of @ConvertGroup (subtypes,<br>
&gt; parallel hierarchies)<br>
&gt;<br>
&gt; WDYT?<br>
&gt;<br>
&gt; --Gunnar<br>
&gt;<br>
&gt;<br>
&gt; 2013/1/28 Emmanuel Bernard &lt;<a href="mailto:emmanuel@hibernate.org">emmanuel@hibernate.org</a>&gt;<br>
&gt;<br>
&gt; &gt; Yes that was the idea to only offer the first variant as valid. If the<br>
&gt; &gt; spec is too unclear open an issue.<br>
&gt; &gt;<br>
&gt; &gt; On 28 janv. 2013, at 17:51, Gunnar Morling &lt;<a href="mailto:gunnar@hibernate.org">gunnar@hibernate.org</a>&gt; wrote:<br>
&gt; &gt;<br>
&gt; &gt; &gt; Emmanuel, all,<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; I need a short confirmation related to the definition of group<br>
&gt; &gt; conversions for the return value of an overriding method. IIUC, the<br>
&gt; &gt; following is legal:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Class Foo {<br>
&gt; &gt; &gt;     public Bar getBar() {}<br>
&gt; &gt; &gt; }<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Class SubFoo extends Foo {<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;     @Valid<br>
&gt; &gt; &gt;     @ConvertGroup(from=..., to=...)<br>
&gt; &gt; &gt;     @Override<br>
&gt; &gt; &gt;     public Bar getBar() {}<br>
&gt; &gt; &gt; }<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; That is, SubFoo can define a group conversion for the return value as<br>
&gt; &gt; @Valid itself is added in SubFoo only. It would be illegal if @Valid was<br>
&gt; &gt; given in Foo, too.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; I think that makes sense since LSP is not violated by the first variant,<br>
&gt; &gt; while it would in the second (a user of Foo wouldn&#39;t be aware of the<br>
&gt; &gt; applying conversions).<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Right?<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Thanks,<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; --Gunnar<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; _______________________________________________<br>
&gt; &gt; &gt; beanvalidation-dev mailing list<br>
&gt; &gt; &gt; <a href="mailto:beanvalidation-dev@lists.jboss.org">beanvalidation-dev@lists.jboss.org</a><br>
&gt; &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>
&gt; &gt; _______________________________________________<br>
&gt; &gt; beanvalidation-dev mailing list<br>
&gt; &gt; <a href="mailto:beanvalidation-dev@lists.jboss.org">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">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">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></div>