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 2a6d0b63e5c2..f3ba6fe91eba 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> configResourcesMap = new HashMap>(); + ApplicationContext rootContext = null; Set excludes = new HashSet(); Properties configProperties = null; @@ -314,24 +318,35 @@ 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()); + if (configResourcesMap.containsKey(def.getName())) { + return configResourcesMap.get(def.getName()); + } - return resources.toArray(new Resource[resources.size()]); + final Set inheritableResources = new LinkedHashSet<>(def.getInheritableContextLocations()); + inheritableResources.addAll(collectInheritedResources(modules.get(def.getParentName()))); + configResourcesMap.put(def.getName(), inheritableResources); + return inheritableResources; } @Override