<div dir="ltr">Hi experts,<div><br></div><div>One of the remaining issues on our way to 1.1 is BVAL-336 [1], which is about what to return from Node#getElementDescriptor() for nodes added by the user via the ConstraintViolationBuilder API.</div>
<div><br></div><div style>Note that as per the spec only sub paths can be created by the user, i.e. user added nodes always represent properties but e.g. no methods or parameters. Based on that, it seems right to return the correct PropertyDescriptor in case a user adds a node for an existing property. </div>
<div style><br></div><div style>Things get tricky though when nodes are added for non-existent properties. Emmanuel, Hardy and I identified the following options to address this situation:</div><div style><br></div><div style>
#1 Disallow adding non-existent nodes</div><div style><br></div><div style>In case a user adds a node but no property with that names exist, an exception is thrown. The problem is elegantly avoided that way, but we might break some 1.0 user code (currently the spec is not really clear whether added nodes must exist or not).</div>
<div style><br></div><div style>#2 return null from getElementDescriptor()</div><div style><br></div><div style>When invoking getElementDescriptor() on a Node representing a non-existent property, null could be returned. This seems consistent (there is no element), but causes additional null checking when traversing a path.</div>
<div style><br></div><div style>#3 return a PropertyDescriptor from getElementDescriptor()</div><div style><br></div><div style>Since all user-added nodes represent properties, a PropertyDescriptor could be returned. hasConstraints() would return false, getConstraintDescriptors() the empty set etc. This would allow to handle all nodes and their descriptors uniformly when traversing a path. Question is what to return from PropertyDescriptor#getElementClass(). Options are to return null (signaling that the property is non-existent) or Object.class.</div>
<div style><br></div><div style>#4 return a VirtualDescriptor from getElementDescriptor()</div><div style><br></div><div style>We could create a new Kind, VIRTUAL, and an accompanying type VirtualDescriptor and return an instance of this. Behavior of the methods on the descriptor would be basically the same as in #3; getKind() returning Kind.VIRTUAL would allow for a very explicit checking whether the node exists or not.</div>
<div style><br></div><div style>Any feedback on the options (ideally with arguments pro/con) or other alternatives are highly welcome. As life goes, Emmanuel&#39;s, Hardy&#39;s and my preferences are equally distributed between these options :) </div>
<div style><br></div><div style>Thanks,</div><div style><br></div><div style>--Gunnar</div><div style><br></div><div>[1] <a href="https://hibernate.onjira.com/browse/BVAL-336">https://hibernate.onjira.com/browse/BVAL-336</a></div>
<div><br></div></div>