Author: noble
Date: Mon Jun  8 07:55:57 2009
New Revision: 782552

URL: http://svn.apache.org/viewvc?rev=782552&view=rev
Log:
SOLR-1198 moved valueSourceParser, listeners, 
deletionPolicy,directoryFactory,queryParser,responseWriter to solconfig

Modified:
    lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java
    lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java
    lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.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=782552&r1=782551&r2=782552&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 Mon 
Jun  8 07:55:57 2009
@@ -131,7 +131,7 @@
 
   void initHandlersFromConfig(SolrConfig config ){
     Map<SolrConfig.PluginInfo,SolrRequestHandler> handlers = new 
HashMap<SolrConfig.PluginInfo,SolrRequestHandler>();
-    for (SolrConfig.PluginInfo info : config.reqHandlerInfo) {
+    for (SolrConfig.PluginInfo info : config.getReqHandlerInfo()) {
       try {
         SolrRequestHandler requestHandler;
         if( info.startup != null ) {

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=782552&r1=782551&r2=782552&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 Mon Jun  8 
07:55:57 2009
@@ -167,7 +167,8 @@
       jmxConfig = new JmxConfiguration(false, null, null);
     }
      maxWarmingSearchers = 
getInt("query/maxWarmingSearchers",Integer.MAX_VALUE);
-     reqHandlerInfo = loadRequestHandlerInfo();
+
+     loadPluginInfo();
 
     Config.log.info("Loaded SolrConfig: " + name);
     
@@ -175,11 +176,27 @@
     config = this;
   }
 
-  private List<PluginInfo> loadRequestHandlerInfo() {
+  protected void loadPluginInfo() {
+    List<String> reqFields = Arrays.asList("name","class");
+    reqHandlerInfo = loadPluginInfo("requestHandler",reqFields);
+    respWriterInfo = loadPluginInfo("queryResponseWriter",reqFields);
+    valueSourceParserInfo = loadPluginInfo("valueSourceParser",reqFields);
+    queryParserInfo = loadPluginInfo("queryParser",reqFields);
+    searchComponentInfo = loadPluginInfo("searchComponent",reqFields);
+    List<PluginInfo> plugins =  loadPluginInfo("directoryFactory",reqFields);
+    directoryfactoryInfo = plugins.isEmpty() ? null:plugins.get(0);
+    reqFields = Arrays.asList("class");
+    plugins = loadPluginInfo("mainIndex/deletionPolicy",reqFields);
+    deletionPolicyInfo = plugins.isEmpty() ? null : plugins.get(0);
+    firstSearcherListenerInfo = 
loadPluginInfo("//listen...@event='firstSearcher']",reqFields);
+    newSearcherListenerInfo = 
loadPluginInfo("//listen...@event='newSearcher']",reqFields);
+  }
+
+  private List<PluginInfo> loadPluginInfo(String tag, List<String> reqFields) {
     ArrayList<PluginInfo> result = new ArrayList<PluginInfo>();
-    NodeList nodes = (NodeList) evaluate("requestHandler", 
XPathConstants.NODESET);
+    NodeList nodes = (NodeList) evaluate(tag, XPathConstants.NODESET);
      for (int i=0; i<nodes.getLength(); i++) {
-       result.add(new PluginInfo(nodes.item(i) ,"[solrconfig.xml] 
requestHandler","name","class"));
+       result.add(new PluginInfo(nodes.item(i) ,"[solrconfig.xml] 
"+tag,reqFields));
      }
     return Collections.unmodifiableList(result) ;
   }
@@ -208,7 +225,16 @@
   // default & main index configurations
   public final SolrIndexConfig defaultIndexConfig;
   public final SolrIndexConfig mainIndexConfig;
-  public final List<PluginInfo> reqHandlerInfo;
+
+  protected List<PluginInfo> reqHandlerInfo;
+  protected List<PluginInfo> queryParserInfo;
+  protected List<PluginInfo> respWriterInfo;
+  protected List<PluginInfo> valueSourceParserInfo;
+  protected List<PluginInfo> searchComponentInfo;
+  protected List<PluginInfo> firstSearcherListenerInfo;
+  protected PluginInfo deletionPolicyInfo;
+  protected List<PluginInfo> newSearcherListenerInfo;
+  protected PluginInfo directoryfactoryInfo;
 
   public final int maxWarmingSearchers;
   public final boolean unlockOnStartup;
@@ -347,34 +373,59 @@
   }
 
   public static class PluginInfo {
-    final String startup, name, className, event;
+    final String startup, name, className;
     final boolean isDefault;    
     final NamedList initArgs;
 
     public PluginInfo(String startup, String name, String className,
-                      String event, boolean isdefault, NamedList initArgs) {
+                      boolean isdefault, NamedList initArgs) {
       this.startup = startup;
       this.name = name;
       this.className = className;
-      this.event = event;
-      isDefault = isdefault;
+      this.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));
+    public PluginInfo(Node node, String err, List<String> reqFields) {
+      startup = getVal( node, "startup",reqFields,err);
+      name = getVal(node, "name", reqFields,err);
+      className = getVal(node, "class",reqFields,err);
+      isDefault = Boolean.parseBoolean(getVal(node,"default",reqFields,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);
+   private String getVal(Node node, String name, List<String> required, String 
err) {
+    return DOMUtil.getAttr(node, name, required.contains(name) ? err : null);
+   }
+
+    @Override
+    public String toString() {
+      StringBuilder sb = new StringBuilder("{");
+      if(name != null) sb.append("name = "+name +",");
+      if(className != null) sb.append("class = "+className +",");
+      if(isDefault) sb.append("default = "+isDefault +",");
+      if(initArgs.size() >0) sb.append("args = "+initArgs);
+      sb.append("}");
+      return sb.toString();    
     }
-
   }
+
+  public List<PluginInfo> getReqHandlerInfo() { return reqHandlerInfo; }
+
+  public List<PluginInfo> getQueryParserInfo() { return queryParserInfo; }
+
+  public List<PluginInfo> getRespWriterInfo() { return respWriterInfo; }
+
+  public List<PluginInfo> getValueSourceParserInfo() { return 
valueSourceParserInfo; }
+
+  public List<PluginInfo> getSearchComponentInfo() { return 
searchComponentInfo; }
+
+  public List<PluginInfo> getFirstSearcherListenerInfo() { return 
firstSearcherListenerInfo; }
+
+  public List<PluginInfo> getNewSearcherListenerInfo() { return 
newSearcherListenerInfo; }
+
+  public PluginInfo getDirectoryfactoryInfo() { return directoryfactoryInfo; }
+
+  public PluginInfo getDeletionPolicyInfo() { return deletionPolicyInfo; }
 }

Modified: lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java?rev=782552&r1=782551&r2=782552&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java Mon Jun  8 
07:55:57 2009
@@ -70,6 +70,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import java.net.URL;
+import java.lang.reflect.Constructor;
 
 
 /**
@@ -248,31 +249,27 @@
     return infoRegistry;
   }
 
-  private void initDeletionPolicy() {
-    String className = solrConfig.get("mainIndex/deletionPolicy/@class", 
SolrDeletionPolicy.class.getName());
-    IndexDeletionPolicy delPolicy = createInstance(className, 
IndexDeletionPolicy.class, "Deletion Policy for SOLR");
-
-    Node node = (Node) solrConfig.evaluate("mainIndex/deletionPolicy", 
XPathConstants.NODE);
-    if (node != null) {
-      if (delPolicy instanceof NamedListInitializedPlugin)
-        ((NamedListInitializedPlugin) 
delPolicy).init(DOMUtil.childNodesToNamedList(node));
-    }
-    solrDelPolicy = new IndexDeletionPolicyWrapper(delPolicy);
-  }
+   private void initDeletionPolicy() {
+     SolrConfig.PluginInfo info = solrConfig.getDeletionPolicyInfo();
+     IndexDeletionPolicy delPolicy = null;
+     if(info != null){
+       delPolicy = 
createInstance(info.className,IndexDeletionPolicy.class,"Deletion Policy for 
SOLR");
+       if (delPolicy instanceof NamedListInitializedPlugin) {
+         ((NamedListInitializedPlugin) delPolicy).init(info.initArgs);
+       }
+     } else {
+       delPolicy = new SolrDeletionPolicy();
+     }     
+     solrDelPolicy = new IndexDeletionPolicyWrapper(delPolicy);
+   }
 
-  public List<SolrEventListener> parseListener(String path) {
+  private List<SolrEventListener> parseListener(List<SolrConfig.PluginInfo> 
path) {
     List<SolrEventListener> lst = new ArrayList<SolrEventListener>();
-    log.info( logid+"Searching for listeners: " +path);
-    NodeList nodes = (NodeList)solrConfig.evaluate(path, 
XPathConstants.NODESET);
-    if (nodes!=null) {
-      for (int i=0; i<nodes.getLength(); i++) {
-        Node node = nodes.item(i);
-        String className = DOMUtil.getAttr(node,"class");
-        SolrEventListener listener = createEventListener(className);
-        listener.init(DOMUtil.childNodesToNamedList(node));
-        lst.add(listener);
-        log.info( logid+"Added SolrEventListener: " + listener);
-      }
+    for (SolrConfig.PluginInfo info : path) {
+      SolrEventListener listener = createEventListener(info.className);
+      listener.init(info.initArgs);
+      lst.add(listener);
+      log.info(logid + "Added SolrEventListener: " + listener);
     }
     return lst;
   }
@@ -280,8 +277,8 @@
   List<SolrEventListener> firstSearcherListeners;
   List<SolrEventListener> newSearcherListeners;
   private void parseListeners() {
-    firstSearcherListeners = 
parseListener("//listen...@event=\"firstSearcher\"]");
-    newSearcherListeners = parseListener("//listen...@event=\"newSearcher\"]");
+    firstSearcherListeners = 
parseListener(solrConfig.getFirstSearcherListenerInfo());
+    newSearcherListeners = 
parseListener(solrConfig.getNewSearcherListenerInfo());
   }
   
   /**
@@ -330,21 +327,16 @@
     return new SolrIndexSearcher(this, schema, name, 
directoryFactory.open(getIndexDir()), readOnly, false);
   }
 
-  private void initDirectoryFactory() {
-    String xpath = "directoryFactory";
-    Node node = (Node) solrConfig.evaluate(xpath, XPathConstants.NODE);
-    DirectoryFactory dirFactory;
-    if (node != null) {
-      Map<String, DirectoryFactory> registry = new HashMap<String, 
DirectoryFactory>();
-      NamedListPluginLoader<DirectoryFactory> indexReaderFactoryLoader = new 
NamedListPluginLoader<DirectoryFactory>(
-          "[solrconfig.xml] " + xpath, registry);
 
-      dirFactory = indexReaderFactoryLoader.loadSingle(solrConfig
-          .getResourceLoader(), node);
+   private void initDirectoryFactory() {
+    DirectoryFactory dirFactory;
+    SolrConfig.PluginInfo info = solrConfig.getDirectoryfactoryInfo();
+    if (info != null) {
+      dirFactory = (DirectoryFactory) 
getResourceLoader().newInstance(info.className);
+      dirFactory.init(info.initArgs);
     } else {
       dirFactory = new StandardDirectoryFactory();
     }
-
     // And set it
     directoryFactory = dirFactory;
   }
@@ -402,17 +394,20 @@
   private <T extends Object> T createInstance(String className, Class<T> cast, 
String msg) {
     Class clazz = null;
     if (msg == null) msg = "SolrCore Object";
-    try {
-      try {
-        clazz = solrConfig.getResourceLoader().findClass(className);
+    try { 
+        clazz = getResourceLoader().findClass(className);
         if (cast != null && !cast.isAssignableFrom(clazz))
           throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error 
Instantiating "+msg+", "+className+ " is not a " +cast.getName());
-        
-        java.lang.reflect.Constructor cons = clazz.getConstructor(new 
Class[]{SolrCore.class});
-        return (T) cons.newInstance(new Object[]{this});
-      } catch(NoSuchMethodException xnomethod) {
-        return (T) clazz.newInstance();
-      }
+      //most of the classes do not have constructors whiuch take in SolrCore. 
It is recommended to obtain SolrCore by implementing SolrCoreAare.
+      // So invariably always it will cause a  NoSuchMethodException. So 
iterate though the list of available constructors
+        Constructor[] cons =  clazz.getConstructors();
+        for (Constructor con : cons) {
+          Class[] types = con.getParameterTypes();
+          if(types.length == 1 && types[0] == SolrCore.class){
+            return (T)con.newInstance(this);
+          }
+        }
+        return (T) clazz.newInstance();//use the empty constructor      
     } catch (SolrException e) {
       throw e;
     } catch (Exception e) {
@@ -830,14 +825,14 @@
   /**
    * Register the default search components
    */
-  private static Map<String, SearchComponent> loadSearchComponents( SolrConfig 
config )
+  private Map<String, SearchComponent> loadSearchComponents( SolrConfig config 
)
   {
     Map<String, SearchComponent> components = new HashMap<String, 
SearchComponent>();
-  
+
     String xpath = "searchComponent";
     NamedListPluginLoader<SearchComponent> loader = new 
NamedListPluginLoader<SearchComponent>( xpath, components );
     loader.load( config.getResourceLoader(), (NodeList)config.evaluate( xpath, 
XPathConstants.NODESET ) );
-  
+
     final Map<String,Class<? extends SearchComponent>> standardcomponents 
         = new HashMap<String, Class<? extends SearchComponent>>();
     standardcomponents.put( QueryComponent.COMPONENT_NAME,        
QueryComponent.class        );
@@ -1415,13 +1410,7 @@
   /** Configure the query response writers. There will always be a default 
writer; additional
    * writers may also be configured. */
   private void initWriters() {
-    String xpath = "queryResponseWriter";
-    NodeList nodes = (NodeList) solrConfig.evaluate(xpath, 
XPathConstants.NODESET);
-    
-    NamedListPluginLoader<QueryResponseWriter> loader = 
-      new NamedListPluginLoader<QueryResponseWriter>( "[solrconfig.xml] 
"+xpath, responseWriters );
-    
-    defaultResponseWriter = loader.load( solrConfig.getResourceLoader(), nodes 
);
+    defaultResponseWriter = initPlugins(solrConfig.getRespWriterInfo(), 
responseWriters, QueryResponseWriter.class);
     for (Map.Entry<String, QueryResponseWriter> entry : 
DEFAULT_RESPONSE_WRITERS.entrySet()) {
       if(responseWriters.get(entry.getKey()) == null) 
responseWriters.put(entry.getKey(), entry.getValue());
     }
@@ -1455,14 +1444,7 @@
 
   /** Configure the query parsers. */
   private void initQParsers() {
-    String xpath = "queryParser";
-    NodeList nodes = (NodeList) solrConfig.evaluate(xpath, 
XPathConstants.NODESET);
-
-    NamedListPluginLoader<QParserPlugin> loader =
-      new NamedListPluginLoader<QParserPlugin>( "[solrconfig.xml] "+xpath, 
qParserPlugins);
-
-    loader.load( solrConfig.getResourceLoader(), nodes );
-
+    
initPlugins(solrConfig.getQueryParserInfo(),qParserPlugins,QParserPlugin.class);
     // default parsers
     for (int i=0; i<QParserPlugin.standardPlugins.length; i+=2) {
      try {
@@ -1489,14 +1471,7 @@
   
   /** Configure the ValueSource (function) plugins */
   private void initValueSourceParsers() {
-    String xpath = "valueSourceParser";
-    NodeList nodes = (NodeList) solrConfig.evaluate(xpath, 
XPathConstants.NODESET);
-
-    NamedListPluginLoader<ValueSourceParser> loader =
-      new NamedListPluginLoader<ValueSourceParser>( "[solrconfig.xml] "+xpath, 
valueSourceParsers);
-
-    loader.load( solrConfig.getResourceLoader(), nodes );
-
+    
initPlugins(solrConfig.getValueSourceParserInfo(),valueSourceParsers,ValueSourceParser.class);
     // default value source parsers
     for (Map.Entry<String, ValueSourceParser> entry : 
ValueSourceParser.standardValueSourceParsers.entrySet()) {
       try {
@@ -1511,7 +1486,23 @@
       }
     }
   }
-  
+
+  private <T> T initPlugins(List<SolrConfig.PluginInfo> pluginInfos , 
Map<String ,T> registry, Class<T> type){
+    T def = null;
+    for (SolrConfig.PluginInfo info : pluginInfos) {
+      T o = createInstance(info.className,type, type.getSimpleName());
+      if (o instanceof NamedListInitializedPlugin) {
+        ((NamedListInitializedPlugin) o).init(info.initArgs);
+      }
+      registry.put(info.name, o);
+      if(info.isDefault){
+        def = o;
+      }
+
+    }
+    return def;
+  }
+
   public ValueSourceParser getValueSourceParser(String parserName) {
     return valueSourceParsers.get(parserName);
   }


Reply via email to