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/02 09:24:08 UTC

[isis] branch master updated: ISIS-2558: implement ConfigurationViewmodel with support for restricted property visibility policy

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 a9b0fee  ISIS-2558: implement ConfigurationViewmodel with support for restricted property visibility policy
a9b0fee is described below

commit a9b0feedf6f4d1a7eeee08b893dfed0fa117984b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Mar 2 10:23:54 2021 +0100

    ISIS-2558: implement ConfigurationViewmodel with support for restricted
    property visibility policy
---
 .../services/confview/ConfigurationMenu.java       |  16 ++---
 .../confview/ConfigurationViewService.java         |   4 +-
 ...iewService.java => ConfigurationViewmodel.java} |  43 +++++++-----
 .../confview/ConfigurationViewmodel.layout.xml     |  76 +++++++++++++++++++++
 .../services/confview/ConfigurationViewmodel.png   | Bin 0 -> 927 bytes
 .../apache/isis/core/config/IsisConfiguration.java |  25 ++++++-
 .../confmenu/ConfigurationViewServiceDefault.java  |  76 +++++++++++++++++----
 7 files changed, 196 insertions(+), 44 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
index 17b776f..bbc7e27 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
@@ -19,8 +19,6 @@
 
 package org.apache.isis.applib.services.confview;
 
-import java.util.Set;
-
 import javax.inject.Inject;
 import javax.inject.Named;
 
@@ -31,8 +29,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.SemanticsOf;
-
-import lombok.RequiredArgsConstructor;
+import org.apache.isis.applib.services.factory.FactoryService;
 
 /**
  * Simply provides a UI in order to access the configuration properties
@@ -48,11 +45,11 @@ public class ConfigurationMenu {
     public static abstract class ActionDomainEvent
             extends IsisModuleApplib.ActionDomainEvent<ConfigurationMenu> {}
 
-    private final ConfigurationViewService configurationService;
+    private final FactoryService factoryService;
 
     @Inject
-    public ConfigurationMenu(ConfigurationViewService configurationService) {
-        this.configurationService = configurationService;
+    public ConfigurationMenu(FactoryService factoryService) {
+        this.factoryService = factoryService;
     }
 
     public static class ConfigurationDomainEvent
@@ -66,8 +63,9 @@ public class ConfigurationMenu {
             cssClassFa = "fa-wrench"
     )
     @MemberOrder(sequence = "500.900.1")
-    public Set<ConfigurationProperty> configuration(){
-        return configurationService.allProperties();
+    public ConfigurationViewmodel configuration(){
+        return factoryService.viewModel(new ConfigurationViewmodel());
     }
 
+
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewService.java b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewService.java
index 0ca321e..9456779 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewService.java
@@ -38,6 +38,8 @@ public interface ConfigurationViewService {
      * Returns all properties, each as an instance of {@link ConfigurationProperty} (a view model).
      * Mask sensitive values if required.
      */
-    Set<ConfigurationProperty> allProperties();
+    Set<ConfigurationProperty> getVisibleConfigurationProperties();
 
+    Set<ConfigurationProperty> getEnvironmentProperties();
+    
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewService.java b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.java
similarity index 53%
copy from api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewService.java
copy to api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.java
index 0ca321e..7f4d05a 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.java
@@ -16,28 +16,35 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.applib.services.confview;
 
 import java.util.Set;
 
