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/12/10 12:36:01 UTC

[isis] branch master updated: ISIS-2915: remove ambiguities in Identifier.Type

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 60fd2aa  ISIS-2915: remove ambiguities in Identifier.Type
60fd2aa is described below

commit 60fd2aac4c997356f4b4f067ae1436444ad545ea
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Dec 10 13:35:47 2021 +0100

    ISIS-2915: remove ambiguities in Identifier.Type
    
    - source of quite some bugs lately
    
    - fixes data-table associated action lookup when the element providing
    Collection is a mixed-in one
---
 .../java/org/apache/isis/applib/Identifier.java    | 40 +++++++++++++++-------
 .../interactions/managed/ActionInteraction.java    |  4 +--
 .../managed/nonscalar/DataTableModel.java          | 11 +++---
 .../specimpl/OneToManyAssociationMixedIn.java      |  2 +-
 .../specimpl/OneToOneAssociationMixedIn.java       |  2 +-
 .../specimpl/dflt/_PropertiesAsColumns.java        | 14 +++++---
 6 files changed, 48 insertions(+), 25 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/Identifier.java b/api/applib/src/main/java/org/apache/isis/applib/Identifier.java
index 9b9cfda..d1d4bd7 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/Identifier.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/Identifier.java
@@ -57,22 +57,29 @@ implements
 
     /**
      * What type of feature this identifies.
-     * @apiNote <i>Action Parameters</i> (for historic reasons) have {@link Type#ACTION},
-     * but other than <i>Actions</i>, have a non-negative {@link #parameterIndex}.
-     * (Future work, might introduce a new Type: eg. PARAMETER)
      */
     public static enum Type {
+        /**
+         * A <i>Value-type</i> or <i>Domain Object</i>.
+         */
         CLASS,
-        PROPERTY_OR_COLLECTION,
         /**
-         * Mixed in <i>Properties</i> and mixed in <i>Collections</i> are both categorized
-         * as {@link #ACTION};
-         * @apiNote future work might deal with this ambiguity
+         * <i>Action</i> either declared or mixed in.
          */
-        ACTION;
-        public boolean isAction() { return this == ACTION; }
-        public boolean isPropertyOrCollection() { return this == PROPERTY_OR_COLLECTION; }
+        ACTION,
+        /**
+         * <i>Action Parameter</i>, also has a non-negative {@link #parameterIndex}.
+         */
+        ACTION_PARAMETER,
+        /**
+         * <i>Association</i> (of any cardinality), either declared or mixed in.
+         */
+        PROPERTY_OR_COLLECTION
+        ;
         public boolean isClass() { return this == CLASS; }
+        public boolean isAction() { return this == ACTION; }
+        public boolean isActionParameter() { return this == ACTION_PARAMETER; }
+        public boolean isPropertyOrCollection() { return this == PROPERTY_OR_COLLECTION;}
     }
 
     // -- FACTORY METHODS
@@ -88,6 +95,13 @@ implements
                 Type.PROPERTY_OR_COLLECTION);
     }
 
+    public static Identifier mixedInPropertyOrCollectionIdentifier(
+            final LogicalType typeIdentifier,
+            final String memberName,
+            final Can<String> singleParameterClassNames) {
+        return new Identifier(typeIdentifier, memberName, singleParameterClassNames, Type.PROPERTY_OR_COLLECTION);
+    }
+
     /** for reporting orphaned methods */
     public static Identifier methodIdentifier(
             final LogicalType typeIdentifier,
@@ -182,10 +196,10 @@ implements
     // -- WITHERS
 
     public Identifier withParameterIndex(final int parameterIndex) {
-        return new Identifier(logicalType, memberLogicalName, memberParameterClassNames, type, parameterIndex);
+        return new Identifier(
+                logicalType, memberLogicalName, memberParameterClassNames, Type.ACTION_PARAMETER, parameterIndex);
     }
 
-
     // -- LOGICAL ID
 
     public String getLogicalIdentityString(final @NonNull String delimiter) {
@@ -305,5 +319,7 @@ implements
     }
 
 
+
+
 }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
