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 2017/01/09 10:26:16 UTC
lucene-solr:apiv2: SOLR-8029: _introspect for per core handlers must
return the full path
Repository: lucene-solr
Updated Branches:
refs/heads/apiv2 d9caa8082 -> 049cb10a2
SOLR-8029: _introspect for per core handlers must return the full path
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/049cb10a
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/049cb10a
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/049cb10a
Branch: refs/heads/apiv2
Commit: 049cb10a21a4fdfa180c1931fdf901c1067f13ab
Parents: d9caa80
Author: Noble Paul <no...@apache.org>
Authored: Mon Jan 9 20:56:05 2017 +1030
Committer: Noble Paul <no...@apache.org>
Committed: Mon Jan 9 20:56:05 2017 +1030
----------------------------------------------------------------------
.../src/java/org/apache/solr/api/ApiBag.java | 26 +++++++++++++++++---
.../java/org/apache/solr/api/V2HttpCall.java | 2 +-
.../java/org/apache/solr/core/PluginBag.java | 2 +-
.../org/apache/solr/handler/BlobHandler.java | 2 +-
.../apache/solr/request/SolrQueryRequest.java | 5 ++++
.../apache/solr/servlet/SolrRequestParsers.java | 5 ++++
.../src/resources/apispec/core.system.blob.json | 20 +++++++++++++++
.../apispec/core.system.blob.upload.json | 12 +++++++++
.../core/src/resources/apispec/system.blob.json | 20 ---------------
.../resources/apispec/system.blob.upload.json | 12 ---------
.../solr/handler/admin/TestCollectionAPIs.java | 2 +-
.../solr/handler/admin/TestConfigsApi.java | 5 +---
.../solr/handler/admin/TestCoreAdminApis.java | 2 +-
13 files changed, 71 insertions(+), 44 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/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 143792e..2cadcf3 100644
--- a/solr/core/src/java/org/apache/solr/api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/api/ApiBag.java
@@ -28,6 +28,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.stream.Collectors;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
@@ -54,10 +56,15 @@ import static org.apache.solr.common.util.ValidatingJsonMap.NOT_NULL;
import static org.apache.solr.common.util.StrUtils.formatString;
public class ApiBag {
+ private final boolean isCoreSpecific;
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private final Map<String, PathTrie<Api>> apis = new ConcurrentHashMap<>();
+ public ApiBag(boolean isCoreSpecific) {
+ this.isCoreSpecific = isCoreSpecific;
+ }
+
public synchronized void register(Api api, Map<String, String> nameSubstitutes) {
try {
validateAndRegister(api, nameSubstitutes);
@@ -74,7 +81,7 @@ public class ApiBag {
private void validateAndRegister(Api api, Map<String, String> nameSubstitutes) {
ValidatingJsonMap spec = api.getSpec();
- Api introspect = new IntrospectApi(api);
+ Api introspect = new IntrospectApi(api, isCoreSpecific);
List<String> methods = spec.getList("methods", ENUM_OF, SUPPORTED_METHODS);
for (String method : methods) {
PathTrie<Api> registry = apis.get(method);
@@ -109,10 +116,12 @@ public class ApiBag {
public static class IntrospectApi extends Api {
Api baseApi;
+ final boolean isCoreSpecific;
- protected IntrospectApi( Api base) {
+ protected IntrospectApi(Api base, boolean isCoreSpecific) {
super(EMPTY_SPEC);
this.baseApi = base;
+ this.isCoreSpecific = isCoreSpecific;
}
public void call(SolrQueryRequest req, SolrQueryResponse rsp) {
@@ -120,7 +129,7 @@ public class ApiBag {
String cmd = req.getParams().get("command");
ValidatingJsonMap result = null;
if (cmd == null) {
- result = baseApi.getSpec();
+ result = isCoreSpecific ? ValidatingJsonMap.getDeepCopy(baseApi.getSpec(), 5, true) : baseApi.getSpec();
} else {
ValidatingJsonMap specCopy = ValidatingJsonMap.getDeepCopy(baseApi.getSpec(), 5, true);
ValidatingJsonMap commands = specCopy.getMap("commands", null);
@@ -130,6 +139,17 @@ public class ApiBag {
}
result = specCopy;
}
+ if (isCoreSpecific) {
+ List<String> pieces = req.getHttpSolrCall() == null ? null : ((V2HttpCall) req.getHttpSolrCall()).pieces;
+ if (pieces != null) {
+ String prefix = "/" + pieces.get(0) + "/" + pieces.get(1);
+ List<String> paths = result.getMap("url", NOT_NULL).getList("paths", NOT_NULL);
+ result.getMap("url", NOT_NULL).put("paths",
+ paths.stream()
+ .map(s -> prefix + s)
+ .collect(Collectors.toList()));
+ }
+ }
List l = (List) rsp.getValues().get("spec");
if (l == null) rsp.getValues().add("spec", l = new ArrayList());
l.add(result);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/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 52f44f6..4cffb3f 100644
--- a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
@@ -63,7 +63,7 @@ import static org.apache.solr.util.PathTrie.getPathSegments;
public class V2HttpCall extends HttpSolrCall {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private Api api;
- private List<String> pieces;
+ List<String> pieces;
private String prefix;
HashMap<String, String> parts = new HashMap<>();
static final Set<String> knownPrefixes = ImmutableSet.of("cluster", "node", "collections", "cores", "c");
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/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 4a380fb..ad8bdec 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginBag.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginBag.java
@@ -74,7 +74,7 @@ public class PluginBag<T> implements AutoCloseable {
* Pass needThreadSafety=true if plugins can be added and removed concurrently with lookups.
*/
public PluginBag(Class<T> klass, SolrCore core, boolean needThreadSafety) {
- this.apiBag = klass == SolrRequestHandler.class ? new ApiBag() : null;
+ this.apiBag = klass == SolrRequestHandler.class ? new ApiBag(core != null) : null;
this.core = core;
this.klass = klass;
// TODO: since reads will dominate writes, we could also think about creating a new instance of a map each time it changes.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
index 69d0608..f5b49ea 100644
--- a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
@@ -287,6 +287,6 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
@Override
public Collection<Api> getApis() {
- return ApiBag.wrapRequestHandlers(this, "system.blob", "system.blob.upload");
+ return ApiBag.wrapRequestHandlers(this, "core.system.blob", "core.system.blob.upload");
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java b/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
index d975be8..a494ec4 100644
--- a/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
+++ b/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
@@ -21,6 +21,7 @@ import org.apache.solr.schema.IndexSchema;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.ContentStream;
import org.apache.solr.core.SolrCore;
+import org.apache.solr.servlet.HttpSolrCall;
import org.apache.solr.util.CommandOperation;
import org.apache.solr.util.RTimerTree;
@@ -117,6 +118,10 @@ public interface SolrQueryRequest extends AutoCloseable {
default String getHttpMethod() {
return (String) getContext().get("httpMethod");
}
+
+ default HttpSolrCall getHttpSolrCall() {
+ return null;
+ }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java b/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
index bf2d814..94a8e7d 100644
--- a/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
@@ -245,6 +245,11 @@ public class SolrRequestParsers
}
return Collections.EMPTY_MAP;
}
+
+ @Override
+ public HttpSolrCall getHttpSolrCall() {
+ return httpSolrCall;
+ }
};
if( streams != null && streams.size() > 0 ) {
q.setContentStreams( streams );
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/solr/core/src/resources/apispec/core.system.blob.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/core.system.blob.json b/solr/core/src/resources/apispec/core.system.blob.json
new file mode 100644
index 0000000..47f0bba
--- /dev/null
+++ b/solr/core/src/resources/apispec/core.system.blob.json
@@ -0,0 +1,20 @@
+{
+ "documentation": "https://cwiki.apache.org/confluence/display/solr/Blob+Store+API",
+ "description": "Lists blobs in the blob store (.system collection). The list can be limited by name or name and version.",
+ "methods": [
+ "GET"
+ ],
+ "url": {
+ "paths": [
+ "/blob",
+ "/blob/{name}",
+ "/blob/{name}/{version}"
+ ],
+ "params": {
+ "wt": {
+ "type":"string",
+ "description": "Use the value 'filestream' to get the file content. Use other response writers (such as xml, or json) to fetch only the metadata."
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/solr/core/src/resources/apispec/core.system.blob.upload.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/core.system.blob.upload.json b/solr/core/src/resources/apispec/core.system.blob.upload.json
new file mode 100644
index 0000000..1b6c6d5
--- /dev/null
+++ b/solr/core/src/resources/apispec/core.system.blob.upload.json
@@ -0,0 +1,12 @@
+{
+ "documentation": "https://cwiki.apache.org/confluence/display/solr/Blob+Store+API",
+ "description": "Uploads a blob to the blob store (.system collection).",
+ "methods": [
+ "POST"
+ ],
+ "url": {
+ "paths": [
+ "/blob/{name}"
+ ]
+ }
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/solr/core/src/resources/apispec/system.blob.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/system.blob.json b/solr/core/src/resources/apispec/system.blob.json
deleted file mode 100644
index e021b4e..0000000
--- a/solr/core/src/resources/apispec/system.blob.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "documentation": "https://cwiki.apache.org/confluence/display/solr/Blob+Store+API",
- "description": "Lists blobs in the blob store (.system collection). The list can be limited by name or name and version.",
- "methods": [
- "GET"
- ],
- "url": {
- "paths": [
- "/blob",
- "/blob/{name}",
- "/blob/{name}/{version}"
- ]
- },
- "params": {
- "wt": {
- "type":"string",
- "description": "Use the value 'filestream' to get the file content. Use other response writers (such as xml, or json) to fetch only the metadata."
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/solr/core/src/resources/apispec/system.blob.upload.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/system.blob.upload.json b/solr/core/src/resources/apispec/system.blob.upload.json
deleted file mode 100644
index 1b6c6d5..0000000
--- a/solr/core/src/resources/apispec/system.blob.upload.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "documentation": "https://cwiki.apache.org/confluence/display/solr/Blob+Store+API",
- "description": "Uploads a blob to the blob store (.system collection).",
- "methods": [
- "POST"
- ],
- "url": {
- "paths": [
- "/blob/{name}"
- ]
- }
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java b/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
index e2ced9c..5e6b34d 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
@@ -56,7 +56,7 @@ public class TestCollectionAPIs extends SolrTestCaseJ4 {
public void testCommands() throws Exception {
MockCollectionsHandler collectionsHandler = new MockCollectionsHandler();
- ApiBag apiBag = new ApiBag();
+ ApiBag apiBag = new ApiBag(false);
Collection<Api> apis = collectionsHandler.getApis();
for (Api api : apis) apiBag.register(api, Collections.EMPTY_MAP);
//test a simple create collection call
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/solr/core/src/test/org/apache/solr/handler/admin/TestConfigsApi.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestConfigsApi.java b/solr/core/src/test/org/apache/solr/handler/admin/TestConfigsApi.java
index 49412ac..d2c96a6 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestConfigsApi.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestConfigsApi.java
@@ -18,14 +18,11 @@
package org.apache.solr.handler.admin;
-import java.util.Collection;
-import java.util.Collections;
import java.util.Map;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.api.Api;
import org.apache.solr.api.ApiBag;
-import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.common.cloud.ZkNodeProps;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.zookeeper.KeeperException;
@@ -51,7 +48,7 @@ public class TestConfigsApi extends SolrTestCaseJ4 {
rsp.add(ZkNodeProps.class.getName(), new ZkNodeProps(result));
}
};
- ApiBag apiBag = new ApiBag();
+ ApiBag apiBag = new ApiBag(false);
for (Api api : handler.getApis()) apiBag.register(api, EMPTY_MAP);
compareOutput(apiBag, "/cluster/configs/sample", DELETE, null, null,
"{name :sample, operation:delete}");
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/049cb10a/solr/core/src/test/org/apache/solr/handler/admin/TestCoreAdminApis.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestCoreAdminApis.java b/solr/core/src/test/org/apache/solr/handler/admin/TestCoreAdminApis.java
index 08db1b3..f263f5e 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestCoreAdminApis.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestCoreAdminApis.java
@@ -43,7 +43,7 @@ public class TestCoreAdminApis extends SolrTestCaseJ4 {
CoreContainer mockCC = getCoreContainerMock(calls, new HashMap<>());
CoreAdminHandler coreAdminHandler = new CoreAdminHandler(mockCC);
- ApiBag apiBag = new ApiBag();
+ ApiBag apiBag = new ApiBag(false);
for (Api api : coreAdminHandler.getApis()) {
apiBag.register(api, Collections.EMPTY_MAP);
}