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) {