index f1fc78b..0e30833 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
@@ -35,7 +35,8 @@ import lombok.NonNull;
 import lombok.Value;
 import lombok.val;
 
-public final class ActionInteraction extends MemberInteraction<ManagedAction, ActionInteraction> {
+public final class ActionInteraction
+extends MemberInteraction<ManagedAction, ActionInteraction> {
 
     public static enum SemanticConstraint {
         NONE,
@@ -54,7 +55,6 @@ public final class ActionInteraction extends MemberInteraction<ManagedAction, Ac
             final @NonNull ManagedObject owner,
             final @NonNull String memberId,
             final @NonNull Where where) {
-
         return startWithMultiselect(owner, memberId, where, Can::empty);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataTableModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
index d937ef5..f1ee825 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
@@ -206,11 +206,12 @@ implements MultiselectChoices {
 
     public ActionInteraction startAssociatedActionInteraction(final String actionId, final Where where) {
         val featureId = managedMember.getIdentifier();
-        if(featureId.getType().isAction()) {
-            return ActionInteraction.empty(String.format("[no such associated action %s for collection %s "
-                    + "(which is not a collection)]",
-                    actionId,
-                    featureId));
+        if(!featureId.getType().isPropertyOrCollection()) {
+            return ActionInteraction.empty(String.format("[no such collection %s; instead got %s;"
+                    + "(while searching for an associated action %s)]",
+                    featureId,
+                    featureId.getType(),
+                    actionId));
         }
         return ActionInteraction.startWithMultiselect(managedMember.getOwner(), actionId, where, this);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
index f800358..6475c45 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
@@ -90,7 +90,7 @@ implements MixedInMember {
             final Class<?> mixinType,
             final String mixinMethodName) {
 
-        super(Identifier.actionIdentifier(
+        super(Identifier.mixedInPropertyOrCollectionIdentifier(
                     LogicalType.eager(
                             mixeeSpec.getCorrespondingClass(),
                             mixeeSpec.getLogicalTypeName()),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
index b68910b..01a758f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
@@ -73,7 +73,7 @@ implements MixedInMember {
             final Class<?> mixinType,
             final String mixinMethodName) {
 
-        super(Identifier.actionIdentifier(
+        super(Identifier.mixedInPropertyOrCollectionIdentifier(
                     LogicalType.eager(
                             mixeeSpec.getCorrespondingClass(),
                             mixeeSpec.getLogicalTypeName()),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/_PropertiesAsColumns.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/_PropertiesAsColumns.java
index 7598174..0df6665 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/_PropertiesAsColumns.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/_PropertiesAsColumns.java
@@ -68,9 +68,7 @@ class _PropertiesAsColumns implements HasMetaModelContext {
 
         val parentSpecIfAny = parentObject.getSpecification();
 
-        val whereContext = memberIdentifier.getType().isAction()
-                ? Where.STANDALONE_TABLES
-                : Where.PARENTED_TABLES;
+        val whereContext = whereContextFor(memberIdentifier);
 
         val propertyById = _Maps.<String, OneToOneAssociation>newLinkedHashMap();
 
@@ -156,9 +154,11 @@ class _PropertiesAsColumns implements HasMetaModelContext {
             return;
         }
 
+        val whereContext = whereContextFor(memberIdentifier);
+
         tableColumnOrderServices.stream()
         .map(tableColumnOrderService->
-            memberIdentifier.getType().isAction()
+            whereContext.inStandaloneTable()
             ? tableColumnOrderService.orderStandalone(
                     elementType,
                     propertyIdsInOrder)
@@ -197,4 +197,10 @@ class _PropertiesAsColumns implements HasMetaModelContext {
         };
     }
 
+    static Where whereContextFor(final Identifier memberIdentifier) {
+        return memberIdentifier.getType().isAction()
+                ? Where.STANDALONE_TABLES
+                : Where.PARENTED_TABLES;
+    }
+
 }