public static void mergePluginLists( PluginContainer childContainer, PluginContainer parentContainer, boolean handleAsInheritance) { if (childContainer == null || parentContainer == null) { // nothing to do. return; } List parentPlugins = parentContainer.getPlugins(); if (parentPlugins == null || parentPlugins.isEmpty()) { return; } List childPlugins = childContainer.getPlugins(); // clone the parent plugin map, since we'll be removing from it Map parentPluginMap = new HashMap(parentContainer.getPluginsAsMap()); List mergedPlugins = new ArrayList(childPlugins.size()); if (!childPlugins.isEmpty()) { for (Iterator itr = childPlugins.iterator(); itr.hasNext();) { Plugin childPlugin = (Plugin) itr.next(); String key = childPlugin.getKey(); Plugin parentPlugin = (Plugin) parentPluginMap.get(key); if (parentPlugin != null) { String parentInherited = parentPlugin.getInherited(); if (!handleAsInheritance || parentInherited == null || Boolean.valueOf(parentInherited).booleanValue()) { mergePluginDefinitions( childPlugin, parentPlugin, handleAsInheritance); if (handleAsInheritance && parentInherited == null) { childPlugin.unsetInheritanceApplied(); } } parentPluginMap.remove(key); } mergedPlugins.add(childPlugin); } } int maxNewSize = mergedPlugins.size() + parentPluginMap.size(); List newChildPlugins = new ArrayList(maxNewSize); for (Iterator itr = parentPlugins.iterator(); itr.hasNext();) { Plugin parentPlugin = (Plugin) itr.next(); if (parentPluginMap.containsKey(parentPlugin.getKey())) { String parentInherited = parentPlugin.getInherited(); if (!handleAsInheritance || parentInherited == null || Boolean.valueOf(parentInherited).booleanValue()) { if (handleAsInheritance && parentInherited == null) { parentPlugin.unsetInheritanceApplied(); } newChildPlugins.add(parentPlugin); } } } newChildPlugins.addAll(mergedPlugins); childContainer.setPlugins(newChildPlugins); childContainer.flushPluginMap(); }