diff --git a/README.md b/README.md index e9fea7d..f846001 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Add the following in your `pom.xml`: com.noleme noleme-vault - 0.16.2 + 0.16.3 ``` diff --git a/pom.xml b/pom.xml index 03a437e..9973ee3 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.noleme noleme-vault - 0.16.2 + 0.16.3 jar Noleme Vault diff --git a/src/main/java/com/noleme/vault/container/register/ScopedDefinitions.java b/src/main/java/com/noleme/vault/container/register/ScopedDefinitions.java index 73d754e..aff77c9 100644 --- a/src/main/java/com/noleme/vault/container/register/ScopedDefinitions.java +++ b/src/main/java/com/noleme/vault/container/register/ScopedDefinitions.java @@ -10,11 +10,13 @@ public class ScopedDefinitions extends Definitions { private final String scope; private final String uid; + private int activeReferenceCount; public ScopedDefinitions(String scope) { this.scope = scope; this.uid = UUID.randomUUID().toString(); + this.activeReferenceCount = 0; } public String scope() @@ -33,4 +35,15 @@ public ScopedDefinitions applyScope() return this; } + + public ScopedDefinitions incrementActiveReferenceCount() + { + this.activeReferenceCount++; + return this; + } + + public boolean isActivelyReferenced() + { + return this.activeReferenceCount > 0; + } } diff --git a/src/main/java/com/noleme/vault/parser/VaultCompositeParser.java b/src/main/java/com/noleme/vault/parser/VaultCompositeParser.java index d85f553..5b00c78 100644 --- a/src/main/java/com/noleme/vault/parser/VaultCompositeParser.java +++ b/src/main/java/com/noleme/vault/parser/VaultCompositeParser.java @@ -2,19 +2,20 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.noleme.commons.container.Lists; +import com.noleme.json.Json; +import com.noleme.json.JsonException; import com.noleme.vault.container.register.Definitions; import com.noleme.vault.exception.VaultParserException; import com.noleme.vault.exception.VaultStructureException; import com.noleme.vault.parser.adjuster.VaultAdjuster; import com.noleme.vault.parser.module.*; import com.noleme.vault.parser.module.scope.ScopeModule; +import com.noleme.vault.parser.module.scope.ScopePruningModule; import com.noleme.vault.parser.preprocessor.VaultPreprocessor; import com.noleme.vault.parser.resolver.FlexibleResolver; import com.noleme.vault.parser.resolver.VaultResolver; import com.noleme.vault.parser.resolver.source.Source; -import com.noleme.commons.container.Lists; -import com.noleme.json.Json; -import com.noleme.json.JsonException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,7 +70,8 @@ public static List defaultPostModules() new VariableReplacementModule(), new ScopeModule(), new TagModule(), - new ServiceModule() + new ServiceModule(), + new ScopePruningModule() ); } diff --git a/src/main/java/com/noleme/vault/parser/module/scope/ScopePruningModule.java b/src/main/java/com/noleme/vault/parser/module/scope/ScopePruningModule.java new file mode 100644 index 0000000..11144fb --- /dev/null +++ b/src/main/java/com/noleme/vault/parser/module/scope/ScopePruningModule.java @@ -0,0 +1,34 @@ +package com.noleme.vault.parser.module.scope; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.noleme.vault.container.register.Definitions; +import com.noleme.vault.container.register.ScopedDefinitions; +import com.noleme.vault.exception.VaultParserException; +import com.noleme.vault.parser.module.VaultModule; + +/** + * @author Pierre LECERF (pierre@noleme.com) + * Created on 27/12/2021 + */ +public class ScopePruningModule implements VaultModule +{ + @Override + public String identifier() + { + return "scopes"; + } + + @Override + public void process(ObjectNode node, Definitions definitions) throws VaultParserException + { + /* We loop over all scoped definitions and check if they are still actively referenced (ie. the ScopedImportExtractor did find services using them) */ + for (ScopedDefinitions scope : definitions.scopes().values()) + { + if (scope.isActivelyReferenced()) + continue; + + for (String inactiveScopedService : scope.services().keys()) + definitions.services().remove(inactiveScopedService); + } + } +} diff --git a/src/main/java/com/noleme/vault/parser/module/service/ScopedImportExtractor.java b/src/main/java/com/noleme/vault/parser/module/service/ScopedImportExtractor.java index f67264c..b50d519 100644 --- a/src/main/java/com/noleme/vault/parser/module/service/ScopedImportExtractor.java +++ b/src/main/java/com/noleme/vault/parser/module/service/ScopedImportExtractor.java @@ -49,6 +49,8 @@ public ServiceDefinition extract(ObjectNode json, Definitions definitions) throw if (!scope.services().has(expectedIdentifier)) throw new VaultParserException("Service "+identifier+" makes a reference to a non-existing "+use+" service in scope "+from); + scope.incrementActiveReferenceCount(); + Reference ref = scope.services().reference(expectedIdentifier); ServiceScopedImport def = new ServiceScopedImport(identifier, from, ref);