You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by no...@apache.org on 2009/06/06 12:18:41 UTC

svn commit: r782219 - in /lucene/solr/trunk/src/java/org/apache/solr/core: RequestHandlers.java SolrConfig.java

Author: noble
Date: Sat Jun  6 10:18:41 2009
New Revision: 782219

URL: http://svn.apache.org/viewvc?rev=782219&view=rev
Log:
SOLR-1198. Moving requesthandler parsing to SolrConfig

Modified:
    lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java
    lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java

Modified: lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java?rev=782219&r1=782218&r2=782219&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java Sat Jun  6 10:18:41 2009
@@ -18,9 +18,7 @@
 package org.apache.solr.core;
 
 import java.net.URL;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.slf4j.Logger;
@@ -38,7 +36,6 @@
 import org.apache.solr.request.SolrQueryResponse;
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.util.plugin.AbstractPluginLoader;
-import org.apache.solr.util.plugin.ResourceLoaderAware;
 import org.apache.solr.util.plugin.SolrCoreAware;
 import org.w3c.dom.NodeList;
 import org.w3c.dom.Node;
@@ -118,11 +115,11 @@
    * This function should <b>only</b> be called from the SolrCore constructor.  It is
    * not intended as a public API.
    * 
-   * While the normal runtime registration contract is that handlers MUST be initialized 
+   * While the normal runtime registration contract is that handlers MUST be initialized
    * before they are registered, this function does not do that exactly.
-   * 
-   * This function registers all handlers first and then calls init() for each one.  
-   * 
+   *
+   * This function registers all handlers first and then calls init() for each one.
+   *
    * This is OK because this function is only called at startup and there is no chance that
    * a handler could be asked to handle a request before it is initialized.
    * 
@@ -131,52 +128,44 @@
    * 
    * Handlers will be registered and initialized in the order they appear in solrconfig.xml
    */
