diff --git a/solr/core/src/java/org/apache/solr/core/InitParams.java b/solr/core/src/java/org/apache/solr/core/InitParams.java index e9dde6d8543..29c5ee47b0e 100644 --- a/solr/core/src/java/org/apache/solr/core/InitParams.java +++ b/solr/core/src/java/org/apache/solr/core/InitParams.java @@ -78,10 +78,16 @@ public class InitParams { } - public void apply(NamedList initArgs) { - merge( (NamedList) initArgs.get(PluginInfo.DEFAULTS), defaults,initArgs, PluginInfo.DEFAULTS, false); - merge((NamedList) initArgs.get(PluginInfo.INVARIANTS), invariants, initArgs, PluginInfo.INVARIANTS, false); - merge((NamedList) initArgs.get(PluginInfo.APPENDS), appends, initArgs, PluginInfo.APPENDS, true); + public void apply(PluginInfo info) { + if (info.isFromSolrConfig) { + //if this is a component implicitly defined in code it should be overridden by initPrams + merge(defaults, (NamedList) info.initArgs.get(PluginInfo.DEFAULTS) ,info.initArgs, PluginInfo.DEFAULTS, false); + } else { + //if the args is initialized from solrconfig.xml inside the requesthHandler it should be taking precedence over initParams + merge( (NamedList) info.initArgs.get(PluginInfo.DEFAULTS), defaults,info.initArgs, PluginInfo.DEFAULTS, false); + } + merge((NamedList) info.initArgs.get(PluginInfo.INVARIANTS), invariants, info.initArgs, PluginInfo.INVARIANTS, false); + merge((NamedList) info.initArgs.get(PluginInfo.APPENDS), appends, info.initArgs, PluginInfo.APPENDS, true); } private static void merge(NamedList first, NamedList second, NamedList sink, String name, boolean appends) { diff --git a/solr/core/src/java/org/apache/solr/core/PluginInfo.java b/solr/core/src/java/org/apache/solr/core/PluginInfo.java index 2cae0efb07a..007dadfda5f 100644 --- a/solr/core/src/java/org/apache/solr/core/PluginInfo.java +++ b/solr/core/src/java/org/apache/solr/core/PluginInfo.java @@ -34,6 +34,7 @@ public class PluginInfo implements MapSerializable{ public final NamedList initArgs; public final Map attributes; public final List children; + public final boolean isFromSolrConfig; public PluginInfo(String type, Map attrs ,NamedList initArgs, List children) { this.type = type; @@ -42,6 +43,7 @@ public class PluginInfo implements MapSerializable{ this.initArgs = initArgs; attributes = unmodifiableMap(attrs); this.children = children == null ? Collections.emptyList(): unmodifiableList(children); + isFromSolrConfig = false; } @@ -52,6 +54,7 @@ public class PluginInfo implements MapSerializable{ initArgs = DOMUtil.childNodesToNamedList(node); attributes = unmodifiableMap(DOMUtil.toMap(node.getAttributes())); children = loadSubPlugins(node); + isFromSolrConfig = true; } private List loadSubPlugins(Node node) { diff --git a/solr/core/src/java/org/apache/solr/core/RequestHandlers.java b/solr/core/src/java/org/apache/solr/core/RequestHandlers.java index e50377f1ab7..6abb35611e0 100644 --- a/solr/core/src/java/org/apache/solr/core/RequestHandlers.java +++ b/solr/core/src/java/org/apache/solr/core/RequestHandlers.java @@ -212,7 +212,7 @@ public final class RequestHandlers { if(!ags.isEmpty()){ info = new PluginInfo(info.type, info.attributes, info.initArgs.clone(), info.children); for (InitParams initParam : ags) { - initParam.apply(info.initArgs); + initParam.apply(info); } } return info; diff --git a/solr/core/src/test/org/apache/solr/core/TestInitParams.java b/solr/core/src/test/org/apache/solr/core/TestInitParams.java index 205a8b5936d..86816755a5c 100644 --- a/solr/core/src/test/org/apache/solr/core/TestInitParams.java +++ b/solr/core/src/test/org/apache/solr/core/TestInitParams.java @@ -18,6 +18,7 @@ package org.apache.solr.core; */ import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.common.cloud.ZkNodeProps; import org.apache.solr.common.util.NamedList; import org.apache.solr.request.SolrRequestHandler; import org.apache.solr.response.SolrQueryResponse; @@ -25,6 +26,9 @@ import org.junit.BeforeClass; import org.junit.Test; import java.util.Arrays; +import java.util.HashMap; + +import static java.util.Collections.singletonMap; public class TestInitParams extends SolrTestCaseJ4 { @BeforeClass @@ -46,6 +50,14 @@ public class TestInitParams extends SolrTestCaseJ4 { def = (NamedList) nl.get(PluginInfo.APPENDS); assertEquals("C", def.get("c")); } + + InitParams initParams = h.getCore().getSolrConfig().getInitParams().get("a"); + + PluginInfo pluginInfo = new PluginInfo("requestHandler", + new HashMap(), + new NamedList<>(singletonMap("defaults", new NamedList(ZkNodeProps.makeMap("a", "A1")))), null); + initParams.apply(pluginInfo); + assertEquals( "A",initParams.defaults.get("a")); } @Test