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/03/04 09:13:19 UTC

[isis] branch master updated: ISIS-2560: fully implements ApplicationRole_addPermission

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 f1f903d  ISIS-2560: fully implements ApplicationRole_addPermission
f1f903d is described below

commit f1f903de568b3ff591d73042529bf6ee5ab9a8c7
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Mar 4 10:13:01 2021 +0100

    ISIS-2560: fully implements ApplicationRole_addPermission
    
    which allows to just add permission with an auto complete search
---
 .../specimpl/ObjectActionParameterAbstract.java    |  4 +-
 .../model/dom/role/ApplicationRole_addAction.java  |  1 +
 .../model/dom/role/ApplicationRole_addClass.java   |  1 +
 .../dom/role/ApplicationRole_addCollection.java    |  1 +
 .../model/dom/role/ApplicationRole_addPackage.java |  1 +
 .../dom/role/ApplicationRole_addPermission.java    | 86 +++++++++++++++++++---
 .../dom/role/ApplicationRole_addProperty.java      |  1 +
 7 files changed, 82 insertions(+), 13 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 06b1356..7641a4d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -175,8 +175,8 @@ implements ObjectActionParameter, HasFacetHolder {
 
     @Override
     public boolean hasAutoComplete() {
-        final ActionParameterAutoCompleteFacet facet = getFacet(ActionParameterAutoCompleteFacet.class);
-        return facet != null;
+        val actionParameterAutoCompleteFacet = getFacet(ActionParameterAutoCompleteFacet.class);
+        return actionParameterAutoCompleteFacet != null;
     }
 
     @Override
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addAction.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addAction.java
index 84d057c..cd3f622 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addAction.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addAction.java
@@ -37,6 +37,7 @@ import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionD
 
 import lombok.RequiredArgsConstructor;
 
+//probably obsolete since ApplicationRole_addPermission
 @Action(
         domainEvent = AddPermissionDomainEvent.class, 
         associateWith = "permissions")
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addClass.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addClass.java
index e597c45..a45c36b 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addClass.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addClass.java
@@ -35,6 +35,7 @@ import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionD
 
 import lombok.RequiredArgsConstructor;
 
+//probably obsolete since ApplicationRole_addPermission
 @Action(
         domainEvent = AddPermissionDomainEvent.class, 
         associateWith = "permissions")
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addCollection.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addCollection.java
index 7555650..e8efcdd 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addCollection.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addCollection.java
@@ -39,6 +39,7 @@ import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionD
 
 import lombok.RequiredArgsConstructor;
 
+// probably obsolete since ApplicationRole_addPermission
 @Action(
         domainEvent = AddPermissionDomainEvent.class, 
         associateWith = "permissions")
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPackage.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPackage.java
index 5bd8e21..88db573 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPackage.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPackage.java
@@ -36,6 +36,7 @@ import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionD
 
 import lombok.RequiredArgsConstructor;
 
+//probably obsolete since ApplicationRole_addPermission
 @Action(
         domainEvent = AddPermissionDomainEvent.class, 
         associateWith = "permissions")
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java
index 7b2ae68..3a4d227 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addPermission.java
@@ -19,20 +19,23 @@
 package org.apache.isis.extensions.secman.model.dom.role;
 
 import java.util.Map;
+import java.util.Objects;
 import java.util.TreeSet;
 import java.util.stream.Collectors;
 
 import javax.enterprise.inject.Model;
 import javax.inject.Inject;
 
+import org.apache.isis.applib.ViewModel;
 import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.MinLength;
+import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
 import org.apache.isis.applib.annotation.ParameterLayout;
-import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository;
 import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeature;
@@ -43,16 +46,18 @@ import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRul
 import org.apache.isis.extensions.secman.api.role.ApplicationRole;
 import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionDomainEvent;
 
+import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.Value;
 import lombok.val;
 import lombok.experimental.Accessors;
 
-//TODO[2560] wip
 @Action(
         domainEvent = AddPermissionDomainEvent.class, 
         associateWith = "permissions")
-@ActionLayout(promptStyle = PromptStyle.DIALOG_MODAL)
 @RequiredArgsConstructor
 public class ApplicationRole_addPermission {
     
@@ -65,7 +70,7 @@ public class ApplicationRole_addPermission {
     public static class Parameters {
         ApplicationPermissionRule rule; // ALLOW/VETO
         ApplicationPermissionMode mode; // r/w
-        String feature;
+        AppFeat feature;
     }
 
     /**
@@ -85,11 +90,9 @@ public class ApplicationRole_addPermission {
             
             @Parameter(optionality = Optionality.MANDATORY)
             @ParameterLayout(named="Feature")
-            final String feature) {
+            final AppFeat feature) {
         
-        val featureId = ApplicationFeatureId.parse(feature);
-        
-        applicationPermissionRepository.newPermission(target, rule, mode, featureId);
+        applicationPermissionRepository.newPermission(target, rule, mode, feature.getFeatureId());
         return target;
     }
 
@@ -104,7 +107,7 @@ public class ApplicationRole_addPermission {
     }
 
     @Model
-    public java.util.Collection<String> autoCompleteFeature(
+    public java.util.Collection<AppFeat> autoCompleteFeature(
             Parameters params,
             @MinLength(3) String search) {
         
@@ -113,7 +116,7 @@ public class ApplicationRole_addPermission {
         return idsByName.entrySet().stream()
         .filter(entry->matches(entry.getKey(), entry.getValue(), search))
         .map(Map.Entry::getValue)
-        .map(ApplicationFeatureId::stringify)
+        .map(AppFeat::new)
         .collect(Collectors.toCollection(TreeSet::new));
     }
 
@@ -121,6 +124,67 @@ public class ApplicationRole_addPermission {
         //TODO yet not very smart
         return featureName.contains(search);
     }
+    
+    // -- FEATURE VIEW MODEL WRAPPING A VALUE TYPE 
 
+    /**
+     * Viewmodel wrapper around value type {@link ApplicationFeatureId}. Introduced,
+     * because at the time of writing, 
+     * autoComplete/choices do not support value types.
+     */
+    @DomainObject(
+            nature = Nature.VIEW_MODEL, 
+            objectType = "isis.ext.secman.AppFeat")
+    @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode
+    public static class AppFeat 
+    implements 
+        Comparable<AppFeat>,
+        ViewModel {
+        
+        @Property
+        @Getter  
+        private ApplicationFeatureId featureId;
+        
+        public String title() {
+            return toString();
+        }
+        
+        @Override
+        public int compareTo(AppFeat o) {
+            val thisId = this.getFeatureId();
+            val otherId = o!=null ? o.getFeatureId() : null;
+            if(Objects.equals(thisId, otherId)) {
+                return 0;
+            }
+            if(thisId==null) {
+                return -1;
+            }
+            if(otherId==null) {
+                return 1;
+            }
+            return this.getFeatureId().compareTo(o.getFeatureId());
+        }
+        
+        @Override
+        public String toString() {
+            return featureId!=null 
+                    ? featureId.getSort().name() + ": " + featureId.getFullyQualifiedName()
+                    : "<no id>";
+        }
+
+        @Override
+        public String viewModelMemento() {
+            return featureId!=null 
+                    ? featureId.asEncodedString() 
+                    : "<no id>";
+        }
+
+        @Override
+        public void viewModelInit(String memento) {
+            featureId = ApplicationFeatureId.parseEncoded(memento); // fail by intention if memento is '<no id>'
+        }
+        
+    }
+    
     
 }
diff --git a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addProperty.java b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addProperty.java
index 0045027..1807349 100644
--- a/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addProperty.java
+++ b/extensions/security/secman/model/src/main/java/org/apache/isis/extensions/secman/model/dom/role/ApplicationRole_addProperty.java
@@ -39,6 +39,7 @@ import org.apache.isis.extensions.secman.api.role.ApplicationRole.AddPermissionD
 
 import lombok.RequiredArgsConstructor;
 
+//probably obsolete since ApplicationRole_addPermission
 @Action(
         domainEvent = AddPermissionDomainEvent.class, 
         associateWith = "permissions")