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/12 13:10:59 UTC
lucene-solr:apiv2: SOLR-8029: improve /_introspect support for urls
with trailing variables such as /blob/{name}
Repository: lucene-solr
Updated Branches:
refs/heads/apiv2 f1bd0f462 -> de325d98c
SOLR-8029: improve /_introspect support for urls with trailing variables such as /blob/{name}
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/de325d98
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/de325d98
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/de325d98
Branch: refs/heads/apiv2
Commit: de325d98cfb86304eed299f9f794786b4bbf24a2
Parents: f1bd0f4
Author: Noble Paul <no...@apache.org>
Authored: Thu Jan 12 15:01:49 2017 +1030
Committer: Noble Paul <no...@apache.org>
Committed: Thu Jan 12 15:01:49 2017 +1030
----------------------------------------------------------------------
.../src/java/org/apache/solr/api/ApiBag.java | 23 ++++++++++++++++++--
.../src/java/org/apache/solr/util/PathTrie.java | 4 ++++
.../solr/handler/admin/TestApiFramework.java | 20 +++++++++++++++++
3 files changed, 45 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de325d98/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 2cadcf3..b7e27f2 100644
--- a/solr/core/src/java/org/apache/solr/api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/api/ApiBag.java
@@ -33,6 +33,7 @@ import java.util.stream.Collectors;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.common.util.Utils;
@@ -109,16 +110,34 @@ public class ApiBag {
verifyCommands(api.getSpec());
for (String path : paths) {
registry.insert(path, nameSubstitutes, api);
- registry.insert(path + INTROSPECT, nameSubstitutes, introspect);
+ registerIntrospect(nameSubstitutes, registry, path, introspect);
}
}
}
+ public static void registerIntrospect(Map<String, String> nameSubstitutes, PathTrie<Api> registry, String path, Api introspect) {
+ List<String> l = PathTrie.getPathSegments(path);
+ registerIntrospect(l, registry, nameSubstitutes, introspect);
+ int lastIdx = l.size() - 1;
+ for (int i = lastIdx; i >= 0; i--) {
+ String itemAt = l.get(i);
+ if (PathTrie.templateName(itemAt) == null) break;
+ l.remove(i);
+ registerIntrospect(l, registry, nameSubstitutes, introspect);
+ }
+ }
+
+ static void registerIntrospect(List<String> l, PathTrie<Api> registry, Map<String, String> substitutes, Api introspect) {
+ ArrayList<String> copy = new ArrayList<>(l);
+ copy.add("_introspect");
+ registry.insert(copy, substitutes, introspect);
+ }
+
public static class IntrospectApi extends Api {
Api baseApi;
final boolean isCoreSpecific;
- protected IntrospectApi(Api base, boolean isCoreSpecific) {
+ public IntrospectApi(Api base, boolean isCoreSpecific) {
super(EMPTY_SPEC);
this.baseApi = base;
this.isCoreSpecific = isCoreSpecific;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de325d98/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 80a613f..d0db660 100644
--- a/solr/core/src/java/org/apache/solr/util/PathTrie.java
+++ b/solr/core/src/java/org/apache/solr/util/PathTrie.java
@@ -42,6 +42,10 @@ public class PathTrie<T> {
public void insert(String path, Map<String, String> replacements, T o) {
List<String> parts = getPathSegments(path);
+ insert(parts,replacements, o);
+ }
+
+ public void insert(List<String> parts, Map<String, String> replacements, T o) {
if (parts.isEmpty()) {
root.obj = o;
return;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de325d98/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 124581c..f285b90 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
@@ -23,6 +23,7 @@ import java.util.List;
import java.util.Map;
import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.api.ApiBag;
import org.apache.solr.api.V2HttpCall.CompositeApi;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.common.params.MapSolrParams;
@@ -35,12 +36,15 @@ import org.apache.solr.handler.PingRequestHandler;
import org.apache.solr.handler.SchemaHandler;
import org.apache.solr.handler.SolrConfigHandler;
import org.apache.solr.request.LocalSolrQueryRequest;
+import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.api.Api;
import org.apache.solr.api.V2HttpCall;
import org.apache.solr.util.CommandOperation;
+import org.apache.solr.util.PathTrie;
+import static org.apache.solr.api.ApiBag.EMPTY_SPEC;
import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
import static org.apache.solr.common.params.CommonParams.COLLECTIONS_HANDLER_PATH;
import static org.apache.solr.common.params.CommonParams.CONFIGSETS_HANDLER_PATH;
@@ -138,7 +142,23 @@ public class TestApiFramework extends SolrTestCaseJ4 {
));
}
+ public void testTrailingTemplatePaths(){
+ PathTrie<Api> registry = new PathTrie<>();
+ Api api = new Api(EMPTY_SPEC) {
+ @Override
+ public void call(SolrQueryRequest req, SolrQueryResponse rsp) {
+ }
+ };
+ Api intropsect = new ApiBag.IntrospectApi(api,false);
+ ApiBag.registerIntrospect(Collections.emptyMap(),registry,"/c/.system/blob/{name}",intropsect);
+ ApiBag.registerIntrospect(Collections.emptyMap(), registry, "/c/.system/{x}/{name}", intropsect);
+ assertEquals(intropsect, registry.lookup("/c/.system/blob/random_string/_introspect", new HashMap<>()));
+ assertEquals(intropsect, registry.lookup("/c/.system/blob/_introspect", new HashMap<>()));
+ assertEquals(intropsect, registry.lookup("/c/.system/_introspect", new HashMap<>()));
+ assertEquals(intropsect, registry.lookup("/c/.system/v1/_introspect", new HashMap<>()));
+ assertEquals(intropsect, registry.lookup("/c/.system/v1/v2/_introspect", new HashMap<>()));
+ }
private SolrQueryResponse invoke(PluginBag<SolrRequestHandler> reqHandlers, String path,
String fullPath, SolrRequest.METHOD method,
CoreContainer mockCC) {