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 2014/10/04 20:18:56 UTC

svn commit: r1629437 - in /lucene/dev/branches/branch_5x: ./ solr/ solr/core/ solr/core/src/java/org/apache/solr/core/ solr/core/src/java/org/apache/solr/handler/ solr/core/src/java/org/apache/solr/request/ solr/core/src/java/org/apache/solr/servlet/ s...

Author: noble
Date: Sat Oct  4 18:18:55 2014
New Revision: 1629437

URL: http://svn.apache.org/r1629437
Log:
SOLR-6585

Added:
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/NestedRequestHandler.java   (props changed)
      - copied unchanged from r1629433, lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/NestedRequestHandler.java
Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/solr/   (props changed)
    lucene/dev/branches/branch_5x/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_5x/solr/core/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/SolrRequestHandler.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
    lucene/dev/branches/branch_5x/solr/core/src/test-files/solr/collection1/conf/solrconfig-paramset.xml
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestInitParams.java

Modified: lucene/dev/branches/branch_5x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/CHANGES.txt?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/solr/CHANGES.txt Sat Oct  4 18:18:55 2014
@@ -383,6 +383,8 @@ New Features
 * SOLR-6233: Provide basic command line tools for checking Solr status and health.
   (Timothy Potter)
 
+* SOLR-6585: RequestHandlers can optionaly handle sub paths as well (Noble Paul)
+
 Bug Fixes
 ----------------------
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java Sat Oct  4 18:18:55 2014
@@ -22,6 +22,8 @@ import static com.google.common.base.Pre
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -35,11 +37,13 @@ import org.apache.solr.cloud.ZkControlle
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.util.ExecutorUtil;
+import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.handler.admin.CollectionsHandler;
 import org.apache.solr.handler.admin.CoreAdminHandler;
 import org.apache.solr.handler.admin.InfoHandler;
 import org.apache.solr.handler.component.ShardHandlerFactory;
 import org.apache.solr.logging.LogWatcher;
+import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.update.UpdateShardHandler;
 import org.apache.solr.util.DefaultSolrThreadFactory;
 import org.apache.solr.util.FileUtils;
