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 2016/09/03 18:11:37 UTC

[1/2] lucene-solr:apiv2: SOLR-8029: more feedback from Steve addressed. ADDROLE, REMOVEROLE commands added

Repository: lucene-solr
Updated Branches:
  refs/heads/apiv2 327aaffae -> 92411981a


SOLR-8029:  more feedback from Steve addressed. ADDROLE, REMOVEROLE commands added


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/baec9703
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/baec9703
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/baec9703

Branch: refs/heads/apiv2
Commit: baec97036a2c0413830f0717f5adf1d7871b5b3c
Parents: 22f1be6
Author: Noble Paul <no...@apache.org>
Authored: Sat Sep 3 22:11:13 2016 +0530
Committer: Noble Paul <no...@apache.org>
Committed: Sat Sep 3 22:11:13 2016 +0530

----------------------------------------------------------------------
 solr/core/src/java/org/apache/solr/api/Api.java |   6 +-
 .../src/java/org/apache/solr/api/ApiBag.java    |  62 ++--
 .../java/org/apache/solr/api/SpecProvider.java  |   4 +-
 .../java/org/apache/solr/api/V2HttpCall.java    |  14 +-
 .../apache/solr/handler/DumpRequestHandler.java |   2 +-
 .../solr/handler/UpdateRequestHandler.java      |   2 +-
 .../solr/handler/UpdateRequestHandlerApi.java   |   2 -
 .../apache/solr/handler/admin/ApiCommand.java   |   5 -
 .../handler/admin/BaseHandlerApiSupport.java    |   4 +-
 .../handler/admin/CollectionHandlerApi.java     |  30 +-
 .../apache/solr/request/SolrQueryRequest.java   |   2 +-
 .../solr/request/SolrQueryRequestBase.java      |   6 +-
 .../apache/solr/security/BasicAuthPlugin.java   |   4 +-
 .../security/RuleBasedAuthorizationPlugin.java  |   8 +-
 .../security/Sha256AuthenticationProvider.java  |   5 +-
 .../org/apache/solr/servlet/HttpSolrCall.java   |  12 +-
 .../apache/solr/servlet/SolrRequestParsers.java |   2 +-
 .../src/java/org/apache/solr/util/PathTrie.java |  35 ++-
 .../src/resources/apispec/cluster.Commands.json |  48 +++
 .../core/src/resources/apispec/node.invoke.json |   8 +-
 .../test/org/apache/solr/api/TestPathTrie.java  |  23 +-
 .../apache/solr/core/TestSolrConfigHandler.java |   9 +-
 .../solr/handler/admin/TestApiFramework.java    |  10 +-
 .../solr/handler/admin/TestCollectionAPIs.java  |  11 +-
 .../org/apache/solr/util/JsonValidatorTest.java |   8 +-
 .../java/org/apache/solr/common/util/Map2.java  | 303 -------------------
 .../org/apache/solr/common/util/Predicate.java  |  31 --
 .../solr/common/util/PredicateWithErrMsg.java   |  31 ++
 .../solr/common/util/ValidatingJsonMap.java     | 291 ++++++++++++++++++
 29 files changed, 510 insertions(+), 468 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/api/Api.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/Api.java b/solr/core/src/java/org/apache/solr/api/Api.java
index 96b9316..b672621 100644
--- a/solr/core/src/java/org/apache/solr/api/Api.java
+++ b/solr/core/src/java/org/apache/solr/api/Api.java
@@ -21,7 +21,7 @@ package org.apache.solr.api;
 import java.util.Map;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.util.JsonSchemaValidator;
