[hibernate-dev] [BV] Path, string or object model

Emmanuel Bernard emmanuel at hibernate.org
Wed Jun 17 14:58:29 EDT 2009


Please review and comment.

Begin forwarded message:

> From: Emmanuel Bernard <emmanuel.bernard at jboss.com>
> Date:  June 17, 2009 14:41:03  EDT
> To:
> Subject: Re: Path, string or object model
>
> Here is the solution I cooked. I think it's acceptable but add some  
> complexity in the ConstraintValidatorContext API (see other email).  
> Please review (pay special attention to the examples).
>
> A Path represents the path and is the one accepted by the path  
> consuming APIs. A Path is an Iterable of Nodes.
>
> /**
>  * Represent a navigation path from an object to another.
>  * Each path element is represented by a Node.
>  *
>  * The path corresponds to the succession of nodes
>  * in the order they are retured by the Iterator
>  *
>  * @author Emmanuel Bernard
>  */
> public interface Path extends Iterable<Node> {
> }
>
>
> A node represent a path element.
>
> /**
>  * Represents an element of a navigation path
>  *
>  * @author Emmanuel Bernard
>  */
> public interface Node {
> 	/**
> 	 * Property name the node represents
> 	 * or null if the leaf node and representing an entity
> 	 * (in particular the node representing the root object
> 	 * has its name null)
> 	 */
> 	String getName();
>
> 	/**
> 	 * True if the node represents an object contained in an Iterable
> 	 * or in a Map.
> 	 */
> 	boolean isInIterable();
>
> 	/**
> 	 * The index the node is placed in if contained
> 	 * in an array or List. Null otherwise.
> 	 */
> 	Integer getIndex();
>
> 	/**
> 	 * The key the node is placed in if contained
> 	 * in a Map. Null otherwise.
> 	 */
> 	Object getKey();
> }
>
> A few interesting points:
>  - the index / key is hosted by the node after the collection node
>
> Here are a few examples and their Node equivalent
>
> ""
> 0: Node(name:null, isInIterable:false, index:null, key:null)
>
> "email"
> 0: Node(name:email, isInIterable:false, index:null, key:null)
>
> "addresses"
> 0: Node(name:addresses, isInIterable:false, index:null, key:null)
>
> "addresses["home"]" represent the bean level of an Address object
> 0: Node(name:addresses, isInIterable:false, index:null, key:null)
> 1: Node(name:null, isInIterable:true, index:null, key:home)
>
> "addresses["home"].city"
> 0: Node(name:addresses, isInIterable:false, index:null, key:null)
> 1: Node(name:city, isInIterable:true, index:null, key:home)
>
> "billingAddresses[3].country.name"
> 0: Node(name:billingAddresses, isInIterable:false, index:null,  
> key:null)
> 1: Node(name:country, isInIterable:true, index:3, key:null)
> 2: Node(name:name, isInIterable:false, index:null, key:null)
>
>
> ConstraintViolation renders a Path
>
> public interface ConstraintViolation<T> {
>     Path getPropertyPath();
> }
>
> TraversableResolver accepts a path
>
> public interface TraversableResolver {
> 	boolean isReachable(Object traversableObject,
> 						  String traversableProperty,
> 						  Class<?> rootBeanType,
> 						  Path pathToTraversableObject,
> 						  ElementType elementType);
>     ...
> }
>
> PS: should String traversableProperty be Node traversableProperty ?
>
>
> On  May 27, 2009, at 12:19, Emmanuel Bernard wrote:
>
>> In several areas we do describe path:
>>  - ConstraintViolation
>>  - ConstraintValidatorContext (with addError(String, String) which  
>> allows to concatenate substrings
>>
>> So far we use the notion of string to represent it
>>  - address.name
>>  - cards[3].color
>>  - addresses["home"].city
>>
>> I have added the idea of using [] for simple Iterable objects (ie  
>> non indexed, like a Set)
>>  - accounts[].balance
>>
>> Anybody objects to that?
>>
>> Second point
>> Do we want to replace this String approach with a path object mode?
>>
>> http://opensource.atlassian.com/projects/hibernate/browse/BVAL-143
>> ______
>> path are today strings with dot separating properties. But it break  
>> when Set or Iterable are used.
>> We could replace that with
>> --- First strawman, must evolve --
>> class PathElement {
>>   String getName();
>>   PathElement getParentPath();
>>   boolean isIterable();
>>   boolean isIndexed();
>>   Object getIndex();
>>   //TODO int getIndex()?
>>
>>   // not happy about that as it is only useful for  
>> Constraintciolation
>>   PathElement getChild();
>> }
>>
>> PathElement would be used for Constraintvuilation, maybe CVContext  
>> etc
>>
>> can this be refactored using inheritance + generics to have an  
>> IndexedPathElement only when it matters (probably no unfortunately)
>> ______
>>
>>
>> Pros:
>>  - less string manipulation by the user and the TraversableResolver  
>> implementation
>>  - the map index no longer rely on "[" + toString() + "]" and is  
>> likely more easily handled
>>
>> Cons:
>>  - ConstraintValidatorContext becomes more complex as it needs to  
>> expose some kind of path element builder.
>>  - we would like need to standardize some kind of String  
>> serialization anyway
>>  - I don't see Pros as huge advantages
>>
>> WDYT?
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/hibernate-dev/attachments/20090617/73aae062/attachment.html 


More information about the hibernate-dev mailing list