Skip to content

Commit c14d744

Browse files
committed
Support evaluation (macro, functions) during json expansion
1 parent 637d96d commit c14d744

File tree

4 files changed

+34
-31
lines changed

4 files changed

+34
-31
lines changed

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

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

1010
import com.fasterxml.jackson.databind.ObjectMapper;
1111
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
12+
import org.seedstack.coffig.Coffig;
1213
import org.seedstack.coffig.TreeNode;
1314
import org.seedstack.coffig.node.MapNode;
1415
import org.seedstack.coffig.node.NamedNode;
@@ -23,6 +24,12 @@
2324

2425
public class JsonConfigProcessor implements ConfigurationProcessor {
2526
private final ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory());
27+
private Coffig coffig;
28+
29+
@Override
30+
public void initialize(Coffig coffig) {
31+
this.coffig = coffig;
32+
}
2633

2734
@Override
2835
public void process(MapNode configuration) {
@@ -39,11 +46,11 @@ public void process(MapNode configuration) {
3946

4047
// Replace the value with the parsed JSON/YAML
4148
toParse.forEach((parent, list) -> list.forEach(key -> {
42-
TreeNode toChange = parent.remove(key);
4349
String newKey = key.substring(0, key.length() - 5);
50+
String rawValue = (String) coffig.getMapper().map(parent.remove(key), String.class);
4451

4552
try {
46-
parent.set(newKey, JacksonProvider.buildTreeFromString(yamlMapper, toChange.value()));
53+
parent.set(newKey, JacksonProvider.buildTreeFromString(yamlMapper, rawValue));
4754
} catch (Exception e) {
4855
parent.set(newKey, new ValueNode(TreeNode.formatNodeError(e)));
4956
}

core/src/main/java/org/seedstack/seed/core/internal/crypto/DecryptFunction.java

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
package org.seedstack.seed.core.internal.crypto;
99

1010
import com.google.common.io.BaseEncoding;
11-
import java.nio.charset.StandardCharsets;
12-
import java.security.KeyStore;
13-
import java.util.concurrent.atomic.AtomicBoolean;
1411
import org.seedstack.coffig.Coffig;
1512
import org.seedstack.coffig.spi.ConfigFunction;
1613
import org.seedstack.coffig.spi.ConfigFunctionHolder;
@@ -19,25 +16,21 @@
1916
import org.seedstack.seed.crypto.CryptoConfig;
2017
import org.seedstack.seed.crypto.EncryptionService;
2118

19+
import java.nio.charset.StandardCharsets;
20+
import java.security.KeyStore;
21+
import java.util.Optional;
22+
import java.util.concurrent.atomic.AtomicBoolean;
23+
2224
public class DecryptFunction implements ConfigFunctionHolder {
2325
private final AtomicBoolean initInProgress = new AtomicBoolean(false);
24-
private EncryptionServiceFactory encryptionServiceFactory;
25-
private CryptoConfig.KeyStoreConfig masterKeyStoreConfig;
26-
private Exception storedException;
26+
private volatile EncryptionService encryptionService;
27+
private Coffig coffig;
2728

2829
@Override
2930
public void initialize(Coffig coffig) {
31+
this.coffig = coffig;
3032
try {
3133
initInProgress.set(true);
32-
coffig.getOptional(CryptoConfig.KeyStoreConfig.class, "crypto.keystores.master").ifPresent(cfg -> {
33-
try {
34-
KeyStore keyStore = new KeyStoreLoader().load(CryptoConfig.MASTER_KEY_STORE_NAME, cfg);
35-
encryptionServiceFactory = new EncryptionServiceFactory(keyStore);
36-
masterKeyStoreConfig = cfg;
37-
} catch (Exception e) {
38-
storedException = e;
39-
}
40-
});
4134
} finally {
4235
initInProgress.set(false);
4336
}
@@ -50,21 +43,21 @@ public ConfigurationComponent fork() {
5043

5144
@ConfigFunction
5245
String decrypt(String alias, String value) {
53-
if (initInProgress.get()) {
54-
// Cannot decrypt anything during initialization phase
55-
return value;
56-
} else {
57-
if (encryptionServiceFactory == null) {
58-
if (storedException != null) {
59-
throw SeedException.wrap(storedException, CryptoErrorCode.MISSING_MASTER_KEYSTORE);
60-
} else {
61-
throw SeedException.createNew(CryptoErrorCode.MISSING_MASTER_KEYSTORE);
46+
if (encryptionService == null) {
47+
synchronized (this) {
48+
if (encryptionService == null) {
49+
Optional<CryptoConfig.KeyStoreConfig> optional = coffig.getOptional(CryptoConfig.KeyStoreConfig.class, "crypto.keystores.master");
50+
if (optional.isPresent()) {
51+
CryptoConfig.KeyStoreConfig cfg = optional.get();
52+
KeyStore keyStore = new KeyStoreLoader().load(CryptoConfig.MASTER_KEY_STORE_NAME, cfg);
53+
EncryptionServiceFactory encryptionServiceFactory = new EncryptionServiceFactory(keyStore);
54+
encryptionService = CryptoPlugin.getMasterEncryptionService(encryptionServiceFactory, cfg, alias);
55+
} else {
56+
throw SeedException.createNew(CryptoErrorCode.MISSING_MASTER_KEYSTORE);
57+
}
6258
}
6359
}
64-
EncryptionService encryptionService = CryptoPlugin.getMasterEncryptionService(encryptionServiceFactory,
65-
masterKeyStoreConfig,
66-
alias);
67-
return new String(encryptionService.decrypt(BaseEncoding.base16().decode(value)), StandardCharsets.UTF_8);
6860
}
61+
return new String(encryptionService.decrypt(BaseEncoding.base16().decode(value)), StandardCharsets.UTF_8);
6962
}
7063
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@
3232
import org.seedstack.seed.core.fixtures.DummyService1;
3333
import org.seedstack.seed.core.fixtures.Service;
3434
import org.seedstack.seed.core.fixtures.SomeEnum;
35+
import org.seedstack.seed.testing.SystemProperty;
3536
import org.seedstack.seed.testing.junit4.SeedITRunner;
3637
import some.other.pkg.ForeignClass;
3738

3839
@RunWith(SeedITRunner.class)
40+
@SystemProperty(name = "testJsonProp", value = "{ \"key2\": \"val2\" }")
3941
public class ConfigurationIT {
4042
@Inject
4143
private Injector injector;
@@ -182,6 +184,7 @@ public void configuration_functions() {
182184
public void json_expansion() {
183185
Coffig configuration = injector.getInstance(Application.class).getConfiguration();
184186
assertThat(configuration.get(String.class, "jsonVal.key1")).isEqualTo("val1");
187+
assertThat(configuration.get(String.class, "jsonValThroughSysProp.key2")).isEqualTo("val2");
185188
}
186189

187190
@Test

core/src/test/resources/application.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ functions:
8383
availableUdpPort: $availableUdpPort('port2')
8484
randomUuid: $randomUuid()
8585
jsonVal|json: '{ "key1": "val1" }'
86-
86+
jsonValThroughSysProp|json: ${sys.testJsonProp}
8787
arrayOfMapContainer:
8888
basicProperty: customId
8989
arrayOfMaps:

0 commit comments

Comments
 (0)