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/02/01 18:04:38 UTC

lucene-solr git commit: SOLR-8029 added support and test for /update paths. All RequestHandlers now won't be automatically register

Repository: lucene-solr
Updated Branches:
  refs/heads/apiv2 00d985b8e -> b7e51075a


SOLR-8029 added support and test for /update paths. All RequestHandlers now won't be automatically register


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

Branch: refs/heads/apiv2
Commit: b7e51075a02343caa806990a8a5414f2683be615
Parents: 00d985b
Author: Noble Paul <no...@apache.org>
Authored: Mon Feb 1 22:34:18 2016 +0530
Committer: Noble Paul <no...@apache.org>
Committed: Mon Feb 1 22:34:18 2016 +0530

----------------------------------------------------------------------
 .../org/apache/solr/core/ImplicitPlugins.java   |  4 ++
 .../java/org/apache/solr/core/PluginBag.java    | 19 ++++--
 .../apache/solr/handler/CdcrRequestHandler.java |  4 ++
 .../apache/solr/handler/ReplicationHandler.java |  5 ++
 .../solr/handler/UpdateRequestHandler.java      |  7 ++
 .../solr/handler/V2UpdateRequestHandler.java    | 69 ++++++++++++++++++++
 .../handler/admin/ZookeeperInfoHandler.java     |  5 ++
 .../src/java/org/apache/solr/v2api/ApiBag.java  |  2 +-
 .../java/org/apache/solr/v2api/PathTrie.java    |  6 +-
 .../org/apache/solr/v2api/V2ApiSupport.java     |  5 ++
 .../java/org/apache/solr/v2api/V2HttpCall.java  |  1 +
 .../resources/v2apispec/core.RealtimeGet.json   |  3 +-
 .../src/resources/v2apispec/core.Update.json    | 19 ++++++
 .../conf/solrconfig.xml                         |  3 +-
 .../solrj/embedded/SolrExampleJettyTest.java    |  9 ++-
 15 files changed, 148 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/java/org/apache/solr/core/ImplicitPlugins.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/ImplicitPlugins.java b/solr/core/src/java/org/apache/solr/core/ImplicitPlugins.java
index 984840d..627e5d1 100644
--- a/solr/core/src/java/org/apache/solr/core/ImplicitPlugins.java
+++ b/solr/core/src/java/org/apache/solr/core/ImplicitPlugins.java
@@ -34,6 +34,7 @@ import org.apache.solr.handler.SchemaHandler;
 import org.apache.solr.handler.SolrConfigHandler;
 import org.apache.solr.handler.StreamHandler;
 import org.apache.solr.handler.UpdateRequestHandler;
+import org.apache.solr.handler.V2UpdateRequestHandler;
 import org.apache.solr.handler.admin.LoggingHandler;
 import org.apache.solr.handler.admin.LukeRequestHandler;
 import org.apache.solr.handler.admin.PluginInfoHandler;