-/**
- * Returns the configuration properties (as view models) such that they can
- * be rendered into the UI (in the Wicket Viewer, under the "Configuration"
- * menu).
- *
- * <p>
- *     This is the backing service used by {@link ConfigurationMenu}.
- * </p>
- *
- * @since 2.0 {@index}
- */
-public interface ConfigurationViewService {
+import javax.inject.Inject;
+
+import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
 
-    /**
-     * Returns all properties, each as an instance of {@link ConfigurationProperty} (a view model).
-     * Mask sensitive values if required.
-     */
-    Set<ConfigurationProperty> allProperties();
+@DomainObject(
+        nature = Nature.VIEW_MODEL,
+        objectType = "isis.applib.ConfigurationViewmodel")
+public class ConfigurationViewmodel {
+    
+    @Inject private ConfigurationViewService configurationService;
 
+    public String title() {
+        return "Configuration";
+    }
+    
+    @Collection
+    public Set<ConfigurationProperty> getEnvironment(){
+        return configurationService.getEnvironmentProperties();
+    }
+    
+    @Collection
+    public Set<ConfigurationProperty> getConfiguration(){
+        return configurationService.getVisibleConfigurationProperties();
+    }
+    
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.layout.xml b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.layout.xml
new file mode 100644
index 0000000..77b65ee
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.layout.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  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.
+-->
+<bs3:grid xsi:schemaLocation="http://isis.apache.org/applib/layout/component http://isis.apache.org/applib/layout/component/component.xsd http://isis.apache.org/applib/layout/grid/bootstrap3 http://isis.apache.org/applib/layout/grid/bootstrap3/bootstrap3.xsd" xmlns:bs3="http://isis.apache.org/applib/layout/grid/bootstrap3" xmlns:cpt="http://isis.apache.org/applib/layout/component" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <bs3:row>
+        <bs3:col span="12" unreferencedActions="true">
+            <cpt:domainObject/>
+        </bs3:col>
+    </bs3:row>
+    <bs3:row>
+        <bs3:col span="2">
+            <bs3:row>
+                <bs3:col span="12">
+                    <bs3:tabGroup>
+                        <bs3:tab name="Identity">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:fieldSet name="Identity" id="identity"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                        <bs3:tab name="Other">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                        <bs3:tab name="Metadata">
+                            <bs3:row>
+                                <bs3:col span="12">
+                                    <cpt:fieldSet name="Metadata" id="metadata"/>
+                                </bs3:col>
+                            </bs3:row>
+                        </bs3:tab>
+                    </bs3:tabGroup>
+                </bs3:col>
+            </bs3:row>
+            <bs3:row>
+                <bs3:col span="12">
+                    <cpt:fieldSet name="Details" id="details"/>
+                </bs3:col>
+            </bs3:row>
+        </bs3:col>
+        <bs3:col span="10">
+            <bs3:tabGroup unreferencedCollections="true">
+                <bs3:tab name="Environment">
+                    <bs3:row>
+                        <bs3:col span="12" size="MD"/>
+                    </bs3:row>
+                </bs3:tab>
+                <bs3:tab name="Configuration">
+                    <bs3:row>
+                        <bs3:col span="12" size="MD"/>
+                    </bs3:row>
+                </bs3:tab>
+            </bs3:tabGroup>
+        </bs3:col>
+    </bs3:row>
+</bs3:grid>
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.png b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.png
new file mode 100644
index 0000000..9d9e1c3
Binary files /dev/null and b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.png differ
diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index 8d0a6c7..64802da 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -1214,6 +1214,29 @@ public class IsisConfiguration {
     @Data
     public static class Core {
 
+        private final Config config = new Config();
+        @Data
+        public static class Config {
+            
+            public static enum ConfigurationPropertyVisibilityPolicy { 
+                NEVER_SHOW,
+                SHOW_ONLY_IN_PROTOTYPE,
+                ALWAYS_SHOW 
+            }
+            
+            /**
+             * Configuration values might contain sensitive data, hence per default, 
+             * configuration properties are only visible with the configuration-page
+             * when <i>prototyping</i>.
+             * <p> 
+             * Alternatively this policy can be set to either <b>always</b> show or <b>never</b> show.  
+             * @see ConfigurationPropertyVisibilityPolicy
+             */
+            private ConfigurationPropertyVisibilityPolicy configurationPropertyVisibilityPolicy 
+                = ConfigurationPropertyVisibilityPolicy.SHOW_ONLY_IN_PROTOTYPE;
+            
+        }
+        
         private final MetaModel metaModel = new MetaModel();
         @Data
         public static class MetaModel {
@@ -1252,7 +1275,7 @@ public class IsisConfiguration {
                  *     For now this is <i>experimental</i>. Leave this disabled (the default).
                  * </p>
                  */
-                private boolean parallelize = false; //TODO[ISIS-2382] concurrent spec-loading is broken
+                private boolean parallelize = false; //TODO[ISIS-2382] concurrent spec-loading is experimental
 
                 /**
                  * Whether all known types should be fully introspected as part of the bootstrapping, or should only be
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/confmenu/ConfigurationViewServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/confmenu/ConfigurationViewServiceDefault.java
index 2f68812..5aad205 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/confmenu/ConfigurationViewServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/confmenu/ConfigurationViewServiceDefault.java
@@ -39,9 +39,10 @@ import org.apache.isis.applib.services.confview.ConfigurationViewService;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.core.config.environment.IsisSystemEnvironment;
 import org.apache.isis.core.config.IsisConfiguration;
+import org.apache.isis.core.config.IsisConfiguration.Core.Config.ConfigurationPropertyVisibilityPolicy;
 import org.apache.isis.core.config.RestEasyConfiguration;
+import org.apache.isis.core.config.environment.IsisSystemEnvironment;
 import org.apache.isis.core.config.util.ValueMaskingUtil;
 
 import lombok.val;
@@ -56,7 +57,10 @@ import lombok.extern.log4j.Log4j2;
 @Primary
 @Qualifier("Default")
 @Log4j2
-public class ConfigurationViewServiceDefault implements ConfigurationViewService, Object_openRestApi.RestfulPathProvider {
+public class ConfigurationViewServiceDefault 
+implements 
+    ConfigurationViewService, 
+    Object_openRestApi.RestfulPathProvider {
 
     private final IsisSystemEnvironment systemEnvironment;
     private final IsisConfiguration configuration;
@@ -73,7 +77,12 @@ public class ConfigurationViewServiceDefault implements ConfigurationViewService
     }
 
     @Override
-    public Set<ConfigurationProperty> allProperties() {
+    public Set<ConfigurationProperty> getEnvironmentProperties() {
+        return new TreeSet<>(env.get().values());
+    }
+    
+    @Override
+    public Set<ConfigurationProperty> getVisibleConfigurationProperties() {
         return new TreeSet<>(config.get().values());
     }
     
@@ -122,29 +131,66 @@ public class ConfigurationViewServiceDefault implements ConfigurationViewService
 
     // -- HELPER
 
+    private _Lazy<Map<String, ConfigurationProperty>> env = _Lazy.of(this::loadEnvironment);
+    
+    private Map<String, ConfigurationProperty> loadEnvironment() {
+        final Map<String, ConfigurationProperty> map = _Maps.newTreeMap();
+        add("Isis Version", IsisSystemEnvironment.VERSION, map);
+        add("Deployment Type", systemEnvironment.getDeploymentType().name(), map);
+        add("Unit Testing", ""+systemEnvironment.isUnitTesting(), map);
+        
+        addSystemProperty("java.version", map);
+        addSystemProperty("java.vm.name", map);
+        addSystemProperty("java.vm.vendor", map);
+        addSystemProperty("java.vm.version", map);
+        addSystemProperty("java.vm.info", map);
+        
+        return map;
+    }
+    
     private _Lazy<Map<String, ConfigurationProperty>> config = _Lazy.of(this::loadConfiguration);
 
     private Map<String, ConfigurationProperty> loadConfiguration() {
-
         final Map<String, ConfigurationProperty> map = _Maps.newTreeMap();
-
-        configuration.getAsMap().forEach((k, v)->add("isis." + k, v, map));
-        restEasyConfiguration.getAsMap().forEach((k, v)->add("resteasy." + k, v, map));
-
-        // for convenience add some additional info to the top ...
-        add("[ Isis Version ]", IsisSystemEnvironment.VERSION, map);
-        add("[ Deployment Type ]", systemEnvironment.getDeploymentType().name(), map);
-        add("[ Unit Testing ]", ""+systemEnvironment.isUnitTesting(), map);
-
+        if(isShowConfigurationProperties()) {
+            configuration.getAsMap().forEach((k, v)->add("isis." + k, v, map));
+            restEasyConfiguration.getAsMap().forEach((k, v)->add("resteasy." + k, v, map));    
+        } else {
+            // if properties are not visible, show at least the policy
+            add("Configuration Property Visibility Policy", 
+                    getConfigurationPropertyVisibilityPolicy().name(), map);
+        }
         return map;
     }
 
     private static void add(String key, String value, Map<String, ConfigurationProperty> map) {
-
         value = ValueMaskingUtil.maskIfProtected(key, value);
-
         map.put(key, new ConfigurationProperty(key, value));
     }
+    
+    private static void addSystemProperty(String key, Map<String, ConfigurationProperty> map) {
+        add(key, System.getProperty(key, "<empty>"), map);
+    }
+
+    private boolean isShowConfigurationProperties() {
+        switch (getConfigurationPropertyVisibilityPolicy()) {
+        case NEVER_SHOW:
+            return false;
+        case SHOW_ONLY_IN_PROTOTYPE:
+            return systemEnvironment.getDeploymentType().isPrototyping();
+        case ALWAYS_SHOW:
+            return true;
+        default:
+            return false;
+        }
+    }
+    
+    private ConfigurationPropertyVisibilityPolicy getConfigurationPropertyVisibilityPolicy() {
+        return Optional.ofNullable(
+                configuration.getCore().getConfig().getConfigurationPropertyVisibilityPolicy())
+                // fallback to configuration default policy
+                .orElseGet(()->new IsisConfiguration.Core.Config().getConfigurationPropertyVisibilityPolicy());
+    }