You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2011/07/07 11:04:29 UTC

svn commit: r1143719 [16/20] - in /lucene/dev/branches/LUCENE2793: ./ dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/lucene/contrib/ dev-tools/idea/lucene/contrib/demo/ dev-tools/idea/lucene/contrib/highlighter/ dev-tools/idea/lucene/contrib/i...

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CloseHook.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CloseHook.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CloseHook.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CloseHook.java Thu Jul  7 09:03:58 2011
@@ -18,27 +18,40 @@ package org.apache.solr.core;
 
 
 /**
-    * Interface to request notification when the core is closed.
- *<p/>
+ * Used to request notification when the core is closed.
+ * <p/>
  * Call {@link org.apache.solr.core.SolrCore#addCloseHook(org.apache.solr.core.CloseHook)} during the {@link org.apache.solr.util.plugin.SolrCoreAware#inform(SolrCore)} method to
  * add a close hook to your object.
  * <p/>
- * The close hook can be useful for releasing objects related to the request handler (for instance, if you have a JDBC DataSource or something like that) 
- *
- *
-  */
+ * The close hook can be useful for releasing objects related to the request handler (for instance, if you have a JDBC DataSource or something like that)
+ */
+
+public abstract class CloseHook {
+
+  /**
+   * Method called when the given SolrCore object is closing / shutting down but before the update handler and
+   * searcher(s) are actually closed
+   * <br />
+   * <b>Important:</b> Keep the method implementation as short as possible. If it were to use any heavy i/o , network connections -
+   * it might be a better idea to launch in a separate Thread so as to not to block the process of
+   * shutting down a given SolrCore instance.
+   *
+   * @param core SolrCore object that is shutting down / closing
+   */
+  public abstract void preClose(SolrCore core);
 
- public interface CloseHook {
-   
-   /**
-    * Method called when the given SolrCore object is closing / shutting down.
-    * <br />
-    *  <b>Important:</b> Keep the method implementation as short as possible. If it were to use any heavy i/o , network connections -
-    *   it might be a better idea to launch in a separate Thread so as to not to block the process of 
-    *   shutting down a given SolrCore instance.   
-    *   
-    * 
-    * @param core SolrCore object that is shutting down / closing
-    */
-   void close( SolrCore core );
- }
+  /**
+   * Method called when the given SolrCore object has been shut down and update handlers and searchers are closed
+   * <br/>
+   * Use this method for post-close clean up operations e.g. deleting the index from disk.
+   * <br/>
+   * <b>The core's passed to the method is already closed and therefore, it's update handler or searcher should *NOT* be used</b>
+   *
+   * <b>Important:</b> Keep the method implementation as short as possible. If it were to use any heavy i/o , network connections -
+   * it might be a better idea to launch in a separate Thread so as to not to block the process of
+   * shutting down a given SolrCore instance.
+   *
+   * @param core
+   */
+  public abstract void postClose(SolrCore core);
+}

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CoreContainer.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/CoreContainer.java Thu Jul  7 09:03:58 2011
@@ -18,7 +18,6 @@
 package org.apache.solr.core;
 
 import java.io.*;
-import java.nio.channels.FileChannel;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeoutException;
@@ -43,6 +42,8 @@ import org.apache.solr.common.util.DOMUt
 import org.apache.solr.common.util.XML;
 import org.apache.solr.common.util.FileUtils;
 import org.apache.solr.common.util.SystemIdResolver;
+import org.apache.solr.core.SolrXMLSerializer.SolrCoreXMLDef;
+import org.apache.solr.core.SolrXMLSerializer.SolrXMLDef;
 import org.apache.solr.handler.admin.CoreAdminHandler;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.zookeeper.KeeperException;
@@ -82,6 +83,7 @@ public class CoreContainer 
   protected Integer zkClientTimeout;
   protected String solrHome;
   protected String defaultCoreName = "";
+  private SolrXMLSerializer solrXMLSerializer = new SolrXMLSerializer();
   private ZkController zkController;
   private SolrZkServer zkServer;
 
@@ -250,7 +252,7 @@ public class CoreContainer 
     }
   }
 
-  private static Properties getCoreProps(String instanceDir, String file, Properties defaults) {
+  static Properties getCoreProps(String instanceDir, String file, Properties defaults) {
     if(file == null) file = "conf"+File.separator+ "solrcore.properties";
     File corePropsFile = new File(file);
     if(!corePropsFile.isAbsolute()){
@@ -648,9 +650,8 @@ public class CoreContainer 
         schema = new IndexSchema(config, dcore.getSchemaName(), null);
       }
     }
-    String dataDir = null;
 
-    SolrCore core = new SolrCore(dcore.getName(), dataDir, config, schema, dcore);
+    SolrCore core = new SolrCore(dcore.getName(), null, config, schema, dcore);
     return core;
   }
     
@@ -712,7 +713,7 @@ public class CoreContainer 
     if (core == null)
       throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "No such core: " + name );
 
-    SolrCore newCore = create(core.getCoreDescriptor());
+    SolrCore newCore = core.reload(libLoader);
     register(name, newCore, false);
   }
 