@@ -99,6 +103,17 @@ public class CoreContainer {
   
   private String hostName;
   
+  private Map<String ,SolrRequestHandler> containerHandlers = new HashMap<>();
+
+  public SolrRequestHandler getRequestHandler(String path) {
+    return RequestHandlerBase.getRequestHandler(path, containerHandlers);
+  }
+
+  public Map<String, SolrRequestHandler> getRequestHandlers(){
+    return this.containerHandlers;
+
+  }
+
  // private ClientConnectionManager clientConnectionManager = new PoolingClientConnectionManager();
 
   {
@@ -222,8 +237,11 @@ public class CoreContainer {
     zkSys.initZooKeeper(this, solrHome, cfg);
 
     collectionsHandler = createHandler(cfg.getCollectionsHandlerClass(), CollectionsHandler.class);
+    containerHandlers.put("/admin/collections" , collectionsHandler);
     infoHandler        = createHandler(cfg.getInfoHandlerClass(), InfoHandler.class);
+    containerHandlers.put("/admin/info" , infoHandler);
     coreAdminHandler   = createHandler(cfg.getCoreAdminHandlerClass(), CoreAdminHandler.class);
+    containerHandlers.put(cfg.getAdminPath() , coreAdminHandler);
 
     coreConfigService = cfg.createCoreConfigService(loader, zkSys.getZkController());
 
@@ -919,5 +937,5 @@ class CloserThread extends Thread {
       }
     }
   }
-  
+
 }

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/RequestHandlers.java?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/RequestHandlers.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/RequestHandlers.java Sat Oct  4 18:18:55 2014
@@ -49,6 +49,7 @@ public final class RequestHandlers {
   // the map implementation should be thread safe
   private final Map<String, SolrRequestHandler> handlers =
       new ConcurrentHashMap<>() ;
+  private final Map<String, SolrRequestHandler> immutableHandlers = Collections.unmodifiableMap(handlers) ;
 
   /**
    * Trim the trailing '/' if its there, and convert null to empty string.
@@ -59,7 +60,7 @@ public final class RequestHandlers {
    * to map to the same handler 
    * 
    */
-  private static String normalize( String p )
+  public static String normalize( String p )
   {
     if(p == null) return "";
     if( p.endsWith( "/" ) && p.length() > 1 )
@@ -114,7 +115,7 @@ public final class RequestHandlers {
    * Returns an unmodifiable Map containing the registered handlers
    */
   public Map<String,SolrRequestHandler> getRequestHandlers() {
-    return Collections.unmodifiableMap( handlers );
+    return immutableHandlers;
   }
 
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java Sat Oct  4 18:18:55 2014
@@ -38,6 +38,7 @@ import org.apache.solr.common.util.Execu
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.core.DirectoryFactory.DirContext;
+import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.handler.SnapPuller;
 import org.apache.solr.handler.UpdateRequestHandler;
 import org.apache.solr.handler.admin.ShowFileRequestHandler;
@@ -1217,7 +1218,7 @@ public final class SolrCore implements S
    * This function is thread safe.
    */
   public SolrRequestHandler getRequestHandler(String handlerName) {
-    return reqHandlers.get(handlerName);
+    return RequestHandlerBase.getRequestHandler(RequestHandlers.normalize(handlerName), reqHandlers.getRequestHandlers());
   }
 
   /**

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java Sat Oct  4 18:18:55 2014
@@ -20,13 +20,18 @@ package org.apache.solr.handler;
 import java.io.IOException;
 import java.io.Reader;
 import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.core.InitParams;
+import org.apache.solr.core.PluginInfo;
 import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.util.plugin.PluginInfoInitialized;
 
 public class DumpRequestHandler extends RequestHandlerBase
 {
@@ -81,4 +86,20 @@ public class DumpRequestHandler extends 
   public String getDescription() {
     return "Dump handler (debug)";
   }
+
+  @Override
+  public SolrRequestHandler getSubHandler(String path) {
+    if(subpaths !=null && subpaths.contains(path)) return this;
+    return null;
+  }
+  private List<String> subpaths;
+
+  @Override
+  public void init(NamedList args) {
+    super.init(args);
+    if(args !=null) {
+      NamedList nl = (NamedList) args.get(PluginInfo.DEFAULTS);
+      if(nl!=null) subpaths = nl.getAll("subpath");
+    }
+  }
 }

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java Sat Oct  4 18:18:55 2014
@@ -33,12 +33,13 @@ import org.apache.solr.util.stats.Timer;
 import org.apache.solr.util.stats.TimerContext;
 
 import java.net.URL;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 
 /**
  *
  */
-public abstract class RequestHandlerBase implements SolrRequestHandler, SolrInfoMBean {
+public abstract class RequestHandlerBase implements SolrRequestHandler, SolrInfoMBean, NestedRequestHandler {
 
   protected NamedList initArgs = null;
   protected SolrParams defaults;
@@ -194,6 +195,41 @@ public abstract class RequestHandlerBase
     return null;  // this can be overridden, but not required
   }
 
+
+  @Override
+  public SolrRequestHandler getSubHandler(String path) {
+    return null;
+  }
+
+
+  /**
+   * Get the request handler registered to a given name.
+   *
+   * This function is thread safe.
+   */
+  public static SolrRequestHandler getRequestHandler(String handlerName, Map<String, SolrRequestHandler> reqHandlers) {
+    if(handlerName == null) return null;
+    SolrRequestHandler handler = reqHandlers.get(handlerName);
+    int idx = 0;
+    if(handler == null) {
+      for (; ; ) {
+        idx = handlerName.indexOf('/', idx+1);
+        if (idx > 0) {
+          String firstPart = handlerName.substring(0, idx);
+          handler = reqHandlers.get(firstPart);
+          if (handler == null) continue;
+          if (handler instanceof NestedRequestHandler) {
+            return ((NestedRequestHandler) handler).getSubHandler(handlerName.substring(idx));
+          }
+        } else {
+          break;
+        }
+      }
+    }
+    return handler;
+  }
+
+
   @Override
   public NamedList<Object> getStatistics() {
     NamedList<Object> lst = new SimpleOrderedMap<>();

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/SolrRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/SolrRequestHandler.java?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/SolrRequestHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/SolrRequestHandler.java Sat Oct  4 18:18:55 2014
@@ -60,5 +60,7 @@ public interface SolrRequestHandler exte
    * all interface obligations.
    */
   public void handleRequest(SolrQueryRequest req, SolrQueryResponse rsp);
+
+  public static final String TYPE = "requestHandler";
 }
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java Sat Oct  4 18:18:55 2014
@@ -256,20 +256,12 @@ public class SolrDispatchFilter extends 
         boolean usingAliases = false;
         List<String> collectionsList = null;
         // Check for the core admin collections url
-        if( path.equals( "/admin/collections" ) ) {
-          handler = cores.getCollectionsHandler();
+        handler = cores.getRequestHandler(path);
+        if( handler!= null ) {
           solrReq =  SolrRequestParsers.DEFAULT.parse(null,path, req);
           handleAdminRequest(req, response, handler, solrReq);
           return;
-        }
-        // Check for the core admin info url
-        if( path.startsWith( "/admin/info" ) ) {
-          handler = cores.getInfoHandler();
-          solrReq =  SolrRequestParsers.DEFAULT.parse(null,path, req);
-          handleAdminRequest(req, response, handler, solrReq);
-          return;
-        }
-        else {
+        } else {
           //otherwise, we should find a core from the path
           idx = path.indexOf( "/", 1 );
           if( idx > 1 ) {

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java Sat Oct  4 18:18:55 2014
@@ -52,6 +52,7 @@ import org.apache.solr.common.params.Sol
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
 import org.apache.solr.common.util.FastInputStream;
+import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
@@ -134,7 +135,7 @@ public class SolrRequestParsers 
     parsers.put( STANDARD, standard );
     parsers.put( "", standard );
   }
-  
+
   public SolrQueryRequest parse( SolrCore core, String path, HttpServletRequest req ) throws Exception
   {
     SolrRequestParser parser = standard;
@@ -149,7 +150,8 @@ public class SolrRequestParsers 
     // Handlers and login will want to know the path. If it contains a ':'
     // the handler could use it for RESTful URLs
     sreq.getContext().put( "path", path );
-    
+    sreq.getContext().put("httpMethod", req.getMethod());
+
     if(addHttpRequestToContext) {
       sreq.getContext().put("httpRequest", req);
     }

Modified: lucene/dev/branches/branch_5x/solr/core/src/test-files/solr/collection1/conf/solrconfig-paramset.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test-files/solr/collection1/conf/solrconfig-paramset.xml?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test-files/solr/collection1/conf/solrconfig-paramset.xml (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test-files/solr/collection1/conf/solrconfig-paramset.xml Sat Oct  4 18:18:55 2014
@@ -60,5 +60,13 @@
     </lst>
   </requestHandler>
 
+  <requestHandler name="/greedypath" class="DumpRequestHandler">
+    <lst name="defaults">
+      <str name="subpath">/some/path</str>
+      <str name="subpath">/some/other/path</str>
+    </lst>
+  </requestHandler>
+
+
 
 </config>

Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestInitParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestInitParams.java?rev=1629437&r1=1629436&r2=1629437&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestInitParams.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestInitParams.java Sat Oct  4 18:18:55 2014
@@ -90,6 +90,13 @@ public class TestInitParams extends Solr
     assertEquals(Arrays.asList("C1","C") ,def.getAll("c"));
   }
 
+  public void testNestedRequestHandler() {
+    assertNotNull(h.getCore().getRequestHandler("/greedypath"));
+    assertNotNull(h.getCore().getRequestHandler("/greedypath/some/path"));
+    assertNotNull( h.getCore().getRequestHandler("/greedypath/some/other/path"));
+    assertNull(h.getCore().getRequestHandler("/greedypath/unknownpath"));
+  }
+