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/09 11:54:20 UTC

[2/2] lucene-solr:apiv2: SOLR-8029: general refactoring

SOLR-8029: general refactoring


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

Branch: refs/heads/apiv2
Commit: cf1bbc3d74fd11f81e6fa51c5c5f205fdc4e2c21
Parents: 66f0913
Author: Noble Paul <no...@apache.org>
Authored: Fri Sep 9 17:23:50 2016 +0530
Committer: Noble Paul <no...@apache.org>
Committed: Fri Sep 9 17:23:50 2016 +0530

----------------------------------------------------------------------
 .../src/java/org/apache/solr/api/ApiBag.java    |  4 +--
 .../java/org/apache/solr/api/ApiHandler.java    | 26 ++++++++++++++++
 .../java/org/apache/solr/api/V2HttpCall.java    |  4 +--
 .../apache/solr/handler/ReplicationHandler.java |  3 --
 .../apache/solr/handler/admin/ApiCommand.java   |  5 ++++
 .../handler/admin/BaseHandlerApiSupport.java    | 12 ++++++--
 .../handler/admin/CollectionHandlerApi.java     | 25 +++++++++-------
 .../handler/admin/ConfigSetsHandlerApi.java     | 19 +++++-------
 .../solr/handler/admin/CoreAdminHandlerApi.java | 21 +++++++------
 .../src/java/org/apache/solr/util/PathTrie.java | 31 ++++++++++----------
 .../src/resources/apispec/cluster.nodes.json    | 11 +++++++
 .../src/resources/apispec/core.RealtimeGet.json |  8 +++--
 .../apispec/core.SchemaEdit.addField.json       |  6 ----
 .../core/src/resources/apispec/core.Update.json |  1 +
 14 files changed, 109 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/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 17582cf..8077485 100644
