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 2018/10/05 10:50:06 UTC

[isis] branch v2 updated: ISIS-1976: moving responsibility for mixed in action lookup into ObjectSpecification API

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/v2 by this push:
     new 9f262ab  ISIS-1976: moving responsibility for mixed in action lookup into ObjectSpecification API
9f262ab is described below

commit 9f262ab4f4c0281799a5f7e7091b344aecb2db58
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Oct 5 12:49:43 2018 +0200

    ISIS-1976: moving responsibility for mixed in action lookup into
    ObjectSpecification API
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../commons/internal/functions/_Predicates.java    |  8 ++++++
 ...ctionInvocationFacetForDomainEventAbstract.java | 24 ++--------------
 .../core/metamodel/spec/ObjectSpecification.java   | 25 ++++++++++++----
 .../core/metamodel/spec/feature/ObjectAction.java  | 33 +++++++++++++---------
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  2 +-
 5 files changed, 50 insertions(+), 42 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/functions/_Predicates.java b/core/commons/src/main/java/org/apache/isis/commons/internal/functions/_Predicates.java
index 68bce34..1c84e8c 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/functions/_Predicates.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/functions/_Predicates.java
@@ -76,4 +76,12 @@ public final class _Predicates {
         return null;
     }
     
+    /**
+     * @param superClass
+     * @return a Predicate that tests for the operand to be an instance of {@code superClass}
+     */
+    public static Predicate<Object> instanceOf(Class<?> superClass) {
+        return obj->superClass.isAssignableFrom(obj.getClass());
+    }
+    
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 2847107..e96e02e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -29,7 +29,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -81,9 +80,7 @@ import org.apache.isis.core.metamodel.services.ixn.InteractionDtoServiceInternal
 import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.core.metamodel.services.publishing.PublishingServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.specloader.specimpl.MixedInMember;
 import org.apache.isis.schema.ixn.v1.ActionInvocationDto;
 
 public abstract class ActionInvocationFacetForDomainEventAbstract
@@ -338,26 +335,9 @@ implements ImperativeFacet {
         return filteredIfRequired(returnedAdapter, interactionInitiatedBy);
     }
 
