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/04/09 08:19:18 UTC

[isis] branch master updated: ISIS-2602: layout groups: polishing

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 8767529  ISIS-2602: layout groups: polishing
8767529 is described below

commit 8767529034175313f2ecd2a6e2fc97758986035c
Author: ahuber@apache.org <ah...@luna>
AuthorDate: Fri Apr 9 10:19:04 2021 +0200

    ISIS-2602: layout groups: polishing
---
 .../isis/applib/annotation/ActionLayout.java       | 10 ++++-
 .../action/ActionAnnotationFacetFactory.java       |  2 +
 .../members/layout/group/GroupIdAndName.java       | 11 +++++-
 .../members/layout/group/LayoutGroupFacet.java     | 20 +++++++---
 .../LayoutGroupFacetFromActionAnnotation.java      | 43 ++++++++++++++++++++++
 .../services/grid/GridSystemServiceAbstract.java   | 17 ++++-----
 6 files changed, 83 insertions(+), 20 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
index b246ecc..a3643f2 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
@@ -111,11 +111,14 @@ public @interface ActionLayout {
             default "";
 
     /**
-     * Specifies the <b>id</b> of associated <i>FieldSet</i>.
+     * Specifies the <b>id</b> of associated <i>FieldSet</i>.  
      * <p>
      * For a more in depth description see the analogous {@link PropertyLayout#fieldSetId()}.
      * </p>
      * 
+     * To associate an <i>Action</i> with a <i>Collection</i>, use {@link Action#associateWith()} 
+     * instead.
+     * 
      * @apiNote An <i>Action</i> can be associated with with a <i>Property</i> or <i>Collection</i> 
      * its so called <i>peer</i>. 
      * It will then be positioned close to its <i>peer</i>, either under it or on the header panel
@@ -133,11 +136,14 @@ public @interface ActionLayout {
             default "__infer";
     
     /**
-     * Specifies the <b>friendly-name</b> of associated <i>FieldSet</i>.
+     * Specifies the <b>friendly-name</b> of associated <i>FieldSet</i> or <i>Collection</i>.
      * <p>
      * For a more in depth description see the analogous {@link PropertyLayout#fieldSetId()}; 
      * </p>
      * 
+     * To associate an <i>Action</i> with a <i>Collection</i>, use {@link Action#associateWith()} 
+     * instead.
+     * 
      * @see Action#associateWith()
      * @see ActionLayout#fieldSetId()
      * @see PropertyLayout#fieldSetId()
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 9f9b072..5b5dbba 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -42,6 +42,7 @@ import org.apache.isis.core.metamodel.facets.actions.action.prototype.PrototypeF
 import org.apache.isis.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.typeof.TypeOfFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.fileaccept.FileAcceptFacetForActionAnnotation;
+import org.apache.isis.core.metamodel.facets.members.layout.group.LayoutGroupFacetFromActionAnnotation;
 import org.apache.isis.core.metamodel.facets.members.publish.command.CommandPublishingFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.members.publish.execution.ExecutionPublishingActionFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.object.domainobject.domainevents.ActionDomainEventDefaultFacetForDomainObjectAnnotation;
@@ -270,6 +271,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
             val associateWith = action.associateWith();
             if(_Strings.isNotEmpty(associateWith)) {
                 super.addFacet(new AssociatedWithFacetForActionAnnotation(associateWith, facetedMethod));
+                super.addFacet(LayoutGroupFacetFromActionAnnotation.create(actionIfAny, facetedMethod));
             }
         });
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/GroupIdAndName.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/GroupIdAndName.java
index 25f5bf3..6025d2c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/GroupIdAndName.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/GroupIdAndName.java
@@ -23,6 +23,7 @@ import java.util.Optional;
 
 import javax.annotation.Nullable;
 
+import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.layout.component.CollectionLayoutData;
@@ -43,12 +44,12 @@ implements
     private static final long serialVersionUID = 1L;
 
     /**
-     * Id of a layout group.
+     * Id of a layout group (a <i>FieldSet</i> or a <i>Collection</i>).
      */
     private final @NonNull String id;
     
     /**
-     * (Friendly) name of a layout group.
+     * (Friendly) name of a layout group (a <i>FieldSet</i> or a <i>Collection</i>).
      */
     private final @NonNull String name;
 
@@ -62,6 +63,12 @@ implements
     
     // -- FACTORIES FOR ANNOTATIONS
 
+    public static Optional<GroupIdAndName> forAction(
+            final @NonNull Action action) {
+        return GroupIdAndName.inferIfOneMissing(
+                action.associateWith(), null);
+    }
+    
     public static Optional<GroupIdAndName> forActionLayout(
             final @NonNull ActionLayout actionLayout) {
         return GroupIdAndName.inferIfOneMissing(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacet.java
index 6d6cde2..3c3900b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacet.java
@@ -19,22 +19,30 @@
 package org.apache.isis.core.metamodel.facets.members.layout.group;
 
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
 /**
- * In the framework's default programming model corresponds to annotations
- * {@link Action#associateWith()} and {@link PropertyLayout#fieldSetId()}.
- * <br>
- * Collections don't support grouping.
+ * With the framework's default programming model corresponds to annotations
+ * {@link ActionLayout#fieldSetId()} and {@link PropertyLayout#fieldSetId()},
+ * with friendly names
+ * {@link ActionLayout#fieldSetName()} and {@link PropertyLayout#fieldSetName()}.
  * <p>
- *     An alternative is to use the <code>Xxx.layout.xml</code> file,
- *     where <code>Xxx</code> is the domain object name.
+ * Collections don't support grouping, but can be associated using 
+ * {@link ActionLayout#associateWith()}. 
+ * </p><p>
+ * An alternative is to use the <code>Xxx.layout.xml</code> file,
+ * where <code>Xxx</code> is the domain object name.
+ * </p><p>
+ * For a more in depth description see {@link PropertyLayout#fieldSetId()}.
  * </p>
  * 
  * @see Action#associateWith() 
  * @see ActionLayout#fieldSetId()
+ * @see ActionLayout#fieldSetName()
  * @see PropertyLayout#fieldSetId()
+ * @see PropertyLayout#fieldSetName()
  * 
  * @since 2.0
  */
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetFromActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetFromActionAnnotation.java
new file mode 100644
index 0000000..26340e8
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/layout/group/LayoutGroupFacetFromActionAnnotation.java
@@ -0,0 +1,43 @@
+/*
+ *  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.members.layout.group;
+
+import java.util.Optional;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+public class LayoutGroupFacetFromActionAnnotation
+extends LayoutGroupFacetAbstract {
+
+    public static LayoutGroupFacetFromActionAnnotation create(
+            final Optional<Action> actionIfAny, 
+            final FacetHolder holder) {
+        
+        return actionIfAny
+            .flatMap(GroupIdAndName::forAction)
+            .map(groupIdAndName->new LayoutGroupFacetFromActionAnnotation(groupIdAndName, holder))
+            .orElse(null);
+    }
+
+    private LayoutGroupFacetFromActionAnnotation(GroupIdAndName groupIdAndName, FacetHolder holder) {
+        super(groupIdAndName, 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 1581f60..5373b53 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
@@ -21,7 +21,6 @@ package org.apache.isis.core.metamodel.services.grid;
 import static org.apache.isis.core.metamodel.facetapi.FacetUtil.addOrReplaceFacet;
 
 import java.util.LinkedHashSet;
-import java.util.List;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Stream;
@@ -215,12 +214,10 @@ implements GridSystemService<G> {
                 GroupIdAndName groupIdAndName = null;
                 int memberOrderSequence;
                 if(actionLayoutDataOwner instanceof FieldSet) {
-                    final FieldSet fieldSet = (FieldSet) actionLayoutDataOwner;
-                    final List<PropertyLayoutData> properties = fieldSet.getProperties();
-                    for (PropertyLayoutData propertyLayoutData : properties) {
-                        final String propertyId = propertyLayoutData.getId();
+                    val fieldSet = (FieldSet) actionLayoutDataOwner;
+                    for (val propertyLayoutData : fieldSet.getProperties()) {
                         // any will do; choose the first one that we know is valid
-                        if(oneToOneAssociationById.containsKey(propertyId)) {
+                        if(oneToOneAssociationById.containsKey(propertyLayoutData.getId())) {
                             groupIdAndName = GroupIdAndName.forPropertyLayoutData(propertyLayoutData)
                                     .orElse(null);
                             break;
@@ -228,13 +225,13 @@ implements GridSystemService<G> {
                     }
                     memberOrderSequence = actionPropertyGroupSequence++;
                 } else if(actionLayoutDataOwner instanceof PropertyLayoutData) {
-                    final PropertyLayoutData propertyLayoutData = (PropertyLayoutData) actionLayoutDataOwner;
-                    groupIdAndName = GroupIdAndName.forPropertyLayoutData(propertyLayoutData)
+                    groupIdAndName = GroupIdAndName
+                            .forPropertyLayoutData((PropertyLayoutData) actionLayoutDataOwner)
                             .orElse(null);
                     memberOrderSequence = actionPropertySequence++;
                 } else if(actionLayoutDataOwner instanceof CollectionLayoutData) {
-                    final CollectionLayoutData collectionLayoutData = (CollectionLayoutData) actionLayoutDataOwner;
-                    groupIdAndName = GroupIdAndName.forCollectionLayoutData(collectionLayoutData)
+                    groupIdAndName = GroupIdAndName
+                            .forCollectionLayoutData((CollectionLayoutData) actionLayoutDataOwner)
                             .orElse(null);
                     memberOrderSequence = actionCollectionSequence++;
                 } else {