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/05/12 10:30:44 UTC

[isis] branch master updated: ISIS-2661: adds AssociatedWithFacetFromLayoutXml that is derived from layout.xml

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 c99092d  ISIS-2661: adds AssociatedWithFacetFromLayoutXml that is derived from layout.xml
c99092d is described below

commit c99092d0ef717fffa4859214d4950a8ba0a2512e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed May 12 12:30:25 2021 +0200

    ISIS-2661: adds AssociatedWithFacetFromLayoutXml that is derived from
    layout.xml
---
 .../isis/core/metamodel/facetapi/FacetUtil.java    | 24 +++++----
 .../AssociatedWithFacetFromLayoutXml.java          | 59 ++++++++++++++++++++++
 .../services/grid/GridSystemServiceAbstract.java   |  3 ++
 .../core/metamodel/spec/feature/ObjectAction.java  | 35 ++++++-------
 .../wicket/model/models/EntityCollectionModel.java |  4 +-
 .../entity/header/EntityHeaderPanel.java           |  2 +-
 6 files changed, 94 insertions(+), 33 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
index db73476..fe9e60d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
@@ -22,26 +22,29 @@ package org.apache.isis.core.metamodel.facetapi;
 import java.util.List;
 import java.util.function.BiConsumer;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.core.metamodel.util.snapshot.XmlSchema;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import lombok.NonNull;
 import lombok.val;
 
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class FacetUtil {
 
-    public static void addIfNotAlreadyPresent(final Facet facet) {
+    public static void addIfNotAlreadyPresent(final @Nullable Facet facet) {
         if (facet == null) {
             return;
         }
         val facetHolder = facet.getFacetHolder();
         if(!facetHolder.containsFacet(facet.facetType())) {
-            facetHolder.addFacet(facet);    
+            facetHolder.addFacet(facet);
         }
     }
-    
-    public static void replaceIfAlreadyPresent(final Facet facet) {
+
+    public static void replaceIfAlreadyPresent(final @Nullable Facet facet) {
         if (facet == null) {
             return;
         }
@@ -49,16 +52,15 @@ public final class FacetUtil {
         facetHolder.addOrReplaceFacet(facet);
         // second call sets the underlying facet as well to this type
         // hacky, to pass validation
-        facetHolder.addOrReplaceFacet(facet); 
+        facetHolder.addOrReplaceFacet(facet);
     }
-    
 
-    public static void addOrReplaceFacet(final Facet facet) {
+
+    public static void addOrReplaceFacet(final @Nullable Facet facet) {
         if (facet == null) {
             return;
         }
-        val facetHolder = facet.getFacetHolder();
-        facetHolder.addOrReplaceFacet(facet);
+        facet.getFacetHolder().addOrReplaceFacet(facet);
     }
 
     /**
@@ -68,7 +70,7 @@ public final class FacetUtil {
      * @return <tt>true</tt> if a non-<tt>null</tt> facet was added,
      *         <tt>false</tt> otherwise.
      */
-    public static boolean addFacet(final Facet facet) {
+    public static boolean addFacet(final @Nullable Facet facet) {
         if (facet == null) {
             return false;
         }
@@ -82,7 +84,7 @@ public final class FacetUtil {
      *
      * @return <tt>true</tt> if any facets were added, <tt>false</tt> otherwise.
      */
-    public static boolean addFacets(final List<Facet> facetList) {
+    public static boolean addFacets(final @NonNull List<Facet> facetList) {
         boolean addedFacets = false;
         for (val facet : facetList) {
             addedFacets = addFacet(facet) | addedFacets;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacetFromLayoutXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacetFromLayoutXml.java
new file mode 100644
index 0000000..2d4cbde
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/associateWith/AssociatedWithFacetFromLayoutXml.java
@@ -0,0 +1,59 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.actions.action.associateWith;
+
+import javax.annotation.Nullable;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.members.layout.group.GroupIdAndName;
+
+import lombok.NonNull;
+
+public class AssociatedWithFacetFromLayoutXml extends AssociatedWithFacetAbstract {
+
+    // -- FACTORIES
+
+    public static @Nullable AssociatedWithFacetFromLayoutXml create(
+            final @Nullable GroupIdAndName groupIdAndName,
+            final @NonNull  FacetHolder holder) {
+
+        return groupIdAndName!=null
+                ? new AssociatedWithFacetFromLayoutXml(groupIdAndName.getId(), holder)
+                : null;
+    }
+
+//    public static @Nullable AssociatedWithFacetFromLayoutXml create(
+//            final @NonNull FieldSet fieldSet,
+//            final @NonNull FacetHolder holder) {
+//
+//        return GroupIdAndName.forFieldSet(fieldSet)
+//            .map(groupIdAndName->create(groupIdAndName, holder))
+//            .orElse(null);
+//    }
+
+    // -- IMPLEMENTATION
+
+    private AssociatedWithFacetFromLayoutXml(
+            final String value,
+            final FacetHolder holder) {
+        super(value, holder);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
index 9e16b10..4cf5dba 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -40,6 +40,7 @@ import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facets.actions.action.associateWith.AssociatedWithFacetFromLayoutXml;
 import org.apache.isis.core.metamodel.facets.actions.layout.ActionPositionFacetForActionXml;
 import org.apache.isis.core.metamodel.facets.actions.layout.BookmarkPolicyFacetForActionXml;
 import org.apache.isis.core.metamodel.facets.actions.layout.CssClassFaFacetForActionXml;
@@ -81,6 +82,7 @@ import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
+import static org.apache.isis.core.metamodel.facetapi.FacetUtil.addIfNotAlreadyPresent;
 import static org.apache.isis.core.metamodel.facetapi.FacetUtil.addOrReplaceFacet;
 
 import lombok.Value;
@@ -237,6 +239,7 @@ implements GridSystemService<G> {
                 }
                 addOrReplaceFacet(LayoutOrderFacetFromXml.create(memberOrderSequence, objectAction));
                 addOrReplaceFacet(LayoutGroupFacetFromXml.create(groupIdAndName, objectAction));
+                addIfNotAlreadyPresent(AssociatedWithFacetFromLayoutXml.create(groupIdAndName, objectAction));
 
 
                 // fix up the action position if required
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 bd07219..ab21017 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
@@ -341,18 +341,19 @@ public interface ObjectAction extends ObjectMember {
         }
 
         /**
-         * Those to be rendered with the entity header panel.
+         * Returns a Stream of those to be rendered with the entity header panel.
          */
-        public static Stream<ObjectAction> streamTopLevelActions(
+        public static Stream<ObjectAction> streamTopBarActions(
                 final ManagedObject adapter) {
 
             val spec = adapter.getSpecification();
 
-            return spec.streamRuntimeActions(MixedIn.INCLUDED)
-            .filter(ObjectAction.Predicates.memberOrderNotAssociationOf(spec))
-            .filter(ObjectAction.Predicates.dynamicallyVisible(adapter,
-                    InteractionInitiatedBy.USER, Where.ANYWHERE))
-            .filter(ObjectAction.Predicates.excludeWizardActions(spec));
+            val all =  spec.streamRuntimeActions(MixedIn.INCLUDED).collect(Can.toCan());
+            val a =  all.filter(ObjectAction.Predicates.memberOrderNotAssociationOf(spec));
+            val b = a.filter(ObjectAction.Predicates.dynamicallyVisible(adapter,
+                    InteractionInitiatedBy.USER, Where.ANYWHERE));
+            val c = b.filter(ObjectAction.Predicates.excludeWizardActions(spec));
+            return c.stream();
         }
 
         public static Stream<ObjectAction> findForAssociation(
@@ -418,12 +419,12 @@ public interface ObjectAction extends ObjectMember {
         }
 
         public static class AssociatedWith implements Predicate<ObjectAction> {
-            private final String memberId;
-            private final String memberName;
+            private final @NonNull String memberId;
+            private final @NonNull String memberName;
 
-            public AssociatedWith(final ObjectAssociation objectAssociation) {
-                this.memberId = objectAssociation.getId();
-                this.memberName = objectAssociation.getName();
+            public AssociatedWith(final @NonNull ObjectAssociation objectAssociation) {
+                this.memberId = _Strings.nullToEmpty(objectAssociation.getId()).toLowerCase();
+                this.memberName = _Strings.nullToEmpty(objectAssociation.getName()).toLowerCase();;
             }
 
             @Override
@@ -436,13 +437,9 @@ public interface ObjectAction extends ObjectMember {
                 if (associatedMemberName == null) {
                     return false;
                 }
-                val memberOrderNameLowerCase = associatedMemberName.toLowerCase();
-                return equalWhenLowerCase(memberName, memberOrderNameLowerCase)
-                        || equalWhenLowerCase(memberId, memberOrderNameLowerCase);
-            }
-
-            private boolean equalWhenLowerCase(@Nullable String string, String lowerCaseString) {
-                return string != null && Objects.equals(string.toLowerCase(), lowerCaseString);
+                val memberNameLowerCase = associatedMemberName.toLowerCase();
+                return Objects.equals(memberName, memberNameLowerCase)
+                        || Objects.equals(memberId, memberNameLowerCase);
             }
 
         }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 400c790..05438fe 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -139,7 +139,7 @@ extends
     String getName();
     int getPageSize();
 
-    // -- PARENTED STUFF
+    // -- PARENTED SPECIFICS
 
     default Optional<EntityCollectionModelParented> parented() {
         return this instanceof EntityCollectionModelParented
@@ -158,7 +158,7 @@ extends
     }
 
     /**
-     * Returns optionally the a {@link ManagedCollection}, based on whether
+     * Optionally returns a {@link ManagedCollection}, based on whether
      * this is a parented collection.
      */
     default Optional<ManagedCollection> parentedManagedCollection() {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
index c60cdd0..4c1628f 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
@@ -80,7 +80,7 @@ extends PanelAbstract<ManagedObject, EntityModel> {
         final EntityModel model = getModel();
         val adapter = model.getObject();
         if (adapter != null) {
-            val topLevelActions = ObjectAction.Util.streamTopLevelActions(adapter);
+            val topLevelActions = ObjectAction.Util.streamTopBarActions(adapter);
             val entityActionLinks = LinkAndLabelUtil
                     .asActionLinksForAdditionalLinksPanel(model, topLevelActions, null)
                     .collect(Can.toCan());