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