@@ -847,172 +848,79 @@ public class CoreContainer 
 
   /** Persists the cores config file in a user provided file. */
   public void persistFile(File file) {
-    log.info("Persisting cores config to " + (file==null ? configFile : file));
-
-    File tmpFile = null;
-    try {
-      // write in temp first
-      if (file == null) {
-        file = tmpFile = File.createTempFile("solr", ".xml", configFile.getParentFile());
-      }
-      java.io.FileOutputStream out = new java.io.FileOutputStream(file);
-        Writer writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
-        persist(writer);
-        writer.flush();
-        writer.close();
-        out.close();
-        // rename over origin or copy it this fails
-        if (tmpFile != null) {
-          if (tmpFile.renameTo(configFile))
-            tmpFile = null;
-          else
-            fileCopy(tmpFile, configFile);
-        }
-    } 
-    catch(java.io.FileNotFoundException xnf) {
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, xnf);
-    } 
-    catch(java.io.IOException xio) {
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, xio);
-    } 
-    finally {
-      if (tmpFile != null) {
-        if (!tmpFile.delete())
-          tmpFile.deleteOnExit();
-      }
-    }
-  }
-  
-  /** Write the cores configuration through a writer.*/
-  void persist(Writer w) throws IOException {
-    w.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
-    w.write("<solr");
-    if (this.libDir != null) {
-      writeAttribute(w,"sharedLib",libDir);
-    }
-    if(zkHost != null) writeAttribute(w, "zkHost", zkHost);
-    writeAttribute(w,"persistent",isPersistent());
-    w.write(">\n");
-
-    if (containerProperties != null && !containerProperties.isEmpty())  {
-      writeProperties(w, containerProperties, "  ");
-    }
-    w.write("  <cores");
-    writeAttribute(w, "adminPath",adminPath);
-    if(adminHandler != null) writeAttribute(w, "adminHandler", adminHandler);
-    if(shareSchema) writeAttribute(w, "shareSchema", "true");
-    if(!defaultCoreName.equals("")) writeAttribute(w, "defaultCoreName", defaultCoreName);
-    if(host != null) writeAttribute(w, "host", host);
-    if(hostPort != null) writeAttribute(w, "hostPort", hostPort);
-    if(zkClientTimeout != null) writeAttribute(w, "zkClientTimeout", zkClientTimeout);
-    if(hostContext != null) writeAttribute(w, "hostContext", hostContext);
-    w.write(">\n");
-
-    synchronized(cores) {
+    log.info("Persisting cores config to " + (file == null ? configFile : file));
+    // <solr attrib="value">
+    Map<String,String> rootSolrAttribs = new HashMap<String,String>();
+    if (libDir != null) rootSolrAttribs.put("sharedLib", libDir);
+    rootSolrAttribs.put("persistent", Boolean.toString(isPersistent()));
+    
+    // <solr attrib="value"> <cores attrib="value">
+    Map<String,String> coresAttribs = new HashMap<String,String>();
+    coresAttribs.put("adminPath", adminPath);
+    if (adminHandler != null) coresAttribs.put("adminHandler", adminHandler);
+    if (shareSchema) coresAttribs.put("shareSchema", "true");
+    if (!defaultCoreName.equals("")) coresAttribs.put("defaultCoreName",
+        defaultCoreName);
+    if (host != null) coresAttribs.put("host", host);
+    if (hostPort != null) coresAttribs.put("hostPort", hostPort);
+    if (zkClientTimeout != null) coresAttribs.put("zkClientTimeout", Integer.toString(zkClientTimeout));
+    if (hostContext != null) coresAttribs.put("hostContext", hostContext);
+    
+    List<SolrCoreXMLDef> solrCoreXMLDefs = new ArrayList<SolrCoreXMLDef>();
+    
+    synchronized (cores) {
+      Map<String,String> coreAttribs = new HashMap<String,String>();
       for (SolrCore solrCore : cores.values()) {
-        persist(w,solrCore.getCoreDescriptor());
+        CoreDescriptor dcore = solrCore.getCoreDescriptor();
+        
+        coreAttribs.put("name", dcore.name.equals("") ? defaultCoreName
+            : dcore.name);
+        coreAttribs.put("instanceDir", dcore.getInstanceDir());
+        // write config (if not default)
+        String opt = dcore.getConfigName();
+        if (opt != null && !opt.equals(dcore.getDefaultConfigName())) {
+          coreAttribs.put("config", opt);
+        }
+        // write schema (if not default)
+        opt = dcore.getSchemaName();
+        if (opt != null && !opt.equals(dcore.getDefaultSchemaName())) {
+          coreAttribs.put("schema", opt);
+        }
+        opt = dcore.getPropertiesName();
+        if (opt != null) {
+          coreAttribs.put("properties", opt);
+        }
+        opt = dcore.dataDir;
+        if (opt != null) coreAttribs.put("dataDir", opt);
+        
+        CloudDescriptor cd = dcore.getCloudDescriptor();
+        if (cd != null) {
+          opt = cd.getShardId();
+          if (opt != null) coreAttribs.put("shard", opt);
+          // only write out the collection name if it's not the default (the
+          // core
+          // name)
+          opt = cd.getCollectionName();
+          if (opt != null && !opt.equals(dcore.name)) coreAttribs.put(
+              "collection", opt);
+        }
+        
+        SolrCoreXMLDef solrCoreXMLDef = new SolrCoreXMLDef();
+        solrCoreXMLDef.coreAttribs = coreAttribs;
+        solrCoreXMLDef.coreProperties = dcore.getCoreProperties();
+        solrCoreXMLDefs.add(solrCoreXMLDef);
       }
-    }
-
-    w.write("  </cores>\n");
-    w.write("</solr>\n");
-  }
-
-  private void writeAttribute(Writer w, String name, Object value) throws IOException {
-    if (value == null) return;
-    w.write(" ");
-    w.write(name);
-    w.write("=\"");
-    XML.escapeAttributeValue(value.toString(), w);
-    w.write("\"");
-  }
-  
-  /** Writes the cores configuration node for a given core. */
-  void persist(Writer w, CoreDescriptor dcore) throws IOException {
-    w.write("    <core");
-    writeAttribute(w,"name",dcore.name.equals("") ? defaultCoreName : dcore.name);
-    writeAttribute(w,"instanceDir",dcore.getInstanceDir());
-    //write config (if not default)
-    String opt = dcore.getConfigName();
-    if (opt != null && !opt.equals(dcore.getDefaultConfigName())) {
-      writeAttribute(w, "config",opt);
-    }
-    //write schema (if not default)
-    opt = dcore.getSchemaName();
-    if (opt != null && !opt.equals(dcore.getDefaultSchemaName())) {
-      writeAttribute(w,"schema",opt);
-    }
-    opt = dcore.getPropertiesName();
-    if (opt != null) {
-      writeAttribute(w,"properties",opt);
-    }
-    opt = dcore.dataDir;
-    if (opt != null) writeAttribute(w,"dataDir",opt);
-
-    CloudDescriptor cd = dcore.getCloudDescriptor();
-    if (cd != null) {
-      opt = cd.getShardId();
-      if (opt != null)
-        writeAttribute(w,"shard",opt);
-      // only write out the collection name if it's not the default (the core name)
-      opt = cd.getCollectionName();
-      if (opt != null && !opt.equals(dcore.name))
-        writeAttribute(w,"collection",opt);
-    }
-
-    if (dcore.getCoreProperties() == null || dcore.getCoreProperties().isEmpty())
-      w.write("/>\n"); // core
-    else  {
-      w.write(">\n");
-      writeProperties(w, dcore.getCoreProperties(), "      ");
-      w.write("    </core>\n");
-    }
-  }
-
-  private void writeProperties(Writer w, Properties props, String indent) throws IOException {
-    for (Map.Entry<Object, Object> entry : props.entrySet()) {
-      w.write(indent + "<property");
-      writeAttribute(w,"name",entry.getKey());
-      writeAttribute(w,"value",entry.getValue());
-      w.write("/>\n");
+      
+      SolrXMLDef solrXMLDef = new SolrXMLDef();
+      solrXMLDef.coresDefs = solrCoreXMLDefs;
+      solrXMLDef.containerProperties = containerProperties;
+      solrXMLDef.solrAttribs = rootSolrAttribs;
+      solrXMLDef.coresAttribs = coresAttribs;
+      solrXMLSerializer.persistFile(file == null ? configFile : file,
+          solrXMLDef);
     }
   }
 
-  /** Copies a src file to a dest file:
-   *  used to circumvent the platform discrepancies regarding renaming files.
-   */
-  public static void fileCopy(File src, File dest) throws IOException {
-    IOException xforward = null;
-    FileInputStream fis =  null;
-    FileOutputStream fos = null;
-    FileChannel fcin = null;
-    FileChannel fcout = null;
-    try {
-      fis = new FileInputStream(src);
-      fos = new FileOutputStream(dest);
-      fcin = fis.getChannel();
-      fcout = fos.getChannel();
-      // do the file copy 32Mb at a time
-      final int MB32 = 32*1024*1024;
-      long size = fcin.size();
-      long position = 0;
-      while (position < size) {
-        position += fcin.transferTo(position, MB32, fcout);
-      }
-    } 
-    catch(IOException xio) {
-      xforward = xio;
-    } 
-    finally {
-      if (fis   != null) try { fis.close(); fis = null; } catch(IOException xio) {}
-      if (fos   != null) try { fos.close(); fos = null; } catch(IOException xio) {}
-      if (fcin  != null && fcin.isOpen() ) try { fcin.close();  fcin = null;  } catch(IOException xio) {}
-      if (fcout != null && fcout.isOpen()) try { fcout.close(); fcout = null; } catch(IOException xio) {}
-    }
-    if (xforward != null) {
-      throw xforward;
-    }
-  }
 
   public String getSolrHome() {
     return solrHome;

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrConfig.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrConfig.java Thu Jul  7 09:03:58 2011
@@ -20,11 +20,7 @@ package org.apache.solr.core;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.DOMUtil;
 import org.apache.solr.common.util.RegexFileFilter;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.handler.PingRequestHandler;
 import org.apache.solr.handler.component.SearchComponent;
-import org.apache.solr.request.LocalSolrQueryRequest;
-import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.response.QueryResponseWriter;
 import org.apache.solr.response.transform.TransformerFactory;
@@ -36,7 +32,6 @@ import org.apache.solr.search.ValueSourc
 import org.apache.solr.update.SolrIndexConfig;
 import org.apache.solr.update.processor.UpdateRequestProcessorChain;
 import org.apache.solr.spelling.QueryConverter;
-import org.apache.solr.highlight.SolrHighlighter;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.index.IndexDeletionPolicy;
 import org.apache.lucene.index.codecs.Codec;
@@ -217,7 +212,9 @@ public class SolrConfig extends Config {
     return new UpdateHandlerInfo(get("updateHandler/@class",null),
             getInt("updateHandler/autoCommit/maxDocs",-1),
             getInt("updateHandler/autoCommit/maxTime",-1),
-            getInt("updateHandler/commitIntervalLowerBound",-1));
+            getInt("updateHandler/commitIntervalLowerBound",-1),
+            getInt("updateHandler/autoSoftCommit/maxDocs",-1),
+            getInt("updateHandler/autoSoftCommit/maxTime",-1));
   }
 
   private void loadPluginInfo(Class clazz, String tag, boolean requireName, boolean requireClass) {
@@ -374,7 +371,8 @@ public class SolrConfig extends Config {
 
   public static class UpdateHandlerInfo{
     public final String className;
-    public final int autoCommmitMaxDocs,autoCommmitMaxTime,commitIntervalLowerBound;
+    public final int autoCommmitMaxDocs,autoCommmitMaxTime,commitIntervalLowerBound,
+        autoSoftCommmitMaxDocs,autoSoftCommmitMaxTime;
 
     /**
      * @param className
@@ -382,11 +380,15 @@ public class SolrConfig extends Config {
      * @param autoCommmitMaxTime set -1 as default
      * @param commitIntervalLowerBound set -1 as default
      */
-    public UpdateHandlerInfo(String className, int autoCommmitMaxDocs, int autoCommmitMaxTime, int commitIntervalLowerBound) {
+    public UpdateHandlerInfo(String className, int autoCommmitMaxDocs, int autoCommmitMaxTime, int commitIntervalLowerBound,
+        int autoSoftCommmitMaxDocs, int autoSoftCommmitMaxTime) {
       this.className = className;
       this.autoCommmitMaxDocs = autoCommmitMaxDocs;
       this.autoCommmitMaxTime = autoCommmitMaxTime;
       this.commitIntervalLowerBound = commitIntervalLowerBound;
+      
+      this.autoSoftCommmitMaxDocs = autoSoftCommmitMaxDocs;
+      this.autoSoftCommmitMaxTime = autoSoftCommmitMaxTime;
     } 
   }
 

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrCore.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrCore.java Thu Jul  7 09:03:58 2011
@@ -32,7 +32,6 @@ import org.apache.solr.common.util.Named
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.handler.admin.ShowFileRequestHandler;
 import org.apache.solr.handler.component.*;
-import org.apache.solr.highlight.SolrHighlighter;
 import org.apache.solr.request.*;
 import org.apache.solr.response.*;
 import org.apache.solr.response.transform.TransformerFactory;
@@ -297,6 +296,24 @@ public final class SolrCore implements S
   public void registerResponseWriter( String name, QueryResponseWriter responseWriter ){
     responseWriters.put(name, responseWriter);
   }
+  
+  public SolrCore reload(ClassLoader libLoader) throws IOException, ParserConfigurationException, SAXException {
+    // TODO - null descriptor and what if indexwriter settings have changed
+    SolrResourceLoader solrLoader = new SolrResourceLoader(getResourceLoader()
+        .getInstanceDir(), libLoader, CoreContainer.getCoreProps(
+        getResourceLoader().getInstanceDir(),
+        coreDescriptor.getPropertiesName(), coreDescriptor.getCoreProperties()));
+    SolrConfig config = new SolrConfig(solrLoader,
+        coreDescriptor.getConfigName(), null);
+    
+    IndexSchema schema = new IndexSchema(config,
+        coreDescriptor.getSchemaName(), null);
+    
+    updateHandler.incref();
+    SolrCore core = new SolrCore(coreDescriptor.getName(), null, config,
+        schema, coreDescriptor, updateHandler);
+    return core;
+  }
 
 
   // gets a non-caching searcher
@@ -411,6 +428,32 @@ public final class SolrCore implements S
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " failed to instantiate " +cast.getName(), e, false);
     }
   }
+  
+  private <T extends Object> T createReloadedUpdateHandler(String className, Class<UpdateHandler> class1, String msg, UpdateHandler updateHandler) {
+    Class clazz = null;
+    if (msg == null) msg = "SolrCore Object";
+    try {
+        clazz = getResourceLoader().findClass(className);
+        if (class1 != null && !class1.isAssignableFrom(clazz)) {
+          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " is not a " +class1.getName());
+        }
+      //most of the classes do not have constructors which takes SolrCore argument. It is recommended to obtain SolrCore by implementing SolrCoreAware.
+      // So invariably always it will cause a  NoSuchMethodException. So iterate though the list of available constructors
+        Constructor justSolrCoreCon = null;
+        Constructor[] cons =  clazz.getConstructors();
+        for (Constructor con : cons) {
+          Class[] types = con.getParameterTypes();
+          if(types.length == 2 && types[0] == SolrCore.class && types[1] == UpdateHandler.class){
+            return (T)con.newInstance(this, updateHandler);
+          } 
+        }
+        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " could not find proper constructor for " +class1.getName(), false);
+    } catch (SolrException e) {
+      throw e;
+    } catch (Exception e) {
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " failed to instantiate " +class1.getName(), e, false);
+    }
+  }
 
   public <T extends Object> T createInitInstance(PluginInfo info,Class<T> cast, String msg, String defClassName){
     if(info == null) return null;
@@ -435,6 +478,10 @@ public final class SolrCore implements S
     return createInstance(className, UpdateHandler.class, "Update Handler");
   }
   
