diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java index 78693f72140c..add33b349aa0 100644 --- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java +++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java @@ -22,6 +22,7 @@ import java.io.InputStream; import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import java.util.EmptyStackException; import java.util.HashMap; import java.util.HashSet; @@ -61,6 +62,9 @@ public class DefaultModuleDefinitionSet implements ModuleDefinitionSet { String root; Map modules; Map contexts = new HashMap(); + + Map> inheritedConfigResourcesMap = new HashMap>(); + ApplicationContext rootContext = null; Set excludes = new HashSet(); Properties configProperties = null; @@ -310,24 +314,36 @@ public Map getContextMap() { @Override public Resource[] getConfigResources(String name) { - Set resources = new LinkedHashSet(); - - ModuleDefinition original = null; - ModuleDefinition def = original = modules.get(name); - - if (def == null) + ModuleDefinition def = modules.get(name); + if (def == null) { return new Resource[] {}; + } + + Set resources = new LinkedHashSet<>(); resources.addAll(def.getContextLocations()); - while (def != null) { - resources.addAll(def.getInheritableContextLocations()); - def = modules.get(def.getParentName()); + resources.addAll(collectInheritedResources(def)); + + resources.addAll(def.getOverrideContextLocations()); + + return resources.toArray(Resource[]::new); + } + + private Set collectInheritedResources(final ModuleDefinition def) { + if (def == null) { + return Collections.emptySet(); } - resources.addAll(original.getOverrideContextLocations()); + final Set cachedResources = inheritedConfigResourcesMap.get(def.getName()); + if (cachedResources != null) { + return cachedResources; + } - return resources.toArray(new Resource[resources.size()]); + final Set inheritableResources = new LinkedHashSet<>(def.getInheritableContextLocations()); + inheritableResources.addAll(collectInheritedResources(modules.get(def.getParentName()))); + inheritedConfigResourcesMap.put(def.getName(), inheritableResources); + return inheritableResources; } @Override