diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/transformation/TransformationRuleEngine.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/transformation/TransformationRuleEngine.java index ca361f005..bc5998991 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/transformation/TransformationRuleEngine.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/transformation/TransformationRuleEngine.java @@ -16,7 +16,7 @@ public class TransformationRuleEngine implements RuleEngine { private String ruleDefinitionsFileName; final List rules = new ArrayList<>(); - + volatile boolean rulesLoaded = false; private static final TransformationRuleEngine INSTANCE = new TransformationRuleEngine(); @Inject Logger logger; @@ -32,14 +32,14 @@ private TransformationRuleEngine() {} @Override public void unloadRules() { rules.clear(); + rulesLoaded = false; } @Override public void ensureRulesLoaded() throws RuleLoaderException { - // Double-checked locking - needed to protect from excessive sync locks - if (rules.isEmpty()) { - synchronized (this) { - if (rules.isEmpty()) { + if (!rulesLoaded) { + synchronized (rules) { + if (!rulesLoaded) { InputStream resourceStream = getClass() .getClassLoader() @@ -51,7 +51,8 @@ public void ensureRulesLoaded() throws RuleLoaderException { } List parsedRules = ruleLoader.loadRules(resourceStream, new TypeReference<>() {}); - this.rules.addAll(parsedRules); + rules.addAll(parsedRules); + rulesLoaded = true; } } } diff --git a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/validation/ValidationRuleEngine.java b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/validation/ValidationRuleEngine.java index 33b39ec4e..209da7c72 100644 --- a/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/validation/ValidationRuleEngine.java +++ b/etor/src/main/java/gov/hhs/cdc/trustedintermediary/etor/ruleengine/validation/ValidationRuleEngine.java @@ -16,7 +16,7 @@ public class ValidationRuleEngine implements RuleEngine { private String ruleDefinitionsFileName; final List rules = new ArrayList<>(); - + volatile boolean rulesLoaded = false; private static final ValidationRuleEngine INSTANCE = new ValidationRuleEngine(); @Inject Logger logger; @@ -32,14 +32,14 @@ private ValidationRuleEngine() {} @Override public void unloadRules() { rules.clear(); + rulesLoaded = false; } @Override public void ensureRulesLoaded() throws RuleLoaderException { - // Double-checked locking - needed to protect from excessive sync locks - if (rules.isEmpty()) { - synchronized (this) { - if (rules.isEmpty()) { + if (!rulesLoaded) { + synchronized (rules) { + if (!rulesLoaded) { InputStream resourceStream = getClass() .getClassLoader() @@ -51,7 +51,8 @@ public void ensureRulesLoaded() throws RuleLoaderException { } List parsedRules = ruleLoader.loadRules(resourceStream, new TypeReference<>() {}); - this.rules.addAll(parsedRules); + rules.addAll(parsedRules); + rulesLoaded = true; } } }