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/03/10 19:31:24 UTC

lucene-solr git commit: SOLR-8029: change dthe structure of the spec json to simplify it

Repository: lucene-solr
Updated Branches:
  refs/heads/apiv2 ec4889a2b -> a9b8176fa


SOLR-8029:  change dthe structure of the spec json to simplify it


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

Branch: refs/heads/apiv2
Commit: a9b8176fa083e6c32f8cd4bf200b92b817fc0e7e
Parents: ec4889a
Author: Noble Paul <no...@apache.org>
Authored: Thu Mar 10 23:54:49 2016 +0530
Committer: Noble Paul <no...@apache.org>
Committed: Thu Mar 10 23:54:49 2016 +0530

----------------------------------------------------------------------
 .../src/java/org/apache/solr/api/ApiBag.java    |   8 +-
 .../java/org/apache/solr/api/ApiSupport.java    |   8 -
 .../java/org/apache/solr/api/V2HttpCall.java    |   5 +-
 .../java/org/apache/solr/core/PluginBag.java    |   1 -
 .../apache/solr/handler/DumpRequestHandler.java |   5 -
 .../solr/handler/UpdateRequestHandlerApi.java   |   5 -
 .../handler/admin/CollectionHandlerApi.java     |  41 ++--
 .../solr/handler/admin/CoreAdminHandler.java    |   5 -
 .../apache/solr/handler/admin/InfoHandler.java  |   4 -
 solr/core/src/resources/apispec/cluster.json    |  30 +--
 .../apispec/cluster.security.BasicAuth.json     |  40 ++--
 ...cluster.security.RuleBasedAuthorization.json |  94 ++++----
 .../cluster.security.authentication.json        |  23 +-
 .../apispec/cluster.security.authorization.json |  24 +-
 solr/core/src/resources/apispec/collection.json |  18 ++
 .../resources/apispec/collections.Commands.json | 146 ++++++------
 .../collections.collection.Commands.json        |  31 ++-
 .../apispec/collections.collection.delete.json  |  12 +
 .../collections.collection.shards.Commands.json |  34 ++-
 ...ctions.collection.shards.shard.Commands.json |  46 ++--
 ...ollection.shards.shard.replica.Commands.json |  32 ++-
 ....collection.shards.shard.replica.delete.json |  31 ++-
 .../core/src/resources/apispec/collections.json |  12 +
 .../src/resources/apispec/core.ConfigEdit.json  | 222 +++++++++----------
 .../src/resources/apispec/core.ConfigRead.json  |  35 +--
 .../src/resources/apispec/core.RealtimeGet.json |  37 ++--
 .../src/resources/apispec/core.SchemaEdit.json  |  40 ++--
 .../apispec/core.SchemaRead.fields.json         |  52 +++--
 .../src/resources/apispec/core.SchemaRead.json  |  46 ++--
 .../core/src/resources/apispec/core.Update.json |  30 ++-
 .../src/resources/apispec/cores.Commands.json   | 127 +++++------
 .../src/resources/apispec/cores.Status.json     |  36 ++-
 .../resources/apispec/cores.core.Commands.json  |  64 +++---
 solr/core/src/resources/apispec/cores.json      |  34 ++-
 solr/core/src/resources/apispec/emptySpec.json  |  24 +-
 solr/core/src/resources/apispec/node.Info.json  |  22 +-
 .../conf/solrconfig-managed-schema.xml          |   2 +-
 .../solr/core/BlobStoreTestRequestHandler.java  |   4 -
 .../apache/solr/core/TestDynamicLoading.java    |   2 +-
 .../apache/solr/core/TestSolrConfigHandler.java |   4 +-
 .../solr/handler/admin/TestApiFramework.java    |  10 +-
 .../java/org/apache/solr/common/util/Map2.java  |   9 +-
 42 files changed, 722 insertions(+), 733 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/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 cc3539e..ce0447e 100644
