Alternative Version implementation

David M. Lloyd david.lloyd at redhat.com
Wed Mar 23 14:20:26 UTC 2016


I've gone ahead and written a new Version implementation that implements 
the rules I've described.  It seems to work OK though I am having a hard 
time running all tests locally due to some environmental problem that 
I'm still working on, so I don't have a webrev yet.  But I do have a 
diff that can be examined (and commented upon) at [1].

The features of this implementation are:

* Defines a single, unified version syntax and collation order without 
defining a versioning policy
* Internally only contains one field, a String, which should provide a 
minimal memory footprint compared to the multiple List approach
* Can be iterated piece-wise using a public Version.Iterator class (also 
lightweight), which allows user-defined validation via e.g. 
Predicate<Version> to be easily implemented
* Internal validation and collation logic uses a simple objectless 
iteration (tokenizer-based) system by way of "cookie" values that 
represent iteration state, which are reused by the aforementioned 
Iterator class
* A bit more Unicode-friendly, as iteration operates on a code point 
basis rather than on a character basis

The unresolved issues of this implementation are:

* It was my intention to apply Unicode normalization to the input 
String, however the Version class is required to be used at an earlier 
stage than Normalizer can be used so there's a bootstrap-related NPE if 
that code is enabled
* There is no hook to provide a layer-specific validation policy; 
Configuration seems to be the logical place for this but it's not clear 
how it can be hooked in to the resolution process because of the tight 
coupling between Configurations and resolution... resolving 
#ModuleNameCharacters will probably provide an answer to this as well
* Needs additional dedicated tests (all testing thus far has been manual)
* Need to review/examine/discuss the collation rules (particularly 
around separators), which I mainly just pulled out of my hat, to 
determine what makes the most sense from a first-use perspective as well 
as a compatibility perspective (OSGi, Maven, packaging systems etc.)

I will follow up with a webrev at some point in the future unless anyone 
wants to discuss or possibly reject this approach.  Rémi has already 
pointed out that a plain version String is possibly the simplest/best 
approach; I think part of this discussion must revolve around whether 
unifying on a version system is desirable.  My position is that there is 
value to be gained by unification (particularly around a common 
collation scheme), but the compatibility path may be a tricky one.

[1] https://github.com/dmlloyd/openjdk-modules/compare/jigsaw/jake...version
-- 
- DML


More information about the jpms-spec-experts mailing list