Hi all,<div><br></div><div>The latest RI version [1] also implements the spec changes regarding the integration of BV and CDI.</div><div><br></div><div>During implementation Hardy, Emmanuel and I got into a discussion regarding the lifecycle of CDI-managed objects [2] which I&#39;d like to continue. </div>
<div><br></div><div>The question is whose responsibility is it to release involved objects such as message interpolator, traversable resolver or constraint validators. Generally we think objects should be released by that party/code that created them.</div>
<div><br></div><div>This means:</div><div><br></div><div>1) objects created by the user and passed via bootstrap API: to be released by user</div><div><div>2) objects created by BV implementation (e.g. internal caches): to be released by BV implementation</div>
</div><div>3) objects passed by CDI integration layer (e.g. CDI-enabled message interpolator etc. based on BootstrapConfiguration): to be released by integration layer</div><div><br></div><div>I think 1) is not in our focus, let the user deal with it. For 2) we have ValidatorFactory#close(). Interesting is 3). A CDI portable extension could make sure that its created managed beans are properly released using CDI&#39;s pre-destroy hook [3].</div>
<div><br></div><div>But that way a CDI-enabled ConstraintValidatorFactory could also easily release all the constraint validators it created:</div><div><br></div><div>CdiConstraintValidatorFactory implements ConstraintValidatorFactory {</div>
<div><br></div><div>  public &lt;T <span class="">extends</span> ConstraintValidator&lt;?, ?&gt;&gt; T getInstance(Class&lt;T&gt; key) {</div><div>    //create validators. keep track of them. </div><div>  }</div><div><br>
</div><div>  @PreDestroy</div><div>  public cleanUpValidators() {</div><div>    //release created validators</div><div>  }</div><div>}</div><div><br></div><div>That is, we&#39;d again adhere to the principle that whoever creates objects has to release them. When following this approach, we actually wouldn&#39;t need ConstraintValidatorFactory#releaseInstance() anymore. I think this would be a good thing as it IMO simplifies the contract between the BV provider and code integrating with it (such as a CDI portable extension) and clarifies responsibilities.</div>
<div><br></div><div>In the spec we would describe that a CDI-enabled CVF has to release its validators when it itself is going to be destructed and for ValidatorFactory#close(), that a BV provider has to release its internal state but no objects passed to it.</div>
<div><br></div><div>One thing not possible with that approach is to release CV instances before the application is shut down. The spec currently says that releaseInstance() is &quot;typically&quot; invoked when the ValidatorFactory is closed, but AFAICS it leaves room for releasing constraint validators also in between. OTOH I wouldn&#39;t know when/how a BV provider would decide to do that.</div>
<div><br></div><div>Any thoughts?</div><div><br></div><div>--Gunnar</div><div><br></div><div>[1] <a href="http://in.relation.to/Bloggers/HibernateValidator500Alpha2And431Final">http://in.relation.to/Bloggers/HibernateValidator500Alpha2And431Final</a></div>
<div>[2] <a href="https://hibernate.onjira.com/browse/BVAL-338">https://hibernate.onjira.com/browse/BVAL-338</a></div><div>[3] <a href="http://docs.oracle.com/javaee/6/tutorial/doc/gmgkd.html">http://docs.oracle.com/javaee/6/tutorial/doc/gmgkd.html</a></div>