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/11/30 07:35:45 UTC

[isis] branch master updated: ISIS-2904: make ObjectAssociationContainer API more explicit, as to whether to include mixed in assoz.

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 201bae2  ISIS-2904: make ObjectAssociationContainer API more explicit, as to whether to include mixed in assoz.
201bae2 is described below

commit 201bae2e3b4b3733fff3f5f09aa510e54f652547
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Nov 30 08:20:41 2021 +0100

    ISIS-2904: make ObjectAssociationContainer API more explicit, as to
    whether to include mixed in assoz.
---
 .../interactions/managed/ManagedMember.java        |  6 +--
 .../isis/core/metamodel/spec/ManagedObjects.java   | 12 ++++-
 .../core/metamodel/spec/ObjectSpecification.java   |  2 -
 .../spec/feature/ObjectAssociationContainer.java   | 55 ++++++++++++++--------
 .../specloader/specimpl/ObjectMemberContainer.java | 12 ++---
 .../specimpl/ObjectSpecificationAbstract.java      |  8 ++--
 .../testspec/ObjectSpecificationStub.java          |  8 ++--
 .../interaction/prop/PropertyInteractionWkt.java   |  5 +-
 8 files changed, 65 insertions(+), 43 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
index ec2364b..e69e381 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
@@ -50,12 +50,10 @@ implements ManagedFeature {
     @RequiredArgsConstructor
     public static enum MemberType {
         PROPERTY(OneToOneAssociation.class, (spec, propertyId)->
-            spec.getAssociation(propertyId)
-            .map(property->property.isOneToOneAssociation()?property:null)),
+            spec.getProperty(propertyId)),
 
         COLLECTION(OneToManyAssociation.class, (spec, collectionId)->
-            spec.getAssociation(collectionId)
-            .map(collection->collection.isOneToManyAssociation()?collection:null)),
+            spec.getCollection(collectionId)),
 
         ACTION(ObjectAction.class, (spec, actionId)->
             spec.getAction(actionId));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
index 885146b..e30f532 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
@@ -337,6 +337,7 @@ public final class ManagedObjects {
 
         return _NullSafe.streamAutodetect(collectionOrArray)
         .map(pojo->ManagedObject.of(elementSpec, pojo)) // pojo is nullable here
+//TODO cannot reattach if id is not memoized
         .map(ManagedObjects.EntityUtil::reattach)
         .filter(ManagedObjects.VisibilityUtil.filterOn(interactionInitiatedBy))
         .collect(Can.toCan());
@@ -635,7 +636,16 @@ public final class ManagedObjects {
                         + "otherwise cannot re-attach",
                         spec.getLogicalTypeName());
                 log.error(msg); // in case exception gets swallowed
-                throw _Exceptions.illegalState(msg);
+                //throw _Exceptions.illegalState(msg);
+
+                val entityFacet = spec.getFacet(EntityFacet.class);
+
+                entityFacet.persist(spec, managedObject.getPojo());
+
+                _Assert.assertTrue(
+                        entityFacet.getEntityState(managedObject.getPojo()).isAttached());
+                managedObject.getBookmark();
+                return managedObject;
             }
 
             val objectManager = managedObject.getObjectManager();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index 411036d..b62198e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -586,6 +586,4 @@ extends
                         objFeature.getFeatureIdentifier()));
     }
 
