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());
+ }