Skip to content

Commit 894493e

Browse files
authored
Merge branch 'master' into update-maven-repository-url-https
2 parents 5abd51e + 62b786e commit 894493e

File tree

16 files changed

+153
-43
lines changed

16 files changed

+153
-43
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
* [new] Support JSON and YAML expansion in configuration. Use a `myKey|json` or `myKey|yaml` as key syntax. The suffix
44
will be removed and the value will be replaced by the parsed subtree. Useful for parsing JSON structures passed by
55
cloud platforms.
6+
* [new] The `SEEDSTACK_PROFILES` environment variable can now be used to specify comma-separated configuration profiles
7+
to enable. These profiles will be added to the profiles already defined in the `seedstack.profiles` system property if
8+
any.
9+
* [new] If config option `rest.diagnosticResource` is set to `true`, the diagnostic report will be available as a JSON
10+
representation at `/seedstack/diagnostic`. Do not enable permanently in production. Default is `false`.
611

712
# Version 3.12.1 (2021-05-21)
813

core/src/main/java/org/seedstack/seed/core/SeedRuntime.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,7 @@
88

99
package org.seedstack.seed.core;
1010

11-
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
1211
import io.nuun.kernel.api.Plugin;
13-
import java.io.IOException;
14-
import java.util.Collection;
15-
import java.util.HashMap;
16-
import java.util.HashSet;
17-
import java.util.Map;
18-
import java.util.ServiceLoader;
19-
import java.util.Set;
2012
import org.seedstack.coffig.Coffig;
2113
import org.seedstack.coffig.provider.CompositeProvider;
2214
import org.seedstack.coffig.provider.InMemoryProvider;
@@ -26,9 +18,15 @@
2618
import org.seedstack.seed.diagnostic.spi.DiagnosticInfoCollector;
2719
import org.seedstack.seed.spi.ConfigurationPriority;
2820