--- a/solr/core/src/java/org/apache/solr/api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/api/ApiBag.java
@@ -183,9 +183,9 @@ public class ApiBag {
   private Set<String> getWildCardNames(List<String> paths) {
     Set<String> wildCardNames = new HashSet<>();
     for (String path : paths) {
-      List<String> p = PathTrie.getTemplateVariables(path);
+      List<String> p = PathTrie.getPathSegments(path);
       for (String s : p) {
-        String wildCard = PathTrie.wildCardName(s);
+        String wildCard = PathTrie.templateName(s);
         if (wildCard != null) wildCardNames.add(wildCard);
       }
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/solr/core/src/java/org/apache/solr/api/ApiHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/ApiHandler.java b/solr/core/src/java/org/apache/solr/api/ApiHandler.java
new file mode 100644
index 0000000..a988d30
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/api/ApiHandler.java
@@ -0,0 +1,26 @@
+/*
+ * 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.api;
+
+
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.SolrQueryResponse;
+
+interface ApiHandler {
+  void handle(SolrQueryRequest req, SolrQueryResponse rsp);
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/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 91f2f66..98dff29 100644
--- a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
@@ -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.getTemplateVariables;
+import static org.apache.solr.util.PathTrie.getPathSegments;
 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 = getTemplateVariables(path);
+      pieces = getPathSegments(path);
       if (pieces.size() == 0) {
         prefix = "c";
         path = "/c";

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
index c511310..84e1ba2 100644
--- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
@@ -1664,9 +1664,6 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
     }
   }
 
-
-  private static final String LOCATION = "location";
-
   private static final String SUCCESS = "success";
 
   private static final String FAILED = "failed";

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/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 cd9d4b3..5a85c14 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
@@ -20,11 +20,14 @@ package org.apache.solr.handler.admin;
 import java.util.Collection;
 
 import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.util.CommandOperation;
 
 public interface ApiCommand {
   String getName();
 
+  // the method supported by this command
   SolrRequest.METHOD getHttpMethod();
 
   V2EndPoint getEndPoint();
@@ -37,4 +40,6 @@ public interface ApiCommand {
   default String getParamSubstitute(String name) {
     return name;
   }
+
+  void invoke(SolrQueryRequest req, SolrQueryResponse rsp, BaseHandlerApiSupport apiHandler) throws Exception;
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/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 9bb3044..198d788 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
@@ -65,6 +65,7 @@ public abstract class BaseHandlerApiSupport implements ApiSupport {
 
 
   private Api getApi(final V2EndPoint op) {
+    final BaseHandlerApiSupport apiHandler = this;
     return new Api(ApiBag.getSpec(op.getSpecName())) {
       @Override
       public void call(SolrQueryRequest req, SolrQueryResponse rsp) {
@@ -90,7 +91,8 @@ public abstract class BaseHandlerApiSupport implements ApiSupport {
               throw new SolrException(BAD_REQUEST, " no such command " + c);
             }
             wrapParams(req, c, command, false);
-            invokeCommand(req, rsp,command, c);
+            command.invoke(req,rsp, apiHandler);
+//            invokeCommand(req, rsp, command, c);
 
           } else {
             if (commands == null || commands.isEmpty()) {
@@ -106,7 +108,8 @@ public abstract class BaseHandlerApiSupport implements ApiSupport {
               }
             }
             wrapParams(req, new CommandOperation("", Collections.EMPTY_MAP), commands.get(0), true);
-            invokeUrl(commands.get(0), req, rsp);
+            commands.get(0).invoke(req,rsp, apiHandler);
+//            invokeUrl(commands.get(0), req, rsp);
           }
 
         } catch (SolrException e) {
@@ -195,10 +198,13 @@ public abstract class BaseHandlerApiSupport implements ApiSupport {
       }
     }
   }
+/*
 
-  protected abstract void invokeCommand(SolrQueryRequest  req, SolrQueryResponse rsp, ApiCommand command, CommandOperation c) throws Exception;
+  protected abstract void invokeCommand(SolrQueryRequest  req, SolrQueryResponse rsp, ApiCommand command, CommandOperation c)
+      throws Exception;
 
   protected abstract void invokeUrl(ApiCommand command, SolrQueryRequest req, SolrQueryResponse rsp) throws Exception;
+*/
 
   protected abstract List<ApiCommand> getCommands();
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/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 249794c..df35a99 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
@@ -52,16 +52,6 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
   }
 
   @Override
-  protected void invokeCommand(SolrQueryRequest req, SolrQueryResponse rsp, ApiCommand command, CommandOperation c) throws Exception {
-    handler.invokeAction(req, rsp, handler.coreContainer, ((Cmd) command).target.action, ((Cmd) command).target);
-  }
-
-  @Override
-  protected void invokeUrl(ApiCommand command, SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
-    handler.invokeAction(req, rsp, handler.coreContainer, ((Cmd) command).target.action, ((Cmd) command).target);
-  }
-
-  @Override
   protected List<V2EndPoint> getEndPoints() {
     return Arrays.asList(EndPoint.values());
   }
@@ -188,7 +178,14 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
         RESTORE_OP,
         "restore-collection",
         null
-        )
+    ),
+    GET_NODES(EndPoint.CLUSTER_NODES, GET, null) {
+      @Override
+      public void invoke(SolrQueryRequest req, SolrQueryResponse rsp, BaseHandlerApiSupport apiHandler) throws Exception {
+        rsp.add("nodes", ((CollectionHandlerApi) apiHandler).handler.coreContainer.getZkController().getClusterState().getLiveNodes());
+        ;
+      }
+    }
     ;
     public final String commandName;
     public final EndPoint endPoint;
@@ -270,11 +267,17 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
       return s;
     }
 
