After more brainstorming with Denis and Thomas here's some updated information about
what we'd like to do:
* Make EntityReference immutable (ie remove the set* methods) - it's a best practice
since it reduces potential mistakes (you pass a reference to some code and then somewhere
else you call setXXX())
* Remove the clone() method (since it's less needed when the object is immutable and
it's hard to implement in a generic way for generic parameters)
* Have equals(), toString(), hashCode(), compareTo() all act on all EntityReference class
fields (ie including the parameters)
* Modify or add a new EntityReferenceResolver that will fill the parameters when
they're missing. Of course the resolver will only know how to handle some parameters
(Version and Locale ATM).
* We thought that the safest way was to add the get/setLocale() and get/setVersion methods
in DocumentReference for now (as helper methods to the generic add/getParameter methods in
EntityReference. This is because the new model hasn't been voted yet and thus
we're not yet sure that all Entities will support Version/Locale
Note that this will break backward compatibility in EntityReference but we think we need
to do this ASAP.
Let us know if you think there's a problem.
Thanks
-Vincent
On Sep 15, 2011, at 4:35 PM, Vincent Massol wrote:
Hi devs,
After much brainstorming with Thomas and with the implementation of the new model I'm
doing, we've come to the conclusion that it would be better to add the notions of
Locale and Version in EntityReference.
The main reasons are:
* otherwise we need to introduce a notion of UniqueEntityReference in the model and it
makes it very awkward at an API level (user need to constuct a UniqueEntityReference from
an EntityReference depending on the APIs used)
* it makes APIs more complex than what they could be.
For example:
- getDocument(EntityReference)
- getDocument(EntityReference, Locale)
- getDocument(EntityReference, Version)
- getDocument(EntityReference, Locale, Version)
vs
- getDocument(EntityReference)
(subnote: this is why I introduced UniqueEntityReference in the model)
* It'll mean that anywhere we use an entity reference we'll be able to reference
a specific version of that entity and/or a specific language. Some example: including a
specific version of a page, referencing a specific version of an attachment in wiki
syntax, etc.
In a first version I'd like to only introduce a generic get/setAttributes (to allow
extensibility) in EntityReference + get/setLocale/Version (for easiness of access).
ATM I'm not planning to define a textual syntax for attributes (but it could
something like: wiki:space.page[name1=value1, … nameN=valueN]). I'm not asking to vote
on this.
Here's my +1
Thanks
-Vincent