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) {