--- a/solr/core/src/java/org/apache/solr/api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/api/ApiBag.java
@@ -29,8 +29,10 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import com.google.common.collect.ImmutableSet;
+import org.apache.lucene.queryparser.flexible.core.util.StringUtils;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.core.PluginBag;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.request.SolrQueryRequest;
@@ -187,8 +189,10 @@ public class ApiBag {
   }
 
   public static Map2 getSpec(String name) {
-    Map2 map = getResource(APISPEC_LOCATION + name + ".json");
-    Map2 result = map.getMap(name, NOT_NULL);
+    String jsonName = APISPEC_LOCATION + name + ".json";
+    Map2 map = getResource(jsonName);
+    Map2 result = map/*.getMap(name, NOT_NULL,
+        formatString("The json file ''{0}'' must have a root object with name ''{1}''",jsonName, name))*/;
     Map2 cmds = result.getMap("commands", null);
     if (cmds != null) {
       Map<String, Map2> comands2BReplaced = new Map2<>();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/java/org/apache/solr/api/ApiSupport.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/ApiSupport.java b/solr/core/src/java/org/apache/solr/api/ApiSupport.java
index 0c0549a..c3da75c 100644
--- a/solr/core/src/java/org/apache/solr/api/ApiSupport.java
+++ b/solr/core/src/java/org/apache/solr/api/ApiSupport.java
@@ -23,12 +23,4 @@ public interface ApiSupport {
 
   Collection<Api> getApis();
 
-
-  default boolean registerApi() {
-    return false;
-  }
-
-  default boolean disableHandler() {
-    return false;
-  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/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 e5f68d4..da39920 100644
--- a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
@@ -52,6 +52,7 @@ import org.apache.solr.servlet.SolrRequestParsers;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.solr.api.PathTrie.getParts;
 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;
@@ -76,7 +77,7 @@ public class V2HttpCall extends HttpSolrCall {
     String path = this.path;
     String fullPath = path = path.substring(3);//strip off '/v2'
     try {
-      pieces = PathTrie.getParts(path);
+      pieces = getParts(path);
       if (pieces.size() == 0) {
         prefix = "c";
         path = "/c";
@@ -261,7 +262,7 @@ public class V2HttpCall extends HttpSolrCall {
     try {
       api.call(solrReq, rsp);
     } catch (RuntimeException e) {
-      //todo remove for debugging only
+      //todo remove. for debugging only
       log.error("error execute()", e);
       throw e;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/java/org/apache/solr/core/PluginBag.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/PluginBag.java b/solr/core/src/java/org/apache/solr/core/PluginBag.java
index 70506e9..356fcd3 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginBag.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginBag.java
@@ -206,7 +206,6 @@ public class PluginBag<T> implements AutoCloseable {
         T inst = plugin.get();
         if (inst instanceof ApiSupport && (registerApi || plugin.registerAPI)) {
           ApiSupport apiSupport = (ApiSupport) inst;
-          if(apiSupport.disableHandler()) disableHandler = true;
           Collection<Api> apis = apiSupport.getApis();
           if (apis != null) {
             Map<String, String> nameSubstitutes = singletonMap(HANDLER_NAME, name);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/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 079f22f..9b0f959 100644
--- a/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
@@ -110,9 +110,4 @@ public class DumpRequestHandler extends RequestHandlerBase
       if(nl!=null) subpaths = nl.getAll("subpath");
     }
   }
-
-  @Override
-  public boolean registerApi() {
-    return true;
-  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/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 2ebda2a..a79e507 100644
--- a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java
+++ b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java
@@ -34,11 +34,6 @@ public class UpdateRequestHandlerApi extends UpdateRequestHandler  {
 
 
   @Override
-  public boolean registerApi() {
-    return true;
-  }
-
-  @Override
   public Collection<Api> getApis() {
     return Collections.singleton(getApiImpl());
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/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 78e5622..6702f4c 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
@@ -67,22 +67,21 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
   }
 
 
-
   enum Cmd implements ApiCommand<CollectionHandlerApi> {
     GET_COLLECTIONS(EndPoint.COLLECTIONS, GET, LIST_OP),
-    GET_A_COLLECTION(EndPoint.PER_COLLECTION, GET, LIST_OP),
-    CREATE_COLLECTION(EndPoint.COLLECTIONS,
+    GET_A_COLLECTION(EndPoint.PER_COLLECTION, GET, CLUSTERSTATUS_OP),
+    CREATE_COLLECTION(EndPoint.COLLECTIONS_COMMANDS,
         POST,
         CREATE_OP,
         CREATE_OP.action.toLower(),
         ImmutableMap.of(
-            OverseerCollectionMessageHandler.COLL_CONF, "config")){
+            OverseerCollectionMessageHandler.COLL_CONF, "config")) {
       @Override
       public Collection<String> getParamNames(CommandOperation op) {
         Collection<String> names = super.getParamNames(op);
         Collection<String> result = new ArrayList<>(names.size());
         for (String paramName : names) {
-          if(paramName.startsWith("properties.")){
+          if (paramName.startsWith("properties.")) {
             result.add(paramName.replace("properties.", "property."));
           } else {
             result.add(paramName);
@@ -93,11 +92,11 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
 
       @Override
       public String getParamSubstitute(String param) {
-        return param.startsWith("property.")? param.replace("property.", "properties.") : super.getParamSubstitute(param);
+        return param.startsWith("property.") ? param.replace("property.", "properties.") : super.getParamSubstitute(param);
       }
     },
 
-    DELETE_COLL(EndPoint.PER_COLLECTION,
+    DELETE_COLL(EndPoint.PER_COLLECTION_DELETE,
         DELETE,
         DELETE_OP,
         DELETE_OP.action.toLower(),
@@ -117,35 +116,35 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
             "target.collection", "target",
             "forward.timeout", "forwardTimeout"
         )),
-    CREATE_ALIAS(EndPoint.COLLECTIONS,
+    CREATE_ALIAS(EndPoint.COLLECTIONS_COMMANDS,
         POST,
         CREATEALIAS_OP,
         "create-alias",
         null),
 
-    DELETE_ALIAS(EndPoint.COLLECTIONS,
+    DELETE_ALIAS(EndPoint.COLLECTIONS_COMMANDS,
         POST,
         CREATEALIAS_OP,
         "delete-alias",
         ImmutableMap.of(NAME, "")),
-    CREATE_SHARD(EndPoint.PER_COLLECTION_SHARDS,
+    CREATE_SHARD(EndPoint.PER_COLLECTION_SHARDS_COMMANDS,
         POST,
         CREATESHARD_OP,
         "create",
         null),
 
-    SPLIT_SHARD(EndPoint.PER_COLLECTION_PER_SHARD,
+    SPLIT_SHARD(EndPoint.PER_COLLECTION_PER_SHARD_COMMANDS,
         POST,
         SPLITSHARD_OP,
         "split",
         ImmutableMap.of(
             "split.key", "splitKey")),
-    DELETE_SHARD(EndPoint.PER_COLLECTION_PER_SHARD,
+    DELETE_SHARD(EndPoint.PER_COLLECTION_PER_SHARD_COMMANDS,
         DELETE,
         DELETESHARD_OP),
 
 
-    CREATE_REPLICA(EndPoint.PER_COLLECTION_PER_SHARD,
+    CREATE_REPLICA(EndPoint.PER_COLLECTION_PER_SHARD_COMMANDS,
         POST,
         ADDREPLICA_OP,
         "create-replica",
@@ -155,7 +154,7 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
         DELETE,
         DELETEREPLICA_OP),
 
-    SYNC_SHARD(EndPoint.PER_COLLECTION_PER_SHARD,
+    SYNC_SHARD(EndPoint.PER_COLLECTION_PER_SHARD_COMMANDS,
         POST,
         SYNCSHARD_OP,
         "synch-shard",
@@ -225,13 +224,15 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
   }
 
   enum EndPoint implements V2EndPoint {
-    CLUSTER("collections.Commands"),
-    COLLECTIONS("collections.Commands"),
+    CLUSTER("cluster"),
+    COLLECTIONS_COMMANDS("collections.Commands"),
+    COLLECTIONS("collections"),
+    COLLECTION_STATE("collection"),
     PER_COLLECTION("collections.collection.Commands"),
-    PER_COLLECTION_SHARDS("collections.collection.shards.Commands"),
-    PER_COLLECTION_PER_SHARD("collections.collection.shards.Commands"),
-    PER_COLLECTION_PER_SHARD_REPLICAS("collections.collection.shards.shard.Commands"),
-    PER_COLLECTION_PER_SHARD_PER_REPLICA("collections.collection.shards.shard.replica.Commands"),
+    PER_COLLECTION_DELETE("collections.collection.delete"),
+    PER_COLLECTION_SHARDS_COMMANDS("collections.collection.shards.Commands"),
+    PER_COLLECTION_PER_SHARD_COMMANDS("collections.collection.shards.shard.Commands"),
+    PER_COLLECTION_PER_SHARD_PER_REPLICA_COMMANDS("collections.collection.shards.shard.replica.Commands"),
     PER_COLLECTION_PER_SHARD_PER_REPLICA_DELETE("collections.collection.shards.shard.replica.delete");
     final String specName;
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
index 80be18d..b18d6b6 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
@@ -363,11 +363,6 @@ public class CoreAdminHandler extends RequestHandlerBase  {
     return coreAdminHandlerApi.getApis();
   }
 
-  @Override
-  public boolean registerApi() {
-    return true;
-  }
-
   static {
     for (CoreAdminOperation op : CoreAdminOperation.values())
       opMap.put(op.action.toString().toLowerCase(Locale.ROOT), op);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/java/org/apache/solr/handler/admin/InfoHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/InfoHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/InfoHandler.java
index cf9e99e..dcfb1e0 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/InfoHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/InfoHandler.java
@@ -153,8 +153,4 @@ public class InfoHandler extends RequestHandlerBase implements ApiSupport {
     });
   }
 
-  @Override
-  public boolean registerApi() {
-    return true;
-  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/cluster.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cluster.json b/solr/core/src/resources/apispec/cluster.json
index bb52f98..3276a18 100644
--- a/solr/core/src/resources/apispec/cluster.json
+++ b/solr/core/src/resources/apispec/cluster.json
@@ -1,17 +1,17 @@
 {
-  "cluster": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr/Config+API",
-    "methods": ["GET"],
-    "url": {
-      "paths": [
-        "/cluster",
-        "/cluster/overseer",
-        "/cluster/nodes",
-        "/cluster/command-status",
-        "/cluster/command-status/{id}",
-        "/cluster/command-status/{id}"
-      ]
-    },
-    "body": null
-  }
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Config+API",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/cluster",
+      "/cluster/overseer",
+      "/cluster/nodes",
+      "/cluster/command-status",
+      "/cluster/command-status/{id}",
+      "/cluster/command-status/{id}"
+    ]
+  },
+  "body": null
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/cluster.security.BasicAuth.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cluster.security.BasicAuth.json b/solr/core/src/resources/apispec/cluster.security.BasicAuth.json
index 44d536c..c15a31b 100644
--- a/solr/core/src/resources/apispec/cluster.security.BasicAuth.json
+++ b/solr/core/src/resources/apispec/cluster.security.BasicAuth.json
@@ -1,25 +1,23 @@
 {
-  "cluster.security.BasicAuth": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "POST",
-      "GET"
-    ],
-    "url": {
-      "paths": [
-        "/cluster/security/authentication"
-      ]
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "POST",
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/cluster/security/authentication"
+    ]
+  },
+  "commands": {
+    "set-user": {
+      "description": "The set-user command allows you to add users and change their passwords",
+      "properties": {},
+      "additionalProperties": true
     },
-    "commands": {
-      "set-user": {
-        "description": "The set-user command allows you to add users and change their passwords",
-        "properties": {},
-        "additionalProperties": true
-      },
-      "delete-user": {
-        "description": "",
-        "type": "list"
-      }
+    "delete-user": {
+      "description": "",
+      "type": "list"
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/cluster.security.RuleBasedAuthorization.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cluster.security.RuleBasedAuthorization.json b/solr/core/src/resources/apispec/cluster.security.RuleBasedAuthorization.json
index 4d28fec..94b7b34 100644
--- a/solr/core/src/resources/apispec/cluster.security.RuleBasedAuthorization.json
+++ b/solr/core/src/resources/apispec/cluster.security.RuleBasedAuthorization.json
@@ -1,56 +1,54 @@
 {
-  "cluster.security.RuleBasedAuthorization": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "POST",
-      "GET"
-    ],
-    "url": {
-      "paths": [
-        "/cluster/security/authorization"
-      ]
-    },
-    "commands": {
-      "set-permission": {
-        "description": "create a new permission, overwrite an existing permission definition, or assign a pre-defined permission to a role.",
-        "properties": {
-          "name":{
-            "type":"string",
-            "description":""
-          },
-          "method":{
-            "type":"string",
-            "description":""
-          },
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "POST",
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/cluster/security/authorization"
+    ]
+  },
+  "commands": {
+    "set-permission": {
+      "description": "create a new permission, overwrite an existing permission definition, or assign a pre-defined permission to a role.",
+      "properties": {
+        "name":{
+          "type":"string",
+          "description":""
+        },
+        "method":{
+          "type":"string",
+          "description":""
+        },
 
-          "collection":{
-            "type":"list",
-            "description":""
-          },
+        "collection":{
+          "type":"list",
+          "description":""
+        },
 
-          "path":{
-            "type":"list",
-            "description":""
-          },
-          "before":{
-            "type":"string",
-            "description":""
-          },
-          "params":{
-            "type":"object",
-            "properties":{},
-            "additionalProperties":true,
-            "description":""
-          }
+        "path":{
+          "type":"list",
+          "description":""
+        },
+        "before":{
+          "type":"string",
+          "description":""
         },
-        "required":["name","role"]
+        "params":{
+          "type":"object",
+          "properties":{},
+          "additionalProperties":true,
+          "description":""
+        }
       },
-      "set-user-role": {
-        "description": "A single command allows roles to be mapped to users. To remove a user's permission, you should set the role to null. The key is always a user id and the value is one or more role names",
-        "properties":{},
-        "additionalProperties":true
+      "required":["name","role"]
+    },
+    "set-user-role": {
+      "description": "A single command allows roles to be mapped to users. To remove a user's permission, you should set the role to null. The key is always a user id and the value is one or more role names",
+      "properties":{},
+      "additionalProperties":true
 
-      }
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/cluster.security.authentication.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cluster.security.authentication.json b/solr/core/src/resources/apispec/cluster.security.authentication.json
index 4f55c4f..8ac576e 100644
--- a/solr/core/src/resources/apispec/cluster.security.authentication.json
+++ b/solr/core/src/resources/apispec/cluster.security.authentication.json
@@ -1,15 +1,12 @@
 {
-  "cluster.security.authentication": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "POST",
-      "GET"
-    ],
-    "url": {
-      "paths": [
-        "/cluster/security/authentication"
-      ]
-    }
-
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "POST",
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/cluster/security/authentication"
+    ]
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/cluster.security.authorization.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cluster.security.authorization.json b/solr/core/src/resources/apispec/cluster.security.authorization.json
index c5b08ea..ff0b99a 100644
--- a/solr/core/src/resources/apispec/cluster.security.authorization.json
+++ b/solr/core/src/resources/apispec/cluster.security.authorization.json
@@ -1,15 +1,13 @@
 {
-  "cluster.security.authorization": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "POST",
-      "GET"
-    ],
-    "url": {
-      "paths": [
-        "/cluster/security/authorization"
-      ]
-    }
-
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "POST",
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/cluster/security/authorization"
+    ]
   }
-}
\ No newline at end of file
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/collection.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/collection.json b/solr/core/src/resources/apispec/collection.json
new file mode 100644
index 0000000..68775bf
--- /dev/null
+++ b/solr/core/src/resources/apispec/collection.json
@@ -0,0 +1,18 @@
+{
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-api1",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/collections/{collection}",
+      "/c/{collection}",
+      "/collections/{collection}/shards",
+      "/c/{collection}/shards",
+      "/collections/{collection}/shards/{shard}",
+      "/c/{collection}/shards/{shard}",
+      "/collections/{collection}/shards/{shard}/{replica}",
+      "/c/{collection}/shards/{shard}/{replica}"
+    ]
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/collections.Commands.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/collections.Commands.json b/solr/core/src/resources/apispec/collections.Commands.json
index c5a194d..aac8f34 100644
--- a/solr/core/src/resources/apispec/collections.Commands.json
+++ b/solr/core/src/resources/apispec/collections.Commands.json
@@ -1,82 +1,80 @@
 {
-  "collections.Commands": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-api1",
-    "methods": [
-      "POST",
-      "GET"
-    ],
-    "url": {
-      "paths": [
-        "/collections",
-        "/c"
-      ]
-    },
-    "commands": {
-      "create": {
-        "properties": {
-          "name": {
-            "type": "string",
-            "description": ""
-          },
-          "config": {
-            "type": "string",
-            "description": ""
-          },
-          "router": {
-            "type": "object",
-            "properties": {
-              "name": {
-              },
-              "field": {
-              }
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-api1",
+  "methods": [
+    "POST",
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/collections",
+      "/c"
+    ]
+  },
+  "commands": {
+    "create": {
+      "properties": {
+        "name": {
+          "type": "string",
+          "description": ""
+        },
+        "config": {
+          "type": "string",
+          "description": ""
+        },
+        "router": {
+          "type": "object",
+          "properties": {
+            "name": {
+            },
+            "field": {
             }
-          },
-          "numShards": {
-            "type": "string",
-            "description": ""
-          },
-          "shards": {
-            "type": "string",
-            "description": ""
-          },
-          "replicationFactor": {
-            "type": "string",
-            "description": ""
-          },
-          "createNodeSet": {
-            "type": "string",
-            "description": ""
-          },
-          "autoAddReplicas": {
-            "type": "boolean",
-            "description": ""
-          },
-          "rule": {
-            "type": "list",
-            "description":""
-
-          },
-          "snitch": {
-            "type": "list",
-            "description":""
           }
         },
-        "required":["name"]
+        "numShards": {
+          "type": "string",
+          "description": ""
+        },
+        "shards": {
+          "type": "string",
+          "description": ""
+        },
+        "replicationFactor": {
+          "type": "string",
+          "description": ""
+        },
+        "createNodeSet": {
+          "type": "string",
+          "description": ""
+        },
+        "autoAddReplicas": {
+          "type": "boolean",
+          "description": ""
+        },
+        "rule": {
+          "type": "list",
+          "description":""
+
+        },
+        "snitch": {
+          "type": "list",
+          "description":""
+        }
       },
-      "create-alias":{
-        "properties": {
-          "name": {
-            "type": "string",
-            "description": "The alias name to be created"
-          },
-          "collections" :{
-            "type":"list",
-            "description":"The list of collections to be aliased"
-          }
+      "required":["name"]
+    },
+    "create-alias":{
+      "properties": {
+        "name": {
+          "type": "string",
+          "description": "The alias name to be created"
         },
-        "required" : ["name","collections"]
+        "collections" :{
+          "type":"list",
+          "description":"The list of collections to be aliased"
+        }
       },
-      "delete-alias":{}
-    }
+      "required" : ["name","collections"]
+    },
+    "delete-alias":{}
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/collections.collection.Commands.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/collections.collection.Commands.json b/solr/core/src/resources/apispec/collections.collection.Commands.json
index 9566787..a9b271d 100644
--- a/solr/core/src/resources/apispec/collections.collection.Commands.json
+++ b/solr/core/src/resources/apispec/collections.collection.Commands.json
@@ -1,19 +1,16 @@
 {
-  "collections.collection.Commands": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "POST",
-      "DELETE"
-    ],
-    "url": {
-      "paths": [
-        "/collections/{collection}",
-        "/c/{collection}"
-      ]
-    },
-    "commands": {
-      "modify": "collections.collection.Commands.modify",
-      "reload": "collections.collection.Commands.reload"
-    }
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "POST"
+  ],
+  "url": {
+    "paths": [
+      "/collections/{collection}",
+      "/c/{collection}"
+    ]
+  },
+  "commands": {
+    "modify": "collections.collection.Commands.modify",
+    "reload": "collections.collection.Commands.reload"
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/collections.collection.delete.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/collections.collection.delete.json b/solr/core/src/resources/apispec/collections.collection.delete.json
new file mode 100644
index 0000000..d33543e
--- /dev/null
+++ b/solr/core/src/resources/apispec/collections.collection.delete.json
@@ -0,0 +1,12 @@
+{
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "DELETE"
+  ],
+  "url": {
+    "paths": [
+      "/collections/{collection}",
+      "/c/{collection}"
+    ]
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/collections.collection.shards.Commands.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/collections.collection.shards.Commands.json b/solr/core/src/resources/apispec/collections.collection.shards.Commands.json
index 97bb22d..70d6e11 100644
--- a/solr/core/src/resources/apispec/collections.collection.shards.Commands.json
+++ b/solr/core/src/resources/apispec/collections.collection.shards.Commands.json
@@ -1,21 +1,19 @@
 {
-  "collections.collection.shards.Commands": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "GET",
-      "POST"
-    ],
-    "url": {
-      "paths": [
-        "/collections/{collection}/shards",
-        "/c/{collection}/shards"
-      ]
-    },
-    "commands": {
-      "create": {
-        "properties":{},
-        "additionalProperties":true
-      }
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "GET",
+    "POST"
+  ],
+  "url": {
+    "paths": [
+      "/collections/{collection}/shards",
+      "/c/{collection}/shards"
+    ]
+  },
+  "commands": {
+    "create": {
+      "properties":{},
+      "additionalProperties":true
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/collections.collection.shards.shard.Commands.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/collections.collection.shards.shard.Commands.json b/solr/core/src/resources/apispec/collections.collection.shards.shard.Commands.json
index fceaeeb..4b42c47 100644
--- a/solr/core/src/resources/apispec/collections.collection.shards.shard.Commands.json
+++ b/solr/core/src/resources/apispec/collections.collection.shards.shard.Commands.json
@@ -1,28 +1,26 @@
 {
-  "collections.collection.shards.shard.Commands": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "POST",
-      "GET",
-      "DELETE"
-    ],
-    "url": {
-      "paths": [
-        "/collections/{collection}/shards/{shard}",
-        "/c/{collection}/shards/{shard}"
-      ]
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "POST",
+    "GET",
+    "DELETE"
+  ],
+  "url": {
+    "paths": [
+      "/collections/{collection}/shards/{shard}",
+      "/c/{collection}/shards/{shard}"
+    ]
+  },
+  "commands": {
+    "split": {
+      "properties": {},
+      "additionalProperties": true
     },
-    "commands": {
-      "split": {
-        "properties": {},
-        "additionalProperties": true
-      },
-      "add-replica": {
-        "additionalProperties": true
-      },
-      "force-leader": {
-        "additionalProperties": true
-      }
+    "add-replica": {
+      "additionalProperties": true
+    },
+    "force-leader": {
+      "additionalProperties": true
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/collections.collection.shards.shard.replica.Commands.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/collections.collection.shards.shard.replica.Commands.json b/solr/core/src/resources/apispec/collections.collection.shards.shard.replica.Commands.json
index e7a43d5..dc747ac 100644
--- a/solr/core/src/resources/apispec/collections.collection.shards.shard.replica.Commands.json
+++ b/solr/core/src/resources/apispec/collections.collection.shards.shard.replica.Commands.json
@@ -1,20 +1,18 @@
 {
-  "collections.collection.shards.shard.replica.Commands": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "GET",
-      "POST"
-    ],
-    "url": {
-      "paths": [
-        "/collections/{collection}/shards/{shard}/{replica}",
-        "/c/{collection}/shards/{shard}/{replica}"
-      ]
-    },
-    "commands": {
-      "set": {
-        "additionalProperties": true
-      }
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "GET",
+    "POST"
+  ],
+  "url": {
+    "paths": [
+      "/collections/{collection}/shards/{shard}/{replica}",
+      "/c/{collection}/shards/{shard}/{replica}"
+    ]
+  },
+  "commands": {
+    "set": {
+      "additionalProperties": true
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/collections.collection.shards.shard.replica.delete.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/collections.collection.shards.shard.replica.delete.json b/solr/core/src/resources/apispec/collections.collection.shards.shard.replica.delete.json
index 6f1243d..cc9e7e3 100644
--- a/solr/core/src/resources/apispec/collections.collection.shards.shard.replica.delete.json
+++ b/solr/core/src/resources/apispec/collections.collection.shards.shard.replica.delete.json
@@ -1,23 +1,20 @@
 {
-  "collections.collection.shards.shard.replica.delete": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "DELETE"
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "DELETE"
+  ],
+  "url": {
+    "paths": [
+      "/collections/{collection}/shards/{shard}/{replica}",
+      "/c/{collection}/shards/{shard}/{replica}"
     ],
-    "url": {
-      "paths": [
-        "/collections/{collection}/shards/{shard}/{replica}",
-        "/c/{collection}/shards/{shard}/{replica}"
-      ],
-      "params":{
-        "onlyIfDown" : {
-          "type":"boolean",
-          "default":false,
-          "description":""
-        }
+    "params": {
+      "onlyIfDown": {
+        "type": "boolean",
+        "default": false,
+        "description": ""
       }
-
     }
 
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/collections.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/collections.json b/solr/core/src/resources/apispec/collections.json
new file mode 100644
index 0000000..0742fca
--- /dev/null
+++ b/solr/core/src/resources/apispec/collections.json
@@ -0,0 +1,12 @@
+{
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-api1",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/collections",
+      "/c"
+    ]
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/core.ConfigEdit.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/core.ConfigEdit.json b/solr/core/src/resources/apispec/core.ConfigEdit.json
index 0146809..32c129d 100644
--- a/solr/core/src/resources/apispec/core.ConfigEdit.json
+++ b/solr/core/src/resources/apispec/core.ConfigEdit.json
@@ -1,115 +1,113 @@
 {
-  "core.ConfigEdit": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
-    "methods": [
-      "POST"
-    ],
-    "url": {
-      "paths": [
-        "$handlerName",
-        "$handlerName/params"
-      ]
-    },
-    "commands": {
-      "add-requesthandler": {
-        "additionalProperties": true
-      },
-      "update-requesthandler": {
-        "additionalProperties": true
-      },
-      "delete-requesthandler": {
-        "additionalProperties": true
-      },
-      "add-searchcomponent": {
-        "additionalProperties": true
-      },
-      "update-searchcomponent": {
-        "additionalProperties": true
-      },
-      "delete-searchcomponent": {
-        "additionalProperties": true
-      },
-      "add-initparams": {
-        "additionalProperties": true
-      },
-      "update-initparams": {
-        "additionalProperties": true
-      },
-      "delete-initparams": {
-        "additionalProperties": true
-      },
-      "add-queryresponsewriter": {
-        "additionalProperties": true
-      },
-      "update-queryresponsewriter": {
-        "additionalProperties": true
-      },
-      "delete-queryresponsewriter": {
-        "additionalProperties": true
-      },
-      "add-queryparser": {
-        "additionalProperties": true
-      },
-      "update-queryparser": {
-        "additionalProperties": true
-      },
-      "delete-queryparser": {
-        "additionalProperties": true
-      },
-      "add-valuesourceparser": {
-        "additionalProperties": true
-      },
-      "update-valuesourceparser": {
-        "additionalProperties": true
-      },
-      "delete-valuesourceparser": {
-        "additionalProperties": true
-      },
-      "add-transformer": {
-        "additionalProperties": true
-      },
-      "update-transformer": {
-        "additionalProperties": true
-      },
-      "delete-transformer": {
-        "additionalProperties": true
-      },
-      "add-updateprocessor": {
-        "additionalProperties": true
-      },
-      "update-updateprocessor": {
-        "additionalProperties": true
-      },
-      "delete-updateprocessor": {
-        "additionalProperties": true
-      },
-      "add-queryconverter": {
-        "additionalProperties": true
-      },
-      "update-queryconverter": {
-        "additionalProperties": true
-      },
-      "delete-queryconverter": {
-        "additionalProperties": true
-      },
-      "add-listener": {
-        "additionalProperties": true
-      },
-      "update-listener": {
-        "additionalProperties": true
-      },
-      "delete-listener": {
-        "additionalProperties": true
-      },
-      "add-runtimelib": {
-        "additionalProperties": true
-      },
-      "update-runtimelib": {
-        "additionalProperties": true
-      },
-      "delete-runtimelib": {
-        "additionalProperties": true
-      }
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
+  "methods": [
+    "POST"
+  ],
+  "url": {
+    "paths": [
+      "$handlerName",
+      "$handlerName/params"
+    ]
+  },
+  "commands": {
+    "add-requesthandler": {
+      "additionalProperties": true
+    },
+    "update-requesthandler": {
+      "additionalProperties": true
+    },
+    "delete-requesthandler": {
+      "additionalProperties": true
+    },
+    "add-searchcomponent": {
+      "additionalProperties": true
+    },
+    "update-searchcomponent": {
+      "additionalProperties": true
+    },
+    "delete-searchcomponent": {
+      "additionalProperties": true
+    },
+    "add-initparams": {
+      "additionalProperties": true
+    },
+    "update-initparams": {
+      "additionalProperties": true
+    },
+    "delete-initparams": {
+      "additionalProperties": true
+    },
+    "add-queryresponsewriter": {
+      "additionalProperties": true
+    },
+    "update-queryresponsewriter": {
+      "additionalProperties": true
+    },
+    "delete-queryresponsewriter": {
+      "additionalProperties": true
+    },
+    "add-queryparser": {
+      "additionalProperties": true
+    },
+    "update-queryparser": {
+      "additionalProperties": true
+    },
+    "delete-queryparser": {
+      "additionalProperties": true
+    },
+    "add-valuesourceparser": {
+      "additionalProperties": true
+    },
+    "update-valuesourceparser": {
+      "additionalProperties": true
+    },
+    "delete-valuesourceparser": {
+      "additionalProperties": true
+    },
+    "add-transformer": {
+      "additionalProperties": true
+    },
+    "update-transformer": {
+      "additionalProperties": true
+    },
+    "delete-transformer": {
+      "additionalProperties": true
+    },
+    "add-updateprocessor": {
+      "additionalProperties": true
+    },
+    "update-updateprocessor": {
+      "additionalProperties": true
+    },
+    "delete-updateprocessor": {
+      "additionalProperties": true
+    },
+    "add-queryconverter": {
+      "additionalProperties": true
+    },
+    "update-queryconverter": {
+      "additionalProperties": true
+    },
+    "delete-queryconverter": {
+      "additionalProperties": true
+    },
+    "add-listener": {
+      "additionalProperties": true
+    },
+    "update-listener": {
+      "additionalProperties": true
+    },
+    "delete-listener": {
+      "additionalProperties": true
+    },
+    "add-runtimelib": {
+      "additionalProperties": true
+    },
+    "update-runtimelib": {
+      "additionalProperties": true
+    },
+    "delete-runtimelib": {
+      "additionalProperties": true
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/core.ConfigRead.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/core.ConfigRead.json b/solr/core/src/resources/apispec/core.ConfigRead.json
index b86a5e4..9f34573 100644
--- a/solr/core/src/resources/apispec/core.ConfigRead.json
+++ b/solr/core/src/resources/apispec/core.ConfigRead.json
@@ -1,19 +1,20 @@
 {
-  "core.ConfigRead": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr/Config+API",
-    "methods": ["GET"],
-    "url": {
-      "paths": [
-        "$handlerName",
-        "$handlerName/overlay",
-        "$handlerName/params",
-        "$handlerName/params",
-        "$handlerName/query",
-        "$handlerName/jmx",
-        "$handlerName/requestDispatcher",
-        "$handlerName/znodeVersion",
-        "$handlerName/{plugin}"
-      ] },
-    "body": null
-  }
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Config+API",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "$handlerName",
+      "$handlerName/overlay",
+      "$handlerName/params",
+      "$handlerName/params",
+      "$handlerName/query",
+      "$handlerName/jmx",
+      "$handlerName/requestDispatcher",
+      "$handlerName/znodeVersion",
+      "$handlerName/{plugin}"
+    ]
+  },
+  "body": null
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/core.RealtimeGet.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/core.RealtimeGet.json b/solr/core/src/resources/apispec/core.RealtimeGet.json
index 20a1cfe..f9b4d8c 100644
--- a/solr/core/src/resources/apispec/core.RealtimeGet.json
+++ b/solr/core/src/resources/apispec/core.RealtimeGet.json
@@ -1,22 +1,23 @@
 {
-  "core.RealtimeGet": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
-    "methods": ["GET"],
-    "url": {
-      "path": "/get",
-      "paths": [
-        "$handlerName",
-        "$handlerName/versions",
-        "$handlerName/updates"],
-      "params":{
-        "id" : {
-          "type":"string",
-          "description" :"one or more ids. Separate by commas if there are more than one"
-        },
-        "ids" : {
-          "type":"string",
-          "description" :"one or more ids. Separate by commas if there are more than one"
-        }
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "path": "/get",
+    "paths": [
+      "$handlerName",
+      "$handlerName/versions",
+      "$handlerName/updates"
+    ],
+    "params": {
+      "id": {
+        "type": "string",
+        "description": "one or more ids. Separate by commas if there are more than one"
+      },
+      "ids": {
+        "type": "string",
+        "description": "one or more ids. Separate by commas if there are more than one"
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/core.SchemaEdit.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/core.SchemaEdit.json b/solr/core/src/resources/apispec/core.SchemaEdit.json
index 59cdd5f..ba336da 100644
--- a/solr/core/src/resources/apispec/core.SchemaEdit.json
+++ b/solr/core/src/resources/apispec/core.SchemaEdit.json
@@ -1,22 +1,24 @@
 {
-  "core.SchemaEdit": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
-    "methods": ["POST"],
-    "url": {
-      "paths": ["$handlerName"]
-    },
-    "commands":{
-      "add-field":"core.SchemaEdit.addField",
-      "delete-field":"core.SchemaEdit.deleteField",
-      "replace-field":"core.SchemaEdit.replaceField",
-      "add-dynamic-field":"core.SchemaEdit.addDynamicField",
-      "delete-dynamic-field":"core.SchemaEdit.deleteDynamicField",
-      "replace-dynamic-field":"core.SchemaEdit.replaceDynamicField",
-      "add-field-type":"core.SchemaEdit.addFieldType",
-      "delete-field-type":"core.SchemaEdit.deleteFieldType",
-      "replace-field-type":"core.SchemaEdit.replaceFieldType",
-      "add-copy-field":"core.SchemaEdit.addCopyField",
-      "delete-copy-field":"core.SchemaEdit.deleteCopyField"
-    }
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
+  "methods": [
+    "POST"
+  ],
+  "url": {
+    "paths": [
+      "$handlerName"
+    ]
+  },
+  "commands": {
+    "add-field": "core.SchemaEdit.addField",
+    "delete-field": "core.SchemaEdit.deleteField",
+    "replace-field": "core.SchemaEdit.replaceField",
+    "add-dynamic-field": "core.SchemaEdit.addDynamicField",
+    "delete-dynamic-field": "core.SchemaEdit.deleteDynamicField",
+    "replace-dynamic-field": "core.SchemaEdit.replaceDynamicField",
+    "add-field-type": "core.SchemaEdit.addFieldType",
+    "delete-field-type": "core.SchemaEdit.deleteFieldType",
+    "replace-field-type": "core.SchemaEdit.replaceFieldType",
+    "add-copy-field": "core.SchemaEdit.addCopyField",
+    "delete-copy-field": "core.SchemaEdit.deleteCopyField"
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/core.SchemaRead.fields.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/core.SchemaRead.fields.json b/solr/core/src/resources/apispec/core.SchemaRead.fields.json
index 1b6f924..673f952 100644
--- a/solr/core/src/resources/apispec/core.SchemaRead.fields.json
+++ b/solr/core/src/resources/apispec/core.SchemaRead.fields.json
@@ -1,31 +1,29 @@
 {
-  "core.SchemaRead.fields": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
-    "methods": [
-      "GET"
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/$handlerName/fields",
+      "/$handlerName/fields/{name}",
+      "/$handlerName/dynamicfields",
+      "/$handlerName/dynamicfields/{name}",
+      "/$handlerName/fieldtypes/",
+      "/$handlerName/fieldtypes/{name}"
     ],
-    "url": {
-      "paths": [
-        "/$handlerName/fields",
-        "/$handlerName/fields/{name}",
-        "/$handlerName/dynamicfields",
-        "/$handlerName/dynamicfields/{name}",
-        "/$handlerName/fieldtypes/",
-        "/$handlerName/fieldtypes/{name}"
-      ],
-      "params": {
-        "includeDynamic" :{
-          "type":"boolean",
-          "description":"If true, and if the fl query parameter is specified or the fieldname path parameter is used, matching dynamic fields are included in the response and identified with the dynamicBase property. If neither the fl query parameter nor the fieldname path parameter is specified, the includeDynamic query parameter is ignored. If false, matching dynamic fields will not be returned.",
-          "default":false
-        },
-        "showDefaults" :{
-          "type":"boolean",
-          "description":"If true, all default field properties from each field's field type will be included in the response (e.g. tokenized for solr.TextField). If false, only explicitly specified field properties will be included.",
-          "default":false
-        }
+    "params": {
+      "includeDynamic": {
+        "type": "boolean",
+        "description": "If true, and if the fl query parameter is specified or the fieldname path parameter is used, matching dynamic fields are included in the response and identified with the dynamicBase property. If neither the fl query parameter nor the fieldname path parameter is specified, the includeDynamic query parameter is ignored. If false, matching dynamic fields will not be returned.",
+        "default": false
+      },
+      "showDefaults": {
+        "type": "boolean",
+        "description": "If true, all default field properties from each field's field type will be included in the response (e.g. tokenized for solr.TextField). If false, only explicitly specified field properties will be included.",
+        "default": false
       }
-    },
-    "body": null
-  }
+    }
+  },
+  "body": null
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/core.SchemaRead.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/core.SchemaRead.json b/solr/core/src/resources/apispec/core.SchemaRead.json
index b76070b..91216ff 100644
--- a/solr/core/src/resources/apispec/core.SchemaRead.json
+++ b/solr/core/src/resources/apispec/core.SchemaRead.json
@@ -1,25 +1,25 @@
 {
-  "core.SchemaRead": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr$handlerName+API",
-    "methods": ["GET"],
-    "url": {
-      "paths": [
-        "$handlerName",
-        "$handlerName/name",
-        "$handlerName/uniquekey",
-        "$handlerName/version",
-        "$handlerName/similarity",
-        "$handlerName/solrqueryparser",
-        "$handlerName/zkversion",
-        "$handlerName/zkversion",
-        "$handlerName/solrqueryparser/defaultoperator",
-        "$handlerName/name",
-        "$handlerName/version",
-        "$handlerName/uniquekey",
-        "$handlerName/similarity",
-        "$handlerName/similarity"
-      ]
-    },
-    "body": null
-  }
+  "documentation": "https://cwiki.apache.org/confluence/display/solr$handlerName+API",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "$handlerName",
+      "$handlerName/name",
+      "$handlerName/uniquekey",
+      "$handlerName/version",
+      "$handlerName/similarity",
+      "$handlerName/solrqueryparser",
+      "$handlerName/zkversion",
+      "$handlerName/zkversion",
+      "$handlerName/solrqueryparser/defaultoperator",
+      "$handlerName/name",
+      "$handlerName/version",
+      "$handlerName/uniquekey",
+      "$handlerName/similarity",
+      "$handlerName/similarity"
+    ]
+  },
+  "body": null
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/core.Update.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/core.Update.json b/solr/core/src/resources/apispec/core.Update.json
index cf2c2ce..f243568 100644
--- a/solr/core/src/resources/apispec/core.Update.json
+++ b/solr/core/src/resources/apispec/core.Update.json
@@ -1,19 +1,17 @@
 {
-  "core.Update": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
-    "methods": [
-      "POST"
-    ],
-    "url": {
-      "path": "/update",
-      "paths": [
-        "/update",
-        "/update/xml",
-        "/update/csv",
-        "/update/json",
-        "/update/json/commands"
-      ]
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
+  "methods": [
+    "POST"
+  ],
+  "url": {
+    "path": "/update",
+    "paths": [
+      "/update",
+      "/update/xml",
+      "/update/csv",
+      "/update/json",
+      "/update/json/commands"
+    ]
 
-    }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/cores.Commands.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cores.Commands.json b/solr/core/src/resources/apispec/cores.Commands.json
index 784d9bf..dcba6145 100644
--- a/solr/core/src/resources/apispec/cores.Commands.json
+++ b/solr/core/src/resources/apispec/cores.Commands.json
@@ -1,67 +1,68 @@
 {
-  "cores.Commands": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "POST"
-    ],
-    "url": {
-      "path": "/cores",
-      "paths": [
-        "/cores"
-      ]
-    },
-    "commands": {
-      "create": {
-        "properties": {
-          "name": {
-            "type": "string",
-            "description": "The core name"
-          },
-          "instanceDir":{
-            "type": "string",
-            "description": "The core instance dir"
-          },
-          "schema": {
-            "type": "string",
-            "description": "The core name"
-          },
-          "dataDir": {
-            "type": "string",
-            "description": "The core name"
-          },
-          "configSet": {
-            "type": "string",
-            "description": "The configset name"
-          },
-          "loadOnStartup": {
-            "type": "boolean",
-            "description": "Load the core on startup"
-          },
-          "transient": {
-            "type": "boolean",
-            "description": "The core may be unloaded if required"
-          },
-          "shard": {
-            "type": "string",
-            "description": "In SolrCloud mode, which shard does this core belong to"
-          },
-          "collection": {
-            "type": "string",
-            "description": "The collection where this core belongs to"
-          },
-          "props":{
-            "type":"object",
-            "additionalProperties": true
-          },
-          "coreNodeName": {
-            "type":"string",
-            "description":"The replica name"
-          },
-          "numShards": {
-          }
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "POST"
+  ],
+  "url": {
+    "path": "/cores",
+    "paths": [
+      "/cores"
+    ]
+  },
+  "commands": {
+    "create": {
+      "properties": {
+        "name": {
+          "type": "string",
+          "description": "The core name"
+        },
+        "instanceDir": {
+          "type": "string",
+          "description": "The core instance dir"
+        },
+        "schema": {
+          "type": "string",
+          "description": "The core name"
+        },
+        "dataDir": {
+          "type": "string",
+          "description": "The core name"
+        },
+        "configSet": {
+          "type": "string",
+          "description": "The configset name"
+        },
+        "loadOnStartup": {
+          "type": "boolean",
+          "description": "Load the core on startup"
         },
-        "required":["name","configset"]
-      }
+        "transient": {
+          "type": "boolean",
+          "description": "The core may be unloaded if required"
+        },
+        "shard": {
+          "type": "string",
+          "description": "In SolrCloud mode, which shard does this core belong to"
+        },
+        "collection": {
+          "type": "string",
+          "description": "The collection where this core belongs to"
+        },
+        "props": {
+          "type": "object",
+          "additionalProperties": true
+        },
+        "coreNodeName": {
+          "type": "string",
+          "description": "The replica name"
+        },
+        "numShards": {
+        }
+      },
+      "required": [
+        "name",
+        "configset"
+      ]
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/cores.Status.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cores.Status.json b/solr/core/src/resources/apispec/cores.Status.json
index 0bf41aa..247cae0 100644
--- a/solr/core/src/resources/apispec/cores.Status.json
+++ b/solr/core/src/resources/apispec/cores.Status.json
@@ -1,23 +1,21 @@
 {
-  "cores.Status": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "GET"
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "path": "/cores",
+    "paths": [
+      "/cores",
+      "/cores/{core}/status"
     ],
-    "url": {
-      "path": "/cores",
-      "paths": [
-        "/cores",
-        "/cores/{core}/status"
-      ],
-      "params": {
-        "indexInfo": {
-          "type": "boolean",
-          "description": "return index info",
-          "default": false
-        }
+    "params": {
+      "indexInfo": {
+        "type": "boolean",
+        "description": "return index info",
+        "default": false
       }
-    },
-    "body": null
-  }
+    }
+  },
+  "body": null
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/cores.core.Commands.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cores.core.Commands.json b/solr/core/src/resources/apispec/cores.core.Commands.json
index c8181b2..1c41605 100644
--- a/solr/core/src/resources/apispec/cores.core.Commands.json
+++ b/solr/core/src/resources/apispec/cores.core.Commands.json
@@ -1,36 +1,36 @@
 {
-  "cores.core.Commands": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "POST"
-    ],
-    "url": {
-      "path": "/cores/{core}",
-      "paths": [
-        "/cores/{core}"
-      ]
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "POST"
+  ],
+  "url": {
+    "path": "/cores/{core}",
+    "paths": [
+      "/cores/{core}"
+    ]
+  },
+  "commands": {
+    "reload": {
+      "properties": {}
     },
-    "commands": {
-      "reload": {
-        "properties": {}
-      },
-      "unload":{
-        "properties": {}
-      },
-      "swap": {
-        "properties": {
-          "with" : {
-            "type":"string",
-            "description":"The other core name"
-          }
-        },
-        "required":["with"]
-      },
-      "merge-indexes": {
-        "properties": {}
+    "unload": {
+      "properties": {}
+    },
+    "swap": {
+      "properties": {
+        "with": {
+          "type": "string",
+          "description": "The other core name"
+        }
       },
-      "request-recovery": {},
-      "split":"cores.core.Commands.split"
-    }
+      "required": [
+        "with"
+      ]
+    },
+    "merge-indexes": {
+      "properties": {}
+    },
+    "request-recovery": {},
+    "split": "cores.core.Commands.split"
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/cores.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cores.json b/solr/core/src/resources/apispec/cores.json
index 4157df1..ce4320f 100644
--- a/solr/core/src/resources/apispec/cores.json
+++ b/solr/core/src/resources/apispec/cores.json
@@ -1,22 +1,20 @@
 {
-  "cores": {
-    "documentation": "https://cwiki.apache.org",
-    "methods": [
-      "GET"
+  "documentation": "https://cwiki.apache.org",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "path": "/cores",
+    "paths": [
+      "/cores"
     ],
-    "url": {
-      "path": "/cores",
-      "paths": [
-        "/cores"
-      ],
-      "params": {
-        "indexInfo": {
-          "type": "boolean",
-          "description": "return index info",
-          "default": false
-        }
+    "params": {
+      "indexInfo": {
+        "type": "boolean",
+        "description": "return index info",
+        "default": false
       }
-    },
-    "body": null
-  }
+    }
+  },
+  "body": null
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/emptySpec.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/emptySpec.json b/solr/core/src/resources/apispec/emptySpec.json
index 0c5125b..e96e841 100644
--- a/solr/core/src/resources/apispec/emptySpec.json
+++ b/solr/core/src/resources/apispec/emptySpec.json
@@ -1,15 +1,13 @@
 {
-  "emptySpec": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
-    "methods": [
-      "GET",
-      "POST"
-    ],
-    "url": {
-      "path": "$handlerName",
-      "paths": [
-        "$handlerName"
-      ]
-    }
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
+  "methods": [
+    "GET",
+    "POST"
+  ],
+  "url": {
+    "path": "$handlerName",
+    "paths": [
+      "$handlerName"
+    ]
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/resources/apispec/node.Info.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/node.Info.json b/solr/core/src/resources/apispec/node.Info.json
index 687b6b6..8ed7740 100644
--- a/solr/core/src/resources/apispec/node.Info.json
+++ b/solr/core/src/resources/apispec/node.Info.json
@@ -1,14 +1,12 @@
 {
-  "node.Info": {
-    "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
-    "methods": ["GET"],
-    "url": {
-      "path": "/node",
-      "paths": [
-        "/node/properties",
-        "/node/threads",
-        "/node/logging",
-        "/node/system"]
-    }
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Schema+API",
+  "methods": ["GET"],
+  "url": {
+    "path": "/node",
+    "paths": [
+      "/node/properties",
+      "/node/threads",
+      "/node/logging",
+      "/node/system"]
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/test-files/solr/collection1/conf/solrconfig-managed-schema.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-managed-schema.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-managed-schema.xml
index 467deca..31bbbb3 100644
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-managed-schema.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig-managed-schema.xml
@@ -40,7 +40,7 @@
   </requestHandler>
 
 
-  <requestHandler name="/dump" class="DumpRequestHandler" initParams="a">
+  <requestHandler name="/dump" class="DumpRequestHandler" initParams="a" registerPath="/,/v2">
     <lst name="defaults">
       <str name="a">${my.custom.variable.a:A}</str>
       <str name="b">${my.custom.variable.b:B}</str>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/test/org/apache/solr/core/BlobStoreTestRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/BlobStoreTestRequestHandler.java b/solr/core/src/test/org/apache/solr/core/BlobStoreTestRequestHandler.java
index 522f94a..dda1eb3 100644
--- a/solr/core/src/test/org/apache/solr/core/BlobStoreTestRequestHandler.java
+++ b/solr/core/src/test/org/apache/solr/core/BlobStoreTestRequestHandler.java
@@ -59,8 +59,4 @@ public class BlobStoreTestRequestHandler extends DumpRequestHandler implements R
 
   }
 
-  @Override
-  public boolean registerApi() {
-    return true;
-  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java b/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java
index c8b4630..ad28215 100644
--- a/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java
+++ b/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java
@@ -94,7 +94,7 @@ public class TestDynamicLoading extends AbstractFullDistribZkTestBase {
 
 
     payload = "{\n" +
-        "'create-requesthandler' : { 'name' : '/test1', 'class': 'org.apache.solr.core.BlobStoreTestRequestHandler' , 'runtimeLib' : true }\n" +
+        "'create-requesthandler' : { 'name' : '/test1', 'class': 'org.apache.solr.core.BlobStoreTestRequestHandler' ,registerPath: '/,/v2',  'runtimeLib' : true }\n" +
         "}";
 
     client = restTestHarnesses.get(random().nextInt(restTestHarnesses.size()));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/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 0717150..fbdbd4d 100644
--- a/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
+++ b/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
@@ -78,7 +78,7 @@ public class TestSolrConfigHandler extends RestTestBase {
 
     createJettyAndHarness(tmpSolrHome.getAbsolutePath(), "solrconfig-managed-schema.xml", "schema-rest.xml",
         "/solr", true, extraServlets);
-    if (true) {
+    if (random().nextBoolean()) {
       log.info("These tests are run with V2 API");
       restTestHarness.setServerProvider(new RESTfulServerProvider() {
         @Override
@@ -575,7 +575,7 @@ public class TestSolrConfigHandler extends RestTestBase {
 
     TestSolrConfigHandler.testForResponseElement(harness,
         null,
-        "/dump?wt=json&useParams=y",
+        "/dump1?wt=json&useParams=y",
         null,
         Arrays.asList("params", "c"),
         "CY val",

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/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 4d20475..60f7dde 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
@@ -53,14 +53,14 @@ public class TestApiFramework extends SolrTestCaseJ4 {
     Map<String, Object> out = new HashMap<>();
     CoreContainer mockCC = TestCoreAdminApis.getCoreContainerMock(calls, out);
     PluginBag<SolrRequestHandler> containerHandlers = new PluginBag<>(SolrRequestHandler.class, null, false);
-    containerHandlers.put(COLLECTIONS_HANDLER_PATH, new TestCollectionAPIs.MockCollectionsHandler());
-    containerHandlers.put(CORES_HANDLER_PATH, new CoreAdminHandler(mockCC));
+    containerHandlers.put(COLLECTIONS_HANDLER_PATH, new TestCollectionAPIs.MockCollectionsHandler(), true);
+    containerHandlers.put(CORES_HANDLER_PATH, new CoreAdminHandler(mockCC), true);
     out.put("getRequestHandlers", containerHandlers);
 
     PluginBag<SolrRequestHandler> coreHandlers = new PluginBag<>(SolrRequestHandler.class, null, false);
-    coreHandlers.put("/schema", new SchemaHandler());
-    coreHandlers.put("/config", new SolrConfigHandler());
-    coreHandlers.put("/admin/ping", new PingRequestHandler());
+    coreHandlers.put("/schema", new SchemaHandler(), true);
+    coreHandlers.put("/config", new SolrConfigHandler(), true);
+    coreHandlers.put("/admin/ping", new PingRequestHandler(), true);
 
     Map<String, String> parts = new HashMap<>();
     String fullPath = "/collections/hello/shards";

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9b8176f/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
index 583f43c..4ac3ca7 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/Map2.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/Map2.java
@@ -189,8 +189,12 @@ public class Map2<K, V> implements Map<K, V> {
       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");
@@ -199,7 +203,8 @@ public class Map2<K, V> implements Map<K, V> {
     if (predicate != null) {
       String msg = predicate.test(v);
       if (msg != null) {
-        throw new RuntimeException("" + key + msg);
+        msg = message != null ? message : key + msg;
+        throw new RuntimeException(msg);
       }
     }
     return wrap((Map) v);