Implementation of [enhanced property 
metadata](https://gist.github.com/mstr2/2fec0303fc440b8eaeb126befc76eb5c).

### New API
This PR includes the following API additions:

1. `ReadOnlyProperty.getDeclaringClass()` and its default implementation.
2. The `javafx.beans.property.AttachedProperty` interface.
3. New constructors for all `Simple<*>Property` and `ReadOnly<*>Wrapper` 
classes, accepting the declaring class of the property.

The declaring class is stored in a new field in the `Simple<*>Property` 
classes. If a legacy constructor is used that doesn't specify the declaring 
class, the `ReadOnlyProperty.getDeclaringClass()` default implementation is 
called the first time the `Simple<*>Property.getDeclaringClass()` method is 
called, and its result is stored for future retrieval.

### Testing
For testing, this PR also includes the 
`test.util.property.PropertyMetadataVerifier` tool. It systematically tests all 
public and protected properties of a class, and ensures conformance to the 
following rules:
* `ReadOnlyProperty.getBean()` returns the object instance of the enclosing 
class, or the target object instance if the property is an attached property.
*  `ReadOnlyProperty.getName()` returns the name of the property, which must 
correspond to the name of the property getter (excluding the word "Property").
* `ReadOnlyProperty.getDeclaringClass()` returns the enclosing class of the 
property getter.
* The declaring class of a `Simple<*>Property` or `ReadOnly<*>Wrapper` must be 
specified in the constructor, not resolved at runtime.
* `getBean()`, `getName()`, and `getDeclaringClass()` must not be overridden in 
subclasses of `Simple<*>Property` or `ReadOnly<*>Wrapper`.
* An instance property does not implement `AttachedProperty`.
* An instance property has a parameterless property getter.
* An attached property implements `AttachedProperty`.
* An attached property has a static single-argument property getter that 
accepts the target object.
* `AttachedProperty.getTargetClass()` returns the class of the single parameter 
of the static property getter.
* A property getter does not return an instance of `ReadOnly<*>Wrapper`, it 
returns the result of calling `ReadOnly<*>Wrapper.getReadOnlyProperty()`.

Many properties in existing JavaFX classes violate the 
`PropertyMetadataVerifier` rules in some way or shape. This PR won't address 
these issues, this will be done in a future cleanup PR.

-------------

Commit messages:
 - doc
 - Enhanced property metadata

Changes: https://git.openjdk.org/jfx/pull/2015/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=2015&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8375588
  Stats: 1804 lines in 28 files changed: 1757 ins; 6 del; 41 mod
  Patch: https://git.openjdk.org/jfx/pull/2015.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/2015/head:pull/2015

PR: https://git.openjdk.org/jfx/pull/2015

Reply via email to