You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/01/23 10:43:29 UTC
[isis] branch master updated: ISIS-2492: adds support for
object-assoc. inheritance
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new 1d169ee ISIS-2492: adds support for object-assoc. inheritance
1d169ee is described below
commit 1d169eebbec11adf3d9afd87562689e9d0471f94
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Jan 23 11:43:16 2021 +0100
ISIS-2492: adds support for object-assoc. inheritance
yet we've only extended the meta-model API, which is not yet used
anywhere internally
---
.../spec/feature/ObjectAssociationContainer.java | 18 ++++++++++++++++
.../specimpl/ObjectSpecificationAbstract.java | 24 ++++++++++++++++++++++
.../testspec/ObjectSpecificationStub.java | 6 ++++++
.../DomainModelTest_usingGoodDomain.java | 8 ++------
4 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
index 2b6d5de..91700f7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
@@ -26,6 +26,24 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
import org.apache.isis.core.metamodel.spec.ObjectSpecificationException;
public interface ObjectAssociationContainer {
+
+ // -- ASSOCIATION LOOKUP, PROPERTIES/COLLECTIONS (INHERITENCE CONSIDERED)
+
+ /**
+ * Same as {@link #getAssociation(String)}, but also considering any inherited object members.
+ * @param id
+ *
+ * @implSpec If not found on the current 'type' search for the 'nearest' match in super-types,
+ * and if nothing found there, search the interfaces.
+ */
+ Optional<ObjectAssociation> findAssociation(String id);
+
+ default ObjectAssociation findAssociationElseFail(String id) {
+ return findAssociation(id)
+ .orElseThrow(()->_Exceptions.noSuchElement("id=%s", id));
+ }
+
+ // -- ASSOCIATION LOOKUP, DECLARED PROPERTIES/COLLECTIONS (NO INHERITENCE CONSIDERED)
/**
* Get the field object representing the field with the specified field
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 0767296..fdedbd0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -711,6 +711,30 @@ implements ObjectSpecification {
return Optional.empty();
}
+ @Override
+ public Optional<ObjectAssociation> findAssociation(String id) {
+
+ if(isTypeHierarchyRoot()) {
+ return Optional.empty(); // stop search as we reached the Object class, which does not contribute actions
+ }
+
+ val declaredAction = getAssociation(id); // no inheritance nor type considered
+
+ if(declaredAction.isPresent()) {
+ return declaredAction;
+ }
+
+ if(superclass()==null) {
+ // guard against unexpected reach of type hierarchy root
+ return Optional.empty();
+ }
+
+ return superclass().findAssociation(id);
+
+ //XXX future extensions should also search the interfaces,
+ // but avoid doing redundant work when walking the type-hierarchy;
+ // (this elegant recursive solution will then need some tweaks to be efficient)
+ }
/**
* The association with the given {@link ObjectAssociation#getId() id}.
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index 809578f..618252c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -357,5 +357,11 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
// poorly implemented, inheritance not supported
return getObjectAction(id, type);
}
+
+ @Override
+ public Optional<ObjectAssociation> findAssociation(String id) {
+ // poorly implemented, inheritance not supported
+ return getAssociation(id);
+ }
}
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
index 5c5d8a8..9ae0ad6 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
@@ -183,22 +183,19 @@ class DomainModelTest_usingGoodDomain {
val holderSpec = specificationLoader.loadSpecification(ProperMemberInheritance.class,
IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
- //TODO we need to synthesize any inherited members on the subclass instead
- val holderSpec_super = holderSpec.superclass();
-
val super_action = holderSpec.findObjectActionElseFail("sampleAction");
assertNotNull(super_action);
assertEquals("sampleAction", super_action.getId());
assertEquals("foo", super_action.getName());
assertEquals("bar", super_action.getDescription());
- val super_property = holderSpec_super.getAssociationElseFail("sampleProperty");
+ val super_property = holderSpec.findAssociationElseFail("sampleProperty");
assertNotNull(super_property);
assertEquals("sampleProperty", super_property.getId());
assertEquals("foo", super_property.getName());
assertEquals("bar", super_property.getDescription());
- val super_collection = holderSpec_super.getAssociationElseFail("sampleCollection");
+ val super_collection = holderSpec.findAssociationElseFail("sampleCollection");
assertNotNull(super_collection);
assertEquals("sampleCollection", super_collection.getId());
assertEquals("foo", super_collection.getName());
@@ -206,7 +203,6 @@ class DomainModelTest_usingGoodDomain {
}
-
// -- HELPER
private void assertHasPublishedActionFacet(FacetHolder facetHolder) {