[bv-dev] Node#getElementDescriptor() for user-created nodes

Emmanuel Bernard emmanuel at hibernate.org
Sat Feb 16 08:13:56 EST 2013


Despite our efforts to make it work, we realized that
Node.getElementDescriptor was causing too much trouble. 

So we did fall back to the parallel node hierarchy solution. It creates
a bit of duplication but that turns out nice.

We now have a node type for each element descriptor. And  Node has a
narrowing method to access node speicifc data like parameter index.
As a consequence we did remove ElementDescriptor's getKind method and
narrowing method as it was of no use anymore AFA we know.

We did release a new beta version of the draft
http://beanvalidation.org/news/2013/02/15/bean-validation-1-1-beta4/

The CR1 aka proposed final draft is still due Feb 20th.

Emmanuel

On Sun 2013-02-10 11:57, Hardy Ferentschik wrote:
> +1 for option  #1. I never likes the fact that you could add arbitrary nodes (even though I have seen code doing it).
> 
> If we not go for #1, I prefer #2 - null from getElementDescriptor(). I don't see the point intruding another virtual descriptor 
> where not all methods are clearly defined or need to be defined with constructed values. In this case I prefer to return null
> directly which of course means that there is one more null check if you are going to use this API. On the other hand, I don't
> see this API used much by actual end users. It is probably more important for integrators of BV. In this case an additional null
> check is acceptable imo.
> 
> --Hardy 
> 
> 
> On 9 Jan 2013, at 3:01 PM, Sebastian Thomschke <sebastian.thomschke at web.de> wrote:
> 
> > I agree with Gunnar. I'm for option #1 as well.
> > 
> > seb
> > 
> > On 09.02.2013 12:12, Gunnar Morling wrote:
> >> My personal preference would be #1 as well.
> >> 
> >> The docs don't say that non-existent nodes are allowed, so IMO it's ok to clarify now that it is not allowed. If code relied on adding non-existent nodes, it relied on behavior not guaranteed explicitly by the spec.
> >> 
> >> --Gunnar
> >> 
> >> 
> >> 
> >> 2013/2/8 Emmanuel Bernard <emmanuel at hibernate.org>
> >> I had the same reserve as you but then reading the JavaDoc made me
> >> realize that the doc mentions properties so it is technically not as
> >> vague as I initially thought.
> >> 
> >> Emmanuel
> >> 
> >> On Fri 2013-02-08 11:48, Matt Benson wrote:
> >> > Personally my reason for eschewing option #1 is the possibility of breaking
> >> > existing code.
> >> >
> >> > Matt
> >> >
> >> >
> >> > On Fri, Feb 8, 2013 at 11:22 AM, Emmanuel Bernard <emmanuel at hibernate.org>wrote:
> >> >
> >> > > At this time of day I do tend to like option #1 (ie making virtual nodes
> >> > > illegal). Otherwise my preferred option is #4
> >> > > (VirtualElementDescriptor).
> >> > >
> >> > > Out of curiosity for people not preferring option #1. What use case do
> >> > > you see in having virtual nodes?
> >> > >
> >> > > Emmanuel
> >> > >
> >> > > On Fri 2013-02-08 11:08, Matt Benson wrote:
> >> > > > Hmm, a third option for the elementClass of such a descriptor might be
> >> > > > Void.class.
> >> > > >
> >> > > > I prefer option #3, followed by #4.
> >> > > >
> >> > > > Matt
> >> > > >
> >> > > >
> >> > > > On Fri, Feb 8, 2013 at 5:17 AM, Gunnar Morling <gunnar at hibernate.org>
> >> > > wrote:
> >> > > >
> >> > > > > Hi experts,
> >> > > > >
> >> > > > > 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.
> >> > > > >
> >> > > > > 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.
> >> > > > >
> >> > > > > Things get tricky though when nodes are added for non-existent
> >> > > properties.
> >> > > > > Emmanuel, Hardy and I identified the following options to address this
> >> > > > > situation:
> >> > > > >
> >> > > > > #1 Disallow adding non-existent nodes
> >> > > > >
> >> > > > > 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).
> >> > > > >
> >> > > > > #2 return null from getElementDescriptor()
> >> > > > >
> >> > > > > 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.
> >> > > > >
> >> > > > > #3 return a PropertyDescriptor from getElementDescriptor()
> >> > > > >
> >> > > > > 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.
> >> > > > >
> >> > > > > #4 return a VirtualDescriptor from getElementDescriptor()
> >> > > > >
> >> > > > > 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.
> >> > > > >
> >> > > > > Any feedback on the options (ideally with arguments pro/con) or other
> >> > > > > alternatives are highly welcome. As life goes, Emmanuel's, Hardy's and
> >> > > my
> >> > > > > preferences are equally distributed between these options :)
> >> > > > >
> >> > > > > Thanks,
> >> > > > >
> >> > > > > --Gunnar
> >> > > > >
> >> > > > > [1] https://hibernate.onjira.com/browse/BVAL-336
> >> > > > >
> >> > > > >
> > 
> > _______________________________________________
> > beanvalidation-dev mailing list
> > beanvalidation-dev at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/beanvalidation-dev
> 
> 
> _______________________________________________
> beanvalidation-dev mailing list
> beanvalidation-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/beanvalidation-dev


More information about the beanvalidation-dev mailing list