+    public void invoke(SolrQueryRequest req, SolrQueryResponse rsp, BaseHandlerApiSupport apiHandler)
+        throws Exception {
+      ((CollectionHandlerApi) apiHandler).handler.invokeAction(req, rsp, ((CollectionHandlerApi) apiHandler).handler.coreContainer, target.action, target);
+    }
+
   }
 
   enum EndPoint implements V2EndPoint {
     CLUSTER("cluster"),
     CLUSTER_CMD("cluster.Commands"),
+    CLUSTER_NODES("cluster.nodes"),
     CLUSTER_CMD_STATUS("cluster.commandstatus"),
     COLLECTIONS_COMMANDS("collections.Commands"),
     COLLECTIONS("collections"),

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandlerApi.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandlerApi.java b/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandlerApi.java
index 546040f..83e5bd4 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandlerApi.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandlerApi.java
@@ -41,17 +41,6 @@ public class ConfigSetsHandlerApi extends BaseHandlerApiSupport {
     this.configSetHandler = configSetHandler;
   }
 
-  @Override
-  protected void invokeCommand(SolrQueryRequest req, SolrQueryResponse rsp, ApiCommand command, CommandOperation c)
-      throws Exception {
-    ((Cmd) command).op.call(req, rsp, this.configSetHandler);
-
-  }
-
-  @Override
-  protected void invokeUrl(ApiCommand command, SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
-    ((Cmd)command).op.call(req, rsp,configSetHandler);
-  }
 
   @Override
   protected List<ApiCommand> getCommands() {
@@ -98,6 +87,14 @@ public class ConfigSetsHandlerApi extends BaseHandlerApiSupport {
     public V2EndPoint getEndPoint() {
       return endPoint;
     }
+
+    @Override
+    public void invoke(SolrQueryRequest req, SolrQueryResponse rsp, BaseHandlerApiSupport apiHandler) throws Exception {
+          op.call(req, rsp,
+              ((ConfigSetsHandlerApi)apiHandler).configSetHandler);
+
+    }
+
   }
   enum EndPoint implements V2EndPoint {
     LIST_CONFIG("cluster.config"),

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandlerApi.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandlerApi.java b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandlerApi.java
index a8fb159..577954c 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandlerApi.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandlerApi.java
@@ -109,6 +109,16 @@ public class CoreAdminHandlerApi extends BaseHandlerApiSupport {
     public String getParamSubstitute(String param) {
       return paramstoAttr.containsKey(param) ? paramstoAttr.get(param) : param;
     }
+
+    @Override
+    public void invoke(SolrQueryRequest req, SolrQueryResponse rsp, BaseHandlerApiSupport apiHandler) throws Exception {
+      target.execute(new CoreAdminHandler.CallInfo(((CoreAdminHandlerApi) apiHandler).handler,
+          req,
+          rsp,
+          target));
+
+    }
+
   }
 
 
@@ -135,17 +145,6 @@ public class CoreAdminHandlerApi extends BaseHandlerApiSupport {
 
 
   @Override
-  protected void invokeCommand(SolrQueryRequest req, SolrQueryResponse rsp, ApiCommand command,
-                               CommandOperation c) throws Exception {
-    ((Cmd) command).target.execute(new CoreAdminHandler.CallInfo(handler, req, rsp, ((Cmd) command).target));
-  }
-
-  @Override
-  protected void invokeUrl(ApiCommand command, SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
-    ((Cmd) command).target.execute(new CoreAdminHandler.CallInfo(handler, req, rsp, ((Cmd) command).target));
-  }
-
-  @Override
   protected List<ApiCommand> getCommands() {
     return Arrays.asList(Cmd.values());
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/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 655bb8b..3326737 100644
--- a/solr/core/src/java/org/apache/solr/util/PathTrie.java
+++ b/solr/core/src/java/org/apache/solr/util/PathTrie.java
@@ -41,7 +41,7 @@ public class PathTrie<T> {
 
 
   public void insert(String path, Map<String, String> replacements, T o) {
-    List<String> parts = getTemplateVariables(path);
+    List<String> parts = getPathSegments(path);
     if (parts.isEmpty()) {
       root.obj = o;
       return;
@@ -62,7 +62,8 @@ public class PathTrie<T> {
     root.insert(parts, o);
   }
 
-  public static List<String> getTemplateVariables(String path) {
+  // /a/b/c will be returned as ["a","b","c"]
+  public static List<String> getPathSegments(String path) {
     if (path == null || path.isEmpty()) return emptyList();
     List<String> parts = new ArrayList<String>() {
       @Override
@@ -76,17 +77,17 @@ public class PathTrie<T> {
   }
 
 
-  public T lookup(String uri, Map<String, String> parts) {
-    return root.lookup(getTemplateVariables(uri), 0, parts);
+  public T lookup(String uri, Map<String, String> templateValues) {
+    return root.lookup(getPathSegments(uri), 0, templateValues);
   }
 
-  public T lookup(String path, Map<String, String> parts, Set<String> paths) {
-    return root.lookup(getTemplateVariables(path), 0, parts, paths);
+  public T lookup(String path, Map<String, String> templateValues, Set<String> paths) {
+    return root.lookup(getPathSegments(path), 0, templateValues, paths);
   }
 
-  public static String wildCardName(String part) {
-    return part.startsWith("{") && part.endsWith("}") ?
-        part.substring(1, part.length() - 1) :
+  public static String templateName(String templateStr) {
+    return templateStr.startsWith("{") && templateStr.endsWith("}") ?
+        templateStr.substring(1, templateStr.length() - 1) :
         null;
 
   }
@@ -95,7 +96,7 @@ public class PathTrie<T> {
     String name;
     Map<String, Node> children;
     T obj;
-    String varName;
+    String templateName;
 
     Node(List<String> path, T o) {
       if (path.isEmpty()) {
@@ -103,7 +104,7 @@ public class PathTrie<T> {
         return;
       }
       String part = path.get(0);
-      varName = wildCardName(part);
+      templateName = templateName(part);
       name = part;
       if (path.isEmpty()) obj = o;
     }
@@ -114,7 +115,7 @@ public class PathTrie<T> {
       Node matchedChild = null;
       if (children == null) children = new ConcurrentHashMap<>();
 
-      String varName = wildCardName(part);
+      String varName = templateName(part);
       String key = varName == null ? part : "";
 
       matchedChild = children.get(key);
@@ -122,8 +123,8 @@ public class PathTrie<T> {
         children.put(key, matchedChild = new Node(path, o));
       }
       if (varName != null) {
-        if (!matchedChild.varName.equals(varName)) {
-          throw new RuntimeException("wildcard name must be " + matchedChild.varName);
+        if (!matchedChild.templateName.equals(varName)) {
+          throw new RuntimeException("wildcard name must be " + matchedChild.templateName);
         }
       }
       path.remove(0);
@@ -166,7 +167,7 @@ public class PathTrie<T> {
      * @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 (templateName != null) templateVariables.put(templateName, pieces.get(index - 1));
       if (pieces.size() < index + 1) {
         findAvailableChildren("", availableSubPaths);
         return obj;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/solr/core/src/resources/apispec/cluster.nodes.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cluster.nodes.json b/solr/core/src/resources/apispec/cluster.nodes.json
new file mode 100644
index 0000000..310577e
--- /dev/null
+++ b/solr/core/src/resources/apispec/cluster.nodes.json
@@ -0,0 +1,11 @@
+{
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Config+API",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/cluster/nodes"
+    ]
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/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 a1f7dfd..af7fd66 100644
--- a/solr/core/src/resources/apispec/core.RealtimeGet.json
+++ b/solr/core/src/resources/apispec/core.RealtimeGet.json
@@ -5,9 +5,7 @@
   ],
   "url": {
     "paths": [
-      "/get",
-      "/get/versions",
-      "/get/updates"
+      "/get"
     ],
     "params": {
       "id": {
@@ -17,6 +15,10 @@
       "ids": {
         "type": "string",
         "description": "one or more ids. Separate by commas if there are more than one"
+      },
+      "fq":{
+        "type": "string",
+        "description": "Filter query"
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/solr/core/src/resources/apispec/core.SchemaEdit.addField.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/core.SchemaEdit.addField.json b/solr/core/src/resources/apispec/core.SchemaEdit.addField.json
index 13e5646..798b81b 100644
--- a/solr/core/src/resources/apispec/core.SchemaEdit.addField.json
+++ b/solr/core/src/resources/apispec/core.SchemaEdit.addField.json
@@ -14,15 +14,9 @@
     "indexed": {
       "type": "boolean"
     },
-    "tokenized": {
-      "type": "boolean"
-    },
     "stored": {
       "type": "boolean"
     },
-    "binary": {
-      "type": "boolean"
-    },
     "omitNorms": {
       "type": "boolean"
     },

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cf1bbc3d/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 2d521df..f9e80c1 100644
--- a/solr/core/src/resources/apispec/core.Update.json
+++ b/solr/core/src/resources/apispec/core.Update.json
@@ -9,6 +9,7 @@
       "/update/xml",
       "/update/csv",
       "/update/json",
+      "/update/bin",
       "/update/json/commands"
     ]