+  private UpdateHandler createUpdateHandler(String className, UpdateHandler updateHandler) {
+    return createReloadedUpdateHandler(className, UpdateHandler.class, "Update Handler", updateHandler);
+  }
+  
   /**
    * 
    * @param dataDir
@@ -452,13 +499,30 @@ public final class SolrCore implements S
   /**
    * Creates a new core and register it in the list of cores.
    * If a core with the same name already exists, it will be stopped and replaced by this one.
+   * 
+   * @param name
+   * @param dataDir the index directory
+   * @param config a solr config instance
+   * @param schema a solr schema instance
+   * @param cd
+   * 
+   * @since solr 1.3
+   */
+  public SolrCore(String name, String dataDir, SolrConfig config, IndexSchema schema, CoreDescriptor cd) {
+    this(name, dataDir, config, schema, cd, null);
+  }
+  
+  /**
+   * Creates a new core and register it in the list of cores.
+   * If a core with the same name already exists, it will be stopped and replaced by this one.
    *@param dataDir the index directory
    *@param config a solr config instance
    *@param schema a solr schema instance
+   *@param updateHandler
    *
    *@since solr 1.3
    */
-  public SolrCore(String name, String dataDir, SolrConfig config, IndexSchema schema, CoreDescriptor cd) {
+  public SolrCore(String name, String dataDir, SolrConfig config, IndexSchema schema, CoreDescriptor cd, UpdateHandler updateHandler) {
     coreDescriptor = cd;
     this.setName( name );
     resourceLoader = config.getResourceLoader();
@@ -536,13 +600,22 @@ public final class SolrCore implements S
 
       String updateHandlerClass = solrConfig.getUpdateHandlerInfo().className;
 
-      updateHandler = createUpdateHandler(updateHandlerClass == null ?  DirectUpdateHandler2.class.getName():updateHandlerClass); 
-      infoRegistry.put("updateHandler", updateHandler);
+      if (updateHandler == null) {
+        this.updateHandler = createUpdateHandler(updateHandlerClass == null ? DirectUpdateHandler2.class
+            .getName() : updateHandlerClass);
+      } else {
+        
+        this.updateHandler = createUpdateHandler(
+            updateHandlerClass == null ? DirectUpdateHandler2.class.getName()
+                : updateHandlerClass, updateHandler);
+      }
+      infoRegistry.put("updateHandler", this.updateHandler);
 
       // Finally tell anyone who wants to know
       resourceLoader.inform( resourceLoader );
       resourceLoader.inform( this );  // last call before the latch is released.
     } catch (IOException e) {
+      log.error("", e);
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, null, e, false);
     } finally {
       // allow firstSearcher events to fire
@@ -654,7 +727,7 @@ public final class SolrCore implements S
     if( closeHooks != null ) {
        for( CloseHook hook : closeHooks ) {
          try {
-           hook.close( this );
+           hook.preClose( this );
          } catch (Throwable e) {
            SolrException.log(log, e);           
          }
@@ -693,7 +766,15 @@ public final class SolrCore implements S
       SolrException.log(log,e);
     }
 
-
+    if( closeHooks != null ) {
+       for( CloseHook hook : closeHooks ) {
+         try {
+           hook.postClose( this );
+         } catch (Throwable e) {
+           SolrException.log(log, e);
+         }
+      }
+    }
   }
 
   /** Current core usage count. */
@@ -909,7 +990,10 @@ public final class SolrCore implements S
     }
   }
 
-
+  public RefCounted<SolrIndexSearcher> getSearcher(boolean forceNew, boolean returnSearcher, final Future[] waitSearcher) throws IOException {
+    return getSearcher(forceNew, returnSearcher, waitSearcher, false);
+  }
+  
   /**
    * Get a {@link SolrIndexSearcher} or start the process of creating a new one.
    * <p>
@@ -944,12 +1028,13 @@ public final class SolrCore implements S
    * <tt>null</tt> in which case the SolrIndexSearcher created has already been registered at the time
    * this method returned.
    * <p>
-   * @param forceNew           if true, force the open of a new index searcher regardless if there is already one open.
-   * @param returnSearcher     if true, returns a {@link SolrIndexSearcher} holder with the refcount already incremented.
-   * @param waitSearcher       if non-null, will be filled in with a {@link Future} that will return after the new searcher is registered.
+   * @param forceNew             if true, force the open of a new index searcher regardless if there is already one open.
+   * @param returnSearcher       if true, returns a {@link SolrIndexSearcher} holder with the refcount already incremented.
+   * @param waitSearcher         if non-null, will be filled in with a {@link Future} that will return after the new searcher is registered.
+   * @param updateHandlerReopens if true, the UpdateHandler will be used when reopening a {@link SolrIndexSearcher}.
    * @throws IOException
    */
