[ https://issues.apache.org/jira/browse/ISIS-1897?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andi Huber resolved ISIS-1897. ------------------------------ Resolution: Resolved Functionality implemented. Legacy JUnit Tests do pass. However I did not implement any new tests. > applib: the new ObjectContracts needs backward compatibility > ------------------------------------------------------------ > > Key: ISIS-1897 > URL: https://issues.apache.org/jira/browse/ISIS-1897 > Project: Isis > Issue Type: Improvement > Components: Core > Reporter: Andi Huber > Assignee: Andi Huber > Priority: Major > Fix For: 2.0.0-M1 > > > ObjectContracts seems to be heavily used with the incode platform. > To ease migration, I've provided functional backward compatibility. > However the old methods are now marked for deprecation! > > > ---- > Isis until 1.16. uses reflection on every of these 4 calls ... > {code:java} > public class ApplicationPermission implements > Comparable<ApplicationPermission> { > ... > private final static String propertyNames = "role, featureType, > featureFqn, mode"; > @Override > public int compareTo(final ApplicationPermission other) { > return ObjectContracts.compare(this, other, propertyNames); > } > @Override > public boolean equals(final Object obj) { > return ObjectContracts.equals(this, obj, propertyNames); > } > @Override > public int hashCode() { > return ObjectContracts.hashCode(this, propertyNames); > } > @Override > public String toString() { > return ObjectContracts.toString(this, propertyNames); > } > > ... > > } > {code} > ---- > Isis since 2.0.0 provides an optimized variant now: reflection is used only > once at class initialization ... > {code:java} > public class ApplicationPermission implements > Comparable<ApplicationPermission> { > ... > private final static String propertyNames = "role, featureType, > featureFqn, mode"; > > private final static ObjectContract<ApplicationPermission> contract > = ObjectContracts.parse(ApplicationPermission.class, propertyNames); > @Override > public int compareTo(final ApplicationPermission other) { > return contract.compare(this, other); > } > @Override > public boolean equals(final Object other) { > return contract.equals(this, other); > } > @Override > public int hashCode() { > return contract.hashCode(this); > } > @Override > public String toString() { > return contract.toString(this); > } > > ... > > } > {code} > ---- > However the *recommended* way to use 'object contracts' now is to no longer > resort to reflection. > Parsing as shown above can be replaced by static method handles to enforce > that properties actually exist (at compile-time) > {code:java} > private final static ObjectContract<ApplicationPermission> contract = > ObjectContracts.contract(ApplicationPermission.class) > .thenUse("role", ApplicationPermission::getRole) > .thenUse("featureType", ApplicationPermission::getFeatureType) > .thenUse("featureFqn", ApplicationPermission::getFeatureFqn) > .thenUse("mode", ApplicationPermission::getMode); > {code} > If different then natural order comparators are needed then resort to Java's > Comparator composition ... > {code:java} > private final static ObjectContract<ApplicationPermission> contract = > ObjectContracts.contract(ApplicationPermission.class) > .thenUse("role", ApplicationPermission::getRole, > Comparator.naturalOrder()) > .thenUse("featureType", ApplicationPermission::getFeatureType, > Comparator.reverseOrder()) > .thenUse("featureFqn", ApplicationPermission::getFeatureFqn, > Comparator.nullsFirst(Comparator.naturalOrder())) > .thenUse("mode", ApplicationPermission::getMode, > Comparator.nullsLast(Comparator.naturalOrder())); > {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)