You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2015/02/06 12:08:25 UTC
svn commit: r1657781 - in /lucene/dev/trunk/solr: ./
core/src/java/org/apache/solr/core/ core/src/java/org/apache/solr/handler/
core/src/test/org/apache/solr/core/
Author: noble
Date: Fri Feb 6 11:08:25 2015
New Revision: 1657781
URL: http://svn.apache.org/r1657781
Log:
SOLR-7083:Support managing all named components in solrconfig such as
requestHandler, queryParser, queryResponseWriter, valueSourceParser,
transformer, queryConverter
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrConfig.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1657781&r1=1657780&r2=1657781&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Fri Feb 6 11:08:25 2015
@@ -101,6 +101,10 @@ New Features
for setting 'highlight' and 'allTermsRequired' in the suggester configuration.
(Boon Low, Varun Thacker via Tomás Fernández Löbbe)
+* SOLR-7083:Support managing all named components in solrconfig such as
+ requestHandler, queryParser, queryResponseWriter, valueSourceParser,
+ transformer, queryConverter (Noble Paul)
+
Bug Fixes
----------------------
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java?rev=1657781&r1=1657780&r2=1657781&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java Fri Feb 6 11:08:25 2015
@@ -46,7 +46,6 @@ public class ConfigOverlay implements Ma
private final Map<String, Object> data;
private Map<String,Object> props;
private Map<String,Object> userProps;
- private Map<String, Map> reqHandlers;
public ConfigOverlay(Map<String,Object> jsonObj, int znodeVersion){
if(jsonObj == null) jsonObj= Collections.EMPTY_MAP;
@@ -56,9 +55,6 @@ public class ConfigOverlay implements Ma
if(props == null) props= Collections.EMPTY_MAP;
userProps = (Map<String, Object>) data.get("userProps");
if(userProps == null) userProps= Collections.EMPTY_MAP;
- reqHandlers = (Map<String, Map>) data.get(SolrRequestHandler.TYPE);
- if(reqHandlers == null) reqHandlers = new LinkedHashMap<>();
-
}
public Object getXPathProperty(String xpath){
return getXPathProperty(xpath,true);
@@ -266,22 +262,24 @@ public class ConfigOverlay implements Ma
result.putAll(data);
return result;
}
-
- public Map<String, Map> getReqHandlers() {
+ public Map<String, Map> getNamedPlugins(String typ){
+ Map<String, Map> reqHandlers = (Map<String, Map>) data.get(typ);
+ if(reqHandlers == null) return Collections.EMPTY_MAP;
return Collections.unmodifiableMap(reqHandlers);
}
- public ConfigOverlay addReqHandler(Map<String, Object> info) {
+
+ public ConfigOverlay addNamedPlugin(Map<String, Object> info, String typ) {
Map dataCopy = RequestParams.getDeepCopy(data, 4);
- Map reqHandler = (Map) dataCopy.get(SolrRequestHandler.TYPE);
- if(reqHandler== null) dataCopy.put(SolrRequestHandler.TYPE, reqHandler = new LinkedHashMap());
+ Map reqHandler = (Map) dataCopy.get(typ);
+ if(reqHandler== null) dataCopy.put(typ, reqHandler = new LinkedHashMap());
reqHandler.put(info.get(CoreAdminParams.NAME) , info);
return new ConfigOverlay(dataCopy, this.znodeVersion);
}
- public ConfigOverlay deleteHandler(String name) {
+ public ConfigOverlay deleteNamedPlugin(String name, String typ) {
Map dataCopy = RequestParams.getDeepCopy(data,4);
- Map reqHandler = (Map) dataCopy.get(SolrRequestHandler.TYPE);
+ Map reqHandler = (Map) dataCopy.get(typ);
if(reqHandler==null) return this;
reqHandler.remove(name);
return new ConfigOverlay(dataCopy,this.znodeVersion);
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java?rev=1657781&r1=1657780&r2=1657781&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java Fri Feb 6 11:08:25 2015
@@ -164,13 +164,8 @@ public final class RequestHandlers {
Map<String, PluginInfo> infoMap= new LinkedHashMap<>();
//deduping implicit and explicit requesthandlers
for (PluginInfo info : implicits) infoMap.put(info.name,info);
- for (PluginInfo info : config.getPluginInfos(SolrRequestHandler.class.getName()))
- if (infoMap.containsKey(info.name)) infoMap.remove(info.name);
- for (Map.Entry e : core.getSolrConfig().getOverlay().getReqHandlers().entrySet())
- infoMap.put((String)e.getKey(), new PluginInfo(SolrRequestHandler.TYPE, (Map)e.getValue()));
-
+ for (PluginInfo info : config.getPluginInfos(SolrRequestHandler.class.getName())) infoMap.put(info.name, info);
ArrayList<PluginInfo> infos = new ArrayList<>(infoMap.values());
- infos.addAll(config.getPluginInfos(SolrRequestHandler.class.getName()));
for (PluginInfo info : infos) {
try {
SolrRequestHandler requestHandler;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrConfig.java?rev=1657781&r1=1657780&r2=1657781&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrConfig.java Fri Feb 6 11:08:25 2015
@@ -95,7 +95,7 @@ public class SolrConfig extends Config i
public static final String DEFAULT_CONF_FILE = "solrconfig.xml";
private RequestParams requestParams;
- static enum PluginOpts {
+ public static enum PluginOpts {
MULTI_OK,
REQUIRE_NAME,
REQUIRE_CLASS,
@@ -295,7 +295,7 @@ public class SolrConfig extends Config i
Config.log.info("Loaded SolrConfig: " + name);
}
- public static List<SolrPluginInfo> plugins = ImmutableList.<SolrPluginInfo>builder()
+ public static final List<SolrPluginInfo> plugins = ImmutableList.<SolrPluginInfo>builder()
.add(new SolrPluginInfo(SolrRequestHandler.class, SolrRequestHandler.TYPE, REQUIRE_NAME, REQUIRE_CLASS, MULTI_OK))
.add(new SolrPluginInfo(QParserPlugin.class, "queryParser", REQUIRE_NAME, REQUIRE_CLASS, MULTI_OK))
.add(new SolrPluginInfo(QueryResponseWriter.class, "queryResponseWriter", REQUIRE_NAME, REQUIRE_CLASS, MULTI_OK))
@@ -323,6 +323,11 @@ public class SolrConfig extends Config i
.add(new SolrPluginInfo(InitParams.class, InitParams.TYPE, MULTI_OK))
.add(new SolrPluginInfo(StatsCache.class, "statsCache", REQUIRE_CLASS))
.build();
+ private static final Map<String, SolrPluginInfo> clsVsInfo = new HashMap<>();
+
+ static {
+ for (SolrPluginInfo plugin : plugins) clsVsInfo.put(plugin.clazz.getName(), plugin);
+ }
public static class SolrPluginInfo{
@@ -627,9 +632,21 @@ public class SolrConfig extends Config i
* SearchComponent, QueryConverter, SolrEventListener, DirectoryFactory,
* IndexDeletionPolicy, IndexReaderFactory, {@link TransformerFactory}
*/
- public List<PluginInfo> getPluginInfos(String type){
+ public List<PluginInfo> getPluginInfos(String type) {
List<PluginInfo> result = pluginStore.get(type);
- return result == null ? Collections.<PluginInfo>emptyList(): result;
+ SolrPluginInfo info = clsVsInfo.get(type);
+ if (info != null && info.options.contains(REQUIRE_NAME)) {
+ Map<String, Map> infos = overlay.getNamedPlugins(info.tag);
+ if (!infos.isEmpty()) {
+ LinkedHashMap<String, PluginInfo> map = new LinkedHashMap<>();
+ if (result != null) for (PluginInfo pluginInfo : result) map.put(pluginInfo.name, pluginInfo);
+ for (Map.Entry<String, Map> e : infos.entrySet()) {
+ map.put(e.getKey(), new PluginInfo(info.tag, e.getValue()));
+ }
+ result = new ArrayList<>(map.values());
+ }
+ }
+ return result == null ? Collections.<PluginInfo>emptyList() : result;
}
public PluginInfo getPluginInfo(String type){
List<PluginInfo> result = pluginStore.get(type);
@@ -741,10 +758,8 @@ public class SolrConfig extends Config i
if(plugin.options.contains(PluginOpts.REQUIRE_NAME)){
LinkedHashMap items = new LinkedHashMap();
for (PluginInfo info : infos) items.put(info.name, info.toMap());
- if(tag.equals(SolrRequestHandler.TYPE)){
- for (Map.Entry e : overlay.getReqHandlers().entrySet()) items.put(e.getKey(),e.getValue());
- }
- result.put(tag,items);
+ for (Map.Entry e : overlay.getNamedPlugins(plugin.tag).entrySet()) items.put(e.getKey(), e.getValue());
+ result.put(tag, items);
} else {
if(plugin.options.contains(MULTI_OK)){
ArrayList<Map> l = new ArrayList<>();
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1657781&r1=1657780&r2=1657781&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java Fri Feb 6 11:08:25 2015
@@ -554,20 +554,35 @@ public final class SolrCore implements S
*@throws SolrException if the object could not be instantiated
*/
private <T> T createInstance(String className, Class<T> cast, String msg) {
+ return createInstance(className,cast,msg, this);
+ }
+
+ /**
+ * Creates an instance by trying a constructor that accepts a SolrCore before
+ * trying the default (no arg) constructor.
+ *
+ * @param className the instance class to create
+ * @param cast the class or interface that the instance should extend or implement
+ * @param msg a message helping compose the exception error if any occurs.
+ * @param core The SolrCore instance for which this object needs to be loaded
+ * @return the desired instance
+ * @throws SolrException if the object could not be instantiated
+ */
+ public static <T> T createInstance(String className, Class<T> cast, String msg, SolrCore core) {
Class<? extends T> clazz = null;
if (msg == null) msg = "SolrCore Object";
try {
- clazz = getResourceLoader().findClass(className, cast);
- //most of the classes do not have constructors which takes SolrCore argument. It is recommended to obtain SolrCore by implementing SolrCoreAware.
- // So invariably always it will cause a NoSuchMethodException. So iterate though the list of available constructors
- Constructor<?>[] cons = clazz.getConstructors();
- for (Constructor<?> con : cons) {
- Class<?>[] types = con.getParameterTypes();
- if(types.length == 1 && types[0] == SolrCore.class){
- return cast.cast(con.newInstance(this));
- }
+ clazz = core.getResourceLoader().findClass(className, cast);
+ //most of the classes do not have constructors which takes SolrCore argument. It is recommended to obtain SolrCore by implementing SolrCoreAware.
+ // So invariably always it will cause a NoSuchMethodException. So iterate though the list of available constructors
+ Constructor<?>[] cons = clazz.getConstructors();
+ for (Constructor<?> con : cons) {
+ Class<?>[] types = con.getParameterTypes();
+ if (types.length == 1 && types[0] == SolrCore.class) {
+ return cast.cast(con.newInstance(core));
}
- return getResourceLoader().newInstance(className, cast);//use the empty constructor
+ }
+ return core.getResourceLoader().newInstance(className, cast);//use the empty constructor
} catch (SolrException e) {
throw e;
} catch (Exception e) {
@@ -578,7 +593,7 @@ public final class SolrCore implements S
throw inner;
}
- throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " failed to instantiate " +cast.getName(), e);
+ throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error Instantiating " + msg + ", " + className + " failed to instantiate " + cast.getName(), e);
}
}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java?rev=1657781&r1=1657780&r2=1657781&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java Fri Feb 6 11:08:25 2015
@@ -22,13 +22,16 @@ import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import com.google.common.collect.ImmutableSet;
import org.apache.solr.cloud.ZkController;
import org.apache.solr.cloud.ZkSolrResourceLoader;
import org.apache.solr.common.SolrException;
@@ -43,11 +46,16 @@ import org.apache.solr.core.PluginInfo;
import org.apache.solr.core.PluginsRegistry;
import org.apache.solr.core.RequestParams;
import org.apache.solr.core.SolrConfig;
+import org.apache.solr.core.SolrCore;
import org.apache.solr.core.SolrResourceLoader;
+import org.apache.solr.handler.component.SearchComponent;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.response.transform.TransformerFactory;
import org.apache.solr.schema.SchemaManager;
+import org.apache.solr.search.QParserPlugin;
+import org.apache.solr.search.ValueSourceParser;
import org.apache.solr.util.CommandOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -56,11 +64,25 @@ import static java.text.MessageFormat.fo
import static java.util.Collections.singletonList;
import static org.apache.solr.common.params.CoreAdminParams.NAME;
import static org.apache.solr.core.ConfigOverlay.NOT_EDITABLE;
+import static org.apache.solr.core.SolrConfig.PluginOpts.REQUIRE_NAME;
import static org.apache.solr.schema.FieldType.CLASS_NAME;
public class SolrConfigHandler extends RequestHandlerBase {
public static final Logger log = LoggerFactory.getLogger(SolrConfigHandler.class);
public static final boolean configEditing_disabled = Boolean.getBoolean("disable.configEdit");
+ private static final Map<String, SolrConfig.SolrPluginInfo> namedPlugins;
+
+ static {
+ Map<String, SolrConfig.SolrPluginInfo> map = new HashMap<>();
+ for (SolrConfig.SolrPluginInfo plugin : SolrConfig.plugins) {
+ if (plugin.options.contains(REQUIRE_NAME)) {
+ map.put(plugin.tag.toLowerCase(Locale.ROOT), plugin);
+
+ }
+ }
+ namedPlugins = Collections.unmodifiableMap(map);
+ }
+
@Override
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
@@ -186,7 +208,7 @@ public class SolrConfigHandler extends R
private void handleParams(ArrayList<CommandOperation> ops, RequestParams params) {
for (CommandOperation op : ops) {
switch (op.name) {
- case CREATE:
+ case SET:
case UPDATE: {
Map<String, Object> map = op.getDataMap();
if (op.hasError()) break;
@@ -282,13 +304,25 @@ public class SolrConfigHandler extends R
case UNSET_USER_PROPERTY:
overlay = applyUnsetUserProp(op, overlay);
break;
- case UPDATE_REQHANDLER:
- case CREATE_REQHANDLER:
- overlay = applyRequestHandler(op, overlay);
- break;
- case DELETE_REQHANDLER:
- overlay = applyDeleteHandler(op,overlay);
- break;
+ default: {
+ List<String> pcs = StrUtils.splitSmart(op.name.toLowerCase(Locale.ROOT), '-');
+ if (pcs.size() != 2) {
+ op.addError(MessageFormat.format("Unknown operation ''{0}'' ", op.name));
+ } else {
+ String prefix = pcs.get(0);
+ String name = pcs.get(1);
+ if (cmdPrefixes.contains(prefix) && namedPlugins.containsKey(name)) {
+ SolrConfig.SolrPluginInfo info = namedPlugins.get(name);
+ if ("delete".equals(prefix)) {
+ overlay = deleteNamedComponent(op, overlay, info.tag);
+ } else {
+ overlay = updateNamedPlugin(info, op, overlay, prefix.equals("create"));
+ }
+ } else {
+ op.addError(MessageFormat.format("Unknown operation ''{0}'' ", op.name));
+ }
+ }
+ }
}
}
List errs = CommandOperation.captureErrors(ops);
@@ -308,49 +342,54 @@ public class SolrConfigHandler extends R
}
}
-
- private ConfigOverlay applyDeleteHandler(CommandOperation op, ConfigOverlay overlay) {
+ private ConfigOverlay deleteNamedComponent(CommandOperation op, ConfigOverlay overlay, String typ) {
String name = op.getStr(CommandOperation.ROOT_OBJ);
- if(op.hasError()) return overlay;
- if(overlay.getReqHandlers().containsKey(name)){
- return overlay.deleteHandler(name);
+ if (op.hasError()) return overlay;
+ if (overlay.getNamedPlugins(typ).containsKey(name)) {
+ return overlay.deleteNamedPlugin(name, typ);
} else {
- op.addError(MessageFormat.format("NO such requestHandler ''{0}'' ",name));
+ op.addError(MessageFormat.format("NO such {0} ''{1}'' ", typ, name));
return overlay;
}
-
}
- private ConfigOverlay applyRequestHandler(CommandOperation op, ConfigOverlay overlay) {
- String name=op.getStr(NAME);
- op.getStr(CLASS_NAME);
+ private ConfigOverlay updateNamedPlugin(SolrConfig.SolrPluginInfo info , CommandOperation op, ConfigOverlay overlay, boolean isCeate) {
+ String name = op.getStr(NAME);
+ String clz = op.getStr(CLASS_NAME);
op.getMap(PluginInfo.DEFAULTS, null);
- op.getMap(PluginInfo.INVARIANTS,null);
- op.getMap(PluginInfo.APPENDS,null);
- if(op.hasError()) return overlay;
-
-
- if(CREATE_REQHANDLER.equals(op.name)) {
- if (overlay.getReqHandlers().containsKey(name)) {
- op.addError(MessageFormat.format(" ''{0}'' already exists . Do an ''{1}'' , if you want to change it ", name, UPDATE_REQHANDLER));
+ op.getMap(PluginInfo.INVARIANTS, null);
+ op.getMap(PluginInfo.APPENDS, null);
+ if (op.hasError()) return overlay;
+ if (!verifyClass(op, clz, info.clazz)) return overlay;
+ if (overlay.getNamedPlugins(info.tag).containsKey(name)) {
+ if (isCeate) {
+ op.addError(MessageFormat.format(" ''{0}'' already exists . Do an ''{1}'' , if you want to change it ", name, "update-" + info.tag.toLowerCase(Locale.ROOT)));
return overlay;
} else {
- return overlay.addReqHandler(op.getDataMap());
+ return overlay.addNamedPlugin(op.getDataMap(), info.tag);
}
- } else if(UPDATE_REQHANDLER.equals(op.name)){
- if (!overlay.getReqHandlers().containsKey(name)) {
- op.addError(MessageFormat.format(" ''{0}'' does not exist . Do an ''{1}'' , if you want to create it ", name, CREATE_REQHANDLER));
- return overlay;
+ } else {
+ if (isCeate) {
+ return overlay.addNamedPlugin(op.getDataMap(), info.tag);
} else {
- return overlay.addReqHandler(op.getDataMap());
-
+ op.addError(MessageFormat.format(" ''{0}'' does not exist . Do an ''{1}'' , if you want to create it ", name, "create-" + info.tag.toLowerCase(Locale.ROOT)));
+ return overlay;
}
}
+ }
- return overlay;
-
-
+ private boolean verifyClass(CommandOperation op, String clz, Class expected) {
+ if (op.getStr("lib", null) == null) {
+ //this is not dynamically loaded so we can verify the class right away
+ try {
+ SolrCore.createInstance(clz, expected, expected.getSimpleName(), req.getCore());
+ } catch (Exception e) {
+ op.addError(e.getMessage());
+ return false;
+ }
+ }
+ return true;
}
private ConfigOverlay applySetUserProp(CommandOperation op, ConfigOverlay overlay) {
@@ -476,10 +515,9 @@ public class SolrConfigHandler extends R
public static final String UNSET_PROPERTY = "unset-property";
public static final String SET_USER_PROPERTY = "set-user-property";
public static final String UNSET_USER_PROPERTY = "unset-user-property";
- public static final String CREATE_REQHANDLER = "create-requesthandler";
- public static final String DELETE_REQHANDLER = "delete-requesthandler";
- public static final String UPDATE_REQHANDLER = "update-requesthandler";
- public static final String CREATE = "set";
+ public static final String SET = "set";
public static final String UPDATE = "update";
+ public static final String CREATE = "create";
+ private static Set<String> cmdPrefixes = ImmutableSet.of(CREATE , UPDATE, "delete");
}
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java?rev=1657781&r1=1657780&r2=1657781&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java Fri Feb 6 11:08:25 2015
@@ -18,11 +18,24 @@ package org.apache.solr.core;
*/
+import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.concurrent.TimeUnit;
+
import com.google.common.collect.ImmutableList;
import org.apache.commons.io.FileUtils;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.handler.TestSolrConfigHandlerCloud;
+import org.apache.solr.common.util.StrUtils;
import org.apache.solr.handler.TestSolrConfigHandlerConcurrent;
import org.apache.solr.util.RestTestBase;
import org.apache.solr.util.RestTestHarness;
@@ -35,23 +48,8 @@ import org.restlet.ext.servlet.ServerSer
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.concurrent.TimeUnit;
-
-import static java.util.Arrays.asList;
import static org.apache.solr.core.ConfigOverlay.getObjectByPath;
import static org.apache.solr.handler.TestBlobHandler.getAsString;
-import static org.apache.solr.handler.TestSolrConfigHandlerCloud.compareValues;
public class TestSolrConfigHandler extends RestTestBase {
public static final Logger log = LoggerFactory.getLogger(TestSolrConfigHandler.class);
@@ -223,6 +221,152 @@ public class TestSolrConfigHandler exten
}
assertTrue( "Could not delete requestHandler ", success);
+ payload = "{\n" +
+ "'create-queryconverter' : { 'name' : 'qc', 'class': 'org.apache.solr.spelling.SpellingQueryConverter'}\n" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "queryConverter", "qc", "class"),
+ "org.apache.solr.spelling.SpellingQueryConverter",
+ 10);
+ payload = "{\n" +
+ "'update-queryconverter' : { 'name' : 'qc', 'class': 'org.apache.solr.spelling.SuggestQueryConverter'}\n" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "queryConverter", "qc", "class"),
+ "org.apache.solr.spelling.SuggestQueryConverter",
+ 10);
+
+ payload = "{\n" +
+ "'delete-queryconverter' : 'qc'" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "queryConverter", "qc"),
+ null,
+ 10);
+
+ payload = "{\n" +
+ "'create-searchcomponent' : { 'name' : 'tc', 'class': 'org.apache.solr.handler.component.TermsComponent'}\n" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "searchComponent", "tc", "class"),
+ "org.apache.solr.handler.component.TermsComponent",
+ 10);
+ payload = "{\n" +
+ "'update-searchcomponent' : { 'name' : 'tc', 'class': 'org.apache.solr.handler.component.TermVectorComponent' }\n" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "searchComponent", "tc", "class"),
+ "org.apache.solr.handler.component.TermVectorComponent",
+ 10);
+
+ payload = "{\n" +
+ "'delete-searchcomponent' : 'tc'" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "searchComponent", "tc"),
+ null,
+ 10);
+ //<valueSourceParser name="countUsage" class="org.apache.solr.core.CountUsageValueSourceParser"/>
+ payload = "{\n" +
+ "'create-valuesourceparser' : { 'name' : 'cu', 'class': 'org.apache.solr.core.CountUsageValueSourceParser'}\n" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "valueSourceParser", "cu", "class"),
+ "org.apache.solr.core.CountUsageValueSourceParser",
+ 10);
+ // <valueSourceParser name="nvl" class="org.apache.solr.search.function.NvlValueSourceParser">
+// <float name="nvlFloatValue">0.0</float>
+// </valueSourceParser>
+ payload = "{\n" +
+ "'update-valuesourceparser' : { 'name' : 'cu', 'class': 'org.apache.solr.search.function.NvlValueSourceParser'}\n" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "valueSourceParser", "cu", "class"),
+ "org.apache.solr.search.function.NvlValueSourceParser",
+ 10);
+
+ payload = "{\n" +
+ "'delete-valuesourceparser' : 'cu'" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "valueSourceParser", "cu"),
+ null,
+ 10);
+// <transformer name="mytrans2" class="org.apache.solr.response.transform.ValueAugmenterFactory" >
+// <int name="value">5</int>
+// </transformer>
+ payload = "{\n" +
+ "'create-transformer' : { 'name' : 'mytrans', 'class': 'org.apache.solr.response.transform.ValueAugmenterFactory', 'value':'5'}\n" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "transformer", "mytrans", "class"),
+ "org.apache.solr.response.transform.ValueAugmenterFactory",
+ 10);
+
+ payload = "{\n" +
+ "'update-transformer' : { 'name' : 'mytrans', 'class': 'org.apache.solr.response.transform.ValueAugmenterFactory', 'value':'6'}\n" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "transformer","mytrans","value"),
+ "6",
+ 10);
+
+ payload = "{\n" +
+ "'delete-transformer' : 'mytrans'" +
+ "}";
+ runConfigCommand(writeHarness, "/config?wt=json", payload);
+ testForResponseElement(writeHarness,
+ testServerBaseUrl,
+ "/config?wt=json",
+ cloudSolrServer,
+ Arrays.asList("config", "transformer", "mytrans"),
+ null,
+ 10);
+
}
public static Map testForResponseElement(RestTestHarness harness,
@@ -252,7 +396,7 @@ public class TestSolrConfigHandler exten
}
- assertTrue(MessageFormat.format("Could not get expected value {0} for path {1} full output {2}", expected, jsonPath, getAsString(m)), success);
+ assertTrue(MessageFormat.format("Could not get expected value ''{0}'' for path ''{1}'' full output: {2}", expected, StrUtils.join(jsonPath, '/'), getAsString(m)), success);
return m;
}