-    // TODO: could improve this, currently have to go searching for the mixin
     private static String targetNameFor(ObjectAction owningAction, ObjectAdapter mixedInAdapter) {
-        if(mixedInAdapter != null) {
-            final ObjectSpecification onType = owningAction.getOnType();
-            final ObjectSpecification mixedInSpec = mixedInAdapter.getSpecification();
-            final Stream<ObjectAction> objectActions = mixedInSpec.streamObjectActions(Contributed.INCLUDED);
-            
-            final Optional<String> mixinName = objectActions
-            .filter(action->action instanceof MixedInMember)
-            .map(action->(MixedInMember) action)
-            .filter(action->action.getMixinType() == onType)
-            .findAny()
-            .map(MixedInMember::getName);
-            
-            if(mixinName.isPresent()) {
-                return mixinName.get();
-            }
-            
-        }
-        return CommandUtil.targetMemberNameFor(owningAction);
+        return ObjectAction.Util.targetNameFor(owningAction, mixedInAdapter)
+                .orElseGet(()->CommandUtil.targetMemberNameFor(owningAction));
     }
 
     private static String trim(String message, final int maxLen) {
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 733a2dd..97ef21e 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
@@ -19,7 +19,10 @@
 
 package org.apache.isis.core.metamodel.spec;
 
+import static org.apache.isis.commons.internal.functions._Predicates.instanceOf;
+
 import java.util.Comparator;
+import java.util.Optional;
 import java.util.function.Function;
 
 import org.apache.isis.applib.annotation.DomainObject;
@@ -45,11 +48,13 @@ import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionContext;
 import org.apache.isis.core.metamodel.interactions.ObjectTitleContext;
 import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionContainer;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationContainer;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
+import org.apache.isis.core.metamodel.specloader.specimpl.MixedInMember;
 
 /**
  * Represents an entity or value (cf {@link java.lang.Class}) within the
@@ -64,8 +69,6 @@ import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitut
 public interface ObjectSpecification extends Specification, ObjectActionContainer, 
 ObjectAssociationContainer, Hierarchical,  DefaultProvider {
 
-    ObjectMember getMember(String memberId);
-
     final class Comparators{
         private Comparators(){}
         
@@ -84,6 +87,21 @@ ObjectAssociationContainer, Hierarchical,  DefaultProvider {
         public static final Function<ObjectSpecification, String> FULL_IDENTIFIER = 
                 ObjectSpecification::getFullIdentifier;
     }
+    
+    ObjectMember getMember(String memberId);
+    
+    /**
+     * @param onType
+     * @return
+     * @since 2.0.0-M2
+     */
+    public default Optional<MixedInMember> getMixedInMember(ObjectSpecification onType) {
+        return streamObjectActions(Contributed.INCLUDED)
+                .filter(instanceOf(MixedInMember.class))
+                .map(member->(MixedInMember) member)
+                .filter(member->member.getMixinType() == onType)
+                .findAny();
+    }
 
     /**
      * @return
@@ -347,9 +365,6 @@ ObjectAssociationContainer, Hierarchical,  DefaultProvider {
 
     boolean isPersistenceCapable();
     boolean isPersistenceCapableOrViewModel();
-
     
 
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index 1ae2f63..77c80de 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -23,10 +23,13 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
@@ -53,6 +56,7 @@ import org.apache.isis.core.metamodel.facets.object.wizard.WizardFacet;
 import org.apache.isis.core.metamodel.layout.memberorderfacet.MemberOrderFacetComparator;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.specimpl.MixedInMember;
 
 public interface ObjectAction extends ObjectMember {
 
@@ -190,17 +194,6 @@ public interface ObjectAction extends ObjectMember {
             final InteractionInitiatedBy interactionInitiatedBy);
 
 
-
-//    // -- setupBulkActionInvocationContext
-//    /**
-//     * internal API, called by {@link ActionInvocationFacet} if the action is actually executed (ie in the foreground).
-//     */
-//    void setupBulkActionInvocationContext(
-//            final ObjectAdapter targetAdapter);
-//
-
-
-
     // -- Util
     public static final class Util {
 
@@ -306,7 +299,6 @@ public interface ObjectAction extends ObjectMember {
                     ObjectAction.Predicates.memberOrderNotAssociationOf(adapterSpec)
                     .and(ObjectAction.Predicates.dynamicallyVisible(adapter, 
                             InteractionInitiatedBy.USER, Where.ANYWHERE))
-//                    .and(ObjectAction.Predicates.notBulkOnly())
                     .and(ObjectAction.Predicates.excludeWizardActions(adapterSpec));
 
             final Stream<ObjectAction> userActions = 
@@ -348,7 +340,6 @@ public interface ObjectAction extends ObjectMember {
 
             Predicate<ObjectAction> predicate = 
                 ObjectAction.Predicates.memberOrderOf(association)
-//                .and(ObjectAction.Predicates.notBulkOnly())
                 .and(ObjectAction.Predicates.excludeWizardActions(objectSpecification));
 
             final Stream<ObjectAction> userActions = 
@@ -371,10 +362,24 @@ public interface ObjectAction extends ObjectMember {
             }
             return promptStyle;
         }
+        
+        public static Optional<String> targetNameFor(
+                final ObjectAction owningAction,
+                final @Nullable ObjectAdapter mixedInAdapter) {
+            
+            if(mixedInAdapter != null) {
+                final ObjectSpecification onType = owningAction.getOnType();
+                final ObjectSpecification mixedInSpec = mixedInAdapter.getSpecification();
+                final Optional<String> mixinName = mixedInSpec.getMixedInMember(onType)
+                        .map(MixedInMember::getName);
+                
+                return mixinName;
+            }
+            return Optional.empty();
+        }
     }
 
 
-
     // -- Predicates
 
     public static final class Predicates {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 1583fa6..d562294 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -395,7 +395,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
             });
         });
     }
-
+    
     // -- toString
     
     @Override