21+
import java.util.Collection;
22+
import java.util.HashMap;
23+
import java.util.HashSet;
24+
import java.util.Map;
25+
import java.util.ServiceLoader;
26+
import java.util.Set;
27+
2928
public class SeedRuntime {
3029
private static final String SEED_PACKAGE_PREFIX = "org.seedstack.seed";
31-
private static final YAMLMapper yamlMapper = new YAMLMapper();
3230
private final Object context;
3331
private final DiagnosticManager diagnosticManager;
3432
private final Coffig configuration;
@@ -45,7 +43,7 @@ private SeedRuntime(Object context, DiagnosticManager diagnosticManager, Coffig
4543
this.configuration = configuration;
4644
this.seedVersion = seedVersion;
4745
this.businessVersion = businessVersion;
48-
this.diagnosticManager.registerDiagnosticInfoCollector("seed", new RuntimeDiagnosticCollector());
46+
this.diagnosticManager.registerDiagnosticInfoCollector("seedstack", new RuntimeDiagnosticCollector());
4947
this.prioritizedProvider = ((CompositeProvider) this.configuration.getProvider()).get(
5048
PrioritizedProvider.class);
5149
this.inMemoryProvider = new InMemoryProvider();
@@ -168,11 +166,6 @@ public Map<String, Object> collect() {
168166
result.put("businessVersion", businessVersion == null ? "UNKNOWN" : businessVersion);
169167
result.put("inconsistentPlugins", inconsistentPlugins);
170168
result.put("contextClass", context == null ? "NONE" : context.getClass().getName());
171-
try {
172-
result.put("configuration", yamlMapper.readValue(configuration.toString(), Map.class));
173-
} catch (IOException | RuntimeException e) {
174-
result.put("rawConfiguration", configuration.toString());
175-
}
176169

177170
return result;
178171
}

core/src/main/java/org/seedstack/seed/core/internal/configuration/ApplicationDiagnosticCollector.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,19 @@
77
*/
88
package org.seedstack.seed.core.internal.configuration;
99

10-
import java.util.HashMap;
11-
import java.util.Map;
10+
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
1211
import org.seedstack.seed.Application;
1312
import org.seedstack.seed.diagnostic.spi.DiagnosticInfoCollector;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
15+
16+
import java.io.IOException;
17+
import java.util.HashMap;
18+
import java.util.Map;
1419

1520
class ApplicationDiagnosticCollector implements DiagnosticInfoCollector {
21+
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationDiagnosticCollector.class);
22+
private final YAMLMapper yamlMapper = new YAMLMapper();
1623
private final Application application;
1724

1825
ApplicationDiagnosticCollector(Application application) {
@@ -30,6 +37,15 @@ public Map<String, Object> collect() {
3037
result.put("storage", application.getStorageLocation(""));
3138
}
3239

40+
try {
41+
result.put("configuration", yamlMapper.readValue(application.getConfiguration().toString(), Map.class));
42+
} catch (IOException | RuntimeException e) {
43+
LOGGER.warn("Error building diagnostic configuration, using toString() instead", e);
44+
result.put("configuration", application.getConfiguration().toString());
45+
}
46+
47+
result.put("configurationProfiles", application.getConfigurationProfiles());
48+
3349
return result;
3450
}
3551
}

core/src/main/java/org/seedstack/seed/core/internal/configuration/ApplicationImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@
88
package org.seedstack.seed.core.internal.configuration;
99

1010
import com.google.inject.util.Types;
11+
1112
import java.io.File;
1213
import java.util.Collections;
1314
import java.util.Map;
15+
import java.util.Set;
16+
1417
import org.seedstack.coffig.Coffig;
1518
import org.seedstack.coffig.node.ValueNode;
1619
import org.seedstack.seed.Application;
@@ -77,6 +80,11 @@ public Coffig getConfiguration() {
7780
return coffig;
7881
}
7982

83+
@Override
84+
public Set<String> getConfigurationProfiles() {
85+
return ProfileProcessor.activeProfiles();
86+
}
87+
8088
@Override
8189
@SuppressWarnings("unchecked")
8290
public <T> ClassConfiguration<T> getConfiguration(Class<T> someClass) {

core/src/main/java/org/seedstack/seed/core/internal/configuration/ProfileProcessor.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,26 @@
88
package org.seedstack.seed.core.internal.configuration;
99

1010
import com.google.common.base.Strings;
11+
import org.seedstack.coffig.TreeNode;
12+
import org.seedstack.coffig.node.MapNode;
13+
import org.seedstack.coffig.spi.ConfigurationProcessor;
14+
1115
import java.util.ArrayList;
1216
import java.util.Arrays;
1317
import java.util.HashMap;
18+
import java.util.HashSet;
1419
import java.util.List;
1520
import java.util.Map;
21+
import java.util.Optional;
1622
import java.util.Set;
1723
import java.util.function.Predicate;
1824
import java.util.regex.Matcher;
1925
import java.util.regex.Pattern;
2026
import java.util.stream.Collectors;
21-
import org.seedstack.coffig.TreeNode;
22-
import org.seedstack.coffig.node.MapNode;
23-
import org.seedstack.coffig.spi.ConfigurationProcessor;
2427

2528
public class ProfileProcessor implements ConfigurationProcessor {
2629
private static final String SEEDSTACK_PROFILES_PROPERTY = "seedstack.profiles";
30+
private static final String SEEDSTACK_PROFILES_ENV = "SEEDSTACK_PROFILES";
2731
private static Pattern keyWithProfilePattern = Pattern.compile("(.*)<([,\\s\\w]+)>");
2832
private static Predicate<String> notNullOrEmpty = ((Predicate<String>) Strings::isNullOrEmpty).negate();
2933

@@ -67,6 +71,9 @@ private static Set<String> parseProfiles(String value) {
6771
}
6872

6973
static Set<String> activeProfiles() {
70-
return parseProfiles(System.getProperty(SEEDSTACK_PROFILES_PROPERTY, ""));
74+
Set<String> activeProfiles = new HashSet<>();
75+
activeProfiles.addAll(parseProfiles(System.getProperty(SEEDSTACK_PROFILES_PROPERTY, "")));
76+
activeProfiles.addAll(parseProfiles(Optional.ofNullable(System.getenv(SEEDSTACK_PROFILES_ENV)).orElse("")));
77+
return activeProfiles;
7178
}
7279
}

core/src/main/java/org/seedstack/seed/core/internal/configuration/SecureConfigurationProcessor.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,16 @@
77
*/
88
package org.seedstack.seed.core.internal.configuration;
99

10-
import java.util.Locale;
1110
import org.seedstack.coffig.TreeNode;
1211
import org.seedstack.coffig.node.MapNode;
1312
import org.seedstack.coffig.node.NamedNode;
1413
import org.seedstack.coffig.spi.ConfigurationProcessor;
1514

15+
import java.util.Locale;
16+
1617
public class SecureConfigurationProcessor implements ConfigurationProcessor {
1718
@Override
1819
public void process(MapNode configuration) {
19-
configuration.get("env").ifPresent(TreeNode::hide);
20-
configuration.get("sys").ifPresent(TreeNode::hide);
2120
configuration.walk()
2221
.filter(node -> node.type() == TreeNode.Type.MAP_NODE)
2322
.forEach(node -> node.namedNodes()
@@ -28,6 +27,6 @@ public void process(MapNode configuration) {
2827

2928
private boolean isPotentialPassword(NamedNode namedNode) {
3029
String key = namedNode.name().toUpperCase(Locale.ENGLISH);
31-
return key.contains("PASSWORD") || key.contains("PASSWD") || key.contains("PWD");
30+
return key.contains("PASSWORD") || key.contains("PASSWD") || key.contains("PWD") || key.contains("SECRET");
3231
}
3332
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
org.seedstack.seed.core.internal.configuration.SystemPropertiesProcessor
22
org.seedstack.seed.core.internal.configuration.RemovalProcessor
33
org.seedstack.seed.core.internal.configuration.ProfileProcessor
4-
org.seedstack.seed.core.internal.configuration.SecureConfigurationProcessor
54
org.seedstack.seed.core.internal.configuration.JsonConfigProcessor
5+
org.seedstack.seed.core.internal.configuration.SecureConfigurationProcessor

core/src/test/java/custom/CustomApplicationProvider.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import java.io.File;
1111
import java.util.Map;
12+
import java.util.Set;
1213
import javax.inject.Provider;
1314
import org.seedstack.coffig.Coffig;
1415
import org.seedstack.seed.Application;
@@ -50,6 +51,11 @@ public Coffig getConfiguration() {
5051
return null;
5152
}
5253

54+
@Override
55+
public Set<String> getConfigurationProfiles() {
56+
return null;
57+
}
58+
5359
@Override
5460
public <T> ClassConfiguration<T> getConfiguration(Class<T> someClass) {
5561
return null;

core/src/test/java/org/seedstack/seed/core/DiagnosticManagerIT.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,10 @@ public void seed_info_is_present() {
6868

6969
assertThat(diagnosticInfo).isNotNull();
7070

71-
Map<String, Object> seedInfo = (Map<String, Object>) diagnosticInfo.get("seed");
71+
Map<String, Object> seedInfo = (Map<String, Object>) diagnosticInfo.get("seedstack");
7272
assertThat((String) (seedInfo.get("version"))).isNotEmpty();
7373
assertThat((Set<String>) (seedInfo.get("inconsistentPlugins"))).isNotNull();
7474
assertThat((String) (seedInfo.get("contextClass"))).isNotEmpty();
75-
assertThat(seedInfo.get("configuration")).isNotNull();
7675
}
7776

7877
@Test
@@ -104,7 +103,9 @@ public void diagnostic_application_information_is_present() {
104103
assertThat(applicationInfo.get("id")).isNotNull();
105104
assertThat(applicationInfo.get("name")).isNotNull();
106105
assertThat(applicationInfo.get("version")).isNotNull();
107-
assertThat(applicationInfo.get("storage-location")).isNull();
106+
assertThat(applicationInfo.get("storage")).isNotNull(); // storage is automatically enabled during integration testing
107+
assertThat(applicationInfo.get("configuration")).isNotNull();
108+
assertThat(applicationInfo.get("configurationProfiles")).isNotNull();
108109
}
109110

110111
@Test
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright © 2013-2021, The SeedStack authors <http://seedstack.org>
3+
*
4+
* This Source Code Form is subject to the terms of the Mozilla Public
5+
* License, v. 2.0. If a copy of the MPL was not distributed with this
6+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
7+
*/
8+
package org.seedstack.seed.rest.internal;
9+
10+
import org.seedstack.seed.diagnostic.DiagnosticManager;
11+
import org.seedstack.seed.diagnostic.spi.DiagnosticInfoCollector;
12+
13+
import javax.inject.Inject;
14+
import javax.ws.rs.GET;
15+
import javax.ws.rs.Path;
16+
import javax.ws.rs.Produces;
17+
import javax.ws.rs.core.MediaType;
18+
import java.util.Map;
19+
20+
@Path("/seedstack/diagnostic")
21+
public class DiagnosticResource {
22+
@Inject
23+
private DiagnosticManager diagnosticManager;
24+
25+
@GET
26+
@Produces(MediaType.APPLICATION_JSON)
27+
public Map<String, Object> diag() {
28+
return diagnosticManager.getDiagnosticInfo(null);
29+
}
30+
}

0 commit comments

Comments
 (0)