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;
   }