-  void initHandlersFromConfig( final Config config )  
-  {
-    final RequestHandlers handlers = this;
-    AbstractPluginLoader<SolrRequestHandler> loader = 
-      new AbstractPluginLoader<SolrRequestHandler>( "[solrconfig.xml] requestHandler", true, true )
-    {
-      @Override
-      protected SolrRequestHandler create( ResourceLoader config, String name, String className, Node node ) throws Exception
-      {    
-        String startup = DOMUtil.getAttr( node, "startup" );
-        if( startup != null ) {
-          if( "lazy".equals( startup ) ) {
-            log.info("adding lazy requestHandler: " + className );
-            NamedList args = DOMUtil.childNodesToNamedList(node);
-            return new LazyRequestHandlerWrapper( core, className, args );
-          }
-          else {
-            throw new Exception( "Unknown startup value: '"+startup+"' for: "+className );
+
+  void initHandlersFromConfig(SolrConfig config ){
+    Map<SolrConfig.PluginInfo,SolrRequestHandler> handlers = new HashMap<SolrConfig.PluginInfo,SolrRequestHandler>();
+    for (SolrConfig.PluginInfo info : config.reqHandlerInfo) {
+      try {
+        SolrRequestHandler requestHandler;
+        if( info.startup != null ) {
+          if( "lazy".equals(info.startup ) ) {
+            log.info("adding lazy requestHandler: " + info.className);
+            requestHandler = new LazyRequestHandlerWrapper( core, info.className, info.initArgs );
+          } else {
+            throw new Exception( "Unknown startup value: '"+info.startup+"' for: "+info.className );
           }
+        } else {
+          requestHandler = (SolrRequestHandler) config.getResourceLoader().newInstance(info.className);
         }
-        return super.create( config, name, className, node );
-      }
-
-      @Override
-      protected SolrRequestHandler register(String name, SolrRequestHandler plugin) throws Exception {
-        return handlers.register( name, plugin );
-      }
-      
-      @Override
-      protected void init(SolrRequestHandler plugin, Node node ) throws Exception {
-        plugin.init( DOMUtil.childNodesToNamedList(node) );
-      }      
-    };
-    
-    NodeList nodes = (NodeList)config.evaluate("requestHandler", XPathConstants.NODESET);
-    
-    // Load the handlers and get the default one
-    SolrRequestHandler defaultHandler = loader.load( config.getResourceLoader(), nodes );
-    if( defaultHandler == null ) {
-      defaultHandler = get(RequestHandlers.DEFAULT_HANDLER_NAME);
-      if( defaultHandler == null ) {
-        defaultHandler = new StandardRequestHandler();
-        register(RequestHandlers.DEFAULT_HANDLER_NAME, defaultHandler);
+        handlers.put(info,requestHandler);
+        requestHandler.init(info.initArgs);
+        SolrRequestHandler old = register(info.name, requestHandler);
+        if(old != null) {
+          log.warn("Multiple requestHandler registered to the same name: " + info.name + " ignoring: " + old.getClass().getName());
+        }
+        if(info.isDefault){
+          old = register("",requestHandler);
+          if(old != null)
+            log.warn("Multiple default requestHandler registered" + " ignoring: " + old.getClass().getName()); 
+        }
+        log.info("created "+info.name+": " + info.className);
+      } catch (Exception e) {
+          SolrConfig.severeErrors.add( e );
+          SolrException.logOnce(log,null,e);
       }
     }
-    register("", defaultHandler);
+    for (Map.Entry<SolrConfig.PluginInfo,SolrRequestHandler> entry : handlers.entrySet()) {
+      entry.getValue().init(entry.getKey().initArgs);
+    }
+
+    if(get("") == null) register("", get(DEFAULT_HANDLER_NAME));
   }
     
 

Modified: lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java?rev=782219&r1=782218&r2=782219&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java Sat Jun  6 10:18:41 2009
@@ -18,6 +18,7 @@
 package org.apache.solr.core;
 
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.DOMUtil;
 import org.apache.solr.handler.PingRequestHandler;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
@@ -31,9 +32,11 @@
 import org.slf4j.LoggerFactory;
 
 import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
 import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPathConstants;
 
 import java.util.*;
 import java.util.regex.Pattern;
@@ -164,14 +167,23 @@
       jmxConfig = new JmxConfiguration(false, null, null);
     }
      maxWarmingSearchers = getInt("query/maxWarmingSearchers",Integer.MAX_VALUE);
+     reqHandlerInfo = loadRequestHandlerInfo();
 
-    
     Config.log.info("Loaded SolrConfig: " + name);
     
     // TODO -- at solr 2.0. this should go away
     config = this;
   }
 
+  private List<PluginInfo> loadRequestHandlerInfo() {
+    ArrayList<PluginInfo> result = new ArrayList<PluginInfo>();
+    NodeList nodes = (NodeList) evaluate("requestHandler", XPathConstants.NODESET);
+     for (int i=0; i<nodes.getLength(); i++) {
+       result.add(new PluginInfo(nodes.item(i) ,"[solrconfig.xml] requestHandler","name","class"));
+     }
+    return Collections.unmodifiableList(result) ;
+  }
+
   /* The set of materialized parameters: */
   public final int booleanQueryMaxClauseCount;
   // SolrIndexSearcher - nutch optimizer
@@ -196,11 +208,12 @@
   // default & main index configurations
   public final SolrIndexConfig defaultIndexConfig;
   public final SolrIndexConfig mainIndexConfig;
+  public final List<PluginInfo> reqHandlerInfo;
 
   public final int maxWarmingSearchers;
   public final boolean unlockOnStartup;
   public final boolean useColdSearcher;
-
+  
   //JMX configuration
   public final JmxConfiguration jmxConfig;
   
@@ -332,4 +345,36 @@
     public Long getMaxAge() { return maxAge; }
     public LastModFrom getLastModFrom() { return lastModFrom; }
   }
+
+  public static class PluginInfo {
+    final String startup, name, className, event;
+    final boolean isDefault;    
+    final NamedList initArgs;
+
+    public PluginInfo(String startup, String name, String className,
+                      String event, boolean isdefault, NamedList initArgs) {
+      this.startup = startup;
+      this.name = name;
+      this.className = className;
+      this.event = event;
+      isDefault = isdefault;
+      this.initArgs = initArgs;
+    }
+
+
+    public PluginInfo(Node node, String err, String... requiredFields) {
+      List<String> l = requiredFields == null? Collections.EMPTY_LIST: Arrays.asList(requiredFields);
+      startup = getVal( node, "startup",l,err);
+      name = getVal(node, "name", l,err);
+      className = getVal(node, "class",l,err);
+      event = getVal(node, "event",l,err);
+      isDefault = Boolean.parseBoolean(getVal(node,"default",l,err));
+      initArgs = DOMUtil.childNodesToNamedList(node);
+  }
+
+    private String getVal(Node node, String name, List<String> required, String err) {
+      return DOMUtil.getAttr(node, name, required.contains(name) ? err : null);
+    }
+
+  }
 }