-  public RefCounted<SolrIndexSearcher> getSearcher(boolean forceNew, boolean returnSearcher, final Future[] waitSearcher) throws IOException {
+  public RefCounted<SolrIndexSearcher> getSearcher(boolean forceNew, boolean returnSearcher, final Future[] waitSearcher, boolean updateHandlerReopens) throws IOException {
     // it may take some time to open an index.... we may need to make
     // sure that two threads aren't trying to open one at the same time
     // if it isn't necessary.
@@ -1016,14 +1101,25 @@ public final class SolrCore implements S
       
       if (newestSearcher != null && solrConfig.reopenReaders
           && indexDirFile.equals(newIndexDirFile)) {
-        IndexReader currentReader = newestSearcher.get().getIndexReader();
-        IndexReader newReader = currentReader.reopen();
-
-        if (newReader == currentReader) {
-          currentReader.incRef();
+        
+        if (updateHandlerReopens) {
+          
+          tmp = getUpdateHandler().reopenSearcher(newestSearcher.get());
+          
+        } else {
+          
+          IndexReader currentReader = newestSearcher.get().getIndexReader();
+          IndexReader newReader;
+          
+          newReader = currentReader.reopen();
+          
+          if (newReader == currentReader) {
+            currentReader.incRef();
+          }
+          
+          tmp = new SolrIndexSearcher(this, schema, "main", newReader, true, true);
         }
 
-        tmp = new SolrIndexSearcher(this, schema, "main", newReader, true, true);
       } else {
         IndexReader reader = getIndexReaderFactory().newReader(getDirectoryFactory().open(newIndexDir), true);
         tmp = new SolrIndexSearcher(this, schema, "main", reader, true, true);

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrEventListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrEventListener.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrEventListener.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrEventListener.java Thu Jul  7 09:03:58 2011
@@ -31,6 +31,8 @@ public interface SolrEventListener exten
 
 
   public void postCommit();
+  
+  public void postSoftCommit();
 
   /** The searchers passed here are only guaranteed to be valid for the duration
    * of this method call, so care should be taken not to spawn threads or asynchronous

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrResourceLoader.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrResourceLoader.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/core/SolrResourceLoader.java Thu Jul  7 09:03:58 2011
@@ -30,6 +30,7 @@ import java.net.URLClassLoader;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.solr.handler.component.ShardHandlerFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -653,7 +654,8 @@ public class SolrResourceLoader implemen
         SolrRequestHandler.class,
         QueryResponseWriter.class,
         SearchComponent.class,
-        UpdateRequestProcessorFactory.class
+        UpdateRequestProcessorFactory.class,
+        ShardHandlerFactory.class
       }
     );
 

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/JsonLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/JsonLoader.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/JsonLoader.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/JsonLoader.java Thu Jul  7 09:03:58 2011
@@ -105,13 +105,13 @@ class JsonLoader extends ContentStreamLo
           }
           else if( v.equals( XmlUpdateRequestHandler.COMMIT ) ) {
             CommitUpdateCommand cmd = new CommitUpdateCommand(req,  false );
-            cmd.waitFlush = cmd.waitSearcher = true;
+            cmd.waitSearcher = true;
             parseCommitOptions( cmd );
             processor.processCommit( cmd );
           }
           else if( v.equals( XmlUpdateRequestHandler.OPTIMIZE ) ) {
             CommitUpdateCommand cmd = new CommitUpdateCommand(req, true );
-            cmd.waitFlush = cmd.waitSearcher = true;
+            cmd.waitSearcher = true;
             parseCommitOptions( cmd );
             processor.processCommit( cmd );
           }
@@ -207,9 +207,6 @@ class JsonLoader extends ContentStreamLo
           if( XmlUpdateRequestHandler.WAIT_SEARCHER.equals( key ) ) {
             cmd.waitSearcher = parser.getBoolean();
           }
-          else if( XmlUpdateRequestHandler.WAIT_FLUSH.equals( key ) ) {
-            cmd.waitFlush = parser.getBoolean();
-          }
           else {
             throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unknown key: "+key+" ["+parser.getPosition()+"]" );
           }

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/PingRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/PingRequestHandler.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/PingRequestHandler.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/PingRequestHandler.java Thu Jul  7 09:03:58 2011
@@ -56,6 +56,11 @@ public class PingRequestHandler extends 
           "Unknown RequestHandler: "+qt );
     }
     
+    if( handler instanceof PingRequestHandler ) {
+      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, 
+          "Cannot execute the PingRequestHandler recursively" );
+    }
+    
     // Execute the ping query and catch any possible exception
     Throwable ex = null;
     try {

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/ReplicationHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/ReplicationHandler.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/ReplicationHandler.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/ReplicationHandler.java Thu Jul  7 09:03:58 2011
@@ -31,7 +31,6 @@ import org.apache.solr.request.SolrQuery
 import org.apache.solr.response.BinaryQueryResponseWriter;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.search.SolrIndexSearcher;
-import org.apache.solr.update.DirectUpdateHandler2;
 import org.apache.solr.util.RefCounted;
 import org.apache.solr.util.plugin.SolrCoreAware;
 import org.apache.commons.io.IOUtils;
@@ -852,12 +851,9 @@ public class ReplicationHandler extends 
               ***/
             }
           }
-          if (core.getUpdateHandler() instanceof DirectUpdateHandler2) {
-            ((DirectUpdateHandler2) core.getUpdateHandler()).forceOpenWriter();
-          } else {
-            LOG.warn("The update handler being used is not an instance or sub-class of DirectUpdateHandler2. " +
-                    "Replicate on Startup cannot work.");
-          } 
+
+          // reboot the writer on the new index
+          core.getUpdateHandler().newIndexWriter();
 
         } catch (IOException e) {
           LOG.warn("Unable to get IndexCommit on startup", e);
@@ -889,11 +885,15 @@ public class ReplicationHandler extends 
    */
   private void registerCloseHook() {
     core.addCloseHook(new CloseHook() {
-      public void close(SolrCore core) {
+      @Override
+      public void preClose(SolrCore core) {
         if (snapPuller != null) {
           snapPuller.destroy();
         }
       }
+
+      @Override
+      public void postClose(SolrCore core) {}
     });
   }
 
@@ -965,6 +965,11 @@ public class ReplicationHandler extends 
       }
 
       public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) { /*no op*/}
+
+      @Override
+      public void postSoftCommit() {
+
+      }
     };
   }
 

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/RequestHandlerUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/RequestHandlerUtils.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/RequestHandlerUtils.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/RequestHandlerUtils.java Thu Jul  7 09:03:58 2011
@@ -66,8 +66,8 @@ public class RequestHandlerUtils
     
     if( optimize || commit || force ) {
       CommitUpdateCommand cmd = new CommitUpdateCommand(req, optimize );
-      cmd.waitFlush    = params.getBool( UpdateParams.WAIT_FLUSH,    cmd.waitFlush    );
       cmd.waitSearcher = params.getBool( UpdateParams.WAIT_SEARCHER, cmd.waitSearcher );
+      cmd.softCommit = params.getBool( UpdateParams.SOFT_COMMIT, cmd.softCommit );
       cmd.expungeDeletes = params.getBool( UpdateParams.EXPUNGE_DELETES, cmd.expungeDeletes);
       cmd.maxOptimizeSegments = params.getInt(UpdateParams.MAX_OPTIMIZE_SEGMENTS, cmd.maxOptimizeSegments);
       req.getCore().getUpdateHandler().commit( cmd );
@@ -100,8 +100,8 @@ public class RequestHandlerUtils
     
     if( optimize || commit || force ) {
       CommitUpdateCommand cmd = new CommitUpdateCommand(req, optimize );
-      cmd.waitFlush    = params.getBool( UpdateParams.WAIT_FLUSH,    cmd.waitFlush    );
       cmd.waitSearcher = params.getBool( UpdateParams.WAIT_SEARCHER, cmd.waitSearcher );
+      cmd.softCommit = params.getBool( UpdateParams.SOFT_COMMIT, cmd.softCommit );
       cmd.expungeDeletes = params.getBool( UpdateParams.EXPUNGE_DELETES, cmd.expungeDeletes);      
       cmd.maxOptimizeSegments = params.getInt(UpdateParams.MAX_OPTIMIZE_SEGMENTS, cmd.maxOptimizeSegments);
       processor.processCommit( cmd );

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/SnapPuller.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/SnapPuller.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/SnapPuller.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/SnapPuller.java Thu Jul  7 09:03:58 2011
@@ -24,17 +24,15 @@ import org.apache.lucene.index.IndexComm
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.FastInputStream;
+import org.apache.solr.common.util.FileUtils;
 import org.apache.solr.common.util.JavaBinCodec;
 import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.FileUtils;
 import org.apache.solr.core.SolrCore;
 import static org.apache.solr.handler.ReplicationHandler.*;
 
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.search.SolrIndexSearcher;
-import org.apache.solr.update.CommitUpdateCommand;
-import org.apache.solr.update.DirectUpdateHandler2;
 import org.apache.solr.util.RefCounted;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,9 +61,6 @@ import java.util.zip.InflaterInputStream
 public class SnapPuller {
   private static final Logger LOG = LoggerFactory.getLogger(SnapPuller.class.getName());
 
-  private static final List<Map<String,Object>> EMPTY_LIST_OF_MAPS 
-    = Collections.emptyList();
-
   private final String masterUrl;
 
   private final ReplicationHandler replicationHandler;
@@ -475,21 +470,15 @@ public class SnapPuller {
   }
 
   private void doCommit() throws IOException {
-    SolrQueryRequest req = new LocalSolrQueryRequest(solrCore, new ModifiableSolrParams());
+    SolrQueryRequest req = new LocalSolrQueryRequest(solrCore,
+        new ModifiableSolrParams());
     try {
-      CommitUpdateCommand cmd = new CommitUpdateCommand(req, false);
-      cmd.waitFlush = true;
-      cmd.waitSearcher = true;
-      solrCore.getUpdateHandler().commit(cmd);
-      if (solrCore.getUpdateHandler() instanceof DirectUpdateHandler2) {
-        LOG.info("Force open index writer to make sure older index files get deleted");
-        DirectUpdateHandler2 handler = (DirectUpdateHandler2) solrCore.getUpdateHandler();
-        handler.forceOpenWriter();
-        replicationHandler.refreshCommitpoint();
-      } else  {
-        LOG.warn("The update handler is not an instance or sub-class of DirectUpdateHandler2. " +
-            "ReplicationHandler may not be able to cleanup un-used index files.");
-      }
+      
+      // reboot the writer on the new index and get a new searcher
+      solrCore.getUpdateHandler().newIndexWriter();
+      solrCore.getSearcher(true, false, null);
+      
+      replicationHandler.refreshCommitpoint();
     } finally {
       req.close();
     }
@@ -605,6 +594,7 @@ public class SnapPuller {
               + " to: " + indexFileInIndex , e);
       }
     }
+
     if (!success) {
       for (String f : copiedfiles) {
         File indexFile = new File(indexDir, f);
@@ -715,11 +705,10 @@ public class SnapPuller {
    */
   private Collection<Map<String, Object>> getModifiedConfFiles(List<Map<String, Object>> confFilesToDownload) {
     if (confFilesToDownload == null || confFilesToDownload.isEmpty())
-      return EMPTY_LIST_OF_MAPS;
-
+      return Collections.EMPTY_LIST;
     //build a map with alias/name as the key
     Map<String, Map<String, Object>> nameVsFile = new HashMap<String, Map<String, Object>>();
-    NamedList<String> names = new NamedList<String>();
+    NamedList names = new NamedList();
     for (Map<String, Object> map : confFilesToDownload) {
       //if alias is present that is the name the file may have in the slave
       String name = (String) (map.get(ALIAS) == null ? map.get(NAME) : map.get(ALIAS));
@@ -737,7 +726,7 @@ public class SnapPuller {
         nameVsFile.remove(name); //checksums are same so the file need not be downloaded
       }
     }
-    return nameVsFile.isEmpty() ? EMPTY_LIST_OF_MAPS : nameVsFile.values();
+    return nameVsFile.isEmpty() ? Collections.EMPTY_LIST : nameVsFile.values();
   }
 
   /**
@@ -800,25 +789,25 @@ public class SnapPuller {
     //make a copy first because it can be null later
     List<Map<String, Object>> tmp = confFilesToDownload;
     //create a new instance. or else iterator may fail
-    return tmp == null ? EMPTY_LIST_OF_MAPS : new ArrayList<Map<String, Object>>(tmp);
+    return tmp == null ? Collections.EMPTY_LIST : new ArrayList<Map<String, Object>>(tmp);
   }
 
   List<Map<String, Object>> getConfFilesDownloaded() {
     //make a copy first because it can be null later
     List<Map<String, Object>> tmp = confFilesDownloaded;
     // NOTE: it's safe to make a copy of a SynchronizedCollection(ArrayList)
-    return tmp == null ? EMPTY_LIST_OF_MAPS : new ArrayList<Map<String, Object>>(tmp);
+    return tmp == null ? Collections.EMPTY_LIST : new ArrayList<Map<String, Object>>(tmp);
   }
 
   List<Map<String, Object>> getFilesToDownload() {
     //make a copy first because it can be null later
     List<Map<String, Object>> tmp = filesToDownload;
-    return tmp == null ? EMPTY_LIST_OF_MAPS : new ArrayList<Map<String, Object>>(tmp);
+    return tmp == null ? Collections.EMPTY_LIST : new ArrayList<Map<String, Object>>(tmp);
   }
 
   List<Map<String, Object>> getFilesDownloaded() {
     List<Map<String, Object>> tmp = filesDownloaded;
-    return tmp == null ? EMPTY_LIST_OF_MAPS : new ArrayList<Map<String, Object>>(tmp);
+    return tmp == null ? Collections.EMPTY_LIST : new ArrayList<Map<String, Object>>(tmp);
   }
 
   Map<String, Object> getCurrentFile() {

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XMLLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XMLLoader.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XMLLoader.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XMLLoader.java Thu Jul  7 09:03:58 2011
@@ -48,7 +48,7 @@ import java.io.IOException;
  **/
 class XMLLoader extends ContentStreamLoader {
   protected UpdateRequestProcessor processor;
-  private XMLInputFactory inputFactory;
+  protected XMLInputFactory inputFactory;
 
   public XMLLoader(UpdateRequestProcessor processor, XMLInputFactory inputFactory) {
     this.processor = processor;
@@ -130,16 +130,13 @@ class XMLLoader extends ContentStreamLoa
 
             CommitUpdateCommand cmd = new CommitUpdateCommand(req, XmlUpdateRequestHandler.OPTIMIZE.equals(currTag));
 
-            boolean sawWaitSearcher = false, sawWaitFlush = false;
             for (int i = 0; i < parser.getAttributeCount(); i++) {
               String attrName = parser.getAttributeLocalName(i);
               String attrVal = parser.getAttributeValue(i);
-              if (XmlUpdateRequestHandler.WAIT_FLUSH.equals(attrName)) {
-                cmd.waitFlush = StrUtils.parseBoolean(attrVal);
-                sawWaitFlush = true;
-              } else if (XmlUpdateRequestHandler.WAIT_SEARCHER.equals(attrName)) {
+              if (XmlUpdateRequestHandler.WAIT_SEARCHER.equals(attrName)) {
                 cmd.waitSearcher = StrUtils.parseBoolean(attrVal);
-                sawWaitSearcher = true;
+              } else if (XmlUpdateRequestHandler.SOFT_COMMIT.equals(attrName)) {
+                cmd.softCommit = StrUtils.parseBoolean(attrVal);
               } else if (UpdateParams.MAX_OPTIMIZE_SEGMENTS.equals(attrName)) {
                 cmd.maxOptimizeSegments = Integer.parseInt(attrVal);
               } else if (UpdateParams.EXPUNGE_DELETES.equals(attrName)) {
@@ -149,11 +146,6 @@ class XMLLoader extends ContentStreamLoa
               }
             }
 
-            // If waitFlush is specified and waitSearcher wasn't, then
-            // clear waitSearcher.
-            if (sawWaitFlush && !sawWaitSearcher) {
-              cmd.waitSearcher = false;
-            }
             processor.processCommit(cmd);
           } // end commit
           else if (XmlUpdateRequestHandler.ROLLBACK.equals(currTag)) {

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java Thu Jul  7 09:03:58 2011
@@ -17,25 +17,15 @@
 
 package org.apache.solr.handler;
 
-import org.apache.solr.common.SolrException;
+import javax.xml.stream.XMLInputFactory;
+
 import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.XML;
 import org.apache.solr.common.util.XMLErrorLogger;
-import org.apache.solr.core.SolrCore;
-import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.update.processor.UpdateRequestProcessor;
-import org.apache.solr.update.processor.UpdateRequestProcessorChain;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamReader;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.HashMap;
-
 /**
  * Add documents to solr using the STAX XML parser.
  */
@@ -52,7 +42,7 @@ public class XmlUpdateRequestHandler ext
   public static final String COMMIT = "commit";
   public static final String ROLLBACK = "rollback";
   public static final String WAIT_SEARCHER = "waitSearcher";
-  public static final String WAIT_FLUSH = "waitFlush";
+  public static final String SOFT_COMMIT = "softCommit";
 
   public static final String OVERWRITE = "overwrite";
   public static final String COMMIT_WITHIN = "commitWithin";

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Thu Jul  7 09:03:58 2011
@@ -18,7 +18,6 @@
 package org.apache.solr.handler.admin;
 
 import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.util.IOUtils;
 import org.apache.solr.cloud.CloudDescriptor;
 import org.apache.solr.common.SolrException;
@@ -28,10 +27,7 @@ import org.apache.solr.common.params.Sol
 import org.apache.solr.common.params.UpdateParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
-import org.apache.solr.core.CoreContainer;
-import org.apache.solr.core.CoreDescriptor;
-import org.apache.solr.core.SolrCore;
-import org.apache.solr.core.DirectoryFactory;
+import org.apache.solr.core.*;
 import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.LocalSolrQueryRequest;
@@ -41,19 +37,19 @@ import org.apache.solr.util.RefCounted;
 import org.apache.solr.update.MergeIndexesCommand;
 import org.apache.solr.update.processor.UpdateRequestProcessor;
 import org.apache.solr.update.processor.UpdateRequestProcessorChain;
-import org.apache.lucene.store.Directory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 
 /**
  *
  * @since solr 1.3
  */
 public class CoreAdminHandler extends RequestHandlerBase {
+  protected static Logger log = LoggerFactory.getLogger(CoreAdminHandler.class);
   protected final CoreContainer coreContainer;
 
   public CoreAdminHandler() {
@@ -397,6 +393,23 @@ public class CoreAdminHandler extends Re
        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
               "No such core exists '"+cname+"'");
     }
+    if (params.getBool(CoreAdminParams.DELETE_INDEX, false)) {
+      core.addCloseHook(new CloseHook() {
+        @Override
+        public void preClose(SolrCore core) {}
+
+        @Override
+        public void postClose(SolrCore core) {
+          File dataDir = new File(core.getIndexDir());
+          for (File file : dataDir.listFiles()) {
+            if (!file.delete()) {
+              log.error(file.getAbsolutePath() + " could not be deleted on core unload");
+            }
+          }
+          if (!dataDir.delete()) log.error(dataDir.getAbsolutePath() + " could not be deleted on core unload");
+        }
+      });
+    }
     core.close();
     return coreContainer.isPersistent();
 

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryComponent.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryComponent.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryComponent.java Thu Jul  7 09:03:58 2011
@@ -126,7 +126,6 @@ public class QueryComponent extends Sear
       throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
     }
 
-    checkDistributed(rb);
   }
 
 
@@ -181,7 +180,7 @@ public class QueryComponent extends Sear
         slices = cloudState.getSlices(cloudDescriptor.getCollectionName());
         rb.slices = slices.keySet().toArray(new String[slices.size()]);
         rb.shards = new String[rb.slices.length];
-        
+
         /***
          rb.slices = new String[slices.size()];
          for (int i=0; i<rb.slices.length; i++) {
@@ -288,6 +287,7 @@ public class QueryComponent extends Sear
       DocListAndSet res = new DocListAndSet();
       res.docList = new DocSlice(0, docs, luceneIds, null, docs, 0);
       if (rb.isNeedDocSet()) {
+        // TODO: create a cache for this!
         List<Query> queries = new ArrayList<Query>();
         queries.add(rb.getQuery());
         List<Query> filters = rb.getFilters();
@@ -435,8 +435,8 @@ public class QueryComponent extends Sear
       }
 
       for (SortField sortField: sortFields) {
-        int type = sortField.getType();
-        if (type==SortField.SCORE || type==SortField.DOC) continue;
+        SortField.Type type = sortField.getType();
+        if (type==SortField.Type.SCORE || type==SortField.Type.DOC) continue;
 
         FieldComparator comparator = null;
         FieldComparator comparators[] = (leaves==null) ? null : new FieldComparator[leaves.length];

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryElevationComponent.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryElevationComponent.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/QueryElevationComponent.java Thu Jul  7 09:03:58 2011
@@ -46,7 +46,6 @@ import org.apache.lucene.index.IndexRead
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.*;
-import org.apache.lucene.util.StringHelper;
 import org.apache.solr.cloud.ZkController;
 import org.apache.lucene.util.BytesRef;
 import org.apache.solr.common.SolrException;
@@ -161,7 +160,7 @@ public class QueryElevationComponent ext
       throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, 
           "QueryElevationComponent requires the schema to have a uniqueKeyField implemented using StrField" );
     }
-    idField = StringHelper.intern(sf.getName());
+    idField = sf.getName();
     
     forceElevation = initArgs.getBool( QueryElevationParams.FORCE_ELEVATION, forceElevation );
     try {
@@ -379,7 +378,7 @@ public class QueryElevationComponent ext
       if( sortSpec.getSort() == null ) {
         sortSpec.setSort( new Sort( new SortField[] {
             new SortField(idField, booster.comparatorSource, false ),
-            new SortField(null, SortField.SCORE, false)
+            new SortField(null, SortField.Type.SCORE, false)
         }));
       }
       else {
@@ -388,12 +387,12 @@ public class QueryElevationComponent ext
         SortField[] current = sortSpec.getSort().getSort();
         ArrayList<SortField> sorts = new ArrayList<SortField>( current.length + 1 );
         // Perhaps force it to always sort by score
-        if( force && current[0].getType() != SortField.SCORE ) {
+        if( force && current[0].getType() != SortField.Type.SCORE ) {
           sorts.add( new SortField(idField, booster.comparatorSource, false ) );
           modify = true;
         }
         for( SortField sf : current ) {
-          if( sf.getType() == SortField.SCORE ) {
+          if( sf.getType() == SortField.Type.SCORE ) {
             sorts.add( new SortField(idField, booster.comparatorSource, sf.getReverse() ) );
             modify = true;
           }

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SearchHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SearchHandler.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SearchHandler.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SearchHandler.java Thu Jul  7 09:03:58 2011
@@ -17,84 +17,45 @@
 
 package org.apache.solr.handler.component;
 
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CompletionService;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorCompletionService;
-import java.util.concurrent.Future;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
-import org.apache.commons.httpclient.params.HttpMethodParams;
 import org.apache.lucene.queryParser.ParseException;
-import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.SolrResponse;
-import org.apache.solr.client.solrj.SolrServer;
-import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
-import org.apache.solr.client.solrj.impl.LBHttpSolrServer;
-import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
-import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.RTimer;
-import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.util.SolrPluginUtils;
+import org.apache.solr.util.plugin.PluginInfoInitialized;
 import org.apache.solr.util.plugin.SolrCoreAware;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.*;
+
 /**
  *
  * Refer SOLR-281
  *
  */
-public class SearchHandler extends RequestHandlerBase implements SolrCoreAware
+public class SearchHandler extends RequestHandlerBase implements SolrCoreAware , PluginInfoInitialized
 {
   static final String INIT_COMPONENTS = "components";
   static final String INIT_FIRST_COMPONENTS = "first-components";
   static final String INIT_LAST_COMPONENTS = "last-components";
 
-  // socket timeout measured in ms, closes a socket if read
-  // takes longer than x ms to complete. throws
-  // java.net.SocketTimeoutException: Read timed out exception
-  static final String INIT_SO_TIMEOUT = "shard-socket-timeout";
-
-  // connection timeout measures in ms, closes a socket if connection
-  // cannot be established within x ms. with a
-  // java.net.SocketTimeoutException: Connection timed out
-  static final String INIT_CONNECTION_TIMEOUT = "shard-connection-timeout";
 
-  // URL scheme to be used in distributed search.
-  static final String INIT_URL_SCHEME = "url-scheme";
   
-  static int soTimeout = 0; //current default values
-  static int connectionTimeout = 0; //current default values
-  public static String scheme = "http://"; //current default values
+
   
   protected static Logger log = LoggerFactory.getLogger(SearchHandler.class);
 
   protected List<SearchComponent> components = null;
+  private ShardHandlerFactory shardHandlerFactory ;
+  private PluginInfo shfInfo;
 
   protected List<String> getDefaultComponents()
   {
@@ -108,6 +69,16 @@ public class SearchHandler extends Reque
     return names;
   }
 
+  public void init(PluginInfo info) {
+    init(info.initArgs);
+    for (PluginInfo child : info.children) {
+      if("shardHandlerFactory".equals(child.type)){
+        this.shfInfo = child;
+        break;
+      }
+    }
+  }
+
   /**
    * Initialize the components based on name.  Note, if using {@link #INIT_FIRST_COMPONENTS} or {@link #INIT_LAST_COMPONENTS},
    * then the {@link DebugComponent} will always occur last.  If this is not desired, then one must explicitly declare all components using
@@ -161,24 +132,12 @@ public class SearchHandler extends Reque
       components.add(dbgCmp);
       log.info("Adding  debug component:" + dbgCmp);
     }
-
-    Object co = initArgs.get(INIT_CONNECTION_TIMEOUT);
-    if (co != null) {
-      connectionTimeout = (Integer) co;
-      log.info("Setting shard-connection-timeout to: " + connectionTimeout);
-    }
-
-    Object so = initArgs.get(INIT_SO_TIMEOUT);
-    if (so != null) {
-      soTimeout = (Integer) so;
-      log.info("Setting shard-socket-timeout to: " + soTimeout);
-    }
-
-    Object urlScheme = initArgs.get(INIT_URL_SCHEME);
-    if (urlScheme != null) {
-      SearchHandler.scheme = (String) urlScheme + "://";
-      log.info("Setting url-scheme to: " + urlScheme);
+    if(shfInfo ==null) {
+      Map m = new HashMap();
+      m.put("class",HttpShardHandlerFactory.class.getName());
+      shfInfo = new PluginInfo("shardHandlerFactory", m,null,Collections.<PluginInfo>emptyList());
     }
+    shardHandlerFactory = core.createInitInstance(shfInfo, ShardHandlerFactory.class, null, null);
   }
 
   public List<SearchComponent> getComponents() {
@@ -204,6 +163,10 @@ public class SearchHandler extends Reque
 
     final RTimer timer = rb.isDebug() ? new RTimer() : null;
 
+
+    ShardHandler shardHandler1 = shardHandlerFactory.getShardHandler();
+    shardHandler1.checkDistributed(rb);
+
     if (timer == null) {
       // non-debugging prepare phase
       for( SearchComponent c : components ) {
@@ -251,8 +214,6 @@ public class SearchHandler extends Reque
     } else {
       // a distributed request
 
-      HttpCommComponent comm = new HttpCommComponent();
-
       if (rb.outgoing == null) {
         rb.outgoing = new LinkedList<ShardRequest>();
       }
@@ -295,13 +256,13 @@ public class SearchHandler extends Reque
                 // we could try and detect when this is needed, but it could be tricky
                 params.set("NOW", Long.toString(rb.requestInfo.getNOW().getTime()));
               }
-              String shardHandler = req.getParams().get(ShardParams.SHARDS_QT);
-              if (shardHandler == null) {
+              String shardQt = req.getParams().get(ShardParams.SHARDS_QT);
+              if (shardQt == null) {
                 params.remove(CommonParams.QT);
               } else {
-                params.set(CommonParams.QT, shardHandler);
+                params.set(CommonParams.QT, shardQt);
               }
-              comm.submit(sreq, shard, params);
+              shardHandler1.submit(sreq, shard, params);
             }
           }
 
@@ -310,13 +271,13 @@ public class SearchHandler extends Reque
           // the outgoing queue, send them out immediately (by exiting
           // this loop)
           while (rb.outgoing.size() == 0) {
-            ShardResponse srsp = comm.takeCompletedOrError();
+            ShardResponse srsp = shardHandler1.takeCompletedOrError();
             if (srsp == null) break;  // no more requests to wait for
 
             // Was there an exception?  If so, abort everything and
             // rethrow
             if (srsp.getException() != null) {
-              comm.cancelAll();
+              shardHandler1.cancelAll();
               if (srsp.getException() instanceof SolrException) {
                 throw (SolrException)srsp.getException();
               } else {
@@ -377,225 +338,4 @@ public class SearchHandler extends Reque
 // TODO: generalize how a comm component can fit into search component framework
 // TODO: statics should be per-core singletons
 
-class HttpCommComponent {
-
-  // We want an executor that doesn't take up any resources if
-  // it's not used, so it could be created statically for
-  // the distributed search component if desired.
-  //
-  // Consider CallerRuns policy and a lower max threads to throttle
-  // requests at some point (or should we simply return failure?)
-  static Executor commExecutor = new ThreadPoolExecutor(
-          0,
-          Integer.MAX_VALUE,
-          5, TimeUnit.SECONDS, // terminate idle threads after 5 sec
-          new SynchronousQueue<Runnable>()  // directly hand off tasks
-  );
-
-
-  static HttpClient client;
-  static Random r = new Random();
-  static LBHttpSolrServer loadbalancer;
-
-  static {
-    MultiThreadedHttpConnectionManager mgr = new MultiThreadedHttpConnectionManager();
-    mgr.getParams().setDefaultMaxConnectionsPerHost(20);
-    mgr.getParams().setMaxTotalConnections(10000);
-    mgr.getParams().setConnectionTimeout(SearchHandler.connectionTimeout);
-    mgr.getParams().setSoTimeout(SearchHandler.soTimeout);
-    // mgr.getParams().setStaleCheckingEnabled(false);
-
-    client = new HttpClient(mgr);
-
-    // prevent retries  (note: this didn't work when set on mgr.. needed to be set on client)
-    DefaultHttpMethodRetryHandler retryhandler = new DefaultHttpMethodRetryHandler(0, false);
-    client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryhandler);
-
-    try {
-      loadbalancer = new LBHttpSolrServer(client);
-    } catch (MalformedURLException e) {
-      // should be impossible since we're not passing any URLs here
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,e);
-    }
-  }
-
-  CompletionService<ShardResponse> completionService = new ExecutorCompletionService<ShardResponse>(commExecutor);
-  Set<Future<ShardResponse>> pending = new HashSet<Future<ShardResponse>>();
-
-  // maps "localhost:8983|localhost:7574" to a shuffled List("http://localhost:8983","http://localhost:7574")
-  // This is primarily to keep track of what order we should use to query the replicas of a shard
-  // so that we use the same replica for all phases of a distributed request.
-  Map<String,List<String>> shardToURLs = new HashMap<String,List<String>>();
-
-  HttpCommComponent() {
-  }
-
-  private static class SimpleSolrResponse extends SolrResponse {
-    long elapsedTime;
-    NamedList<Object> nl;
-    
-    @Override
-    public long getElapsedTime() {
-      return elapsedTime;
-    }
-
-    @Override
-    public NamedList<Object> getResponse() {
-      return nl;
-    }
-
-    @Override
-    public void setResponse(NamedList<Object> rsp) {
-      nl = rsp;
-    }
-  }
-
-
-  // Not thread safe... don't use in Callable.
-  // Don't modify the returned URL list.
-  private List<String> getURLs(String shard) {
-    List<String> urls = shardToURLs.get(shard);
-    if (urls==null) {
-      urls = StrUtils.splitSmart(shard,"|",true);
-
-      // convert shard to URL
-      for (int i=0; i<urls.size(); i++) {
-        urls.set(i, SearchHandler.scheme + urls.get(i));
-      }
-
-      //
-      // Shuffle the list instead of use round-robin by default.
-      // This prevents accidental synchronization where multiple shards could get in sync
-      // and query the same replica at the same time.
-      //
-      if (urls.size() > 1)
-        Collections.shuffle(urls, r);
-      shardToURLs.put(shard, urls);
-    }
-    return urls;
-  }
-
-
-  void submit(final ShardRequest sreq, final String shard, final ModifiableSolrParams params) {
-    // do this outside of the callable for thread safety reasons
-    final List<String> urls = getURLs(shard);
-
-    Callable<ShardResponse> task = new Callable<ShardResponse>() {
-      public ShardResponse call() throws Exception {
-
-        ShardResponse srsp = new ShardResponse();
-        srsp.setShardRequest(sreq);
-        srsp.setShard(shard);
-        SimpleSolrResponse ssr = new SimpleSolrResponse();
-        srsp.setSolrResponse(ssr);
-        long startTime = System.currentTimeMillis();
-
-        try {
-          params.remove(CommonParams.WT); // use default (currently javabin)
-          params.remove(CommonParams.VERSION);
-
-          // SolrRequest req = new QueryRequest(SolrRequest.METHOD.POST, "/select");
-          // use generic request to avoid extra processing of queries
-          QueryRequest req = new QueryRequest(params);
-          req.setMethod(SolrRequest.METHOD.POST);
-
-          // no need to set the response parser as binary is the default
-          // req.setResponseParser(new BinaryResponseParser());
-
-          // if there are no shards available for a slice, urls.size()==0
-          if (urls.size()==0) {
-            // TODO: what's the right error code here? We should use the same thing when
-            // all of the servers for a shard are down.
-            throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, "no servers hosting shard: " + shard);
-          }
 
-          if (urls.size() <= 1) {
-            String url = urls.get(0);
-            srsp.setShardAddress(url);
-            SolrServer server = new CommonsHttpSolrServer(url, client);
-            ssr.nl = server.request(req);
-          } else {
-            LBHttpSolrServer.Rsp rsp = loadbalancer.request(new LBHttpSolrServer.Req(req, urls));
-            ssr.nl = rsp.getResponse();
-            srsp.setShardAddress(rsp.getServer());
-          }
-        } catch (Throwable th) {
-          srsp.setException(th);
-          if (th instanceof SolrException) {
-            srsp.setResponseCode(((SolrException)th).code());
-          } else {
-            srsp.setResponseCode(-1);
-          }
-        }
-
-        ssr.elapsedTime = System.currentTimeMillis() - startTime;
-
-        return srsp;
-      }
-    };
-
-    pending.add( completionService.submit(task) );
-  }
-
-  /** returns a ShardResponse of the last response correlated with a ShardRequest */
-  ShardResponse take() {
-    while (pending.size() > 0) {
-      try {
-        Future<ShardResponse> future = completionService.take();
-        pending.remove(future);
-        ShardResponse rsp = future.get();
-        rsp.getShardRequest().responses.add(rsp);
-        if (rsp.getShardRequest().responses.size() == rsp.getShardRequest().actualShards.length) {
-          return rsp;
-        }
-      } catch (InterruptedException e) {
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
-      } catch (ExecutionException e) {
-        // should be impossible... the problem with catching the exception
-        // at this level is we don't know what ShardRequest it applied to
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Impossible Exception",e);
-      }
-    }
-    return null;
-  }
-
-
-  /** returns a ShardResponse of the last response correlated with a ShardRequest,
-   * or immediately returns a ShardResponse if there was an error detected
-   */
-  ShardResponse takeCompletedOrError() {
-    while (pending.size() > 0) {
-      try {
-        Future<ShardResponse> future = completionService.take();
-        pending.remove(future);
-        ShardResponse rsp = future.get();
-        if (rsp.getException() != null) return rsp; // if exception, return immediately
-        // add response to the response list... we do this after the take() and
-        // not after the completion of "call" so we know when the last response
-        // for a request was received.  Otherwise we might return the same
-        // request more than once.
-        rsp.getShardRequest().responses.add(rsp);
-        if (rsp.getShardRequest().responses.size() == rsp.getShardRequest().actualShards.length) {
-          return rsp;
-        }
-      } catch (InterruptedException e) {
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
-      } catch (ExecutionException e) {
-        // should be impossible... the problem with catching the exception
-        // at this level is we don't know what ShardRequest it applied to
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Impossible Exception",e);
-      }
-    }
-    return null;
-  }
-
-
-  void cancelAll() {
-    for (Future<ShardResponse> future : pending) {
-      // TODO: any issues with interrupting?  shouldn't be if
-      // there are finally blocks to release connections.
-      future.cancel(true);
-    }
-  }
-
-}

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardDoc.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardDoc.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardDoc.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardDoc.java Thu Jul  7 09:03:58 2011
@@ -89,8 +89,8 @@ class ShardFieldSortedHitQueue extends P
     for (int i = 0; i < n; ++i) {
 
       // keep track of the named fields
-      int type = fields[i].getType();
-      if (type!=SortField.SCORE && type!=SortField.DOC) {
+      SortField.Type type = fields[i].getType();
+      if (type!=SortField.Type.SCORE && type!=SortField.Type.DOC) {
         fieldNames.add(fields[i].getField());
       }
 
@@ -98,8 +98,8 @@ class ShardFieldSortedHitQueue extends P
       comparators[i] = getCachedComparator(fieldname, fields[i]
           .getType(), fields[i].getComparatorSource());
 
-     if (fields[i].getType() == SortField.STRING) {
-        this.fields[i] = new SortField(fieldname, SortField.STRING, 
+     if (fields[i].getType() == SortField.Type.STRING) {
+        this.fields[i] = new SortField(fieldname, SortField.Type.STRING,
             fields[i].getReverse());
       } else {
         this.fields[i] = new SortField(fieldname, fields[i].getType(),
@@ -144,16 +144,16 @@ class ShardFieldSortedHitQueue extends P
     return c < 0;
   }
 
-  Comparator getCachedComparator(String fieldname, int type, FieldComparatorSource factory) {
+  Comparator getCachedComparator(String fieldname, SortField.Type type, FieldComparatorSource factory) {
     Comparator comparator = null;
     switch (type) {
-    case SortField.SCORE:
+    case SCORE:
       comparator = comparatorScore(fieldname);
       break;
-    case SortField.STRING:
+    case STRING:
       comparator = comparatorNatural(fieldname);
       break;
-    case SortField.CUSTOM:
+    case CUSTOM:
       if (factory instanceof MissingStringLastComparatorSource){
         comparator = comparatorMissingStringLast(fieldname);
       } else {
@@ -163,7 +163,7 @@ class ShardFieldSortedHitQueue extends P
         // throw new RuntimeException("Custom sort not supported factory is "+factory.getClass());
       }
       break;
-    case SortField.DOC:
+    case DOC:
       // TODO: we can support this!
       throw new RuntimeException("Doc sort not supported");
     default:
@@ -282,4 +282,4 @@ class ShardFieldSortedHitQueue extends P
     };
   }
 
-}
\ No newline at end of file
+}

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardResponse.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardResponse.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardResponse.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/ShardResponse.java Thu Jul  7 09:03:58 2011
@@ -56,12 +56,12 @@ public final class ShardResponse {
     return shard;
   }
 
-  void setShardRequest(ShardRequest rsp)
+  public void setShardRequest(ShardRequest rsp)
   {
     this.req = rsp;
   }
 
-  void setSolrResponse(SolrResponse rsp)
+  public void setSolrResponse(SolrResponse rsp)
   {
     this.rsp = rsp;
   }

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SpellCheckComponent.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SpellCheckComponent.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/SpellCheckComponent.java Thu Jul  7 09:03:58 2011
@@ -702,6 +702,10 @@ public class SpellCheckComponent extends
 
     public void postCommit() {
     }
+
+    @Override
+    public void postSoftCommit() {
+    }
   }
 
   public Map<String, SolrSpellChecker> getSpellCheckers() {

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermVectorComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermVectorComponent.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermVectorComponent.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermVectorComponent.java Thu Jul  7 09:03:58 2011
@@ -5,7 +5,6 @@ import org.apache.lucene.document.Fielda
 import org.apache.lucene.document.SetBasedFieldSelector;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.MultiFields;
-import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermVectorMapper;
 import org.apache.lucene.index.TermVectorOffsetInfo;
 import org.apache.lucene.index.Terms;
@@ -103,8 +102,7 @@ public class TermVectorComponent extends
     allFields.tfIdf = params.getBool(TermVectorParams.TF_IDF, false);
     //boolean cacheIdf = params.getBool(TermVectorParams.IDF, false);
     //short cut to all values.
-    boolean all = params.getBool(TermVectorParams.ALL, false);
-    if (all == true) {
+    if (params.getBool(TermVectorParams.ALL, false)) {
       allFields.termFreq = true;
       allFields.positions = true;
       allFields.offsets = true;
@@ -145,11 +143,11 @@ public class TermVectorComponent extends
             option.tfIdf = params.getFieldBool(field, TermVectorParams.TF_IDF, allFields.tfIdf);
             //Validate these are even an option
             option.positions = params.getFieldBool(field, TermVectorParams.POSITIONS, allFields.positions);
-            if (option.positions == true && sf.storeTermPositions() == false){
+            if (option.positions && !sf.storeTermPositions()){
               noPos.add(field);
             }
             option.offsets = params.getFieldBool(field, TermVectorParams.OFFSETS, allFields.offsets);
-            if (option.offsets == true && sf.storeTermOffsets() == false){
+            if (option.offsets && !sf.storeTermOffsets()){
               noOff.add(field);
             }
           } else {//field doesn't have term vectors
@@ -162,26 +160,26 @@ public class TermVectorComponent extends
       }
     } //else, deal with all fields
     boolean hasWarnings = false;
-    if (noTV.isEmpty() == false) {
+    if (!noTV.isEmpty()) {
       warnings.add("noTermVectors", noTV);
       hasWarnings = true;
     }
-    if (noPos.isEmpty() == false) {
+    if (!noPos.isEmpty()) {
       warnings.add("noPositions", noPos);
       hasWarnings = true;
     }
-    if (noOff.isEmpty() == false) {
+    if (!noOff.isEmpty()) {
       warnings.add("noOffsets", noOff);
       hasWarnings = true;
     }
-    if (hasWarnings == true) {
+    if (hasWarnings) {
       termVectors.add("warnings", warnings);
     }
 
     DocListAndSet listAndSet = rb.getResults();
     List<Integer> docIds = getInts(params.getParams(TermVectorParams.DOC_IDS));
     Iterator<Integer> iter;
-    if (docIds != null && docIds.isEmpty() == false) {
+    if (docIds != null && !docIds.isEmpty()) {
       iter = docIds.iterator();
     } else {
       DocList list = listAndSet.docList;
@@ -218,7 +216,7 @@ public class TermVectorComponent extends
           termVectors.add("uniqueKeyFieldName", uniqFieldName);
         }
       }
-      if (fieldOptions.isEmpty() == false) {
+      if (!fieldOptions.isEmpty()) {
         for (Map.Entry<String, FieldOptions> entry : fieldOptions.entrySet()) {
           mapper.fieldOptions = entry.getValue();
           reader.getTermFreqVector(docId, entry.getKey(), mapper);
@@ -296,7 +294,7 @@ public class TermVectorComponent extends
     private boolean useOffsets, usePositions;
     //private Map<String, Integer> idfCache;
     private NamedList<Object> fieldNL;
-    private Term currentTerm;
+    private String field;
 
 
     public TVMapper(IndexReader reader) {
@@ -310,7 +308,7 @@ public class TermVectorComponent extends
       if (fieldOptions.termFreq == true) {
         termInfo.add("tf", frequency);
       }
-      if (useOffsets == true) {
+      if (useOffsets) {
         NamedList<Number> theOffsets = new NamedList<Number>();
         termInfo.add("offsets", theOffsets);
         for (int i = 0; i < offsets.length; i++) {
@@ -319,17 +317,17 @@ public class TermVectorComponent extends
           theOffsets.add("end", offset.getEndOffset());
         }
       }
-      if (usePositions == true) {
+      if (usePositions) {
         NamedList<Integer> positionsNL = new NamedList<Integer>();
         for (int i = 0; i < positions.length; i++) {
           positionsNL.add("position", positions[i]);
         }
         termInfo.add("positions", positionsNL);
       }
-      if (fieldOptions.docFreq == true) {
+      if (fieldOptions.docFreq) {
         termInfo.add("df", getDocFreq(term));
       }
-      if (fieldOptions.tfIdf == true) {
+      if (fieldOptions.tfIdf) {
         double tfIdfVal = ((double) frequency) / getDocFreq(term);
         termInfo.add("tf-idf", tfIdfVal);
       }
@@ -337,12 +335,11 @@ public class TermVectorComponent extends
 
     private int getDocFreq(BytesRef term) {
       int result = 1;
-      currentTerm = currentTerm.createTerm(term);
       try {
-        Terms terms = MultiFields.getTerms(reader, currentTerm.field());
+        Terms terms = MultiFields.getTerms(reader, field);
         if (terms != null) {
           TermsEnum termsEnum = terms.iterator();
-          if (termsEnum.seek(term) == TermsEnum.SeekStatus.FOUND) {
+          if (termsEnum.seekExact(term, true)) {
             result = termsEnum.docFreq();
           }
         }
@@ -354,10 +351,7 @@ public class TermVectorComponent extends
 
     @Override
     public void setExpectations(String field, int numTerms, boolean storeOffsets, boolean storePositions) {
-
-      if (fieldOptions.docFreq == true && reader != null) {
-        this.currentTerm = new Term(field);
-      }
+      this.field = field;
       useOffsets = storeOffsets && fieldOptions.offsets;
       usePositions = storePositions && fieldOptions.positions;
       fieldNL = new NamedList<Object>();
@@ -366,12 +360,12 @@ public class TermVectorComponent extends
 
     @Override
     public boolean isIgnoringPositions() {
-      return fieldOptions.positions == false;  // if we are not interested in positions, then return true telling Lucene to skip loading them
+      return !fieldOptions.positions;  // if we are not interested in positions, then return true telling Lucene to skip loading them
     }
 
     @Override
     public boolean isIgnoringOffsets() {
-      return fieldOptions.offsets == false;  //  if we are not interested in offsets, then return true telling Lucene to skip loading them
+      return !fieldOptions.offsets;  //  if we are not interested in offsets, then return true telling Lucene to skip loading them
     }
   }
 

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermsComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermsComponent.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermsComponent.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/handler/component/TermsComponent.java Thu Jul  7 09:03:58 2011
@@ -162,7 +162,7 @@ public class TermsComponent extends Sear
      BytesRef term = null;
 
       if (lowerBytes != null) {
-        if (termsEnum.seek(lowerBytes, true) == TermsEnum.SeekStatus.END) {
+        if (termsEnum.seekCeil(lowerBytes, true) == TermsEnum.SeekStatus.END) {
           termsEnum = null;
         } else {
           term = termsEnum.term();

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java Thu Jul  7 09:03:58 2011
@@ -362,6 +362,7 @@ public class DefaultSolrHighlighter exte
         params.getBool( HighlightParams.USE_PHRASE_HIGHLIGHTER, true ),
         // FVH cannot process hl.requireFieldMatch parameter per-field basis
         params.getBool( HighlightParams.FIELD_MATCH, false ) );
+    fvh.setPhraseLimit(params.getInt(HighlightParams.PHRASE_LIMIT, Integer.MAX_VALUE));
     FieldQuery fieldQuery = fvh.getFieldQuery( query );
 
     // Highlight each document

Modified: lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java?rev=1143719&r1=1143718&r2=1143719&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java (original)
+++ lucene/dev/branches/LUCENE2793/solr/src/java/org/apache/solr/request/PerSegmentSingleValuedFaceting.java Thu Jul  7 09:03:58 2011
@@ -157,7 +157,7 @@ class PerSegmentSingleValuedFaceting {
         }
         if (seg.pos < seg.endTermIndex) {
           seg.tenum = seg.si.getTermsEnum();          
-          seg.tenum.seek(seg.pos);
+          seg.tenum.seekExact(seg.pos);
           seg.tempBR = seg.tenum.term();
           queue.add(seg);
         }