This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/main by this push:
new b3f341e4c13 CAUSEWAY-3893: on retrieval errors of
CausewayConfiguration#valueOf(..) log instead of throw
b3f341e4c13 is described below
commit b3f341e4c13dfa9d3c9883e6a7f2530d3c7a29ec
Author: Andi Huber <[email protected]>
AuthorDate: Wed May 28 04:41:29 2025 +0200
CAUSEWAY-3893: on retrieval errors of CausewayConfiguration#valueOf(..)
log instead of throw
---
.../core/config/CausewayConfiguration.java | 22 ++++++++++++++++++++++
.../confmenu/ConfigurationViewServiceDefault.java | 12 ++++++++++--
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git
a/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
b/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
index 92a88f3aae4..7d41f7111cb 100644
---
a/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
+++
b/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
@@ -33,6 +33,7 @@
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.Callable;
+import java.util.function.Consumer;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -58,6 +59,8 @@
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
+import org.jspecify.annotations.Nullable;
+
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import
org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
@@ -88,6 +91,7 @@
import org.apache.causeway.applib.services.userui.UserMenu;
import
org.apache.causeway.applib.value.semantics.TemporalValueSemantics.TemporalDisplayPattern;
import
org.apache.causeway.applib.value.semantics.TemporalValueSemantics.TemporalEditingPattern;
+import org.apache.causeway.commons.functional.Try;
import org.apache.causeway.commons.internal.base._NullSafe;
import org.apache.causeway.commons.internal.context._Context;
import org.apache.causeway.core.config.metamodel.facets.ActionConfigOptions;
@@ -189,6 +193,24 @@ public Optional<String> valueOf(final String
configurationPropertyName) {
return
Optional.ofNullable(environment.getProperty(configurationPropertyName));
}
+ /**
+ * The value of a specific configuration property
+ *
+ * @param configurationPropertyName - eg as obtained from {@link
#streamConfigurationPropertyNames()}.
+ * @param onError - callback in case the value retrieval thorws any
exception
+ */
+ public Optional<String> valueOf(final String configurationPropertyName,
final @Nullable Consumer<Throwable> onError) {
+ try {
+ return
Optional.ofNullable(environment.getProperty(configurationPropertyName));
+ } catch (Throwable t) {
+ if(onError!=null) {
+ Try.run(()->onError.accept(t));
+ }
+ return Optional.empty();
+ }
+
+ }
+
private final Security security = new Security();
@Data
public static class Security {
diff --git
a/core/webapp/src/main/java/org/apache/causeway/core/webapp/confmenu/ConfigurationViewServiceDefault.java
b/core/webapp/src/main/java/org/apache/causeway/core/webapp/confmenu/ConfigurationViewServiceDefault.java
index ec94c031d8d..3378420a6dd 100644
---
a/core/webapp/src/main/java/org/apache/causeway/core/webapp/confmenu/ConfigurationViewServiceDefault.java
+++
b/core/webapp/src/main/java/org/apache/causeway/core/webapp/confmenu/ConfigurationViewServiceDefault.java
@@ -192,7 +192,9 @@ private Map<String, ConfigurationProperty>
loadPrimary(final List<String> primar
configuration.streamConfigurationPropertyNames()
.filter(propName->primaryPrefixes.stream().anyMatch(propName::startsWith))
.forEach(propName -> {
- String propertyValue =
configuration.valueOf(propName).orElse(null);
+ String propertyValue = configuration
+ .valueOf(propName, ex->logRetrievalFailure(propName,
ex))
+ .orElse(null);
add(propName, propertyValue, map);
});
@@ -218,7 +220,9 @@ private Map<String, ConfigurationProperty>
loadSecondary(final Set<String> toBeE
configuration.streamConfigurationPropertyNames()
.filter(propName->!toBeExcluded.contains(propName))
.forEach(propName -> {
- String propertyValue =
configuration.valueOf(propName).orElse(null);
+ String propertyValue = configuration
+ .valueOf(propName, ex->logRetrievalFailure(propName,
ex))
+ .orElse(null);
add(propName, propertyValue, map);
});
@@ -229,6 +233,10 @@ private Map<String, ConfigurationProperty>
loadSecondary(final Set<String> toBeE
}
return map;
}
+
+ private static void logRetrievalFailure(final String propName, Throwable
error) {
+ log.warn("failed to load configuration property '{}'", propName,
error);
+ }
private static void add(final String key, String value, final Map<String,
ConfigurationProperty> map) {
value = ValueMaskingUtil.maskIfProtected(key, value);