@@ -38,7 +38,7 @@ public abstract class Api implements SpecProvider {
     if (commandSchema == null) {
       synchronized (this) {
         if(commandSchema == null) {
-          Map2 commands = getSpec().getMap("commands", null);
+          ValidatingJsonMap commands = getSpec().getMap("commands", null);
           commandSchema = commands != null ?
               ImmutableMap.copyOf(ApiBag.getParsedSchema(commands)) :
               ImmutableMap.of();
@@ -51,7 +51,7 @@ public abstract class Api implements SpecProvider {
   public abstract void call(SolrQueryRequest req , SolrQueryResponse rsp);
 
   @Override
-  public Map2 getSpec() {
+  public ValidatingJsonMap getSpec() {
     return spec.getSpec();
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/api/ApiBag.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/ApiBag.java b/solr/core/src/java/org/apache/solr/api/ApiBag.java
index ddc3643..dd90ee9 100644
--- a/solr/core/src/java/org/apache/solr/api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/api/ApiBag.java
@@ -33,7 +33,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.PluginBag;
 import org.apache.solr.core.PluginInfo;
@@ -50,8 +50,8 @@ import org.slf4j.LoggerFactory;
 
 import static org.apache.solr.client.solrj.SolrRequest.SUPPORTED_METHODS;
 import static org.apache.solr.common.params.CommonParams.NAME;
-import static org.apache.solr.common.util.Map2.ENUM_OF;
-import static org.apache.solr.common.util.Map2.NOT_NULL;
+import static org.apache.solr.common.util.ValidatingJsonMap.ENUM_OF;
+import static org.apache.solr.common.util.ValidatingJsonMap.NOT_NULL;
 import static org.apache.solr.common.util.StrUtils.formatString;
 
 public class ApiBag {
@@ -59,13 +59,13 @@ public class ApiBag {
 
   private final Map<String, PathTrie<Api>> apis = new ConcurrentHashMap<>();
 
-  public static Map2 getResource(String name) {
+  public static ValidatingJsonMap getResource(String name) {
     InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
     if (is == null)
       throw new RuntimeException("invalid API spec :" + name );
-    Map2 map1 = null;
+    ValidatingJsonMap map1 = null;
     try {
-      map1 = Map2.fromJSON(is);
+      map1 = ValidatingJsonMap.fromJSON(is);
     } catch (Exception e) {
       log.error("Error in JSON : " + name, e);
       if (e instanceof RuntimeException) {
@@ -75,7 +75,7 @@ public class ApiBag {
     }
     if (map1 == null) throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Empty value for " + name);
 
-    return Map2.getDeepCopy(map1, 5, false);
+    return ValidatingJsonMap.getDeepCopy(map1, 5, false);
   }
 
 
@@ -95,30 +95,30 @@ public class ApiBag {
   }
 
   private void validateAndRegister(Api api, Map<String, String> nameSubstitutes) {
-    Map2 spec = api.getSpec();
+    ValidatingJsonMap spec = api.getSpec();
     Api introspect = new IntrospectApi(api);
     List<String> methods = spec.getList("methods", ENUM_OF, SUPPORTED_METHODS);
     for (String method : methods) {
       PathTrie<Api> registry = apis.get(method);
 
       if (registry == null) apis.put(method, registry = new PathTrie<>(ImmutableSet.of("_introspect")));
-      Map2 url = spec.getMap("url", NOT_NULL);
-      Map2 params = url.getMap("params", null);
+      ValidatingJsonMap url = spec.getMap("url", NOT_NULL);
+      ValidatingJsonMap params = url.getMap("params", null);
       if (params != null) {
         for (Object o : params.keySet()) {
-          Map2 param = params.getMap(o.toString(), NOT_NULL);
+          ValidatingJsonMap param = params.getMap(o.toString(), NOT_NULL);
           param.get("type", ENUM_OF, KNOWN_TYPES);
           param.get("description", NOT_NULL);
         }
       }
       List<String> paths = url.getList("paths", NOT_NULL);
-      Map2 parts = url.getMap("parts", null);
+      ValidatingJsonMap parts = url.getMap("parts", null);
       if (parts != null) {
         Set<String> wildCardNames = getWildCardNames(paths);
         for (Object o : parts.keySet()) {
           if (!wildCardNames.contains(o.toString()))
             throw new RuntimeException("" + o + " is not a valid part name");
-          Map2 pathMeta = parts.getMap(o.toString(), NOT_NULL);
+          ValidatingJsonMap pathMeta = parts.getMap(o.toString(), NOT_NULL);
           pathMeta.get("type", ENUM_OF, ImmutableSet.of("enum", "string", "int", "number", "boolean"));
         }
       }
@@ -141,14 +141,14 @@ public class ApiBag {
     public void call(SolrQueryRequest req, SolrQueryResponse rsp) {
 
       String cmd = req.getParams().get("command");
-      Map2 result = null;
+      ValidatingJsonMap result = null;
       if (cmd == null) {
         result = baseApi.getSpec();
       } else {
-        Map2 specCopy = Map2.getDeepCopy(baseApi.getSpec(), 5, true);
-        Map2 commands = specCopy.getMap("commands", null);
+        ValidatingJsonMap specCopy = ValidatingJsonMap.getDeepCopy(baseApi.getSpec(), 5, true);
+        ValidatingJsonMap commands = specCopy.getMap("commands", null);
         if (commands != null) {
-          Map2 m = commands.getMap(cmd, null);
+          ValidatingJsonMap m = commands.getMap(cmd, null);
           specCopy.put("commands", Collections.singletonMap(cmd, m));
         }
         result = specCopy;
@@ -159,7 +159,7 @@ public class ApiBag {
     }
   }
 
-  public static Map<String, JsonSchemaValidator> getParsedSchema(Map2 commands) {
+  public static Map<String, JsonSchemaValidator> getParsedSchema(ValidatingJsonMap commands) {
     Map<String,JsonSchemaValidator> validators =  new HashMap<>();
     for (Object o : commands.entrySet()) {
       Map.Entry cmd = (Map.Entry) o;
@@ -173,8 +173,8 @@ public class ApiBag {
   }
 
 
-  private void verifyCommands(Map2 spec) {
-    Map2 commands = spec.getMap("commands", null);
+  private void verifyCommands(ValidatingJsonMap spec) {
+    ValidatingJsonMap commands = spec.getMap("commands", null);
     if (commands == null) return;
     getParsedSchema(commands);
 
@@ -183,7 +183,7 @@ public class ApiBag {
   private Set<String> getWildCardNames(List<String> paths) {
     Set<String> wildCardNames = new HashSet<>();
     for (String path : paths) {
-      List<String> p = PathTrie.getParts(path);
+      List<String> p = PathTrie.getTemplateVariables(path);
       for (String s : p) {
         String wildCard = PathTrie.wildCardName(s);
         if (wildCard != null) wildCardNames.add(wildCard);
@@ -210,24 +210,24 @@ public class ApiBag {
   public static SpecProvider getSpec(final String name) {
     return () -> {
       String jsonName = APISPEC_LOCATION + name + ".json";
-      Map2 map = getResource(jsonName);
-      Map2 result = map;
-      Map2 cmds = result.getMap("commands", null);
+      ValidatingJsonMap map = getResource(jsonName);
+      ValidatingJsonMap result = map;
+      ValidatingJsonMap cmds = result.getMap("commands", null);
       if (cmds != null) {
-        Map<String, Map2> comands2BReplaced = new Map2<>();
+        Map  comands2BReplaced = new ValidatingJsonMap();
         for (Object o : cmds.keySet()) {
           Object val = cmds.get(o);
           if (val instanceof String) {
             String s = (String) val;
-            Map2 cmdSpec = getResource(APISPEC_LOCATION + s + ".json");
+            ValidatingJsonMap cmdSpec = getResource(APISPEC_LOCATION + s + ".json");
             comands2BReplaced.put(o.toString(), cmdSpec);
           }
         }
 
         if (!comands2BReplaced.isEmpty()) {
-          Map2 mapCopy = Map2.getDeepCopy(result, 4, true);
+          ValidatingJsonMap mapCopy = ValidatingJsonMap.getDeepCopy(result, 4, true);
           mapCopy.getMap("commands", NOT_NULL).putAll(comands2BReplaced);
-          result = Map2.getDeepCopy(mapCopy, 4, false);
+          result = ValidatingJsonMap.getDeepCopy(mapCopy, 4, false);
         }
       }
 
@@ -269,7 +269,7 @@ public class ApiBag {
   public static final String INTROSPECT = "/_introspect";
 
 
-  public static final SpecProvider EMPTY_SPEC = () -> Map2.EMPTY;
+  public static final SpecProvider EMPTY_SPEC = () -> ValidatingJsonMap.EMPTY;
   public static final String HANDLER_NAME = "handlerName";
   public static final Set<String> KNOWN_TYPES = ImmutableSet.of("string", "boolean", "list", "int", "double", "object");
 
@@ -277,7 +277,7 @@ public class ApiBag {
     return apis.get(method);
   }
 
-  public <T> void registerLazy(PluginBag.PluginHolder<SolrRequestHandler> holder, PluginInfo info) {
+  public void registerLazy(PluginBag.PluginHolder<SolrRequestHandler> holder, PluginInfo info) {
     String specName = info.attributes.get("spec");
     if (specName == null) specName = "emptySpec";
     register(new LazyLoadedApi(ApiBag.getSpec(specName), holder), Collections.singletonMap(HANDLER_NAME, info.attributes.get(NAME)));
@@ -288,7 +288,7 @@ public class ApiBag {
     if (specObj == null) specObj = "emptySpec";
     if (specObj instanceof Map) {
       Map map = (Map) specObj;
-      return () -> Map2.getDeepCopy(map, 4, false);
+      return () -> ValidatingJsonMap.getDeepCopy(map, 4, false);
     } else {
       return ApiBag.getSpec((String) specObj);
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/api/SpecProvider.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/SpecProvider.java b/solr/core/src/java/org/apache/solr/api/SpecProvider.java
index 1d1ad32..88a06c8 100644
--- a/solr/core/src/java/org/apache/solr/api/SpecProvider.java
+++ b/solr/core/src/java/org/apache/solr/api/SpecProvider.java
@@ -17,8 +17,8 @@ package org.apache.solr.api;
  * limitations under the License.
  */
 
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
 
 public interface SpecProvider {
-  Map2 getSpec();
+  ValidatingJsonMap getSpec();
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
index 997ccce..b997c42 100644
--- a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
@@ -33,7 +33,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CommonParams;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.PluginBag;
 import org.apache.solr.core.SolrCore;
@@ -52,7 +52,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.apache.solr.servlet.SolrDispatchFilter.Action.PASSTHROUGH;
-import static org.apache.solr.util.PathTrie.getParts;
+import static org.apache.solr.util.PathTrie.getTemplateVariables;
 import static org.apache.solr.common.params.CommonParams.JSON;
 import static org.apache.solr.common.params.CommonParams.WT;
 import static org.apache.solr.servlet.SolrDispatchFilter.Action.ADMIN;
@@ -77,7 +77,7 @@ public class V2HttpCall extends HttpSolrCall {
     String path = this.path;
     String fullPath = path = path.substring(3);//strip off '/v2'
     try {
-      pieces = getParts(path);
+      pieces = getTemplateVariables(path);
       if (pieces.size() == 0) {
         prefix = "c";
         path = "/c";
@@ -175,7 +175,7 @@ public class V2HttpCall extends HttpSolrCall {
     }
 
     if (api == null) {
-      // this is to return the user with all the subpaths for  a given 4044 request
+      // this is to return the user with all the subpaths for  a given 404 request
       // the request  begins with /collections , /cores or a /c and the current lookup is on container level handlers
       // So the subsequent per core lookup would find a path
       if (containerHandlerLookup && commonPaths4ContainerLevelAndCoreLevel.contains(prefix)) return null;
@@ -249,7 +249,7 @@ public class V2HttpCall extends HttpSolrCall {
   }
 
   private static Api getSubPathImpl(final Map<String, Set<String>> subpaths, String path,  boolean addMsg) {
-    return new Api(() -> Map2.EMPTY) {
+    return new Api(() -> ValidatingJsonMap.EMPTY) {
       @Override
       public void call(SolrQueryRequest req, SolrQueryResponse rsp) {
         if(addMsg) rsp.add("msg", "Invalid path, try the following");
@@ -273,8 +273,6 @@ public class V2HttpCall extends HttpSolrCall {
     try {
       api.call(solrReq, rsp);
     } catch (RuntimeException e) {
-      //todo remove. for debugging only
-      log.error("error execute()", e);
       throw e;
     }
   }
@@ -296,7 +294,7 @@ public class V2HttpCall extends HttpSolrCall {
   }
 
   @Override
-  protected Map2 getSpec() {
+  protected ValidatingJsonMap getSpec() {
     return api == null ? null : api.getSpec();
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
index 7dd69a5..c5b899f 100644
--- a/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
@@ -46,7 +46,7 @@ public class DumpRequestHandler extends RequestHandlerBase
       Map map = new LinkedHashMap<>();
       rsp.getValues().add("urlPart", map);
       for (String part : parts) {
-        map.put(part, req.getPathValues().get(part));
+        map.put(part, req.getPathTemplateValues().get(part));
       }
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
index b3c7b17..d2da05e 100644
--- a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
@@ -150,7 +150,7 @@ public class UpdateRequestHandler extends ContentStreamHandlerBase implements Pe
     pathVsLoaders.put(JSON_PATH,registry.get("application/json"));
     pathVsLoaders.put(DOC_PATH,registry.get("application/json"));
     pathVsLoaders.put(CSV_PATH,registry.get("application/csv"));
-    pathVsLoaders.put(BIN_PATH,registry.get("application/csv"));
+    pathVsLoaders.put(BIN_PATH,registry.get("application/javabin"));
     return registry;
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java
index 1e07277..a1035aa 100644
--- a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java
+++ b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java
@@ -23,11 +23,9 @@ import java.util.Collections;
 import java.util.Map;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.solr.api.SpecProvider;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.api.Api;
 import org.apache.solr.api.ApiBag;
-import org.apache.solr.common.util.Map2;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java b/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java
index 8899a7a..940eee1 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java
@@ -32,11 +32,6 @@ public interface ApiCommand<T> {
 
   V2EndPoint getEndPoint();
 
-
- /* void command(SolrQueryRequest req, SolrQueryResponse rsp, CommandOperation c, T handler) throws Exception;
-
-  void GET(SolrQueryRequest req, SolrQueryResponse rsp, T handler) throws Exception;
-*/
   default Collection<String> getParamNames(CommandOperation op) {
     return BaseHandlerApiSupport.getParamNames(op, this);
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java b/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
index aaf229b..efda446 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
@@ -28,11 +28,9 @@ import java.util.Map;
 import java.util.Objects;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.solr.api.SpecProvider;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.common.util.Map2;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
@@ -126,7 +124,7 @@ public abstract class BaseHandlerApiSupport implements ApiSupport {
   }
 
   private static void wrapParams(final SolrQueryRequest req, final CommandOperation co, final ApiCommand cmd, final boolean useRequestParams) {
-    final Map<String, String> pathValues = req.getPathValues();
+    final Map<String, String> pathValues = req.getPathTemplateValues();
     final Map<String, Object> map = co == null || !(co.getCommandData() instanceof Map) ?
         Collections.singletonMap("", co.getCommandData()) : co.getDataMap();
     final SolrParams origParams = req.getParams();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
index 502a0d1..56e5191 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
@@ -71,7 +71,7 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
     GET_COLLECTIONS(EndPoint.COLLECTIONS, GET, LIST_OP),
     GET_CLUSTER(EndPoint.CLUSTER, GET, LIST_OP, "/cluster", null),
     GET_CLUSTER_OVERSEER(EndPoint.CLUSTER, GET, OVERSEERSTATUS_OP, "/cluster/overseer", null),
-    GET_CLUSTER_CMD(EndPoint.CLUSTER_CMD, GET, REQUESTSTATUS_OP),
+    GET_CLUSTER_CMD(EndPoint.CLUSTER_CMD_STATUS, GET, REQUESTSTATUS_OP),
     GET_A_COLLECTION(EndPoint.COLLECTION_STATE, GET, CLUSTERSTATUS_OP),
     CREATE_COLLECTION(EndPoint.COLLECTIONS_COMMANDS,
         POST,
@@ -163,13 +163,22 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
         POST,
         DELETEREPLICAPROP_OP,
         "delete-property",
-        ImmutableMap.of("property", ""));
+        ImmutableMap.of("property", "")),
+    ADDROLE(EndPoint.CLUSTER_CMD,
+        POST,
+        ADDROLE_OP,
+        "add-role",null),
+    REMOVEROLE(EndPoint.CLUSTER_CMD,
+        POST,
+        REMOVEROLE_OP,
+        "remove-role",null),
+    ;
     public final String commandName;
     public final EndPoint endPoint;
     public final SolrRequest.METHOD method;
     public final CollectionOperation target;
     public final Map<String, String> paramstoAttr;
-    public final Map<String, String> prefixSubStitutes;
+    public final Map<String, String> prefixSubstitutes;
 
     public SolrRequest.METHOD getMethod() {
       return method;
@@ -187,13 +196,13 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
     }
 
     Cmd(EndPoint endPoint, SolrRequest.METHOD method, CollectionOperation target,
-        String commandName, Map<String, String> paramstoAttr, Map<String, String> prefixSubStitutes) {
+        String commandName, Map<String, String> paramstoAttr, Map<String, String> prefixSubstitutes) {
       this.commandName = commandName;
       this.endPoint = endPoint;
       this.method = method;
       this.target = target;
       this.paramstoAttr = paramstoAttr == null ? Collections.EMPTY_MAP : paramstoAttr;
-      this.prefixSubStitutes = prefixSubStitutes;
+      this.prefixSubstitutes = prefixSubstitutes;
 
     }
 
@@ -216,9 +225,9 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
     @Override
     public Collection<String> getParamNames(CommandOperation op) {
       Collection<String> paramNames = BaseHandlerApiSupport.getParamNames(op, this);
-      if (!prefixSubStitutes.isEmpty()) {
+      if (!prefixSubstitutes.isEmpty()) {
         Collection<String> result = new ArrayList<>(paramNames.size());
-        for (Map.Entry<String, String> e : prefixSubStitutes.entrySet()) {
+        for (Map.Entry<String, String> e : prefixSubstitutes.entrySet()) {
           for (String paramName : paramNames) {
             if (paramName.startsWith(e.getKey())) {
               result.add(paramName.replace(e.getKey(), e.getValue()));
@@ -236,8 +245,8 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
     @Override
     public String getParamSubstitute(String param) {
       String s = paramstoAttr.containsKey(param) ? paramstoAttr.get(param) : param;
-      if (prefixSubStitutes != null) {
-        for (Map.Entry<String, String> e : prefixSubStitutes.entrySet()) {
+      if (prefixSubstitutes != null) {
+        for (Map.Entry<String, String> e : prefixSubstitutes.entrySet()) {
           if (s.startsWith(e.getValue())) return s.replace(e.getValue(), e.getKey());
         }
       }
@@ -248,7 +257,8 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
 
   enum EndPoint implements V2EndPoint {
     CLUSTER("cluster"),
-    CLUSTER_CMD("cluster.commandstatus"),
+    CLUSTER_CMD("cluster.Commands"),
+    CLUSTER_CMD_STATUS("cluster.commandstatus"),
     COLLECTIONS_COMMANDS("collections.Commands"),
     COLLECTIONS("collections"),
     COLLECTION_STATE("collection"),

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java b/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
index 7674427..d975be8 100644
--- a/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
+++ b/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
@@ -106,7 +106,7 @@ public interface SolrQueryRequest extends AutoCloseable {
     return (String) getContext().get("path");
   }
 
-  default Map<String, String> getPathValues() {
+  default Map<String, String> getPathTemplateValues() {
     return Collections.emptyMap();
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java b/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
index 42d0814..4b0e4d6 100644
--- a/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
+++ b/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
@@ -17,12 +17,10 @@
 package org.apache.solr.request;
 
 import org.apache.solr.api.ApiBag;
-import org.apache.solr.api.V2HttpCall;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.search.SolrIndexSearcher;
-import org.apache.solr.servlet.HttpSolrCall;
 import org.apache.solr.util.CommandOperation;
 import org.apache.solr.util.JsonSchemaValidator;
 import org.apache.solr.util.RTimerTree;
@@ -213,7 +211,7 @@ public abstract class SolrQueryRequestBase implements SolrQueryRequest, Closeabl
 
   }
 
-  protected Map2 getSpec() {
+  protected ValidatingJsonMap getSpec() {
     return null;
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
index ef2932d..f9f71cf 100644
--- a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
@@ -37,7 +37,7 @@ import org.apache.http.Header;
 import org.apache.http.auth.BasicUserPrincipal;
 import org.apache.http.message.BasicHeader;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.util.CommandOperation;
 import org.apache.solr.api.SpecProvider;
 import org.slf4j.Logger;
@@ -168,7 +168,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
   }
 
   @Override
-  public Map2 getSpec() {
+  public ValidatingJsonMap getSpec() {
     return zkAuthentication.getSpec();
   }
   public boolean getBlockUnknown(){

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java b/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
index 1b4ec13..3388147 100644
--- a/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
@@ -27,11 +27,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.function.Function;
 
-import com.google.common.collect.ImmutableSet;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.params.CollectionParams;
-import org.apache.solr.common.util.Map2;
-import org.apache.solr.common.util.Utils;
+import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.util.CommandOperation;
 import org.apache.solr.api.ApiBag;
 import org.apache.solr.api.SpecProvider;
@@ -241,7 +237,7 @@ public class RuleBasedAuthorizationPlugin implements AuthorizationPlugin, Config
 
 
   @Override
-  public Map2 getSpec() {
+  public ValidatingJsonMap getSpec() {
     return ApiBag.getSpec("cluster.security.RuleBasedAuthorization").getSpec();
 
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
index 7427422..f270524 100644
--- a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
+++ b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
@@ -30,8 +30,7 @@ import java.util.Set;
 
 import com.google.common.collect.ImmutableSet;
 import org.apache.commons.codec.binary.Base64;
-import org.apache.solr.api.SpecProvider;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.util.CommandOperation;
 import org.apache.solr.api.ApiBag;
 import org.slf4j.Logger;
@@ -156,7 +155,7 @@ public class Sha256AuthenticationProvider implements ConfigEditablePlugin,  Basi
   }
 
   @Override
-  public Map2 getSpec() {
+  public ValidatingJsonMap getSpec() {
     return ApiBag.getSpec("cluster.security.BasicAuth.Commands").getSpec();
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
index 19b95c2..5d023e2 100644
--- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
+++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
@@ -22,10 +22,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
 import java.lang.invoke.MethodHandles;
 import java.security.Principal;
@@ -37,12 +34,10 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Locale;
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
 
-import com.google.common.collect.ImmutableSet;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.input.CloseShieldInputStream;
 import org.apache.commons.io.output.CloseShieldOutputStream;
@@ -61,7 +56,6 @@ import org.apache.http.client.methods.HttpPost;
 import org.apache.http.client.methods.HttpPut;
 import org.apache.http.client.methods.HttpRequestBase;
 import org.apache.http.entity.InputStreamEntity;
-import org.apache.http.util.EntityUtils;
 import org.apache.solr.api.ApiBag;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
@@ -79,7 +73,7 @@ import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.ContentStream;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.StrUtils;
@@ -96,7 +90,6 @@ import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.response.QueryResponseWriter;
 import org.apache.solr.response.QueryResponseWriterUtil;
 import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.security.AuthenticationPlugin;
 import org.apache.solr.security.AuthorizationContext;
 import org.apache.solr.security.AuthorizationContext.CollectionRequest;
@@ -114,7 +107,6 @@ import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.solr.common.cloud.ZkStateReader.BASE_URL_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.CORE_NAME_PROP;
@@ -1090,7 +1082,7 @@ public class HttpSolrCall {
     }
     return CommandOperation.clone(parsedCommands);
   }
-  protected Map2 getSpec() {
+  protected ValidatingJsonMap getSpec() {
     return null;
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java b/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
index 9f613d9..e9b4c36 100644
--- a/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
@@ -241,7 +241,7 @@ public class SolrRequestParsers
       }
 
       @Override
-      public Map<String, String> getPathValues() {
+      public Map<String, String> getPathTemplateValues() {
         if (httpSolrCall != null && httpSolrCall instanceof V2HttpCall) {
           return ((V2HttpCall) httpSolrCall).getUrlParts();
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/util/PathTrie.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/util/PathTrie.java b/solr/core/src/java/org/apache/solr/util/PathTrie.java
index c9f1521..8976353 100644
--- a/solr/core/src/java/org/apache/solr/util/PathTrie.java
+++ b/solr/core/src/java/org/apache/solr/util/PathTrie.java
@@ -42,7 +42,7 @@ public class PathTrie<T> {
 
 
   public void insert(String path, Map<String, String> replacements, T o) {
-    List<String> parts = getParts(path);
+    List<String> parts = getTemplateVariables(path);
     if (parts.isEmpty()) {
       root.obj = o;
       return;
@@ -63,7 +63,7 @@ public class PathTrie<T> {
     root.insert(parts, o);
   }
 
-  public static List<String> getParts(String path) {
+  public static List<String> getTemplateVariables(String path) {
     if (path == null || path.isEmpty()) return emptyList();
     List<String> parts = new ArrayList<String>() {
       @Override
@@ -78,11 +78,11 @@ public class PathTrie<T> {
 
 
   public T lookup(String uri, Map<String, String> parts) {
-    return root.lookup(getParts(uri), 0, parts);
+    return root.lookup(getTemplateVariables(uri), 0, parts);
   }
 
   public T lookup(String path, Map<String, String> parts, Set<String> paths) {
-    return root.lookup(getParts(path), 0, parts, paths);
+    return root.lookup(getTemplateVariables(path), 0, parts, paths);
   }
 
   public static String wildCardName(String part) {
@@ -137,7 +137,7 @@ public class PathTrie<T> {
     }
 
 
-    void findValidChildren(String path, Set<String> availableSubPaths) {
+    void findAvailableChildren(String path, Set<String> availableSubPaths) {
       if (availableSubPaths == null) return;
       if (children != null) {
         for (Node node : children.values()) {
@@ -148,29 +148,36 @@ public class PathTrie<T> {
         }
 
         for (Node node : children.values()) {
-          node.findValidChildren(path + "/" + node.name, availableSubPaths);
+          node.findAvailableChildren(path + "/" + node.name, availableSubPaths);
         }
       }
     }
 
 
-    public T lookup(List<String> pieces, int i, Map<String, String> parts) {
-      return lookup(pieces, i, parts, null);
+    public T lookup(List<String> pieces, int i, Map<String, String> templateValues) {
+      return lookup(pieces, i, templateValues, null);
 
     }
 
-    public T lookup(List<String> pieces, int i, Map<String, String> parts, Set<String> availableSubPaths) {
-      if (varName != null) parts.put(varName, pieces.get(i - 1));
-      if (pieces.size() < i + 1) {
-        findValidChildren("", availableSubPaths);
+    /**
+     *
+     * @param pieces pieces in the url /a/b/c has pieces as 'a' , 'b' , 'c'
+     * @param index current index of the pieces that we are looking at in /a/b/c 0='a' and 1='b'
+     * @param templateVariables The mapping of template variable to its value
+     * @param availableSubPaths If not null , available sub paths will be returned in this set
+     */
+    public T lookup(List<String> pieces, int index, Map<String, String> templateVariables, Set<String> availableSubPaths) {
+      if (varName != null) templateVariables.put(varName, pieces.get(index - 1));
+      if (pieces.size() < index + 1) {
+        findAvailableChildren("", availableSubPaths);
         return obj;
       }
-      String piece = pieces.get(i);
+      String piece = pieces.get(index);
       if (children == null) return null;
       Node n = children.get(piece);
       if (n == null && !reserved.contains(piece)) n = children.get("");
       if (n == null) return null;
-      return n.lookup(pieces, i + 1, parts, availableSubPaths);
+      return n.lookup(pieces, index + 1, templateVariables, availableSubPaths);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/resources/apispec/cluster.Commands.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cluster.Commands.json b/solr/core/src/resources/apispec/cluster.Commands.json
new file mode 100644
index 0000000..7e72d40
--- /dev/null
+++ b/solr/core/src/resources/apispec/cluster.Commands.json
@@ -0,0 +1,48 @@
+{
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Collections+API",
+  "Description": "Cluster-wide commands",
+  "methods": [
+    "POST"
+  ],
+  "url": {
+    "paths": [
+      "/cluster"
+    ]
+  },
+  "commands": {
+    "add-role":{
+      "type":"object",
+      "documentation":"https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-api15AddRole",
+      "description":"Add a specific role to a node in the cluster ",
+      "properties": {
+        "role": {
+          "type": "string",
+          "description": "The name of the role. The only supported role as of now is overseer."
+
+        },
+        "node": {
+          "type": "string",
+          "description": "The name of the node. It is possible to assign a role even before that node is started"
+
+        }
+      }
+    },
+    "remove-role":{
+      "type":"object",
+      "documentation":"https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-api16RemoveRole",
+      "description":"",
+      "properties": {
+        "role": {
+          "type": "string",
+          "description": "The name of the role. The only supported role as of now is overseer."
+
+        },
+        "node": {
+          "type": "string",
+          "description": "The name of the node. It is possible to assign a role even before that node is started"
+        }
+      }
+    }
+
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/resources/apispec/node.invoke.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/node.invoke.json b/solr/core/src/resources/apispec/node.invoke.json
index a615aca..c8a9f69 100644
--- a/solr/core/src/resources/apispec/node.invoke.json
+++ b/solr/core/src/resources/apispec/node.invoke.json
@@ -5,6 +5,12 @@
   "url": {
     "paths": [
       "/node/invoke"
-    ]
+    ],
+    "params": {
+      "class": {
+        "type": "string",
+        "description": "Name of the class that must be invoked. "
+      }
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/test/org/apache/solr/api/TestPathTrie.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/api/TestPathTrie.java b/solr/core/src/test/org/apache/solr/api/TestPathTrie.java
index e370ed8..9e0723d 100644
--- a/solr/core/src/test/org/apache/solr/api/TestPathTrie.java
+++ b/solr/core/src/test/org/apache/solr/api/TestPathTrie.java
@@ -41,17 +41,20 @@ public class TestPathTrie extends SolrTestCaseJ4 {
     pathTrie.insert("/aa/bb/{cc}/{xx}", emptyMap(), "b");
     pathTrie.insert("/aa/bb", emptyMap(), "c");
 
-    HashMap parts = new HashMap<>();
-    assertEquals("R", pathTrie.lookup("/", parts, null));
-    assertEquals("d", pathTrie.lookup("/aa", parts, null));
-    assertEquals("a", pathTrie.lookup("/aa/bb/hello/dd", parts, null));
-    assertEquals("test", pathTrie.lookup("/test/hello/dd", parts, null));
-    assertEquals("hello", parts.get("cc"));
-    assertEquals("b", pathTrie.lookup("/aa/bb/hello/world", parts, null));
-    assertEquals("hello", parts.get("cc"));
-    assertEquals("world", parts.get("xx"));
+    HashMap templateValues = new HashMap<>();
+    assertEquals("R", pathTrie.lookup("/", templateValues, null));
+    assertEquals("d", pathTrie.lookup("/aa", templateValues, null));
+    assertEquals("a", pathTrie.lookup("/aa/bb/hello/dd", templateValues, null));
+    templateValues.clear();
+    assertEquals("test", pathTrie.lookup("/test/hello/dd", templateValues, null));
+    assertEquals("hello", templateValues.get("cc"));
+    templateValues.clear();
+    assertEquals("b", pathTrie.lookup("/aa/bb/hello/world", templateValues, null));
+    assertEquals("hello", templateValues.get("cc"));
+    assertEquals("world", templateValues.get("xx"));
     Set<String> subPaths =  new HashSet<>();
-    pathTrie.lookup("/aa",parts, subPaths);
+    templateValues.clear();
+    pathTrie.lookup("/aa",templateValues, subPaths);
     assertEquals(3, subPaths.size());
 
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java b/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
index 5cec10f..32b2323 100644
--- a/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
+++ b/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
@@ -33,11 +33,10 @@ 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.common.util.Predicate;
+import org.apache.solr.common.util.PredicateWithErrMsg;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.handler.TestBlobHandler;
-import org.apache.solr.handler.TestSolrConfigHandlerCloud;
 import org.apache.solr.handler.TestSolrConfigHandlerConcurrent;
 import org.apache.solr.util.RESTfulServerProvider;
 import org.apache.solr.util.RestTestBase;
@@ -482,8 +481,8 @@ public class TestSolrConfigHandler extends RestTestBase {
       }
       Object actual = Utils.getObjectByPath(m, false, jsonPath);
 
-      if (expected instanceof Predicate) {
-        Predicate predicate = (Predicate) expected;
+      if (expected instanceof PredicateWithErrMsg) {
+        PredicateWithErrMsg predicate = (PredicateWithErrMsg) expected;
         if (predicate.test(actual) == null) {
           success = true;
           break;
@@ -752,7 +751,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         "/something/part1_Value/fixed/part2_Value?urlPart=part1&urlPart=part2",
         null,
         Arrays.asList("urlPart"),
-        (Predicate) new Predicate() {
+        (PredicateWithErrMsg) new PredicateWithErrMsg() {
           @Override
           public String test(Object o) {
             if (o instanceof Map) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
index d1ec3ba..f57c1f3 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
@@ -24,9 +24,8 @@ import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.MapSolrParams;
-import org.apache.solr.common.util.Predicate;
+import org.apache.solr.common.util.PredicateWithErrMsg;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
@@ -42,11 +41,10 @@ import org.apache.solr.api.V2HttpCall;
 import org.apache.solr.util.CommandOperation;
 
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
-import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
 import static org.apache.solr.common.params.CommonParams.COLLECTIONS_HANDLER_PATH;
 import static org.apache.solr.common.params.CommonParams.CONFIGSETS_HANDLER_PATH;
 import static org.apache.solr.common.params.CommonParams.CORES_HANDLER_PATH;
-import static org.apache.solr.common.util.Map2.NOT_NULL;
+import static org.apache.solr.common.util.ValidatingJsonMap.NOT_NULL;
 
 public class TestApiFramework extends SolrTestCaseJ4 {
 
@@ -176,8 +174,8 @@ public class TestApiFramework extends SolrTestCaseJ4 {
       List<String> parts = StrUtils.splitSmart(path, path.charAt(0) == '/' ?  '/':' ');
       if (parts.get(0).isEmpty()) parts.remove(0);
       Object val = Utils.getObjectByPath(root, false, parts);
-      if (e.getValue() instanceof Predicate) {
-        Predicate value = (Predicate) e.getValue();
+      if (e.getValue() instanceof PredicateWithErrMsg) {
+        PredicateWithErrMsg value = (PredicateWithErrMsg) e.getValue();
         String err = value.test(val);
         if(err != null){
           assertEquals(err + " for " + e.getKey() + " in :" + Utils.toJSONString(root), e.getValue(), val);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java b/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
index 6cfbf92..e3e6cda 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
@@ -123,6 +123,15 @@ public class TestCollectionAPIs extends SolrTestCaseJ4 {
         "{modify : {rule : 'replica:*,cores:<5', autoAddReplicas : false} }", null,
         "{collection: collName, operation : modifycollection , autoAddReplicas : 'false', rule : [{replica: '*', cores : '<5' }]}"
     );
+    compareOutput(apiBag, "/cluster", POST,
+        "{add-role : {role : overseer, node : 'localhost_8978'} }", null,
+        "{operation : addrole ,role : overseer, node : 'localhost_8978'}"
+    );
+
+    compareOutput(apiBag, "/cluster", POST,
+        "{remove-role : {role : overseer, node : 'localhost_8978'} }", null,
+        "{operation : removerole ,role : overseer, node : 'localhost_8978'}"
+    );
 
 
     System.out.println();
@@ -159,7 +168,7 @@ public class TestCollectionAPIs extends SolrTestCaseJ4 {
       }
 
       @Override
-      public Map<String, String> getPathValues() {
+      public Map<String, String> getPathTemplateValues() {
         return parts;
       }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java b/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
index 9c3b490..0bfdc12 100644
--- a/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
+++ b/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
@@ -22,11 +22,11 @@ import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.api.ApiBag;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 
-import static org.apache.solr.common.util.Map2.NOT_NULL;
+import static org.apache.solr.common.util.ValidatingJsonMap.NOT_NULL;
 import static org.apache.solr.common.util.Utils.toJSONString;
 
 public class JsonValidatorTest extends SolrTestCaseJ4 {
@@ -49,7 +49,7 @@ public class JsonValidatorTest extends SolrTestCaseJ4 {
 
 
   public void testSchemaValidation() {
-    Map2 spec = ApiBag.getSpec("collections.commands").getSpec();
+    ValidatingJsonMap spec = ApiBag.getSpec("collections.commands").getSpec();
     Map createSchema = spec.getMap("commands", NOT_NULL).getMap("create-alias", NOT_NULL);
     JsonSchemaValidator validator = new JsonSchemaValidator(createSchema);
     List<String> errs = validator.validateJson(Utils.fromJSONString("{name : x, collections: [ c1 , c2]}"));
@@ -88,7 +88,7 @@ public class JsonValidatorTest extends SolrTestCaseJ4 {
   }
 
   private void checkSchema(String name) {
-    Map2 spec = ApiBag.getSpec(name).getSpec();
+    ValidatingJsonMap spec = ApiBag.getSpec(name).getSpec();
     Map commands = (Map) spec.get("commands");
     for (Object o : commands.entrySet()) {
       Map.Entry cmd = (Map.Entry) o;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/solrj/src/java/org/apache/solr/common/util/Map2.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Map2.java b/solr/solrj/src/java/org/apache/solr/common/util/Map2.java
deleted file mode 100644
index 69a85be..0000000
--- a/solr/solrj/src/java/org/apache/solr/common/util/Map2.java
+++ /dev/null
@@ -1,303 +0,0 @@
-package org.apache.solr.common.util;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-import org.noggit.JSONParser;
-import org.noggit.ObjectBuilder;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.Collections.unmodifiableList;
-import static java.util.Collections.unmodifiableSet;
-
-public class Map2<K, V> implements Map<K, V> {
-
-  public static final Predicate<Object> NOT_NULL = o -> {
-    if (o == null) return " Must not be NULL";
-    return null;
-  };
-  public static final Predicate<Pair> NOT_NULL_OF_TYPE = pair -> {
-    if (pair.first() == null) return " Must not be NULL";
-    if (pair.second() instanceof Class) {
-      return ((Class) pair.first()).isAssignableFrom(pair.first().getClass()) ?
-          null :
-          " Must be of type " + ((Class) pair.second()).getName();
-    }
-    return " Unknown Type";
-  };
-  public static final Predicate<Pair> ENUM_OF = pair -> {
-    if (pair.second() instanceof Set) {
-      Set set = (Set) pair.second();
-      if (pair.first() instanceof Collection) {
-        for (Object o : (Collection) pair.first()) {
-          if (!set.contains(o)) {
-            return " Must be one of " + pair.second();
-          }
-        }
-      } else {
-        if (!set.contains(pair.first())) return " Must be one of " + pair.second() + ", got " + pair.first();
-      }
-      return null;
-    } else {
-      return " Unknown type";
-    }
-
-  };
-  private final Map<K, V> delegate;
-
-  public Map2(Map<K, V> delegate) {
-    this.delegate = delegate;
-  }
-
-  public Map2(int i) {
-    delegate = new LinkedHashMap<>(i);
-  }
-
-  public Map2() {
-    delegate = new LinkedHashMap<>();
-  }
-
-  @Override
-  public int size() {
-    return delegate.size();
-  }
-
-  @Override
-  public boolean isEmpty() {
-    return delegate.isEmpty();
-  }
-
-  @Override
-  public boolean containsKey(Object key) {
-    return delegate.containsKey(key);
-  }
-
-  @Override
-  public boolean containsValue(Object value) {
-    return delegate.containsValue(value);
-  }
-
-  @Override
-  public V get(Object key) {
-    return delegate.get(key);
-  }
-
-  @Override
-  public V put(K key, V value) {
-    return delegate.put(key, value);
-  }
-
-  @Override
-  public V remove(Object key) {
-    return delegate.remove(key);
-  }
-
-  @Override
-  public void putAll(Map<? extends K, ? extends V> m) {
-    delegate.putAll(m);
-
-  }
-
-  @Override
-  public void clear() {
-    delegate.clear();
-
-  }
-
-  @Override
-  public Set<K> keySet() {
-    return delegate.keySet();
-  }
-
-  @Override
-  public Collection<V> values() {
-    return delegate.values();
-  }
-
-  @Override
-  public Set<Entry<K, V>> entrySet() {
-    return delegate.entrySet();
-  }
-
-  public V get(K k, Predicate predicate) {
-    V v = get(k);
-    if (predicate != null) {
-      String msg = predicate.test(v);
-      if (msg != null) {
-        throw new RuntimeException("" + k + msg);
-      }
-    }
-    return v;
-  }
-
-  public Boolean getBool(K k, Boolean def) {
-    V v = get(k);
-    if (v == null) return def;
-    if (v instanceof Boolean) return (Boolean) v;
-    try {
-      return Boolean.parseBoolean(v.toString());
-    } catch (NumberFormatException e) {
-      throw new RuntimeException("value of " + k + "must be an boolean");
-    }
-  }
-
-  public Integer getInt(K k, Integer def) {
-    V v = get(k);
-    if (v == null) return def;
-    if (v instanceof Integer) return (Integer) v;
-    try {
-      return Integer.parseInt(v.toString());
-    } catch (NumberFormatException e) {
-      throw new RuntimeException("value of " + k + "must be an integer");
-    }
-  }
-  public Map2 getMap(String key, Predicate predicate) {
-    return getMap(key, predicate, null);
-
-  }
-
-  public Map2 getMap(String key, Predicate predicate, String message) {
-    V v = get(key);
-    if (v != null && !(v instanceof Map)) {
-      throw new RuntimeException("" + key + " should be of type map");
-    }
-
-    if (predicate != null) {
-      String msg = predicate.test(v);
-      if (msg != null) {
-        msg = message != null ? message : key + msg;
-        throw new RuntimeException(msg);
-      }
-    }
-    return wrap((Map) v);
-  }
-
-  public List getList(String key, Predicate predicate) {
-    return getList(key, predicate, null);
-  }
-
-  public List getList(String key, Predicate predicate, Object test) {
-    V v = get(key);
-    if (v != null && !(v instanceof List)) {
-      throw new RuntimeException("" + key + " should be of type List");
-    }
-
-    if (predicate != null) {
-      String msg = predicate.test(test == null ? v : new Pair(v, test));
-      if (msg != null) {
-        throw new RuntimeException("" + key + msg);
-      }
-    }
-
-    return (List) v;
-  }
-
-  public V get(K k, Predicate<Pair> predicate, Object arg) {
-    V v = get(k);
-    String test = predicate.test(new Pair(v, arg));
-    if (test != null) {
-      throw new RuntimeException("" + k + test);
-    }
-    return v;
-  }
-
-  public V get(K k, V def) {
-    V v = get(k);
-    if (v == null) return def;
-    return v;
-  }
-
-  static <K, V> Map2<K, V> wrap(Map<K, V> map) {
-    if (map == null) return null;
-    if (map instanceof Map2) {
-      return (Map2) map;
-    } else {
-      return new Map2<>(map);
-    }
-
-  }
-
-  public static Map2 fromJSON(InputStream is) {
-    return fromJSON(new InputStreamReader(is, UTF_8));
-  }
-
-  public static Map2 fromJSON(Reader s) {
-    try {
-      return (Map2) (getObjectBuilder(new JSONParser(s)).getObject());
-    } catch (IOException e) {
-      throw new RuntimeException();
-    }
-  }
-
-  public static Map2 getDeepCopy(Map map, int maxDepth, boolean mutable) {
-    if (map == null) return null;
-    if (maxDepth < 1) return Map2.wrap(map);
-    Map2 copy = mutable ? new Map2(map.size()) : new Map2<>();
-    for (Object o : map.entrySet()) {
-      Map.Entry e = (Map.Entry) o;
-      Object v = e.getValue();
-      if (v instanceof Map) v = getDeepCopy((Map) v, maxDepth - 1, mutable);
-      else if (v instanceof Collection) v = getDeepCopy((Collection) v, maxDepth - 1, mutable);
-      copy.put(e.getKey(), v);
-    }
-    return mutable ? copy : new Map2<>(Collections.unmodifiableMap(copy));
-  }
-
-  public static Collection getDeepCopy(Collection c, int maxDepth, boolean mutable) {
-    if (c == null || maxDepth < 1) return c;
-    Collection result = c instanceof Set ? new HashSet() : new ArrayList();
-    for (Object o : c) {
-      if (o instanceof Map) {
-        o = getDeepCopy((Map) o, maxDepth - 1, mutable);
-      }
-      result.add(o);
-    }
-    return mutable ? result : result instanceof Set ? unmodifiableSet((Set) result) : unmodifiableList((List) result);
-  }
-
-  private static ObjectBuilder getObjectBuilder(final JSONParser jp) throws IOException {
-    return new ObjectBuilder(jp) {
-      @Override
-      public Object newObject() throws IOException {
-        return new Map2();
-      }
-    };
-  }
-
-
-  @Override
-  public boolean equals(Object that) {
-    return that instanceof Map && this.delegate.equals(that);
-  }
-
-  public static final Map2 EMPTY = new Map2(Collections.EMPTY_MAP);
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/solrj/src/java/org/apache/solr/common/util/Predicate.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Predicate.java b/solr/solrj/src/java/org/apache/solr/common/util/Predicate.java
deleted file mode 100644
index 493532b..0000000
--- a/solr/solrj/src/java/org/apache/solr/common/util/Predicate.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.solr.common.util;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-public interface Predicate<T> {
-
-  /**
-   * Test the object abd return null if the predicate is true
-   * or return a string with a message;
-   *
-   * @param t test value
-   * @return null if test succeeds or an error description if test fails
-   */
-  String test(T t);
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/solrj/src/java/org/apache/solr/common/util/PredicateWithErrMsg.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/PredicateWithErrMsg.java b/solr/solrj/src/java/org/apache/solr/common/util/PredicateWithErrMsg.java
new file mode 100644
index 0000000..0a79724
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/common/util/PredicateWithErrMsg.java
@@ -0,0 +1,31 @@
+package org.apache.solr.common.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public interface PredicateWithErrMsg<T> {
+
+  /**
+   * Test the object and return null if the predicate is true
+   * or return a string with a message;
+   *
+   * @param t test value
+   * @return null if test succeeds or an error description if test fails
+   */
+  String test(T t);
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java b/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
new file mode 100644
index 0000000..553d134
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
@@ -0,0 +1,291 @@
+package org.apache.solr.common.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.noggit.JSONParser;
+import org.noggit.ObjectBuilder;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Collections.unmodifiableList;
+import static java.util.Collections.unmodifiableSet;
+
+public class ValidatingJsonMap implements Map<String, Object> {
+
+  public static final PredicateWithErrMsg<Object> NOT_NULL = o -> {
+    if (o == null) return " Must not be NULL";
+    return null;
+  };
+  public static final PredicateWithErrMsg<Pair> ENUM_OF = pair -> {
+    if (pair.second() instanceof Set) {
+      Set set = (Set) pair.second();
+      if (pair.first() instanceof Collection) {
+        for (Object o : (Collection) pair.first()) {
+          if (!set.contains(o)) {
+            return " Must be one of " + pair.second();
+          }
+        }
+      } else {
+        if (!set.contains(pair.first())) return " Must be one of " + pair.second() + ", got " + pair.first();
+      }
+      return null;
+    } else {
+      return " Unknown type";
+    }
+
+  };
+  private final Map<String, Object> delegate;
+
+  public ValidatingJsonMap(Map<String, Object> delegate) {
+    this.delegate = delegate;
+  }
+
+  public ValidatingJsonMap(int i) {
+    delegate = new LinkedHashMap<>(i);
+  }
+
+  public ValidatingJsonMap() {
+    delegate = new LinkedHashMap<>();
+  }
+
+  @Override
+  public int size() {
+    return delegate.size();
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return delegate.isEmpty();
+  }
+
+  @Override
+  public boolean containsKey(Object key) {
+    return delegate.containsKey(key);
+  }
+
+  @Override
+  public boolean containsValue(Object value) {
+    return delegate.containsValue(value);
+  }
+
+  @Override
+  public Object get(Object key) {
+    return delegate.get(key);
+  }
+
+  @Override
+  public Object put(String key, Object value) {
+    return delegate.put(key, value);
+  }
+
+  @Override
+  public Object remove(Object key) {
+    return null;
+  }
+
+  @Override
+  public void putAll(Map<? extends String, ?> m) {
+    delegate.putAll(m);
+  }
+
+  @Override
+  public void clear() {
+    delegate.clear();
+
+  }
+
+  @Override
+  public Set<String> keySet() {
+    return delegate.keySet();
+  }
+
+  @Override
+  public Collection<Object> values() {
+    return delegate.values();
+  }
+
+  @Override
+  public Set<Entry<String, Object>> entrySet() {
+    return delegate.entrySet();
+  }
+
+  public Object get(String key, PredicateWithErrMsg predicate) {
+    Object v = get(key);
+    if (predicate != null) {
+      String msg = predicate.test(v);
+      if (msg != null) {
+        throw new RuntimeException("" + key + msg);
+      }
+    }
+    return v;
+  }
+
+  public Boolean getBool(String key, Boolean def) {
+    Object v = get(key);
+    if (v == null) return def;
+    if (v instanceof Boolean) return (Boolean) v;
+    try {
+      return Boolean.parseBoolean(v.toString());
+    } catch (NumberFormatException e) {
+      throw new RuntimeException("value of " + key + "must be an boolean");
+    }
+  }
+
+  public Integer getInt(String key, Integer def) {
+    Object v = get(key);
+    if (v == null) return def;
+    if (v instanceof Integer) return (Integer) v;
+    try {
+      return Integer.parseInt(v.toString());
+    } catch (NumberFormatException e) {
+      throw new RuntimeException("value of " + key + "must be an integer");
+    }
+  }
+  public ValidatingJsonMap getMap(String key, PredicateWithErrMsg predicate) {
+    return getMap(key, predicate, null);
+
+  }
+
+  public ValidatingJsonMap getMap(String key, PredicateWithErrMsg predicate, String message) {
+    Object v = get(key);
+    if (v != null && !(v instanceof Map)) {
+      throw new RuntimeException("" + key + " should be of type map");
+    }
+
+    if (predicate != null) {
+      String msg = predicate.test(v);
+      if (msg != null) {
+        msg = message != null ? message : key + msg;
+        throw new RuntimeException(msg);
+      }
+    }
+    return wrap((Map) v);
+  }
+
+  public List getList(String key, PredicateWithErrMsg predicate) {
+    return getList(key, predicate, null);
+  }
+
+  public List getList(String key, PredicateWithErrMsg predicate, Object test) {
+    Object v = get(key);
+    if (v != null && !(v instanceof List)) {
+      throw new RuntimeException("" + key + " should be of type List");
+    }
+
+    if (predicate != null) {
+      String msg = predicate.test(test == null ? v : new Pair(v, test));
+      if (msg != null) {
+        throw new RuntimeException("" + key + msg);
+      }
+    }
+
+    return (List) v;
+  }
+
+  public Object get(String key, PredicateWithErrMsg<Pair> predicate, Object arg) {
+    Object v = get(key);
+    String test = predicate.test(new Pair(v, arg));
+    if (test != null) {
+      throw new RuntimeException("" + key + test);
+    }
+    return v;
+  }
+
+  public Object get(String k, Object def) {
+    Object v = get(k);
+    if (v == null) return def;
+    return v;
+  }
+
+  static ValidatingJsonMap wrap(Map<String, Object> map) {
+    if (map == null) return null;
+    if (map instanceof ValidatingJsonMap) {
+      return (ValidatingJsonMap) map;
+    } else {
+      return new ValidatingJsonMap(map);
+    }
+
+  }
+
+  public static ValidatingJsonMap fromJSON(InputStream is) {
+    return fromJSON(new InputStreamReader(is, UTF_8));
+  }
+
+  public static ValidatingJsonMap fromJSON(Reader s) {
+    try {
+      return (ValidatingJsonMap) (getObjectBuilder(new JSONParser(s)).getObject());
+    } catch (IOException e) {
+      throw new RuntimeException();
+    }
+  }
+
+  public static ValidatingJsonMap getDeepCopy(Map map, int maxDepth, boolean mutable) {
+    if (map == null) return null;
+    if (maxDepth < 1) return ValidatingJsonMap.wrap(map);
+    ValidatingJsonMap copy = mutable ? new ValidatingJsonMap(map.size()) : new ValidatingJsonMap();
+    for (Object o : map.entrySet()) {
+      Map.Entry<String,Object> e = (Entry<String, Object>) o;
+      Object v = e.getValue();
+      if (v instanceof Map) v = getDeepCopy((Map) v, maxDepth - 1, mutable);
+      else if (v instanceof Collection) v = getDeepCopy((Collection) v, maxDepth - 1, mutable);
+      copy.put(e.getKey(), v);
+    }
+    return mutable ? copy : new ValidatingJsonMap(Collections.unmodifiableMap(copy));
+  }
+
+  public static Collection getDeepCopy(Collection c, int maxDepth, boolean mutable) {
+    if (c == null || maxDepth < 1) return c;
+    Collection result = c instanceof Set ? new HashSet() : new ArrayList();
+    for (Object o : c) {
+      if (o instanceof Map) {
+        o = getDeepCopy((Map) o, maxDepth - 1, mutable);
+      }
+      result.add(o);
+    }
+    return mutable ? result : result instanceof Set ? unmodifiableSet((Set) result) : unmodifiableList((List) result);
+  }
+
+  private static ObjectBuilder getObjectBuilder(final JSONParser jp) throws IOException {
+    return new ObjectBuilder(jp) {
+      @Override
+      public Object newObject() throws IOException {
+        return new ValidatingJsonMap();
+      }
+    };
+  }
+
+
+  @Override
+  public boolean equals(Object that) {
+    return that instanceof Map && this.delegate.equals(that);
+  }
+
+  public static final ValidatingJsonMap EMPTY = new ValidatingJsonMap(Collections.EMPTY_MAP);
+}


[2/2] lucene-solr:apiv2: Merge remote-tracking branch 'origin/apiv2' into apiv2

Posted by no...@apache.org.
Merge remote-tracking branch 'origin/apiv2' into apiv2

Conflicts:
	solr/core/src/java/org/apache/solr/api/SpecProvider.java
	solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
	solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
	solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
	solr/solrj/src/java/org/apache/solr/common/util/PredicateWithErrMsg.java


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/92411981
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/92411981
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/92411981

Branch: refs/heads/apiv2
Commit: 92411981a82256d2add58e45e13f1065dad27ab4
Parents: baec970 327aaff
Author: Noble Paul <no...@apache.org>
Authored: Sat Sep 3 23:35:58 2016 +0530
Committer: Noble Paul <no...@apache.org>
Committed: Sat Sep 3 23:35:58 2016 +0530

----------------------------------------------------------------------
 build.xml                                       |   39 +-
 .../dot.settings/org.eclipse.jdt.core.prefs     |    3 +
 .../idea/.idea/copyright/profiles_settings.xml  |    1 -
 .../test-framework/lucene-test-framework.iml    |    1 +
 .../lucene/analysis/common/pom.xml.template     |   13 +
 dev-tools/maven/pom.xml.template                |    4 +-
 .../contrib/analysis-extras/pom.xml.template    |    7 +
 dev-tools/maven/solr/pom.xml.template           |    6 +-
 .../maven/solr/test-framework/pom.xml.template  |    5 +-
 dev-tools/scripts/addBackcompatIndexes.py       |   30 +-
 dev-tools/scripts/addVersion.py                 |   19 +-
 dev-tools/scripts/releasedJirasRegex.py         |   93 +
 dev-tools/scripts/scriptutil.py                 |    7 +-
 lucene/CHANGES.txt                              |  182 +-
 lucene/MIGRATE.txt                              |  103 +-
 lucene/analysis/common/build.xml                |   39 +-
 .../lucene/analysis/ar/ArabicAnalyzer.java      |   20 +-
 .../lucene/analysis/bg/BulgarianAnalyzer.java   |   17 +-
 .../lucene/analysis/br/BrazilianAnalyzer.java   |   17 +-
 .../lucene/analysis/ca/CatalanAnalyzer.java     |   18 +-
 .../charfilter/HTMLStripCharFilter.java         |    5 +-
 .../charfilter/HTMLStripCharFilter.jflex        |    1 +
 .../apache/lucene/analysis/cjk/CJKAnalyzer.java |   15 +-
 .../lucene/analysis/ckb/SoraniAnalyzer.java     |   23 +-
 .../analysis/commongrams/CommonGramsFilter.java |    4 +-
 .../commongrams/CommonGramsFilterFactory.java   |    3 +-
 .../compound/CompoundWordTokenFilterBase.java   |    8 +-
 .../DictionaryCompoundWordTokenFilter.java      |    2 +-
 ...ictionaryCompoundWordTokenFilterFactory.java |    8 +-
 .../HyphenationCompoundWordTokenFilter.java     |    7 +-
 ...phenationCompoundWordTokenFilterFactory.java |   11 +-
 .../lucene/analysis/core/LowerCaseFilter.java   |   50 -
 .../analysis/core/LowerCaseFilterFactory.java   |    2 +-
 .../lucene/analysis/core/SimpleAnalyzer.java    |    7 +
 .../lucene/analysis/core/StopAnalyzer.java      |   31 +-
 .../apache/lucene/analysis/core/StopFilter.java |  111 -
 .../lucene/analysis/core/StopFilterFactory.java |   11 +-
 .../lucene/analysis/core/TypeTokenFilter.java   |    2 +-
 .../lucene/analysis/core/UpperCaseFilter.java   |    3 +-
 .../lucene/analysis/custom/CustomAnalyzer.java  |   28 +-
 .../lucene/analysis/cz/CzechAnalyzer.java       |   25 +-
 .../lucene/analysis/da/DanishAnalyzer.java      |   19 +-
 .../lucene/analysis/de/GermanAnalyzer.java      |   20 +-
 .../lucene/analysis/el/GreekAnalyzer.java       |   13 +-
 .../apache/lucene/analysis/el/GreekStemmer.java |    2 +-
 .../lucene/analysis/en/EnglishAnalyzer.java     |   15 +-
 .../org/apache/lucene/analysis/en/KStemmer.java |    2 +-
 .../lucene/analysis/es/SpanishAnalyzer.java     |   19 +-
 .../lucene/analysis/eu/BasqueAnalyzer.java      |   17 +-
 .../lucene/analysis/fa/PersianAnalyzer.java     |   22 +-
 .../lucene/analysis/fi/FinnishAnalyzer.java     |   19 +-
 .../lucene/analysis/fr/FrenchAnalyzer.java      |   32 +-
 .../lucene/analysis/ga/IrishAnalyzer.java       |   16 +-
 .../lucene/analysis/gl/GalicianAnalyzer.java    |   19 +-
 .../lucene/analysis/hi/HindiAnalyzer.java       |   23 +-
 .../lucene/analysis/hu/HungarianAnalyzer.java   |   19 +-
 .../lucene/analysis/hunspell/Stemmer.java       |    2 +-
 .../lucene/analysis/hy/ArmenianAnalyzer.java    |   17 +-
 .../lucene/analysis/id/IndonesianAnalyzer.java  |   17 +-
 .../lucene/analysis/it/ItalianAnalyzer.java     |   20 +-
 .../lucene/analysis/lt/LithuanianAnalyzer.java  |   17 +-
 .../lucene/analysis/lv/LatvianAnalyzer.java     |   19 +-
 .../lucene/analysis/minhash/MinHashFilter.java  |    6 +-
 .../analysis/minhash/MinHashFilterFactory.java  |    5 +-
 .../miscellaneous/CapitalizationFilter.java     |    2 +-
 .../CapitalizationFilterFactory.java            |    8 +-
 .../miscellaneous/CodepointCountFilter.java     |    2 +-
 .../miscellaneous/DateRecognizerFilter.java     |    2 +-
 .../miscellaneous/FingerprintFilter.java        |    2 +-
 .../analysis/miscellaneous/KeepWordFilter.java  |    4 +-
 .../miscellaneous/KeepWordFilterFactory.java    |    8 +-
 .../KeywordMarkerFilterFactory.java             |    2 +-
 .../analysis/miscellaneous/LengthFilter.java    |    2 +-
 .../RemoveDuplicatesTokenFilter.java            |    2 +-
 .../ScandinavianFoldingFilterFactory.java       |   10 +-
 .../ScandinavianNormalizationFilterFactory.java |   10 +-
 .../miscellaneous/SetKeywordMarkerFilter.java   |    2 +-
 .../miscellaneous/WordDelimiterFilter.java      |   10 +-
 .../WordDelimiterFilterFactory.java             |   16 +-
 .../lucene/analysis/ngram/NGramTokenizer.java   |    2 +-
 .../lucene/analysis/nl/DutchAnalyzer.java       |   29 +-
 .../lucene/analysis/no/NorwegianAnalyzer.java   |   19 +-
 .../lucene/analysis/pt/PortugueseAnalyzer.java  |   19 +-
 .../lucene/analysis/pt/RSLPStemmerBase.java     |    2 +-
 .../query/QueryAutoStopWordAnalyzer.java        |    4 +-
 .../lucene/analysis/ro/RomanianAnalyzer.java    |   17 +-
 .../lucene/analysis/ru/RussianAnalyzer.java     |   23 +-
 .../analysis/snowball/SnowballFilter.java       |    4 +-
 .../snowball/SnowballPorterFilterFactory.java   |    6 +-
 .../analysis/standard/ASCIITLD.jflex-macro      |    2 +-
 .../analysis/standard/ClassicAnalyzer.java      |   15 +-
 .../analysis/standard/ClassicTokenizer.java     |    1 +
 .../standard/ClassicTokenizerImpl.jflex         |    1 +
 .../analysis/standard/StandardAnalyzer.java     |   98 -
 .../analysis/standard/StandardFilter.java       |   38 -
 .../analysis/standard/StandardTokenizer.java    |  201 -
 .../standard/StandardTokenizerImpl.java         |  818 ---
 .../standard/StandardTokenizerImpl.jflex        |  201 -
 .../standard/UAX29URLEmailAnalyzer.java         |   19 +-
 .../standard/UAX29URLEmailTokenizer.java        |    1 +
 .../standard/UAX29URLEmailTokenizerImpl.jflex   |    1 +
 .../lucene/analysis/standard/package-info.java  |   63 -
 .../lucene/analysis/standard/package.html       |   50 +
 .../lucene/analysis/sv/SwedishAnalyzer.java     |   19 +-
 .../analysis/synonym/SynonymFilterFactory.java  |    2 +-
 .../apache/lucene/analysis/th/ThaiAnalyzer.java |   15 +-
 .../lucene/analysis/tr/TurkishAnalyzer.java     |   15 +-
 .../analysis/util/AbstractAnalysisFactory.java  |    4 +-
 .../lucene/analysis/util/CharArrayMap.java      |  669 ---
 .../lucene/analysis/util/CharArraySet.java      |  193 -
 .../lucene/analysis/util/CharTokenizer.java     |   10 +-
 .../lucene/analysis/util/CharacterUtils.java    |  251 -
 .../lucene/analysis/util/ElisionFilter.java     |    2 +-
 .../analysis/util/ElisionFilterFactory.java     |    1 +
 .../analysis/util/FilteringTokenFilter.java     |   76 -
 .../analysis/util/StopwordAnalyzerBase.java     |  138 -
 .../lucene/analysis/util/UnicodeProps.java      |    4 +-
 .../lucene/analysis/util/WordlistLoader.java    |  244 -
 .../wikipedia/WikipediaTokenizerImpl.java       |    1 +
 .../wikipedia/WikipediaTokenizerImpl.jflex      |    1 +
 .../lucene/collation/CollationKeyAnalyzer.java  |    7 +
 .../apache/lucene/collation/package-info.java   |    2 +-
 .../lucene/analysis/ar/TestArabicAnalyzer.java  |    2 +-
 .../analysis/ar/TestArabicStemFilter.java       |    2 +-
 .../analysis/bg/TestBulgarianAnalyzer.java      |    2 +-
 .../analysis/bg/TestBulgarianStemmer.java       |    2 +-
 .../analysis/br/TestBrazilianAnalyzer.java      |    2 +-
 .../lucene/analysis/ca/TestCatalanAnalyzer.java |    2 +-
 .../lucene/analysis/cjk/TestCJKAnalyzer.java    |    4 +-
 .../lucene/analysis/ckb/TestSoraniAnalyzer.java |    2 +-
 .../commongrams/CommonGramsFilterTest.java      |    2 +-
 .../TestCommonGramsFilterFactory.java           |   10 +-
 .../TestCommonGramsQueryFilterFactory.java      |    7 +-
 .../compound/TestCompoundWordTokenFilter.java   |    2 +-
 .../core/TestAllAnalyzersHaveFactories.java     |    4 +
 .../lucene/analysis/core/TestAnalyzers.java     |    5 +
 .../analysis/core/TestBugInSomething.java       |    2 +-
 .../lucene/analysis/core/TestRandomChains.java  |   16 +-
 .../lucene/analysis/core/TestStopAnalyzer.java  |   14 +-
 .../lucene/analysis/core/TestStopFilter.java    |  176 -
 .../analysis/core/TestStopFilterFactory.java    |    2 +-
 .../analysis/custom/TestCustomAnalyzer.java     |  143 +
 .../lucene/analysis/cz/TestCzechAnalyzer.java   |    4 +-
 .../lucene/analysis/cz/TestCzechStemmer.java    |    2 +-
 .../lucene/analysis/da/TestDanishAnalyzer.java  |    2 +-
 .../lucene/analysis/de/TestGermanAnalyzer.java  |    2 +-
 .../analysis/de/TestGermanLightStemFilter.java  |    2 +-
 .../de/TestGermanMinimalStemFilter.java         |    2 +-
 .../analysis/de/TestGermanStemFilter.java       |    4 +-
 .../lucene/analysis/en/TestEnglishAnalyzer.java |    2 +-
 .../analysis/en/TestPorterStemFilter.java       |    8 +-
 .../lucene/analysis/es/TestSpanishAnalyzer.java |    2 +-
 .../lucene/analysis/eu/TestBasqueAnalyzer.java  |    2 +-
 .../lucene/analysis/fa/TestPersianAnalyzer.java |    2 +-
 .../lucene/analysis/fi/TestFinnishAnalyzer.java |    2 +-
 .../analysis/fi/TestFinnishLightStemFilter.java |    2 +-
 .../lucene/analysis/fr/TestFrenchAnalyzer.java  |    2 +-
 .../analysis/fr/TestFrenchLightStemFilter.java  |    2 +-
 .../fr/TestFrenchMinimalStemFilter.java         |    2 +-
 .../lucene/analysis/ga/TestIrishAnalyzer.java   |    2 +-
 .../analysis/gl/TestGalicianAnalyzer.java       |    2 +-
 .../gl/TestGalicianMinimalStemFilter.java       |    2 +-
 .../lucene/analysis/hi/TestHindiAnalyzer.java   |    2 +-
 .../analysis/hu/TestHungarianAnalyzer.java      |    2 +-
 .../hu/TestHungarianLightStemFilter.java        |    2 +-
 .../hunspell/TestHunspellStemFilter.java        |    2 +-
 .../analysis/hy/TestArmenianAnalyzer.java       |    2 +-
 .../analysis/id/TestIndonesianAnalyzer.java     |    2 +-
 .../lucene/analysis/it/TestItalianAnalyzer.java |    2 +-
 .../analysis/lt/TestLithuanianAnalyzer.java     |    2 +-
 .../lucene/analysis/lv/TestLatvianAnalyzer.java |    2 +-
 .../analysis/minhash/MinHashFilterTest.java     |    4 +-
 .../miscellaneous/TestCapitalizationFilter.java |    2 +-
 .../miscellaneous/TestKeepFilterFactory.java    |    4 +-
 .../miscellaneous/TestKeepWordFilter.java       |    2 +-
 .../miscellaneous/TestKeywordMarkerFilter.java  |    4 +-
 .../TestStemmerOverrideFilter.java              |    2 +-
 .../miscellaneous/TestWordDelimiterFilter.java  |   12 +-
 .../lucene/analysis/nl/TestDutchAnalyzer.java   |    6 +-
 .../analysis/no/TestNorwegianAnalyzer.java      |    2 +-
 .../no/TestNorwegianLightStemFilter.java        |    2 +-
 .../no/TestNorwegianMinimalStemFilter.java      |    2 +-
 .../analysis/pt/TestPortugueseAnalyzer.java     |    2 +-
 .../pt/TestPortugueseLightStemFilter.java       |    2 +-
 .../pt/TestPortugueseMinimalStemFilter.java     |    2 +-
 .../analysis/pt/TestPortugueseStemFilter.java   |    6 +-
 .../analysis/ro/TestRomanianAnalyzer.java       |    2 +-
 .../lucene/analysis/ru/TestRussianAnalyzer.java |    4 +-
 .../analysis/ru/TestRussianLightStemFilter.java |    2 +-
 .../shingle/ShingleAnalyzerWrapperTest.java     |    4 +-
 .../analysis/sinks/TestTeeSinkTokenFilter.java  |    4 +-
 .../analysis/standard/TestStandardAnalyzer.java |  390 --
 .../standard/WordBreakTestUnicode_6_3_0.java    | 5537 ------------------
 .../generateJavaUnicodeWordBreakTest.pl         |  232 -
 .../lucene/analysis/sv/TestSwedishAnalyzer.java |    2 +-
 .../analysis/sv/TestSwedishLightStemFilter.java |    2 +-
 .../lucene/analysis/th/TestThaiAnalyzer.java    |    2 +-
 .../lucene/analysis/tr/TestTurkishAnalyzer.java |    2 +-
 .../lucene/analysis/util/TestCharArrayMap.java  |  244 -
 .../lucene/analysis/util/TestCharArraySet.java  |  429 --
 .../analysis/util/TestCharacterUtils.java       |  107 -
 .../lucene/analysis/util/TestElision.java       |    2 +-
 .../util/TestFilesystemResourceLoader.java      |    2 +
 .../analysis/util/TestWordlistLoader.java       |   79 -
 .../tools/groovy/generate-unicode-data.groovy   |    4 +-
 .../icu/src/data/uax29/MyanmarSyllable.rbbi     |   50 +
 .../segmentation/DefaultICUTokenizerConfig.java |   14 +-
 .../analysis/icu/segmentation/ICUTokenizer.java |    2 +-
 .../icu/segmentation/ICUTokenizerFactory.java   |    6 +-
 lucene/analysis/icu/src/java/overview.html      |    2 +-
 .../icu/segmentation/MyanmarSyllable.brk        |  Bin 0 -> 19776 bytes
 .../icu/segmentation/TestICUTokenizer.java      |    6 +-
 .../icu/segmentation/TestICUTokenizerCJK.java   |    2 +-
 .../icu/segmentation/TestMyanmarSyllable.java   |  156 +
 .../segmentation/TestWithCJKBigramFilter.java   |    8 +-
 .../lucene/analysis/ja/JapaneseAnalyzer.java    |   15 +-
 .../analysis/ja/JapaneseNumberFilter.java       |    4 +-
 .../ja/JapanesePartOfSpeechStopFilter.java      |    4 +-
 .../JapanesePartOfSpeechStopFilterFactory.java  |    2 +-
 .../analysis/ja/TestJapaneseBaseFormFilter.java |    2 +-
 .../ja/TestJapaneseKatakanaStemFilter.java      |    6 +-
 .../analysis/ja/TestJapaneseNumberFilter.java   |    2 +-
 .../analysis/morfologik/MorfologikAnalyzer.java |    6 +
 .../analysis/morfologik/MorfologikFilter.java   |   12 +-
 .../uk/UkrainianMorfologikAnalyzer.java         |  153 +
 .../apache/lucene/analysis/uk/package-info.java |   21 +
 .../apache/lucene/analysis/uk/mapping_uk.txt    |   19 +
 .../org/apache/lucene/analysis/uk/stopwords.txt | 1269 ++++
 .../apache/lucene/analysis/uk/ukrainian.dict    |  Bin 0 -> 1989243 bytes
 .../apache/lucene/analysis/uk/ukrainian.info    |   10 +
 .../morfologik/TestMorfologikAnalyzer.java      |    2 +-
 .../analysis/uk/TestUkrainianAnalyzer.java      |   72 +
 .../analysis/cn/smart/SmartChineseAnalyzer.java |   12 +-
 .../lucene/analysis/pl/PolishAnalyzer.java      |   21 +-
 .../lucene/analysis/pl/TestPolishAnalyzer.java  |    2 +-
 .../index/TestBackwardsCompatibility.java       |   42 +-
 .../org/apache/lucene/index/index.6.0.0-cfs.zip |  Bin 13744 -> 15807 bytes
 .../apache/lucene/index/index.6.0.0-nocfs.zip   |  Bin 13749 -> 15806 bytes
 .../org/apache/lucene/index/index.6.0.1-cfs.zip |  Bin 13734 -> 15820 bytes
 .../apache/lucene/index/index.6.0.1-nocfs.zip   |  Bin 13735 -> 15823 bytes
 .../org/apache/lucene/index/index.6.1.0-cfs.zip |  Bin 0 -> 15803 bytes
 .../apache/lucene/index/index.6.1.0-nocfs.zip   |  Bin 0 -> 15829 bytes
 .../lucene/index/unsupported.5.5.2-cfs.zip      |  Bin 0 -> 13712 bytes
 .../lucene/index/unsupported.5.5.2-nocfs.zip    |  Bin 0 -> 13720 bytes
 .../benchmark/byTask/tasks/CommitIndexTask.java |    2 +-
 .../benchmark/quality/TestQualityRun.java       |    3 -
 .../lucene/benchmark/quality/trecQRels.txt      |  428 +-
 lucene/build.xml                                |   15 +-
 .../BooleanPerceptronClassifier.java            |   20 +-
 .../CachingNaiveBayesClassifier.java            |   18 +-
 .../KNearestNeighborClassifier.java             |    9 +-
 .../SimpleNaiveBayesClassifier.java             |   24 +-
 .../KNearestNeighborDocumentClassifier.java     |   10 +-
 .../SimpleNaiveBayesDocumentClassifier.java     |   16 +-
 .../utils/ConfusionMatrixGenerator.java         |    8 +-
 .../classification/utils/DatasetSplitter.java   |   30 +-
 .../DocumentClassificationTestBase.java         |   11 +-
 .../KNearestNeighborDocumentClassifierTest.java |   40 +-
 .../SimpleNaiveBayesDocumentClassifierTest.java |   32 +-
 .../autoprefix/AutoPrefixPostingsFormat.java    |  125 -
 .../lucene/codecs/autoprefix/package-info.java  |   22 -
 .../simpletext/SimpleTextCompoundFormat.java    |    5 +-
 .../simpletext/SimpleTextPointsWriter.java      |   16 +-
 .../org.apache.lucene.codecs.PostingsFormat     |    1 -
 .../TestAutoPrefixPostingsFormat.java           |   38 -
 .../codecs/autoprefix/TestAutoPrefixTerms.java  |  941 ---
 lucene/common-build.xml                         |   48 +-
 lucene/core/build.xml                           |   18 +-
 .../org/apache/lucene/analysis/Analyzer.java    |  135 +-
 .../apache/lucene/analysis/CharArrayMap.java    |  669 +++
 .../apache/lucene/analysis/CharArraySet.java    |  196 +
 .../apache/lucene/analysis/CharacterUtils.java  |  251 +
 .../lucene/analysis/FilteringTokenFilter.java   |   76 +
 .../apache/lucene/analysis/LowerCaseFilter.java |   50 +
 .../org/apache/lucene/analysis/StopFilter.java  |  111 +
 .../lucene/analysis/StopwordAnalyzerBase.java   |  138 +
 .../apache/lucene/analysis/WordlistLoader.java  |  244 +
 .../apache/lucene/analysis/package-info.java    |    2 +-
 .../analysis/standard/StandardAnalyzer.java     |  122 +
 .../analysis/standard/StandardFilter.java       |   39 +
 .../analysis/standard/StandardTokenizer.java    |  214 +
 .../standard/StandardTokenizerImpl.java         |  823 +++
 .../standard/StandardTokenizerImpl.jflex        |  207 +
 .../lucene/analysis/standard/package-info.java  |   33 +
 .../apache/lucene/codecs/BlockTermState.java    |   14 +-
 .../lucene/codecs/MutablePointsReader.java      |   39 +
 .../codecs/blocktree/AutoPrefixTermsWriter.java |  438 --
 .../codecs/blocktree/BlockTreeTermsReader.java  |   11 +-
 .../codecs/blocktree/BlockTreeTermsWriter.java  |  222 +-
 .../codecs/blocktree/IntersectTermsEnum.java    |    2 -
 .../codecs/lucene50/Lucene50CompoundReader.java |    7 +-
 .../codecs/lucene60/Lucene60PointsWriter.java   |    9 +
 .../org/apache/lucene/document/BinaryPoint.java |    2 +-
 .../lucene/document/CompressionTools.java       |  150 -
 .../org/apache/lucene/document/FieldType.java   |    2 +-
 .../lucene/document/SortedDocValuesField.java   |    4 +-
 .../document/SortedSetDocValuesField.java       |    2 +
 .../java/org/apache/lucene/geo/GeoUtils.java    |   43 +-
 .../src/java/org/apache/lucene/geo/Polygon.java |   13 +-
 .../java/org/apache/lucene/geo/Rectangle.java   |    4 +-
 .../lucene/geo/SimpleGeoJSONPolygonParser.java  |  440 ++
 .../apache/lucene/index/DocumentsWriter.java    |   15 +-
 .../index/DocumentsWriterFlushControl.java      |   27 +-
 .../index/DocumentsWriterStallControl.java      |   26 +-
 .../org/apache/lucene/index/IndexCommit.java    |    2 +-
 .../org/apache/lucene/index/IndexUpgrader.java  |    2 +-
 .../org/apache/lucene/index/IndexWriter.java    |   74 +-
 .../apache/lucene/index/IndexWriterConfig.java  |   17 +-
 .../apache/lucene/index/MergeReaderWrapper.java |    4 +-
 .../apache/lucene/index/PointValuesWriter.java  |  160 +-
 .../org/apache/lucene/index/SegmentInfos.java   |   35 +-
 .../apache/lucene/index/SortingLeafReader.java  |    4 +-
 .../org/apache/lucene/index/TermContext.java    |   12 -
 .../java/org/apache/lucene/index/TermState.java |    6 -
 .../apache/lucene/search/BlendedTermQuery.java  |    6 +-
 .../org/apache/lucene/search/BooleanQuery.java  |   44 +-
 .../org/apache/lucene/search/BooleanScorer.java |   36 +-
 .../lucene/search/BooleanTopLevelScorers.java   |  182 -
 .../org/apache/lucene/search/BooleanWeight.java |  180 +-
 .../org/apache/lucene/search/BoostQuery.java    |   44 +-
 .../apache/lucene/search/ConjunctionDISI.java   |  124 +-
 .../apache/lucene/search/ConjunctionScorer.java |   10 +-
 .../lucene/search/ConstantScoreQuery.java       |    6 +-
 .../lucene/search/ConstantScoreWeight.java      |   35 +-
 .../lucene/search/DisjunctionMaxQuery.java      |   29 +-
 .../lucene/search/DisjunctionSumScorer.java     |   11 +-
 .../lucene/search/DocValuesRewriteMethod.java   |    4 +-
 .../org/apache/lucene/search/Explanation.java   |   33 +-
 .../apache/lucene/search/FieldValueQuery.java   |    4 +-
 .../org/apache/lucene/search/FilterWeight.java  |   73 +
 .../org/apache/lucene/search/IndexSearcher.java |   27 +-
 .../org/apache/lucene/search/LRUQueryCache.java |   36 +-
 .../lucene/search/LeafFieldComparator.java      |    7 +-
 .../apache/lucene/search/MatchAllDocsQuery.java |    4 +-
 .../apache/lucene/search/MatchNoDocsQuery.java  |   42 +-
 .../lucene/search/MinShouldMatchSumScorer.java  |    6 +-
 .../apache/lucene/search/MultiPhraseQuery.java  |   20 +-
 .../apache/lucene/search/MultiTermQuery.java    |    8 +-
 .../MultiTermQueryConstantScoreWrapper.java     |   11 +-
 .../org/apache/lucene/search/PhraseQuery.java   |   20 +-
 .../apache/lucene/search/PointInSetQuery.java   |    4 +-
 .../apache/lucene/search/PointRangeQuery.java   |    4 +-
 .../java/org/apache/lucene/search/Query.java    |    3 +-
 .../lucene/search/RandomAccessWeight.java       |    4 +-
 .../apache/lucene/search/ScoringRewrite.java    |    6 +-
 .../org/apache/lucene/search/SynonymQuery.java  |   20 +-
 .../org/apache/lucene/search/TermQuery.java     |   86 +-
 .../java/org/apache/lucene/search/Weight.java   |   15 +-
 .../org/apache/lucene/search/package-info.java  |   29 +-
 .../search/similarities/BM25Similarity.java     |   25 +-
 .../lucene/search/similarities/BasicStats.java  |   35 +-
 .../search/similarities/ClassicSimilarity.java  |   12 -
 .../search/similarities/LMSimilarity.java       |    8 +-
 .../search/similarities/MultiSimilarity.java    |   20 +-
 .../similarities/PerFieldSimilarityWrapper.java |   14 +-
 .../lucene/search/similarities/Similarity.java  |   64 +-
 .../search/similarities/SimilarityBase.java     |    8 +-
 .../search/similarities/TFIDFSimilarity.java    |  168 +-
 .../search/spans/FieldMaskingSpanQuery.java     |    4 +-
 .../search/spans/ScoringWrapperSpans.java       |   95 -
 .../lucene/search/spans/SpanBoostQuery.java     |   54 +-
 .../lucene/search/spans/SpanContainQuery.java   |    4 +-
 .../search/spans/SpanContainingQuery.java       |   12 +-
 .../search/spans/SpanMultiTermQueryWrapper.java |    2 +-
 .../lucene/search/spans/SpanNearQuery.java      |   18 +-
 .../lucene/search/spans/SpanNotQuery.java       |   14 +-
 .../apache/lucene/search/spans/SpanOrQuery.java |   12 +-
 .../search/spans/SpanPositionCheckQuery.java    |   10 +-
 .../apache/lucene/search/spans/SpanQuery.java   |    2 +-
 .../apache/lucene/search/spans/SpanScorer.java  |   10 +-
 .../lucene/search/spans/SpanTermQuery.java      |    8 +-
 .../apache/lucene/search/spans/SpanWeight.java  |   20 +-
 .../lucene/search/spans/SpanWithinQuery.java    |   12 +-
 .../lucene/store/ByteArrayIndexInput.java       |    4 +-
 .../java/org/apache/lucene/store/Directory.java |    8 +-
 .../org/apache/lucene/store/FSDirectory.java    |   15 +-
 .../lucene/store/FileSwitchDirectory.java       |   10 +-
 .../apache/lucene/store/FilterDirectory.java    |    9 +-
 .../store/LockValidatingDirectoryWrapper.java   |   10 +-
 .../lucene/store/NRTCachingDirectory.java       |    4 +-
 .../org/apache/lucene/store/RAMDirectory.java   |   22 +-
 .../lucene/store/TrackingDirectoryWrapper.java  |    4 +-
 .../java/org/apache/lucene/util/ArrayUtil.java  |   71 +-
 .../org/apache/lucene/util/BitSetIterator.java  |   10 +
 .../org/apache/lucene/util/ByteBlockPool.java   |    8 +
 .../org/apache/lucene/util/IntroSelector.java   |  126 +
 .../org/apache/lucene/util/IntroSorter.java     |    7 +-
 .../org/apache/lucene/util/QueryBuilder.java    |    1 -
 .../org/apache/lucene/util/RadixSelector.java   |  202 +
 .../java/org/apache/lucene/util/Selector.java   |   41 +
 .../java/org/apache/lucene/util/SloppyMath.java |   20 +-
 .../org/apache/lucene/util/bkd/BKDReader.java   |   83 +-
 .../org/apache/lucene/util/bkd/BKDWriter.java   |  638 +-
 .../apache/lucene/util/bkd/DocIdsWriter.java    |  170 +
 .../util/bkd/MutablePointsReaderUtils.java      |  185 +
 .../org/apache/lucene/util/packed/Direct16.java |    2 +-
 .../org/apache/lucene/util/packed/Direct32.java |    2 +-
 .../org/apache/lucene/util/packed/Direct64.java |    2 +-
 .../org/apache/lucene/util/packed/Direct8.java  |    2 +-
 .../lucene/util/packed/Packed16ThreeBlocks.java |    2 +-
 .../lucene/util/packed/Packed64SingleBlock.java |    2 +-
 .../lucene/util/packed/Packed8ThreeBlocks.java  |    2 +-
 lucene/core/src/java/overview.html              |    2 +-
 .../lucene/analysis/TestCharArrayMap.java       |  244 +
 .../lucene/analysis/TestCharArraySet.java       |  430 ++
 .../lucene/analysis/TestCharacterUtils.java     |  107 +
 .../apache/lucene/analysis/TestStopFilter.java  |  139 +
 .../lucene/analysis/TestWordlistLoader.java     |   79 +
 .../analysis/standard/TestStandardAnalyzer.java |  396 ++
 .../lucene62/TestLucene62SegmentInfoFormat.java |    4 +-
 .../lucene/document/TestBinaryDocument.java     |   29 -
 .../test/org/apache/lucene/geo/TestPolygon.java |  241 +
 .../index/TestAllFilesCheckIndexHeader.java     |    6 -
 .../index/TestConcurrentMergeScheduler.java     |    3 -
 .../test/org/apache/lucene/index/TestCrash.java |    1 -
 .../apache/lucene/index/TestCustomNorms.java    |   12 +-
 .../apache/lucene/index/TestDeletionPolicy.java |    4 +-
 .../lucene/index/TestDirectoryReaderReopen.java |    4 +-
 .../index/TestDocumentsWriterStallControl.java  |    6 +-
 .../lucene/index/TestIndexFileDeleter.java      |    3 -
 .../apache/lucene/index/TestIndexSorting.java   |    8 +-
 .../apache/lucene/index/TestIndexWriter.java    |   43 +-
 .../lucene/index/TestIndexWriterCommit.java     |   57 +-
 .../lucene/index/TestIndexWriterDelete.java     |    1 -
 .../index/TestIndexWriterExceptions2.java       |    1 -
 .../lucene/index/TestIndexWriterFromReader.java |    9 -
 .../lucene/index/TestIndexWriterMerging.java    |    5 -
 .../lucene/index/TestIndexWriterOnDiskFull.java |    1 -
 .../TestIndexWriterOutOfFileDescriptors.java    |    1 -
 .../index/TestIndexWriterWithThreads.java       |    3 -
 .../lucene/index/TestMaxTermFrequency.java      |    2 -
 .../lucene/index/TestNRTReaderCleanup.java      |    3 -
 .../test/org/apache/lucene/index/TestNorms.java |   15 +-
 .../org/apache/lucene/index/TestOmitTf.java     |    4 -
 .../apache/lucene/index/TestPointValues.java    |    3 +-
 .../lucene/index/TestTransactionRollback.java   |    4 +-
 .../apache/lucene/index/TestTransactions.java   |    2 -
 .../lucene/index/TestUniqueTermCount.java       |    2 +-
 .../apache/lucene/search/JustCompileSearch.java |   12 +-
 .../org/apache/lucene/search/TestBoolean2.java  |   65 +-
 .../apache/lucene/search/TestBooleanCoord.java  |  860 ---
 .../search/TestBooleanMinShouldMatch.java       |   58 +-
 .../org/apache/lucene/search/TestBooleanOr.java |    2 +-
 .../apache/lucene/search/TestBooleanQuery.java  |   37 +-
 .../search/TestBooleanQueryVisitSubscorers.java |    5 +-
 .../lucene/search/TestBooleanRewrites.java      |   14 -
 .../apache/lucene/search/TestBooleanScorer.java |   26 +-
 .../apache/lucene/search/TestBoostQuery.java    |    4 +-
 .../lucene/search/TestComplexExplanations.java  |   17 +-
 .../lucene/search/TestConjunctionDISI.java      |   98 +-
 .../apache/lucene/search/TestConjunctions.java  |   13 +-
 .../lucene/search/TestConstantScoreQuery.java   |   13 +-
 .../TestControlledRealTimeReopenThread.java     |   15 +
 .../lucene/search/TestDocValuesScoring.java     |   14 +-
 .../apache/lucene/search/TestFilterWeight.java  |   67 +
 .../apache/lucene/search/TestLRUQueryCache.java |   35 +-
 .../lucene/search/TestMatchNoDocsQuery.java     |   50 +-
 .../lucene/search/TestMinShouldMatch2.java      |   13 +-
 .../lucene/search/TestMultiPhraseQuery.java     |   27 -
 .../search/TestMultiTermConstantScore.java      |   74 -
 .../search/TestMultiTermQueryRewrites.java      |   12 +-
 .../apache/lucene/search/TestNeedsScores.java   |   14 +-
 .../lucene/search/TestPositionIncrement.java    |    4 +-
 .../search/TestPositiveScoresOnlyCollector.java |    2 +-
 .../apache/lucene/search/TestQueryRescorer.java |   11 +-
 .../search/TestScoreCachingWrappingScorer.java  |    2 +-
 .../apache/lucene/search/TestScorerPerf.java    |    5 +-
 .../apache/lucene/search/TestSimilarity.java    |    4 -
 .../lucene/search/TestSimilarityProvider.java   |   20 -
 .../lucene/search/TestSimpleExplanations.java   |   43 +-
 .../apache/lucene/search/TestSortRandom.java    |    4 +-
 .../org/apache/lucene/search/TestTermQuery.java |  154 +
 .../org/apache/lucene/search/TestWildcard.java  |    3 +-
 .../search/similarities/TestSimilarity2.java    |    5 -
 .../search/similarities/TestSimilarityBase.java |    8 +-
 .../search/spans/JustCompileSearchSpans.java    |    2 +-
 .../search/spans/TestFieldMaskingSpanQuery.java |   14 +-
 .../search/spans/TestNearSpansOrdered.java      |   26 +-
 .../lucene/search/spans/TestSpanCollection.java |    6 +-
 .../search/spans/TestSpanContainQuery.java      |    2 +-
 .../apache/lucene/search/spans/TestSpans.java   |   10 +-
 .../store/TestTrackingDirectoryWrapper.java     |    2 +-
 .../apache/lucene/util/TestByteBlockPool.java   |    8 +-
 .../apache/lucene/util/TestIntroSelector.java   |   86 +
 .../apache/lucene/util/TestOfflineSorter.java   |   13 -
 .../apache/lucene/util/TestQueryBuilder.java    |   43 +-
 .../apache/lucene/util/TestRadixSelector.java   |   77 +
 .../org/apache/lucene/util/bkd/TestBKD.java     |   35 +-
 .../lucene/util/bkd/TestDocIdsWriter.java       |  101 +
 .../util/bkd/TestMutablePointsReaderUtils.java  |  251 +
 .../org/apache/lucene/util/fst/TestFSTs.java    |    1 -
 .../demo/facet/DistanceFacetsExample.java       |   27 +-
 .../org/apache/lucene/facet/DrillDownQuery.java |    1 -
 .../apache/lucene/facet/DrillSidewaysQuery.java |   14 +-
 .../apache/lucene/facet/range/DoubleRange.java  |    6 +-
 .../apache/lucene/facet/range/LongRange.java    |    6 +-
 .../lucene/facet/taxonomy/TaxonomyReader.java   |    2 +-
 .../lucene/facet/taxonomy/TaxonomyWriter.java   |   16 +-
 .../directory/DirectoryTaxonomyWriter.java      |   40 +-
 .../apache/lucene/facet/TestDrillSideways.java  |    5 +-
 .../facet/range/TestRangeFacetCounts.java       |   14 +-
 .../taxonomy/directory/TestAddTaxonomy.java     |    4 +-
 .../directory/TestDirectoryTaxonomyWriter.java  |   20 +-
 .../lucene/search/grouping/SearchGroup.java     |    8 +-
 .../highlight/WeightedSpanTermExtractor.java    |    4 +-
 .../search/vectorhighlight/FieldQuery.java      |    6 +
 .../search/vectorhighlight/FieldQueryTest.java  |   14 +
 lucene/ivy-versions.properties                  |   38 +-
 .../lucene/search/join/GlobalOrdinalsQuery.java |    8 +-
 .../join/GlobalOrdinalsWithScoreQuery.java      |   25 +-
 .../org/apache/lucene/search/join/JoinUtil.java |    4 +-
 .../join/PointInSetIncludingScoreQuery.java     |   47 +-
 .../search/join/TermsIncludingScoreQuery.java   |   13 +-
 .../search/join/ToChildBlockJoinQuery.java      |   33 +-
 .../search/join/ToParentBlockJoinQuery.java     |   33 +-
 .../lucene/search/join/TestBlockJoin.java       |    4 +-
 .../apache/lucene/search/join/TestJoinUtil.java |   13 +-
 lucene/licenses/commons-compress-1.11.jar.sha1  |    1 +
 lucene/licenses/commons-compress-1.8.1.jar.sha1 |    1 -
 .../apache/lucene/index/memory/MemoryIndex.java |   51 +-
 .../lucene/index/memory/TestMemoryIndex.java    |   36 +
 .../store/HardlinkCopyDirectoryWrapper.java     |    4 +-
 .../search/TestDiversifiedTopDocsCollector.java |    4 +-
 .../store/TestHardLinkCopyDirectoryWrapper.java |    4 +-
 .../apache/lucene/util/fst/TestFSTsMisc.java    |    1 -
 .../apache/lucene/queries/BoostingQuery.java    |   18 +-
 .../apache/lucene/queries/CommonTermsQuery.java |   49 +-
 .../apache/lucene/queries/CustomScoreQuery.java |   82 +-
 .../org/apache/lucene/queries/TermsQuery.java   |    7 +-
 .../lucene/queries/function/BoostedQuery.java   |   18 +-
 .../lucene/queries/function/FunctionQuery.java  |   37 +-
 .../queries/function/FunctionRangeQuery.java    |   13 +-
 .../valuesource/ComparisonBoolFunction.java     |  105 +
 .../lucene/queries/mlt/MoreLikeThisQuery.java   |    1 -
 .../queries/payloads/PayloadScoreQuery.java     |   20 +-
 .../queries/payloads/SpanPayloadCheckQuery.java |   10 +-
 .../lucene/queries/BoostingQueryTest.java       |    4 +-
 .../lucene/queries/CommonTermsQueryTest.java    |   10 +-
 .../queries/TestCustomScoreExplanations.java    |   12 +-
 .../lucene/queries/TestCustomScoreQuery.java    |    4 -
 .../function/TestLongNormValueSource.java       |   12 -
 .../queries/payloads/TestPayloadScoreQuery.java |   10 -
 .../queries/payloads/TestPayloadSpans.java      |   30 +-
 .../queries/payloads/TestPayloadTermQuery.java  |   14 +-
 .../analyzing/AnalyzingQueryParser.java         |  202 -
 .../queryparser/analyzing/package-info.java     |   22 -
 .../lucene/queryparser/classic/CharStream.java  |    2 +-
 .../classic/MultiFieldQueryParser.java          |   52 +-
 .../queryparser/classic/ParseException.java     |    2 +-
 .../lucene/queryparser/classic/QueryParser.java |  399 +-
 .../lucene/queryparser/classic/QueryParser.jj   |  265 +-
 .../queryparser/classic/QueryParserBase.java    |  179 +-
 .../classic/QueryParserTokenManager.java        |   27 +-
 .../lucene/queryparser/classic/Token.java       |    2 +-
 .../queryparser/classic/TokenMgrError.java      |    2 +-
 .../complexPhrase/ComplexPhraseQueryParser.java |   24 +-
 .../CommonQueryParserConfiguration.java         |   12 -
 .../flexible/standard/StandardQueryParser.java  |   30 -
 .../StandardBooleanQueryNodeBuilder.java        |  109 -
 .../builders/StandardQueryTreeBuilder.java      |    6 +-
 .../builders/SynonymQueryNodeBuilder.java       |   48 +
 .../config/StandardQueryConfigHandler.java      |    9 -
 .../nodes/StandardBooleanQueryNode.java         |   49 -
 .../standard/nodes/SynonymQueryNode.java        |   30 +
 .../processors/AnalyzerQueryNodeProcessor.java  |    8 +-
 .../processors/FuzzyQueryNodeProcessor.java     |   11 +-
 ...owercaseExpandedTermsQueryNodeProcessor.java |  100 -
 .../processors/RegexpQueryNodeProcessor.java    |   56 +
 .../StandardQueryNodeProcessorPipeline.java     |    4 +-
 .../processors/TermRangeQueryNodeProcessor.java |   11 +-
 .../processors/WildcardQueryNodeProcessor.java  |   58 +-
 .../queryparser/simple/SimpleQueryParser.java   |   16 +-
 .../lucene/queryparser/xml/CoreParser.java      |    2 +
 .../xml/builders/BooleanQueryBuilder.java       |    1 -
 .../xml/builders/TermsQueryBuilder.java         |    1 -
 .../analyzing/TestAnalyzingQueryParser.java     |  268 -
 .../classic/TestMultiFieldQueryParser.java      |    1 -
 .../queryparser/classic/TestQueryParser.java    |  485 +-
 .../ext/TestExtendableQueryParser.java          |    1 +
 .../precedence/TestPrecedenceQueryParser.java   |   61 +-
 .../standard/TestMultiFieldQPHelper.java        |   24 +-
 .../flexible/standard/TestQPHelper.java         |   93 +-
 .../flexible/standard/TestStandardQP.java       |   27 +-
 .../simple/TestSimpleQueryParser.java           |    3 -
 .../queryparser/util/QueryParserTestBase.java   |  149 +-
 .../IndexAndTaxonomyReplicationHandler.java     |    6 +-
 .../replicator/IndexReplicationHandler.java     |    3 +-
 .../apache/lucene/replicator/nrt/CopyJob.java   |    4 +-
 .../lucene/replicator/nrt/CopyOneFile.java      |    4 +-
 .../apache/lucene/replicator/nrt/CopyState.java |    4 +-
 .../lucene/replicator/nrt/FileMetaData.java     |    4 +-
 .../org/apache/lucene/replicator/nrt/Node.java  |   23 +-
 .../nrt/NodeCommunicationException.java         |    4 +-
 .../nrt/PreCopyMergedSegmentWarmer.java         |    4 +-
 .../lucene/replicator/nrt/PrimaryNode.java      |   35 +-
 .../replicator/nrt/ReplicaFileDeleter.java      |    4 +-
 .../lucene/replicator/nrt/ReplicaNode.java      |    8 +-
 .../nrt/SegmentInfosSearcherManager.java        |    4 +-
 .../IndexAndTaxonomyReplicationClientTest.java  |   16 +-
 .../replicator/IndexReplicationClientTest.java  |   15 +-
 .../lucene/replicator/LocalReplicatorTest.java  |    4 +-
 .../replicator/http/HttpReplicatorTest.java     |    2 +-
 .../lucene/replicator/nrt/Connection.java       |    4 +-
 .../org/apache/lucene/replicator/nrt/Jobs.java  |    4 +-
 .../lucene/replicator/nrt/NodeProcess.java      |    4 +-
 .../lucene/replicator/nrt/SimpleCopyJob.java    |    6 +-
 .../replicator/nrt/SimplePrimaryNode.java       |    4 +-
 .../replicator/nrt/SimpleReplicaNode.java       |    4 +-
 .../lucene/replicator/nrt/SimpleServer.java     |    4 +-
 .../lucene/replicator/nrt/SimpleTransLog.java   |    4 +-
 .../replicator/nrt/TestNRTReplication.java      |   15 +-
 .../nrt/TestStressNRTReplication.java           |    4 +-
 .../lucene/replicator/nrt/ThreadPumper.java     |    4 +-
 .../lucene/document/DoubleRangeField.java       |  262 +
 .../org/apache/lucene/document/LatLonPoint.java |    5 +-
 .../document/LatLonPointDistanceQuery.java      |   39 +-
 .../document/LatLonPointInPolygonQuery.java     |    4 +-
 .../apache/lucene/document/RangeFieldQuery.java |  315 +
 .../sandbox/queries/FuzzyLikeThisQuery.java     |    1 -
 .../lucene/search/DocValuesNumbersQuery.java    |    4 +-
 .../lucene/search/DocValuesRangeQuery.java      |    4 +-
 .../lucene/search/DocValuesTermsQuery.java      |    4 +-
 .../lucene/search/TermAutomatonQuery.java       |   18 +-
 .../lucene/document/TestDoubleRangeField.java   |   67 +
 .../sandbox/queries/FuzzyLikeThisQueryTest.java |    8 +-
 .../sandbox/queries/TestSlowFuzzyQuery2.java    |  184 -
 .../lucene/sandbox/queries/fuzzyTestData.txt    | 3721 ------------
 .../search/BaseRangeFieldQueryTestCase.java     |  427 ++
 .../search/TestDoubleRangeFieldQueries.java     |  106 +
 .../lucene/search/TestTermAutomatonQuery.java   |    4 +-
 .../spatial/composite/CompositeVerifyQuery.java |    6 +-
 .../composite/IntersectsRPTVerifyQuery.java     |    4 +-
 .../spatial/prefix/AbstractPrefixTreeQuery.java |    4 +-
 .../serialized/SerializedDVStrategy.java        |    4 +-
 .../geopoint/document/GeoPointTokenStream.java  |   14 +-
 .../geopoint/search/GeoPointDistanceQuery.java  |   15 +-
 .../search/GeoPointDistanceQueryImpl.java       |   63 +-
 .../search/GeoPointInBBoxQueryImpl.java         |   32 +-
 .../search/GeoPointInPolygonQueryImpl.java      |   14 +-
 .../geopoint/search/GeoPointMultiTermQuery.java |   49 +-
 .../GeoPointTermQueryConstantScoreWrapper.java  |    4 +-
 .../geopoint/search/GeoPointTermsEnum.java      |  212 +-
 .../lucene/spatial/util/TestGeoPointField.java  |    4 +-
 .../spatial3d/PointInGeo3DShapeQuery.java       |    4 +-
 .../lucene/spatial3d/geom/GeoStandardPath.java  |   35 +-
 .../apache/lucene/spatial3d/geom/XYZBounds.java |    2 +-
 .../lucene/spatial3d/geom/GeoPathTest.java      |   37 +-
 .../suggest/analyzing/SuggestStopFilter.java    |    4 +-
 .../analyzing/SuggestStopFilterFactory.java     |   10 +-
 .../suggest/document/CompletionWeight.java      |    8 -
 .../search/suggest/document/ContextQuery.java   |    4 +-
 .../suggest/document/FuzzyCompletionQuery.java  |    2 +-
 .../suggest/document/PrefixCompletionQuery.java |    2 +-
 .../suggest/document/RegexCompletionQuery.java  |    2 +-
 .../suggest/document/SuggestIndexSearcher.java  |    2 +-
 .../analyzing/AnalyzingInfixSuggesterTest.java  |    4 +-
 .../analyzing/BlendedInfixSuggesterTest.java    |    2 +-
 .../analyzing/TestFreeTextSuggester.java        |    6 +-
 .../analyzing/TestSuggestStopFilter.java        |    4 +-
 .../analyzing/TestSuggestStopFilterFactory.java |    2 +-
 .../analysis/BaseTokenStreamTestCase.java       |    5 +-
 .../apache/lucene/analysis/MockAnalyzer.java    |   11 +-
 .../lucene/analysis/MockBytesAnalyzer.java      |    7 +
 .../lucene/analysis/MockLowerCaseFilter.java    |   40 +
 .../lucene/analysis/MockSynonymAnalyzer.java    |   28 +
 .../lucene/analysis/MockSynonymFilter.java      |   97 +
 .../standard/WordBreakTestUnicode_6_3_0.java    | 5537 ++++++++++++++++++
 .../generateJavaUnicodeWordBreakTest.pl         |  232 +
 .../lucene/analysis/standard/package.html       |   26 +
 .../codecs/asserting/AssertingPointsFormat.java |    1 +
 .../org/apache/lucene/geo/EarthDebugger.java    |    8 +-
 .../java/org/apache/lucene/geo/GeoTestUtil.java |    8 +-
 .../index/BaseCompoundFormatTestCase.java       |    2 +-
 .../index/BaseIndexFileFormatTestCase.java      |    1 -
 .../lucene/index/BaseNormsFormatTestCase.java   |    2 +-
 .../lucene/index/BasePointsFormatTestCase.java  |   29 +
 .../apache/lucene/mockfile/VirusCheckingFS.java |    4 +-
 .../lucene/search/AssertingIndexSearcher.java   |   23 +-
 .../apache/lucene/search/AssertingQuery.java    |    4 +-
 .../apache/lucene/search/AssertingWeight.java   |   29 +-
 .../lucene/search/BaseExplanationTestCase.java  |    6 +-
 .../org/apache/lucene/search/CheckHits.java     |    6 +-
 .../lucene/search/RandomApproximationQuery.java |   35 +-
 .../search/similarities/RandomSimilarity.java   |   32 +-
 .../lucene/search/spans/AssertingSpanQuery.java |    4 +-
 .../search/spans/AssertingSpanWeight.java       |   12 +-
 .../lucene/store/BaseDirectoryTestCase.java     |   56 +-
 .../lucene/store/MockDirectoryWrapper.java      |  136 +-
 .../lucene/analysis/TestMockSynonymFilter.java  |  151 +
 .../lucene/mockfile/TestVirusCheckingFS.java    |    4 +-
 .../search/TestBaseExplanationTestCase.java     |   24 +-
 .../lucene/store/TestMockDirectoryWrapper.java  |   82 +-
 lucene/tools/forbiddenApis/lucene.txt           |    3 +
 .../dependencies/GetMavenDependenciesTask.java  |    2 +-
 solr/CHANGES.txt                                |  376 +-
 solr/NOTICE.txt                                 |    3 +
 solr/bin/solr                                   |  254 +-
 solr/bin/solr.cmd                               |  280 +-
 solr/build.xml                                  |    8 +-
 solr/common-build.xml                           |    9 +-
 solr/contrib/analysis-extras/build.xml          |   10 +
 .../apache/solr/schema/ICUCollationField.java   |    2 +-
 .../solr/schema/TestICUCollationField.java      |   15 +-
 .../SolrStopwordsCarrot2LexicalDataFactory.java |    4 +-
 .../dataimport/TestTikaEntityProcessor.java     |    2 -
 .../solr/handler/dataimport/DataImporter.java   |    7 +-
 solr/contrib/extraction/ivy.xml                 |    3 +
 .../extraction/ExtractingDocumentLoader.java    |    4 +-
 .../ExtractingRequestHandlerTest.java           |    2 -
 solr/contrib/map-reduce/ivy.xml                 |    4 +-
 .../apache/solr/hadoop/SolrRecordWriter.java    |    7 +-
 .../solr/hadoop/TreeMergeOutputFormat.java      |    5 +-
 .../apache/solr/hadoop/ZooKeeperInspector.java  |   21 +-
 .../solr/hadoop/MorphlineBasicMiniMRTest.java   |    2 +
 .../solr/hadoop/MorphlineGoLiveMiniMRTest.java  |    2 +
 .../apache/solr/hadoop/MorphlineMapperTest.java |    1 +
 .../morphlines/cell/SolrCellMorphlineTest.java  |    3 +-
 solr/contrib/morphlines-core/ivy.xml            |    5 +-
 .../solr/collection1/conf/elevate.xml           |   24 +-
 .../src/test-files/solr/minimr/conf/elevate.xml |   24 +-
 .../src/test-files/solr/mrunit/conf/elevate.xml |   24 +-
 .../solrcelltest/collection1/conf/elevate.xml   |   24 +-
 solr/core/ivy.xml                               |   12 +-
 .../apache/solr/analysis/TokenizerChain.java    |   28 +-
 solr/core/src/java/org/apache/solr/api/Api.java |    3 +-
 .../src/java/org/apache/solr/api/ApiBag.java    |    4 +-
 .../java/org/apache/solr/api/ApiSupport.java    |    4 +-
 .../java/org/apache/solr/api/V2HttpCall.java    |    4 +-
 .../org/apache/solr/cloud/ElectionContext.java  |   51 +-
 .../java/org/apache/solr/cloud/LockTree.java    |   30 +-
 .../java/org/apache/solr/cloud/Overseer.java    |    9 +-
 .../OverseerAutoReplicaFailoverThread.java      |    2 +-
 .../cloud/OverseerCollectionMessageHandler.java |  168 +-
 .../org/apache/solr/cloud/ZkController.java     |  170 +-
 .../apache/solr/cloud/ZkSolrResourceLoader.java |   16 +-
 .../solr/cloud/overseer/CollectionMutator.java  |   11 +-
 .../apache/solr/cloud/rule/ImplicitSnitch.java  |   25 +-
 .../apache/solr/cloud/rule/ReplicaAssigner.java |   10 +-
 .../java/org/apache/solr/cloud/rule/Rule.java   |   10 +-
 .../apache/solr/cloud/rule/SnitchContext.java   |   33 +-
 .../org/apache/solr/core/CoreContainer.java     |  100 +-
 .../java/org/apache/solr/core/CoreSorter.java   |  185 +
 .../apache/solr/core/HdfsDirectoryFactory.java  |   13 +-
 .../solr/core/IndexDeletionPolicyWrapper.java   |   27 +-
 .../java/org/apache/solr/core/NodeConfig.java   |   38 +-
 .../apache/solr/core/QuerySenderListener.java   |   10 +-
 .../java/org/apache/solr/core/SolrConfig.java   |   10 +-
 .../src/java/org/apache/solr/core/SolrCore.java |  111 +-
 .../apache/solr/core/SolrResourceLoader.java    |   10 +-
 .../org/apache/solr/core/SolrXmlConfig.java     |   12 +
 .../java/org/apache/solr/core/ZkContainer.java  |   44 +-
 .../apache/solr/core/backup/BackupManager.java  |  249 +
 .../apache/solr/core/backup/package-info.java   |   22 +
 .../backup/repository/BackupRepository.java     |  174 +
 .../repository/BackupRepositoryFactory.java     |   89 +
 .../backup/repository/HdfsBackupRepository.java |  159 +
 .../repository/LocalFileSystemRepository.java   |  136 +
 .../core/backup/repository/package-info.java    |   23 +
 .../core/snapshots/SolrSnapshotManager.java     |  134 +
 .../snapshots/SolrSnapshotMetaDataManager.java  |  416 ++
 .../solr/core/snapshots/package-info.java       |   22 +
 .../org/apache/solr/handler/GraphHandler.java   |    8 +-
 .../org/apache/solr/handler/IndexFetcher.java   |   35 +-
 .../solr/handler/MoreLikeThisHandler.java       |    1 -
 .../apache/solr/handler/OldBackupDirectory.java |   55 +-
 .../apache/solr/handler/PingRequestHandler.java |    1 -
 .../apache/solr/handler/ReplicationHandler.java |   88 +-
 .../apache/solr/handler/RequestHandlerBase.java |   24 +-
 .../org/apache/solr/handler/RestoreCore.java    |   40 +-
 .../org/apache/solr/handler/SQLHandler.java     |    5 +-
 .../org/apache/solr/handler/SnapShooter.java    |  215 +-
 .../apache/solr/handler/SolrConfigHandler.java  |   29 +-
 .../org/apache/solr/handler/StreamHandler.java  |    1 +
 .../solr/handler/UpdateRequestHandlerApi.java   |    3 +-
 .../apache/solr/handler/admin/ApiCommand.java   |    5 +-
 .../handler/admin/BaseHandlerApiSupport.java    |    3 +-
 .../handler/admin/CollectionHandlerApi.java     |    4 +-
 .../solr/handler/admin/CollectionsHandler.java  |  849 ++-
 .../handler/admin/ConfigSetsHandlerApi.java     |    5 +-
 .../solr/handler/admin/CoreAdminHandler.java    |   10 +-
 .../solr/handler/admin/CoreAdminHandlerApi.java |    7 +-
 .../solr/handler/admin/CoreAdminOperation.java  | 1463 ++---
 .../apache/solr/handler/admin/InfoHandler.java  |    3 -
 .../apache/solr/handler/admin/V2EndPoint.java   |    3 +-
 .../component/QueryElevationComponent.java      |    1 -
 .../handler/component/RealTimeGetComponent.java |  286 +-
 .../solr/handler/component/SearchComponent.java |    2 +
 .../solr/handler/component/SearchHandler.java   |    2 +
 .../solr/handler/component/TermsComponent.java  |  122 +-
 .../solr/highlight/DefaultSolrHighlighter.java  |   17 +-
 .../java/org/apache/solr/query/FilterQuery.java |    6 +-
 .../org/apache/solr/query/SolrRangeQuery.java   |   20 +-
 .../apache/solr/request/SolrRequestInfo.java    |    6 +-
 .../solr/response/GraphMLResponseWriter.java    |    6 +-
 .../org/apache/solr/response/ResultContext.java |    2 +-
 .../transform/DocIdAugmenterFactory.java        |   10 +-
 .../solr/response/transform/DocTransformer.java |   26 +-
 .../response/transform/DocTransformers.java     |   12 +
 .../transform/ExplainAugmenterFactory.java      |   22 +-
 .../transform/ValueSourceAugmenter.java         |   13 +-
 .../analysis/ManagedStopFilterFactory.java      |    4 +-
 .../solr/schema/AbstractSpatialFieldType.java   |   18 +-
 .../java/org/apache/solr/schema/LatLonType.java |   12 +-
 .../java/org/apache/solr/schema/PointType.java  |    2 -
 .../org/apache/solr/schema/SchemaManager.java   |   56 +-
 .../org/apache/solr/search/DisMaxQParser.java   |    1 -
 .../apache/solr/search/ExportQParserPlugin.java |    4 +-
 .../solr/search/ExtendedDismaxQParser.java      |   16 +-
 .../src/java/org/apache/solr/search/Filter.java |   10 +-
 .../solr/search/GraphTermsQParserPlugin.java    |    9 +-
 .../apache/solr/search/HashQParserPlugin.java   |    4 +-
 .../apache/solr/search/JoinQParserPlugin.java   |    8 +-
 .../java/org/apache/solr/search/LRUCache.java   |   34 +-
 .../org/apache/solr/search/QueryParsing.java    |    5 +-
 .../java/org/apache/solr/search/QueryUtils.java |    2 -
 .../apache/solr/search/ReRankQParserPlugin.java |   37 +-
 .../apache/solr/search/SimpleQParserPlugin.java |    2 -
 .../solr/search/SolrConstantScoreQuery.java     |    8 +-
 .../org/apache/solr/search/SolrCoreParser.java  |   40 +-
 .../apache/solr/search/SolrIndexSearcher.java   |   20 +-
 .../apache/solr/search/SolrQueryBuilder.java    |   34 +
 .../apache/solr/search/TermsQParserPlugin.java  |    1 -
 .../apache/solr/search/ValueSourceParser.java   |   52 +
 .../org/apache/solr/search/WrappedQuery.java    |    4 +-
 .../apache/solr/search/XmlQParserPlugin.java    |   11 +
 .../function/SolrComparisonBoolFunction.java    |   58 +
 .../org/apache/solr/search/join/GraphQuery.java |   22 +-
 .../apache/solr/search/mlt/CloudMLTQParser.java |    2 -
 .../solr/search/mlt/SimpleMLTQParser.java       |    2 -
 .../similarities/SchemaSimilarityFactory.java   |    4 +-
 .../solr/security/AuthenticationPlugin.java     |   29 +-
 .../security/AutorizationEditOperation.java     |   29 +-
 .../apache/solr/security/BasicAuthPlugin.java   |    5 +-
 .../security/DelegationTokenKerberosFilter.java |  171 +
 .../apache/solr/security/KerberosFilter.java    |   14 +
 .../apache/solr/security/KerberosPlugin.java    |  195 +-
 .../solr/security/PKIAuthenticationPlugin.java  |   13 +-
 .../org/apache/solr/security/Permission.java    |   35 +-
 .../solr/security/PermissionNameProvider.java   |    4 +-
 .../solr/security/PrintWriterWrapper.java       |  215 +
 .../security/RuleBasedAuthorizationPlugin.java  |    5 +
 .../security/Sha256AuthenticationProvider.java  |    2 +
 .../apache/solr/servlet/SolrDispatchFilter.java |   12 +-
 .../apache/solr/servlet/SolrRequestParsers.java |    2 -
 .../solr/store/blockcache/BlockDirectory.java   |    5 +-
 .../store/blockcache/BlockDirectoryCache.java   |    5 +-
 .../solr/store/blockcache/BufferStore.java      |    2 +-
 .../blockcache/CustomBufferedIndexInput.java    |    2 +-
 .../apache/solr/store/hdfs/HdfsDirectory.java   |   33 +-
 .../apache/solr/store/hdfs/HdfsFileReader.java  |  105 -
 .../solr/update/DeleteByQueryWrapper.java       |   10 +-
 .../solr/update/DirectUpdateHandler2.java       |  117 +-
 .../org/apache/solr/update/HdfsUpdateLog.java   |    6 -
 .../apache/solr/update/IndexFingerprint.java    |    6 +-
 .../java/org/apache/solr/update/PeerSync.java   |  124 +-
 .../apache/solr/update/UpdateShardHandler.java  |   13 +-
 .../ClassificationUpdateProcessor.java          |   38 +-
 .../ClassificationUpdateProcessorFactory.java   |   24 +-
 .../processor/UpdateRequestProcessorChain.java  |   19 +-
 .../apache/solr/util/ConcurrentLFUCache.java    |   15 +-
 .../apache/solr/util/ConcurrentLRUCache.java    |   40 +-
 .../apache/solr/util/JsonSchemaValidator.java   |  129 +-
 .../src/java/org/apache/solr/util/PathTrie.java |    3 +-
 .../apache/solr/util/RecordingJSONParser.java   |   80 +-
 .../src/java/org/apache/solr/util/SolrCLI.java  |  414 +-
 .../org/apache/solr/util/SolrPluginUtils.java   |    1 -
 .../resources/EditableSolrConfigAttributes.json |    5 +-
 solr/core/src/resources/ImplicitPlugins.json    |    6 +
 .../apispec/cluster.config.Commands.json        |   30 +
 .../apispec/cluster.config.commands.json        |   33 -
 .../cluster.security.BasicAuth.Commands.json    |    1 -
 ...cluster.security.RuleBasedAuthorization.json |   12 +-
 .../resources/apispec/collections.Commands.json |    4 +-
 .../apispec/core.SchemaEdit.addCopyField.json   |    2 +-
 .../core/src/resources/apispec/core.Update.json |    1 -
 .../core.config.Commands.addRuntimeLib.json     |    2 +-
 .../core.config.Commands.updateRuntimeLib.json  |    2 +-
 .../src/resources/apispec/cores.Commands.json   |    1 -
 .../src/resources/apispec/cores.Status.json     |    1 -
 .../resources/apispec/cores.core.Commands.json  |    1 -
 .../cores.core.Commands.requestRecovery.json    |    4 -
 solr/core/src/resources/apispec/cores.json      |   19 -
 .../collection1/conf/schema-psuedo-fields.xml   |   71 +
 .../conf/solrconfig-testxmlparser.xml           |   33 +
 .../solr/collection1/conf/solrconfig-tlog.xml   |    8 +-
 .../solr/collection1/conf/solrconfig.xml        |    5 +-
 .../configsets/cloud-subdirs/conf/schema.xml    |   28 +
 .../cloud-subdirs/conf/solrconfig.xml           |   48 +
 .../conf/stopwords/stopwords-en.txt             |   62 +
 solr/core/src/test-files/solr/solr-50-all.xml   |    4 +
 solr/core/src/test-files/solr/solr-no-core.xml  |   45 -
 solr/core/src/test-files/solr/solr.xml          |    3 +
 .../apache/solr/DisMaxRequestHandlerTest.java   |    4 +-
 .../test/org/apache/solr/MinimalSchemaTest.java |    4 +-
 .../test/org/apache/solr/api/TestPathTrie.java  |    3 +-
 .../AbstractCloudBackupRestoreTestCase.java     |  272 +
 .../solr/cloud/BasicDistributedZk2Test.java     |   27 +-
 .../solr/cloud/ChaosMonkeyShardSplitTest.java   |   13 +-
 .../solr/cloud/CollectionStateFormat2Test.java  |    2 +-
 .../cloud/CollectionsAPIDistributedZkTest.java  |    2 +-
 .../solr/cloud/CreateCollectionCleanupTest.java |    4 +-
 .../apache/solr/cloud/CustomCollectionTest.java |    2 +-
 .../DeleteLastCustomShardedReplicaTest.java     |    2 +-
 .../apache/solr/cloud/DeleteReplicaTest.java    |    2 +-
 .../cloud/DistribJoinFromCollectionTest.java    |    2 +-
 .../apache/solr/cloud/KerberosTestServices.java |  228 +
 .../org/apache/solr/cloud/KerberosTestUtil.java |  147 -
 .../apache/solr/cloud/LeaderElectionTest.java   |    1 +
 ...utOfBoxZkACLAndCredentialsProvidersTest.java |    7 +-
 ...rriddenZkACLAndCredentialsProvidersTest.java |   71 +-
 .../cloud/OverseerModifyCollectionTest.java     |   96 +
 .../apache/solr/cloud/OverseerRolesTest.java    |    2 +-
 .../org/apache/solr/cloud/OverseerTest.java     |    1 +
 .../solr/cloud/SaslZkACLProviderTest.java       |   39 +-
 .../cloud/SharedFSAutoReplicaFailoverTest.java  |  150 +-
 .../apache/solr/cloud/SolrCLIZkUtilsTest.java   |  632 ++
 .../solr/cloud/TestAuthenticationFramework.java |  169 +-
 .../solr/cloud/TestCloudBackupRestore.java      |  219 -
 .../solr/cloud/TestCloudPseudoReturnFields.java |  839 +++
 .../apache/solr/cloud/TestConfigSetsAPI.java    |    4 +-
 .../solr/cloud/TestConfigSetsAPIZkFailure.java  |    2 +-
 .../solr/cloud/TestHdfsCloudBackupRestore.java  |  147 +
 .../cloud/TestLocalFSCloudBackupRestore.java    |   51 +
 .../org/apache/solr/cloud/TestLockTree.java     |   34 +-
 .../solr/cloud/TestMiniSolrCloudCluster.java    |    2 +-
 .../cloud/TestMiniSolrCloudClusterKerberos.java |   32 +-
 .../cloud/TestOnReconnectListenerSupport.java   |    4 +-
 .../apache/solr/cloud/TestRandomFlRTGCloud.java |  675 +++
 .../cloud/TestSizeLimitedDistributedMap.java    |    4 +-
 .../TestSolrCloudWithDelegationTokens.java      |  405 ++
 .../cloud/TestSolrCloudWithKerberosAlt.java     |   40 +-
 .../solr/cloud/UnloadDistributedZkTest.java     |    2 +-
 ...MParamsZkACLAndCredentialsProvidersTest.java |   25 +-
 .../org/apache/solr/cloud/ZkControllerTest.java |    1 +
 .../solr/cloud/hdfs/HdfsNNFailoverTest.java     |    2 +-
 .../HdfsWriteToMultipleCollectionsTest.java     |    2 +-
 .../apache/solr/cloud/hdfs/StressHdfsTest.java  |    2 +-
 .../solr/cloud/overseer/ZkStateReaderTest.java  |   36 +-
 .../solr/cloud/overseer/ZkStateWriterTest.java  |  403 +-
 .../solr/cloud/rule/ImplicitSnitchTest.java     |   49 +-
 .../apache/solr/cloud/rule/RuleEngineTest.java  |   51 +-
 .../org/apache/solr/cloud/rule/RulesTest.java   |    2 -
 .../solr/core/BlobRepositoryCloudTest.java      |   35 +-
 .../solr/core/BlobRepositoryMockingTest.java    |   35 +-
 .../org/apache/solr/core/CoreSorterTest.java    |  240 +
 .../solr/core/OpenCloseCoreStressTest.java      |   16 +-
 .../test/org/apache/solr/core/SolrCoreTest.java |    1 +
 .../solr/core/TestBackupRepositoryFactory.java  |  149 +
 .../solr/core/TestConfigSetImmutable.java       |    3 +-
 .../org/apache/solr/core/TestLazyCores.java     |    4 +-
 .../solr/core/TestQuerySenderListener.java      |   18 +-
 .../apache/solr/core/TestSolrConfigHandler.java |    2 +-
 .../test/org/apache/solr/core/TestSolrXml.java  |   15 +-
 .../core/snapshots/TestSolrCoreSnapshots.java   |  419 ++
 .../apache/solr/handler/BackupRestoreUtils.java |  104 +
 .../apache/solr/handler/CheckBackupStatus.java  |   10 +-
 .../DocumentAnalysisRequestHandlerTest.java     |    8 +-
 .../FieldAnalysisRequestHandlerTest.java        |   10 +-
 .../solr/handler/TestHdfsBackupRestoreCore.java |  239 +
 .../solr/handler/TestReplicationHandler.java    |   20 +-
 .../handler/TestReplicationHandlerBackup.java   |   39 +-
 .../apache/solr/handler/TestRestoreCore.java    |   52 +-
 .../handler/TestSolrConfigHandlerCloud.java     |    2 +-
 .../handler/admin/CoreAdminHandlerTest.java     |    2 +-
 .../solr/handler/admin/TestApiFramework.java    |    4 +-
 .../solr/handler/admin/TestCollectionAPIs.java  |    6 +-
 .../solr/handler/admin/TestCoreAdminApis.java   |    7 +-
 .../DistributedTermsComponentTest.java          |   13 +-
 .../component/ResourceSharingTestComponent.java |   34 +-
 .../handler/component/TermsComponentTest.java   |   58 +-
 .../solr/index/hdfs/CheckHdfsIndexTest.java     |    3 +-
 .../apache/solr/request/TestFacetMethods.java   |    4 +-
 .../response/TestGraphMLResponseWriter.java     |    4 +-
 .../transform/TestSubQueryTransformer.java      |   17 +-
 .../apache/solr/schema/BooleanFieldTest.java    |    4 +-
 .../solr/schema/TestManagedSchemaAPI.java       |   34 +-
 .../apache/solr/search/GoodbyeQueryBuilder.java |   39 +
 .../apache/solr/search/HandyQueryBuilder.java   |   53 +
 .../apache/solr/search/HelloQueryBuilder.java   |   39 +
 .../apache/solr/search/QueryEqualityTest.java   |   27 +-
 .../search/TestGraphTermsQParserPlugin.java     |    4 +-
 .../solr/search/TestPseudoReturnFields.java     |  615 +-
 .../org/apache/solr/search/TestRangeQuery.java  |  146 +-
 .../apache/solr/search/TestRankQueryPlugin.java |    4 +-
 .../solr/search/TestXmlQParserPlugin.java       |   78 +
 .../solr/search/function/TestFunctionQuery.java |   69 +-
 .../solr/search/mlt/CloudMLTQParserTest.java    |   10 +-
 .../solr/security/BasicAuthIntegrationTest.java |  227 +-
 ...ramDelegationTokenAuthenticationHandler.java |  109 +
 .../solr/security/MockAuthenticationPlugin.java |   32 +-
 .../spelling/TestSuggestSpellingConverter.java  |    2 +-
 .../solr/store/hdfs/HdfsDirectoryTest.java      |    5 +-
 .../uninverting/TestFieldCacheSortRandom.java   |    4 +-
 .../solr/update/DirectUpdateHandlerTest.java    |   48 +-
 ...lassificationUpdateProcessorFactoryTest.java |    4 +-
 .../org/apache/solr/util/JsonValidatorTest.java |   45 +-
 .../example-DIH/solr/db/conf/elevate.xml        |   24 +-
 .../example-DIH/solr/mail/conf/elevate.xml      |   24 +-
 .../example-DIH/solr/rss/conf/elevate.xml       |   24 +-
 .../example-DIH/solr/solr/conf/elevate.xml      |   24 +-
 solr/example/files/conf/elevate.xml             |   24 +-
 solr/licenses/bcpkix-jdk15on-1.47.jar.sha1      |    1 +
 .../bcpkix-jdk15on-LICENSE-BSD_LIKE.txt         |   15 +
 solr/licenses/bcpkix-jdk15on-NOTICE.txt         |    2 +
 solr/licenses/commons-compress-1.11.jar.sha1    |    1 +
 solr/licenses/commons-compress-1.8.1.jar.sha1   |    1 -
 solr/licenses/curator-recipes-2.8.0.jar.sha1    |    1 +
 solr/licenses/curator-recipes-LICENSE-ASL.txt   |  202 +
 solr/licenses/curator-recipes-NOTICE.txt        |    5 +
 solr/licenses/fontbox-1.8.8.jar.sha1            |    1 -
 solr/licenses/fontbox-2.0.1.jar.sha1            |    1 +
 solr/licenses/hadoop-annotations-2.6.0.jar.sha1 |    1 -
 solr/licenses/hadoop-annotations-2.7.2.jar.sha1 |    1 +
 solr/licenses/hadoop-auth-2.6.0.jar.sha1        |    1 -
 solr/licenses/hadoop-auth-2.7.2.jar.sha1        |    1 +
 .../licenses/hadoop-common-2.6.0-tests.jar.sha1 |    1 -
 solr/licenses/hadoop-common-2.6.0.jar.sha1      |    1 -
 .../licenses/hadoop-common-2.7.2-tests.jar.sha1 |    1 +
 solr/licenses/hadoop-common-2.7.2.jar.sha1      |    1 +
 solr/licenses/hadoop-hdfs-2.6.0-tests.jar.sha1  |    1 -
 solr/licenses/hadoop-hdfs-2.6.0.jar.sha1        |    1 -
 solr/licenses/hadoop-hdfs-2.7.2-tests.jar.sha1  |    1 +
 solr/licenses/hadoop-hdfs-2.7.2.jar.sha1        |    1 +
 .../hadoop-mapreduce-client-app-2.6.0.jar.sha1  |    1 -
 .../hadoop-mapreduce-client-app-2.7.2.jar.sha1  |    1 +
 ...adoop-mapreduce-client-common-2.6.0.jar.sha1 |    1 -
 ...adoop-mapreduce-client-common-2.7.2.jar.sha1 |    1 +
 .../hadoop-mapreduce-client-core-2.6.0.jar.sha1 |    1 -
 .../hadoop-mapreduce-client-core-2.7.2.jar.sha1 |    1 +
 .../hadoop-mapreduce-client-hs-2.6.0.jar.sha1   |    1 -
 .../hadoop-mapreduce-client-hs-2.7.2.jar.sha1   |    1 +
 ...reduce-client-jobclient-2.6.0-tests.jar.sha1 |    1 -
 ...op-mapreduce-client-jobclient-2.6.0.jar.sha1 |    1 -
 ...reduce-client-jobclient-2.7.2-tests.jar.sha1 |    1 +
 ...op-mapreduce-client-jobclient-2.7.2.jar.sha1 |    1 +
 ...doop-mapreduce-client-shuffle-2.6.0.jar.sha1 |    1 -
 ...doop-mapreduce-client-shuffle-2.7.2.jar.sha1 |    1 +
 solr/licenses/hadoop-minikdc-2.6.0.jar.sha1     |    1 -
 solr/licenses/hadoop-minikdc-2.7.2.jar.sha1     |    1 +
 solr/licenses/hadoop-yarn-api-2.6.0.jar.sha1    |    1 -
 solr/licenses/hadoop-yarn-api-2.7.2.jar.sha1    |    1 +
 solr/licenses/hadoop-yarn-client-2.6.0.jar.sha1 |    1 -
 solr/licenses/hadoop-yarn-client-2.7.2.jar.sha1 |    1 +
 solr/licenses/hadoop-yarn-common-2.6.0.jar.sha1 |    1 -
 solr/licenses/hadoop-yarn-common-2.7.2.jar.sha1 |    1 +
 ...ver-applicationhistoryservice-2.6.0.jar.sha1 |    1 -
 ...ver-applicationhistoryservice-2.7.2.jar.sha1 |    1 +
 .../hadoop-yarn-server-common-2.6.0.jar.sha1    |    1 -
 .../hadoop-yarn-server-common-2.7.2.jar.sha1    |    1 +
 ...adoop-yarn-server-nodemanager-2.6.0.jar.sha1 |    1 -
 ...adoop-yarn-server-nodemanager-2.7.2.jar.sha1 |    1 +
 ...p-yarn-server-resourcemanager-2.6.0.jar.sha1 |    1 -
 ...p-yarn-server-resourcemanager-2.7.2.jar.sha1 |    1 +
 ...adoop-yarn-server-tests-2.6.0-tests.jar.sha1 |    1 -
 ...adoop-yarn-server-tests-2.7.2-tests.jar.sha1 |    1 +
 .../hadoop-yarn-server-web-proxy-2.6.0.jar.sha1 |    1 -
 .../hadoop-yarn-server-web-proxy-2.7.2.jar.sha1 |    1 +
 solr/licenses/htrace-core-3.0.4.jar.sha1        |    1 -
 .../htrace-core-3.2.0-incubating.jar.sha1       |    1 +
 solr/licenses/isoparser-1.0.2.jar.sha1          |    1 -
 solr/licenses/isoparser-1.1.18.jar.sha1         |    1 +
 solr/licenses/jackcess-2.1.3.jar.sha1           |    1 +
 solr/licenses/jackcess-LICENSE-ASL.txt          |  507 ++
 solr/licenses/jackcess-NOTICE.txt               |    2 +
 solr/licenses/jempbox-1.8.12.jar.sha1           |    1 +
 solr/licenses/jempbox-1.8.8.jar.sha1            |    1 -
 solr/licenses/metadata-extractor-2.6.2.jar.sha1 |    1 -
 solr/licenses/metadata-extractor-2.8.1.jar.sha1 |    1 +
 solr/licenses/netty-3.2.4.Final.jar.sha1        |    1 +
 solr/licenses/netty-3.7.0.Final.jar.sha1        |    1 -
 solr/licenses/netty-NOTICE.txt                  |   85 +-
 solr/licenses/netty-all-4.0.36.Final.jar.sha1   |    1 +
 solr/licenses/netty-all-LICENSE-ASL.txt         |  202 +
 solr/licenses/netty-all-NOTICE.txt              |  121 +
 solr/licenses/pdfbox-1.8.8.jar.sha1             |    1 -
 solr/licenses/pdfbox-2.0.1.jar.sha1             |    1 +
 solr/licenses/pdfbox-tools-2.0.1.jar.sha1       |    1 +
 solr/licenses/pdfbox-tools-LICENSE-ASL.txt      |  314 +
 solr/licenses/pdfbox-tools-NOTICE.txt           |   14 +
 solr/licenses/poi-3.11.jar.sha1                 |    1 -
 solr/licenses/poi-3.15-beta1.jar.sha1           |    1 +
 solr/licenses/poi-ooxml-3.11.jar.sha1           |    1 -
 solr/licenses/poi-ooxml-3.15-beta1.jar.sha1     |    1 +
 solr/licenses/poi-ooxml-schemas-3.11.jar.sha1   |    1 -
 .../poi-ooxml-schemas-3.15-beta1.jar.sha1       |    1 +
 solr/licenses/poi-scratchpad-3.11.jar.sha1      |    1 -
 .../licenses/poi-scratchpad-3.15-beta1.jar.sha1 |    1 +
 solr/licenses/rome-1.6.1.jar.sha1               |    1 +
 solr/licenses/tika-core-1.13.jar.sha1           |    1 +
 solr/licenses/tika-core-1.7.jar.sha1            |    1 -
 solr/licenses/tika-java7-1.13.jar.sha1          |    1 +
 solr/licenses/tika-java7-1.7.jar.sha1           |    1 -
 solr/licenses/tika-parsers-1.13.jar.sha1        |    1 +
 solr/licenses/tika-parsers-1.7.jar.sha1         |    1 -
 solr/licenses/tika-xmp-1.13.jar.sha1            |    1 +
 solr/licenses/tika-xmp-1.7.jar.sha1             |    1 -
 solr/licenses/vorbis-java-core-0.6.jar.sha1     |    1 -
 solr/licenses/vorbis-java-core-0.8.jar.sha1     |    1 +
 solr/licenses/vorbis-java-tika-0.6.jar.sha1     |    1 -
 solr/licenses/vorbis-java-tika-0.8.jar.sha1     |    1 +
 .../basic_configs/conf/_rest_managed.json       |    1 -
 .../configsets/basic_configs/conf/elevate.xml   |   42 +
 .../basic_configs/conf/lang/contractions_ca.txt |    8 +
 .../basic_configs/conf/lang/contractions_fr.txt |   15 +
 .../basic_configs/conf/lang/contractions_ga.txt |    5 +
 .../basic_configs/conf/lang/contractions_it.txt |   23 +
 .../basic_configs/conf/lang/hyphenations_ga.txt |    5 +
 .../basic_configs/conf/lang/stemdict_nl.txt     |    6 +
 .../basic_configs/conf/lang/stoptags_ja.txt     |  420 ++
 .../basic_configs/conf/lang/stopwords_ar.txt    |  125 +
 .../basic_configs/conf/lang/stopwords_bg.txt    |  193 +
 .../basic_configs/conf/lang/stopwords_ca.txt    |  220 +
 .../basic_configs/conf/lang/stopwords_cz.txt    |  172 +
 .../basic_configs/conf/lang/stopwords_da.txt    |  110 +
 .../basic_configs/conf/lang/stopwords_de.txt    |  294 +
 .../basic_configs/conf/lang/stopwords_el.txt    |   78 +
 .../basic_configs/conf/lang/stopwords_es.txt    |  356 ++
 .../basic_configs/conf/lang/stopwords_eu.txt    |   99 +
 .../basic_configs/conf/lang/stopwords_fa.txt    |  313 +
 .../basic_configs/conf/lang/stopwords_fi.txt    |   97 +
 .../basic_configs/conf/lang/stopwords_fr.txt    |  186 +
 .../basic_configs/conf/lang/stopwords_ga.txt    |  110 +
 .../basic_configs/conf/lang/stopwords_gl.txt    |  161 +
 .../basic_configs/conf/lang/stopwords_hi.txt    |  235 +
 .../basic_configs/conf/lang/stopwords_hu.txt    |  211 +
 .../basic_configs/conf/lang/stopwords_hy.txt    |   46 +
 .../basic_configs/conf/lang/stopwords_id.txt    |  359 ++
 .../basic_configs/conf/lang/stopwords_it.txt    |  303 +
 .../basic_configs/conf/lang/stopwords_ja.txt    |  127 +
 .../basic_configs/conf/lang/stopwords_lv.txt    |  172 +
 .../basic_configs/conf/lang/stopwords_nl.txt    |  119 +
 .../basic_configs/conf/lang/stopwords_no.txt    |  194 +
 .../basic_configs/conf/lang/stopwords_pt.txt    |  253 +
 .../basic_configs/conf/lang/stopwords_ro.txt    |  233 +
 .../basic_configs/conf/lang/stopwords_ru.txt    |  243 +
 .../basic_configs/conf/lang/stopwords_sv.txt    |  133 +
 .../basic_configs/conf/lang/stopwords_th.txt    |  119 +
 .../basic_configs/conf/lang/stopwords_tr.txt    |  212 +
 .../basic_configs/conf/lang/userdict_ja.txt     |   29 +
 .../basic_configs/conf/managed-schema           |  764 ++-
 .../configsets/basic_configs/conf/params.json   |   20 +
 .../basic_configs/conf/solrconfig.xml           | 1072 +++-
 .../data_driven_schema_configs/conf/elevate.xml |   24 +-
 .../conf/managed-schema                         |    4 +-
 .../conf/elevate.xml                            |   24 +-
 solr/solrj/ivy.xml                              |    5 +
 .../apache/solr/client/solrj/SolrRequest.java   |    1 -
 .../solr/client/solrj/impl/CloudSolrClient.java |  158 +-
 .../solr/client/solrj/impl/HttpClientUtil.java  |    8 +-
 .../solr/client/solrj/impl/HttpSolrClient.java  |   57 +-
 .../solrj/impl/Krb5HttpClientBuilder.java       |   18 +-
 .../solrj/io/graph/ShortestPathStream.java      |    6 +-
 .../client/solrj/io/stream/CloudSolrStream.java |   25 +-
 .../solr/client/solrj/io/stream/JDBCStream.java |    4 +
 .../client/solrj/io/stream/ParallelStream.java  |    2 +-
 .../solrj/io/stream/ScoreNodesStream.java       |  256 +
 .../client/solrj/io/stream/TopicStream.java     |   61 +-
 .../solrj/request/CollectionAdminRequest.java   |   32 +-
 .../client/solrj/request/CoreAdminRequest.java  |   57 +
 .../solrj/request/DelegationTokenRequest.java   |  152 +
 .../client/solrj/request/UpdateRequest.java     |    6 +
 .../solrj/response/DelegationTokenResponse.java |  108 +
 .../solr/common/ToleratedUpdateError.java       |    2 +-
 .../solr/common/cloud/ClusterProperties.java    |    4 +-
 .../apache/solr/common/cloud/ClusterState.java  |   13 +-
 .../common/cloud/CollectionStatePredicate.java  |    4 +-
 .../common/cloud/CollectionStateWatcher.java    |    6 +-
 .../solr/common/cloud/ConnectionManager.java    |   15 +-
 .../common/cloud/DefaultConnectionStrategy.java |    4 +-
 .../apache/solr/common/cloud/DocCollection.java |   26 +-
 .../solr/common/cloud/SaslZkACLProvider.java    |   21 +-
 .../cloud/SecurityAwareZkACLProvider.java       |   79 +
 .../apache/solr/common/cloud/SolrZkClient.java  |  121 +-
 ...ParamsAllAndReadonlyDigestZkACLProvider.java |   52 +-
 .../cloud/ZkClientConnectionStrategy.java       |    4 +-
 .../solr/common/cloud/ZkConfigManager.java      |  117 +-
 .../solr/common/cloud/ZkMaintenanceUtils.java   |  368 ++
 .../apache/solr/common/cloud/ZkStateReader.java |  167 +-
 .../solr/common/params/CollectionParams.java    |   29 +-
 .../solr/common/params/CoreAdminParams.java     |   20 +-
 .../apache/solr/common/params/SolrParams.java   |   24 +-
 .../apache/solr/common/params/TermsParams.java  |   12 +
 .../org/apache/solr/common/util/Lookup.java     |   22 -
 .../org/apache/solr/common/util/RetryUtil.java  |    8 +-
 .../solr/common/util/ValidatingJsonMap.java     |    4 +-
 .../solr/configsets/streaming/conf/schema.xml   |    2 +-
 .../solrj/impl/CloudSolrClientBuilderTest.java  |   28 +-
 .../client/solrj/impl/CloudSolrClientTest.java  |   24 +-
 .../ConcurrentUpdateSolrClientBuilderTest.java  |   12 +-
 .../solrj/impl/HttpSolrClientBuilderTest.java   |   22 +-
 .../solrj/impl/LBHttpSolrClientBuilderTest.java |   18 +-
 .../solrj/io/graph/GraphExpressionTest.java     |  137 +-
 .../solr/client/solrj/io/graph/GraphTest.java   |    4 +-
 .../solr/client/solrj/io/sql/JdbcTest.java      |    4 +-
 .../client/solrj/io/stream/JDBCStreamTest.java  |   16 +
 .../solrj/io/stream/StreamExpressionTest.java   |  244 +-
 .../client/solrj/io/stream/StreamingTest.java   |   19 +-
 .../request/TestDelegationTokenRequest.java     |   70 +
 .../response/TestDelegationTokenResponse.java   |  138 +
 .../cloud/TestCollectionStateWatchers.java      |    4 +-
 .../solr/common/util/TestJsonRecordReader.java  |   52 +
 .../apache/solr/common/util/TestRetryUtil.java  |   37 +-
 .../java/org/apache/solr/SolrTestCaseJ4.java    |   71 +-
 .../apache/solr/core/MockDirectoryFactory.java  |    5 -
 .../solr/core/MockFSDirectoryFactory.java       |    1 -
 solr/webapp/web/css/angular/cloud.css           |   14 +
 solr/webapp/web/js/angular/app.js               |    2 +-
 solr/webapp/web/js/angular/controllers/cloud.js |   53 +-
 solr/webapp/web/js/angular/controllers/query.js |   10 +-
 solr/webapp/web/js/lib/jquery.blockUI.js        |    2 +-
 solr/webapp/web/partials/cloud.html             |    3 +-
 1211 files changed, 47788 insertions(+), 28323 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/api/Api.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/api/ApiBag.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
index 3388147,c674ff3..e798670
--- a/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
@@@ -27,7 -27,7 +27,12 @@@ import java.util.Map
  import java.util.Set;
  import java.util.function.Function;
  
 -import org.apache.solr.common.util.Map2;
++import com.google.common.collect.ImmutableSet;
++import org.apache.solr.common.SolrException;
++import org.apache.solr.common.params.CollectionParams;
++import org.apache.solr.common.util.Utils;
 +import org.apache.solr.common.util.ValidatingJsonMap;
++
  import org.apache.solr.util.CommandOperation;
  import org.apache.solr.api.ApiBag;
  import org.apache.solr.api.SpecProvider;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
index f270524,7410335..f18838d
--- a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
+++ b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
@@@ -30,7 -30,7 +30,9 @@@ import java.util.Set
  
  import com.google.common.collect.ImmutableSet;
  import org.apache.commons.codec.binary.Base64;
 -import org.apache.solr.common.util.Map2;
++import org.apache.solr.api.SpecProvider;
 +import org.apache.solr.common.util.ValidatingJsonMap;
++
  import org.apache.solr.util.CommandOperation;
  import org.apache.solr.api.ApiBag;
  import org.slf4j.Logger;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/util/PathTrie.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/test/org/apache/solr/api/TestPathTrie.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
----------------------------------------------------------------------
diff --cc solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
index 0bfdc12,3bae53f..1730353
--- a/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
+++ b/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
@@@ -31,9 -31,10 +31,9 @@@ import static org.apache.solr.common.ut
  
  public class JsonValidatorTest extends SolrTestCaseJ4 {
  
 -
    public void testSchema() {
      checkSchema("collections.Commands");
-     checkSchema("collections.collection.commands");
+     checkSchema("collections.collection.Commands");
      checkSchema("collections.collection.shards.Commands");
      checkSchema("collections.collection.shards.shard.Commands");
      checkSchema("collections.collection.shards.shard.replica.Commands");

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
----------------------------------------------------------------------
diff --cc solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
index 553d134,0000000..d19d56a
mode 100644,000000..100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
@@@ -1,291 -1,0 +1,291 @@@
- package org.apache.solr.common.util;
- 
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one or more
 + * contributor license agreements.  See the NOTICE file distributed with
 + * this work for additional information regarding copyright ownership.
 + * The ASF licenses this file to You under the Apache License, Version 2.0
 + * (the "License"); you may not use this file except in compliance with
 + * the License.  You may obtain a copy of the License at
 + *
 + *     http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +
++package org.apache.solr.common.util;
++
 +import java.io.IOException;
 +import java.io.InputStream;
 +import java.io.InputStreamReader;
 +import java.io.Reader;
 +import java.util.ArrayList;
 +import java.util.Collection;
 +import java.util.Collections;
 +import java.util.HashSet;
 +import java.util.LinkedHashMap;
 +import java.util.List;
 +import java.util.Map;
 +import java.util.Set;
 +
 +import org.noggit.JSONParser;
 +import org.noggit.ObjectBuilder;
 +
 +import static java.nio.charset.StandardCharsets.UTF_8;
 +import static java.util.Collections.unmodifiableList;
 +import static java.util.Collections.unmodifiableSet;
 +
 +public class ValidatingJsonMap implements Map<String, Object> {
 +
 +  public static final PredicateWithErrMsg<Object> NOT_NULL = o -> {
 +    if (o == null) return " Must not be NULL";
 +    return null;
 +  };
 +  public static final PredicateWithErrMsg<Pair> ENUM_OF = pair -> {
 +    if (pair.second() instanceof Set) {
 +      Set set = (Set) pair.second();
 +      if (pair.first() instanceof Collection) {
 +        for (Object o : (Collection) pair.first()) {
 +          if (!set.contains(o)) {
 +            return " Must be one of " + pair.second();
 +          }
 +        }
 +      } else {
 +        if (!set.contains(pair.first())) return " Must be one of " + pair.second() + ", got " + pair.first();
 +      }
 +      return null;
 +    } else {
 +      return " Unknown type";
 +    }
 +
 +  };
 +  private final Map<String, Object> delegate;
 +
 +  public ValidatingJsonMap(Map<String, Object> delegate) {
 +    this.delegate = delegate;
 +  }
 +
 +  public ValidatingJsonMap(int i) {
 +    delegate = new LinkedHashMap<>(i);
 +  }
 +
 +  public ValidatingJsonMap() {
 +    delegate = new LinkedHashMap<>();
 +  }
 +
 +  @Override
 +  public int size() {
 +    return delegate.size();
 +  }
 +
 +  @Override
 +  public boolean isEmpty() {
 +    return delegate.isEmpty();
 +  }
 +
 +  @Override
 +  public boolean containsKey(Object key) {
 +    return delegate.containsKey(key);
 +  }
 +
 +  @Override
 +  public boolean containsValue(Object value) {
 +    return delegate.containsValue(value);
 +  }
 +
 +  @Override
 +  public Object get(Object key) {
 +    return delegate.get(key);
 +  }
 +
 +  @Override
 +  public Object put(String key, Object value) {
 +    return delegate.put(key, value);
 +  }
 +
 +  @Override
 +  public Object remove(Object key) {
 +    return null;
 +  }
 +
 +  @Override
 +  public void putAll(Map<? extends String, ?> m) {
 +    delegate.putAll(m);
 +  }
 +
 +  @Override
 +  public void clear() {
 +    delegate.clear();
 +
 +  }
 +
 +  @Override
 +  public Set<String> keySet() {
 +    return delegate.keySet();
 +  }
 +
 +  @Override
 +  public Collection<Object> values() {
 +    return delegate.values();
 +  }
 +
 +  @Override
 +  public Set<Entry<String, Object>> entrySet() {
 +    return delegate.entrySet();
 +  }
 +
 +  public Object get(String key, PredicateWithErrMsg predicate) {
 +    Object v = get(key);
 +    if (predicate != null) {
 +      String msg = predicate.test(v);
 +      if (msg != null) {
 +        throw new RuntimeException("" + key + msg);
 +      }
 +    }
 +    return v;
 +  }
 +
 +  public Boolean getBool(String key, Boolean def) {
 +    Object v = get(key);
 +    if (v == null) return def;
 +    if (v instanceof Boolean) return (Boolean) v;
 +    try {
 +      return Boolean.parseBoolean(v.toString());
 +    } catch (NumberFormatException e) {
 +      throw new RuntimeException("value of " + key + "must be an boolean");
 +    }
 +  }
 +
 +  public Integer getInt(String key, Integer def) {
 +    Object v = get(key);
 +    if (v == null) return def;
 +    if (v instanceof Integer) return (Integer) v;
 +    try {
 +      return Integer.parseInt(v.toString());
 +    } catch (NumberFormatException e) {
 +      throw new RuntimeException("value of " + key + "must be an integer");
 +    }
 +  }
 +  public ValidatingJsonMap getMap(String key, PredicateWithErrMsg predicate) {
 +    return getMap(key, predicate, null);
 +
 +  }
 +
 +  public ValidatingJsonMap getMap(String key, PredicateWithErrMsg predicate, String message) {
 +    Object v = get(key);
 +    if (v != null && !(v instanceof Map)) {
 +      throw new RuntimeException("" + key + " should be of type map");
 +    }
 +
 +    if (predicate != null) {
 +      String msg = predicate.test(v);
 +      if (msg != null) {
 +        msg = message != null ? message : key + msg;
 +        throw new RuntimeException(msg);
 +      }
 +    }
 +    return wrap((Map) v);
 +  }
 +
 +  public List getList(String key, PredicateWithErrMsg predicate) {
 +    return getList(key, predicate, null);
 +  }
 +
 +  public List getList(String key, PredicateWithErrMsg predicate, Object test) {
 +    Object v = get(key);
 +    if (v != null && !(v instanceof List)) {
 +      throw new RuntimeException("" + key + " should be of type List");
 +    }
 +
 +    if (predicate != null) {
 +      String msg = predicate.test(test == null ? v : new Pair(v, test));
 +      if (msg != null) {
 +        throw new RuntimeException("" + key + msg);
 +      }
 +    }
 +
 +    return (List) v;
 +  }
 +
 +  public Object get(String key, PredicateWithErrMsg<Pair> predicate, Object arg) {
 +    Object v = get(key);
 +    String test = predicate.test(new Pair(v, arg));
 +    if (test != null) {
 +      throw new RuntimeException("" + key + test);
 +    }
 +    return v;
 +  }
 +
 +  public Object get(String k, Object def) {
 +    Object v = get(k);
 +    if (v == null) return def;
 +    return v;
 +  }
 +
 +  static ValidatingJsonMap wrap(Map<String, Object> map) {
 +    if (map == null) return null;
 +    if (map instanceof ValidatingJsonMap) {
 +      return (ValidatingJsonMap) map;
 +    } else {
 +      return new ValidatingJsonMap(map);
 +    }
 +
 +  }
 +
 +  public static ValidatingJsonMap fromJSON(InputStream is) {
 +    return fromJSON(new InputStreamReader(is, UTF_8));
 +  }
 +
 +  public static ValidatingJsonMap fromJSON(Reader s) {
 +    try {
 +      return (ValidatingJsonMap) (getObjectBuilder(new JSONParser(s)).getObject());
 +    } catch (IOException e) {
 +      throw new RuntimeException();
 +    }
 +  }
 +
 +  public static ValidatingJsonMap getDeepCopy(Map map, int maxDepth, boolean mutable) {
 +    if (map == null) return null;
 +    if (maxDepth < 1) return ValidatingJsonMap.wrap(map);
 +    ValidatingJsonMap copy = mutable ? new ValidatingJsonMap(map.size()) : new ValidatingJsonMap();
 +    for (Object o : map.entrySet()) {
 +      Map.Entry<String,Object> e = (Entry<String, Object>) o;
 +      Object v = e.getValue();
 +      if (v instanceof Map) v = getDeepCopy((Map) v, maxDepth - 1, mutable);
 +      else if (v instanceof Collection) v = getDeepCopy((Collection) v, maxDepth - 1, mutable);
 +      copy.put(e.getKey(), v);
 +    }
 +    return mutable ? copy : new ValidatingJsonMap(Collections.unmodifiableMap(copy));
 +  }
 +
 +  public static Collection getDeepCopy(Collection c, int maxDepth, boolean mutable) {
 +    if (c == null || maxDepth < 1) return c;
 +    Collection result = c instanceof Set ? new HashSet() : new ArrayList();
 +    for (Object o : c) {
 +      if (o instanceof Map) {
 +        o = getDeepCopy((Map) o, maxDepth - 1, mutable);
 +      }
 +      result.add(o);
 +    }
 +    return mutable ? result : result instanceof Set ? unmodifiableSet((Set) result) : unmodifiableList((List) result);
 +  }
 +
 +  private static ObjectBuilder getObjectBuilder(final JSONParser jp) throws IOException {
 +    return new ObjectBuilder(jp) {
 +      @Override
 +      public Object newObject() throws IOException {
 +        return new ValidatingJsonMap();
 +      }
 +    };
 +  }
 +
 +
 +  @Override
 +  public boolean equals(Object that) {
 +    return that instanceof Map && this.delegate.equals(that);
 +  }
 +
 +  public static final ValidatingJsonMap EMPTY = new ValidatingJsonMap(Collections.EMPTY_MAP);
 +}