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);