-
-
 }
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 30d907f..e916ace 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
@@ -31,41 +31,56 @@ public interface ObjectAssociationContainer {
     // -- ASSOCIATION LOOKUP, PROPERTIES/COLLECTIONS (INHERITANCE CONSIDERED)
 
     /**
-     * Same as {@link #getDeclaredAssociation(String)}, but also considering any inherited object members.
-     * @param id
+     * Similar to {@link #getDeclaredAssociation(String, MixedIn)},
+     * but also considering any inherited object members.
      *
      * @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> getAssociation(String id);
+    Optional<ObjectAssociation> getAssociation(String id, MixedIn mixedIn);
 
-    default ObjectAssociation getAssociationElseFail(final String id) {
-        return getAssociation(id)
+    default ObjectAssociation getAssociationElseFail(final String id, final MixedIn mixedIn) {
+        return getAssociation(id, mixedIn)
                 .orElseThrow(()->_Exceptions.noSuchElement("id=%s", id));
     }
 
-    default Optional<OneToOneAssociation> getProperty(final String id) {
-        return getAssociation(id)
+    default Optional<OneToOneAssociation> getProperty(final String id, final MixedIn mixedIn) {
+        return getAssociation(id, mixedIn)
                 .filter(ObjectAssociation.Predicates.PROPERTIES)
                 .map(OneToOneAssociation.class::cast);
     }
 
-    default OneToOneAssociation getPropertyElseFail(final String id) {
-        return getProperty(id)
+    default OneToOneAssociation getPropertyElseFail(final String id, final MixedIn mixedIn) {
+        return getProperty(id, mixedIn)
                 .orElseThrow(()->_Exceptions.noSuchElement("id=%s", id));
     }
 
-    default Optional<OneToManyAssociation> getCollection(final String id) {
-        return getAssociation(id)
+    default Optional<OneToManyAssociation> getCollection(final String id, final MixedIn mixedIn) {
+        return getAssociation(id, mixedIn)
                 .filter(ObjectAssociation.Predicates.COLLECTIONS)
                 .map(OneToManyAssociation.class::cast);
     }
 
-    default OneToManyAssociation getCollectionElseFail(final String id) {
-        return getCollection(id)
+    default OneToManyAssociation getCollectionElseFail(final String id, final MixedIn mixedIn) {
+        return getCollection(id, mixedIn)
                 .orElseThrow(()->_Exceptions.noSuchElement("id=%s", id));
     }
 
+    // -- MIXED-IN INCLUDED
+
+    default Optional<ObjectAssociation> getAssociation(final String id) {
+        return getAssociation(id, MixedIn.INCLUDED);}
+    default ObjectAssociation getAssociationElseFail(final String id) {
+        return getAssociationElseFail(id, MixedIn.INCLUDED);}
+    default Optional<OneToOneAssociation> getProperty(final String id) {
+        return getProperty(id, MixedIn.INCLUDED);}
+    default OneToOneAssociation getPropertyElseFail(final String id) {
+        return getPropertyElseFail(id, MixedIn.INCLUDED);}
+    default Optional<OneToManyAssociation> getCollection(final String id) {
+        return getCollection(id, MixedIn.INCLUDED);}
+    default OneToManyAssociation getCollectionElseFail(final String id) {
+        return getCollectionElseFail(id, MixedIn.INCLUDED);}
+
     // -- ASSOCIATION LOOKUP, DECLARED PROPERTIES/COLLECTIONS (NO INHERITANCE CONSIDERED)
 
     /**
@@ -76,7 +91,7 @@ public interface ObjectAssociationContainer {
      * Throw a {@link ObjectSpecificationException} if no such association
      * exists.
      */
-    Optional<ObjectAssociation> getDeclaredAssociation(String id);
+    Optional<ObjectAssociation> getDeclaredAssociation(String id, MixedIn mixedIn);
 
     // -- ASSOCIATION STREAMS (INHERITANCE CONSIDERED)
 
@@ -87,15 +102,15 @@ public interface ObjectAssociationContainer {
      * @implSpec Walk through the type hierarchy nearest to farthest and add any ObjectAssociation to the stream,
      * except don't add ObjectAssociations that already have been added (due to inheritance).
      */
-    Stream<ObjectAssociation> streamAssociations(MixedIn contributed);
+    Stream<ObjectAssociation> streamAssociations(MixedIn mixedIn);
 
 
     /**
      * All {@link ObjectAssociation association}s that represent
      * {@link OneToOneAssociation properties}.
      */
-    default Stream<OneToOneAssociation> streamProperties(final MixedIn contributed) {
-        return streamAssociations(contributed)
+    default Stream<OneToOneAssociation> streamProperties(final MixedIn mixedIn) {
+        return streamAssociations(mixedIn)
                 .filter(ObjectAssociation.Predicates.PROPERTIES)
                 .map(OneToOneAssociation.class::cast);
     }
@@ -104,8 +119,8 @@ public interface ObjectAssociationContainer {
      * All {@link ObjectAssociation association}s that represents
      * {@link OneToManyAssociation collections}.
      */
-    default Stream<OneToManyAssociation> streamCollections(final MixedIn contributed){
-        return streamAssociations(contributed)
+    default Stream<OneToManyAssociation> streamCollections(final MixedIn mixedIn){
+        return streamAssociations(mixedIn)
                 .filter(ObjectAssociation.Predicates.COLLECTIONS)
                 .map(OneToManyAssociation.class::cast);
     }
@@ -127,7 +142,7 @@ public interface ObjectAssociationContainer {
      * unauthorized fields have been removed) use
      * <tt>ObjectAssociationFilters#staticallyVisible(...)</tt>
      */
-    Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn contributed);
+    Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn mixedIn);
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
index 02d654f..81e271c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
@@ -55,14 +55,14 @@ implements
     ObjectAssociationContainer,
     Hierarchical {
 
-    protected ObjectMemberContainer(MetaModelContext metaModelContext) {
+    protected ObjectMemberContainer(final MetaModelContext metaModelContext) {
         super(metaModelContext);
     }
 
     // -- ACTIONS
 
     @Override
-    public Optional<ObjectAction> getAction(String id, @Nullable ActionType type) {
+    public Optional<ObjectAction> getAction(final String id, @Nullable final ActionType type) {
 
         val declaredAction = getDeclaredAction(id); // no inheritance nor type considered
 
@@ -120,9 +120,9 @@ implements
     // -- ASSOCIATIONS
 
     @Override
-    public Optional<ObjectAssociation> getAssociation(String id) {
+    public Optional<ObjectAssociation> getAssociation(final String id, final MixedIn mixedIn) {
 
-        val declaredAssociation = getDeclaredAssociation(id); // no inheritance considered
+        val declaredAssociation = getDeclaredAssociation(id, mixedIn); // no inheritance considered
 
         if(declaredAssociation.isPresent()) {
             return declaredAssociation;
@@ -130,11 +130,11 @@ implements
 
         return isTypeHierarchyRoot()
                ? Optional.empty() // stop searching
-               : superclass().getAssociation(id);
+               : superclass().getAssociation(id, mixedIn);
     }
 
     @Override
-    public Stream<ObjectAssociation> streamAssociations(MixedIn mixedIn) {
+    public Stream<ObjectAssociation> streamAssociations(final MixedIn mixedIn) {
 
         if(isTypeHierarchyRoot()) {
             return streamDeclaredAssociations(mixedIn); // stop going deeper
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 b414554..3d04e3e 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
@@ -654,10 +654,10 @@ implements ObjectSpecification {
     // -- ASSOCIATIONS
 
     @Override
-    public Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn contributed) {
+    public Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn mixedIn) {
         introspectUpTo(IntrospectionState.FULLY_INTROSPECTED);
 
-        if(contributed.isIncluded()) {
+        if(mixedIn.isIncluded()) {
             createMixedInAssociations(); // only if not already
             synchronized(unmodifiableAssociations) {
                 return stream(unmodifiableAssociations.get());
@@ -687,9 +687,9 @@ implements ObjectSpecification {
     }
 
     @Override
-    public Optional<ObjectAssociation> getDeclaredAssociation(final String id) {
+    public Optional<ObjectAssociation> getDeclaredAssociation(final String id, final MixedIn mixedIn) {
         introspectUpTo(IntrospectionState.FULLY_INTROSPECTED);
-        return streamDeclaredAssociations(MixedIn.INCLUDED)
+        return streamDeclaredAssociations(mixedIn)
                 .filter(objectAssociation->objectAssociation.getId().equals(id))
                 .findFirst();
     }
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 4ddbcd8..0153e9a 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
@@ -116,7 +116,7 @@ implements ObjectSpecification {
     }
 
     @Override
-    public Optional<ObjectAssociation> getDeclaredAssociation(final String name) {
+    public Optional<ObjectAssociation> getDeclaredAssociation(final String name, final MixedIn mixedIn) {
         for (int i = 0; i < fields.size(); i++) {
             if (fields.get(i).getId().equals(name)) {
                 return Optional.ofNullable(fields.get(i));
@@ -126,7 +126,7 @@ implements ObjectSpecification {
     }
 
     @Override
-    public Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn contributed) {
+    public Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn mixedIn) {
         return fields.stream();
     }
 
@@ -361,9 +361,9 @@ implements ObjectSpecification {
     }
 
     @Override
-    public Optional<ObjectAssociation> getAssociation(final String id) {
+    public Optional<ObjectAssociation> getAssociation(final String id, final MixedIn mixedIn) {
         // poorly implemented, inheritance not supported
-        return getDeclaredAssociation(id);
+        return getDeclaredAssociation(id, mixedIn);
     }
 
     @Override
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java
index 7d3e89f..2f31871 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java
@@ -77,8 +77,9 @@ extends HasBookmarkedOwnerAbstract<PropertyInteraction> {
 
         return PropertyInteraction.wrap(
                 ManagedProperty.lookupProperty(getBookmarkedOwner(), memberId, where)
-                .orElseThrow(()->_Exceptions.noSuchElement(memberId)));
-
+                .orElseThrow(()->_Exceptions.noSuchElement("property '%s' in %s",
+                        memberId,
+                        getBookmarkedOwner().getSpecification())));
     }
 
     @Override