@@ -66,6 +67,9 @@ public class ImplicitPlugins {
     implicits.add(createPluginInfoWithDefaults(UpdateRequestHandler.CSV_PATH, UpdateRequestHandler.class, singletonMap("update.contentType", "application/csv")));
     implicits.add(createPluginInfoWithDefaults(UpdateRequestHandler.DOC_PATH, UpdateRequestHandler.class, makeMap("update.contentType", "application/json", "json.command", "false")));
 
+    Map attrs = Utils.makeMap("legacy", "false", NAME, "/update/v2", "class", V2UpdateRequestHandler.class.getName());
+    implicits.add(new PluginInfo(SolrRequestHandler.TYPE, attrs, new NamedList(), null));
+
     //solrconfighandler
     PluginInfo config = createPluginInfoWithDefaults("/config", SolrConfigHandler.class, null);
     if (solrCore.getConfigSetProperties() != null) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/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 ab5943b..4e45a39 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginBag.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginBag.java
@@ -35,8 +35,6 @@ import org.apache.lucene.analysis.util.ResourceLoader;
 import org.apache.lucene.analysis.util.ResourceLoaderAware;
 import org.apache.solr.cloud.CloudUtil;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.Lookup;
-import org.apache.solr.common.util.Map2;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.handler.component.SearchComponent;
@@ -186,6 +184,7 @@ public class PluginBag<T> implements AutoCloseable {
 
 
   PluginHolder<T> put(String name, PluginHolder<T> plugin) {
+
     PluginHolder<T> old = registry.put(name, plugin);
     if (plugin.pluginInfo != null && plugin.pluginInfo.isDefault()) {
       setDefault(name);
@@ -194,11 +193,13 @@ public class PluginBag<T> implements AutoCloseable {
     if (apiBag != null) {
       if (plugin.isLoaded()) {
         T inst = plugin.get();
-        Collection<V2Api> apis = ((V2ApiSupport) inst).getApis(apiBag.getSpecLookup());
-        if (apis != null) {
-          Map<String, String> nameSubstitutes = singletonMap(HANDLER_NAME, name);
-          for (V2Api api : apis) {
-            apiBag.register(api, nameSubstitutes);
+        if (inst instanceof V2ApiSupport && ((V2ApiSupport) inst).registerAutomatically()) {
+          Collection<V2Api> apis = ((V2ApiSupport) inst).getApis(apiBag.getSpecLookup());
+          if (apis != null) {
+            Map<String, String> nameSubstitutes = singletonMap(HANDLER_NAME, name);
+            for (V2Api api : apis) {
+              apiBag.register(api, nameSubstitutes);
+            }
           }
         }
       } else {
@@ -315,6 +316,10 @@ public class PluginBag<T> implements AutoCloseable {
       return inst != null;
     }
 
+    public boolean isV2Only() {
+      return pluginInfo != null || "false".equals(String.valueOf(pluginInfo.attributes.get("legacy")));
+    }
+
     @Override
     public void close() throws Exception {
       // TODO: there may be a race here.  One thread can be creating a plugin

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/java/org/apache/solr/handler/CdcrRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/CdcrRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/CdcrRequestHandler.java
index a9fef59..33cd95b 100644
--- a/solr/core/src/java/org/apache/solr/handler/CdcrRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/CdcrRequestHandler.java
@@ -613,5 +613,9 @@ public class CdcrRequestHandler extends RequestHandlerBase implements SolrCoreAw
 
   }
 
+  @Override
+  public boolean registerAutomatically() {
+    return false;
+  }
 }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/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 c9bd750..2564bc0 100644
--- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
@@ -1603,6 +1603,11 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
     }
   }
 
+  @Override
+  public boolean registerAutomatically() {
+    return false;
+  }
+
   private static final String LOCATION = "location";
 
   private static final String SUCCESS = "success";

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
index ed3090d..c6c4a87 100644
--- a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
@@ -148,6 +148,7 @@ public class UpdateRequestHandler extends ContentStreamHandlerBase {
     pathVsLoaders.put(JSON_PATH,registry.get("application/json"));
     pathVsLoaders.put(DOC_PATH,registry.get("application/json"));
     pathVsLoaders.put(CSV_PATH,registry.get("application/csv"));
+    pathVsLoaders.put(BIN_PATH,registry.get("application/csv"));
     return registry;
   }
 
@@ -157,6 +158,11 @@ public class UpdateRequestHandler extends ContentStreamHandlerBase {
     return instance;
   }
 
+  @Override
+  public boolean registerAutomatically() {
+    return false;
+  }
+
   //////////////////////// SolrInfoMBeans methods //////////////////////
 
   @Override
@@ -167,6 +173,7 @@ public class UpdateRequestHandler extends ContentStreamHandlerBase {
   public static final String DOC_PATH = "/update/json/docs";
   public static final String JSON_PATH = "/update/json";
   public static final String CSV_PATH = "/update/csv";
+  public static final String BIN_PATH = "/update/bin";
 
 }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/java/org/apache/solr/handler/V2UpdateRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/V2UpdateRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/V2UpdateRequestHandler.java
new file mode 100644
index 0000000..6f603c8
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/handler/V2UpdateRequestHandler.java
@@ -0,0 +1,69 @@
+package org.apache.solr.handler;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.util.Lookup;
+import org.apache.solr.common.util.Map2;
+import org.apache.solr.v2api.V2Api;
+import org.apache.solr.v2api.V2RequestContext;
+
+
+public class V2UpdateRequestHandler extends UpdateRequestHandler  {
+
+
+  @Override
+  public boolean registerAutomatically() {
+    return true;
+  }
+
+  @Override
+  public Collection<V2Api> getApis(Lookup<String, Map2> specLookup) {
+    return Collections.singleton(getApiImpl(specLookup));
+  }
+
+  private V2Api getApiImpl(Lookup<String, Map2> specLookup) {
+    return new V2Api(specLookup.get("core.Update")) {
+      @Override
+      public void call(V2RequestContext ctx) {
+        String path = ctx.getPath();
+        String target =  mapping.get(path);
+        if(target != null) ctx.getSolrRequest().getContext().put("path", target);
+        try {
+          handleRequest(ctx.getSolrRequest(),ctx.getResponse());
+        } catch (RuntimeException e) {
+          throw e;
+        } catch (Exception e){
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,e );
+        }
+      }
+    };
+  }
+
+  private static final Map<String, String> mapping = ImmutableMap.<String,String>builder()
+      .put("/update", DOC_PATH)
+      .put(JSON_PATH, DOC_PATH)
+      .put("/update/json/commands", JSON_PATH)
+      .build();
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java
index aa5bde6..9dad9b1 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java
@@ -846,4 +846,9 @@ public final class ZookeeperInfoHandler extends RequestHandlerBase {
       return null;
     }
   }
+
+  @Override
+  public boolean registerAutomatically() {
+    return false;
+  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/java/org/apache/solr/v2api/ApiBag.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/v2api/ApiBag.java b/solr/core/src/java/org/apache/solr/v2api/ApiBag.java
index 467864d..f33091d 100644
--- a/solr/core/src/java/org/apache/solr/v2api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/v2api/ApiBag.java
@@ -119,7 +119,7 @@ public class ApiBag {
           if (!wildCardNames.contains(o.toString()))
             throw new RuntimeException("" + o + " is not a valid part name");
           Map2 pathMeta = parts.getMap(o.toString(), NOT_NULL);
-          pathMeta.get("type", ENUM_OF, ImmutableSet.of("enum", "string", "int", "number"));
+          pathMeta.get("type", ENUM_OF, ImmutableSet.of("enum", "string", "int", "number", "boolean"));
         }
       }
       verifyCommands(api.getSpec(getSpecLookup()));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/java/org/apache/solr/v2api/PathTrie.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/v2api/PathTrie.java b/solr/core/src/java/org/apache/solr/v2api/PathTrie.java
index 5a2820a..5740ae5 100644
--- a/solr/core/src/java/org/apache/solr/v2api/PathTrie.java
+++ b/solr/core/src/java/org/apache/solr/v2api/PathTrie.java
@@ -57,7 +57,11 @@ public class PathTrie<T> {
   public static List<String> getParts(String path) {
     if (path == null || path.isEmpty()) return emptyList();
     List<String> parts = StrUtils.splitSmart(path, '/');
-    if ("".equals(parts.get(0))) parts.remove(0);
+    while(true) {
+      if(parts.isEmpty()) break;
+      if ("".equals(parts.get(0))) parts.remove(0);
+      else break;
+    }
     return parts;
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/java/org/apache/solr/v2api/V2ApiSupport.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/v2api/V2ApiSupport.java b/solr/core/src/java/org/apache/solr/v2api/V2ApiSupport.java
index c3ca910..6210f1a 100644
--- a/solr/core/src/java/org/apache/solr/v2api/V2ApiSupport.java
+++ b/solr/core/src/java/org/apache/solr/v2api/V2ApiSupport.java
@@ -25,4 +25,9 @@ import org.apache.solr.common.util.Map2;
 public interface V2ApiSupport {
 
   Collection<V2Api> getApis(Lookup<String, Map2> specLookup);
+
+
+  default boolean registerAutomatically() {
+    return true;
+  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/java/org/apache/solr/v2api/V2HttpCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/v2api/V2HttpCall.java b/solr/core/src/java/org/apache/solr/v2api/V2HttpCall.java
index 30da9d5..25f5e2b 100644
--- a/solr/core/src/java/org/apache/solr/v2api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/v2api/V2HttpCall.java
@@ -269,6 +269,7 @@ public class V2HttpCall extends HttpSolrCall {
     try {
       api.call(getV2RequestCtx(rsp));
     } catch (RuntimeException e) {
+      //todo remove for debugging only
       log.error("error execute()", e);
       throw e;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/resources/v2apispec/core.RealtimeGet.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/v2apispec/core.RealtimeGet.json b/solr/core/src/resources/v2apispec/core.RealtimeGet.json
index 9002fce..20a1cfe 100644
--- a/solr/core/src/resources/v2apispec/core.RealtimeGet.json
+++ b/solr/core/src/resources/v2apispec/core.RealtimeGet.json
@@ -18,7 +18,6 @@
           "description" :"one or more ids. Separate by commas if there are more than one"
         }
       }
-    },
-    "body": null
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/core/src/resources/v2apispec/core.Update.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/v2apispec/core.Update.json b/solr/core/src/resources/v2apispec/core.Update.json
new file mode 100644
index 0000000..cf2c2ce
--- /dev/null
+++ b/solr/core/src/resources/v2apispec/core.Update.json
@@ -0,0 +1,19 @@
+{
+  "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"
+      ]
+
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
----------------------------------------------------------------------
diff --git a/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml b/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
index 4eab458..9583398 100644
--- a/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
+++ b/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
@@ -964,7 +964,8 @@
     </lst>
   </initParams>
 
-  <initParams path="/update/json/docs">
+  <!--TODO need to clean this up -->
+  <initParams path="/update/json/docs,/update/v2,/update">
     <lst name="defaults">
       <!--this ensures that the entire json doc will be stored verbatim into one field-->
       <str name="srcField">_src_</str>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b7e51075/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
index 3256425..9afd1ec 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
@@ -73,7 +73,7 @@ public class SolrExampleJettyTest extends SolrExampleTests {
     // two docs, one with uniqueKey, another without it
     String json = "{\"id\":\"abc1\", \"name\": \"name1\"} {\"name\" : \"name2\"}";
     HttpClient httpClient = client.getHttpClient();
-    HttpPost post = new HttpPost(client.getBaseURL() + "/update/json/docs");
+    HttpPost post = new HttpPost(getUri(client));
     post.setHeader("Content-Type", "application/json");
     post.setEntity(new InputStreamEntity(new ByteArrayInputStream(json.getBytes("UTF-8")), -1));
     HttpResponse response = httpClient.execute(post);
@@ -94,4 +94,11 @@ public class SolrExampleJettyTest extends SolrExampleTests {
     assertEquals("name2",m.get("name"));
 
   }
+
+  private String getUri(HttpSolrClient client) {
+    String baseURL = client.getBaseURL();
+    return random().nextBoolean() ?
+        baseURL.replace("/collection1", "/v2/cores/collection1/update") :
+        baseURL + "/update/json/docs";
+  }
 }