You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2012/07/19 17:59:32 UTC

svn commit: r1363400 [25/31] - in /lucene/dev/branches/pforcodec_3892: ./ dev-tools/ dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/.idea/copyright/ dev-tools/idea/.idea/libraries/ dev-tools/idea/lucene/ dev-tools/maven/ dev-tools/maven/lucene...

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/SnapPuller.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/SnapPuller.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/SnapPuller.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/SnapPuller.java Thu Jul 19 15:58:54 2012
@@ -17,23 +17,23 @@
 package org.apache.solr.handler;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
 import org.apache.http.client.HttpClient;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.message.AbstractHttpMessage;
-import org.apache.http.message.BasicNameValuePair;
 import org.apache.lucene.index.IndexCommit;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.store.Directory;
+import org.apache.solr.client.solrj.SolrServer;
+import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
+import org.apache.solr.client.solrj.impl.HttpSolrServer;
+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.SolrParams;
 import org.apache.solr.common.util.FastInputStream;
 import org.apache.solr.util.FileUtils;
-import org.apache.solr.common.util.JavaBinCodec;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.core.CachingDirectoryFactory.CloseListener;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.IndexDeletionPolicyWrapper;
 import static org.apache.solr.handler.ReplicationHandler.*;
@@ -57,7 +57,6 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.zip.Adler32;
 import java.util.zip.Checksum;
-import java.util.zip.GZIPInputStream;
 import java.util.zip.InflaterInputStream;
 
 /**
@@ -116,13 +115,14 @@ public class SnapPuller {
   // HttpClient for this instance if connectionTimeout or readTimeout has been specified
   private final HttpClient myHttpClient;
 
-  private static synchronized HttpClient createHttpClient(String connTimeout, String readTimeout, String httpBasicAuthUser, String httpBasicAuthPassword) {
+  private static synchronized HttpClient createHttpClient(String connTimeout, String readTimeout, String httpBasicAuthUser, String httpBasicAuthPassword, boolean useCompression) {
     if (connTimeout == null && readTimeout == null && client != null)  return client;
     final ModifiableSolrParams httpClientParams = new ModifiableSolrParams();
     httpClientParams.set(HttpClientUtil.PROP_CONNECTION_TIMEOUT, connTimeout != null ? connTimeout : "5000");
     httpClientParams.set(HttpClientUtil.PROP_SO_TIMEOUT, readTimeout != null ? readTimeout : "20000");
     httpClientParams.set(HttpClientUtil.PROP_BASIC_AUTH_USER, httpBasicAuthUser);
     httpClientParams.set(HttpClientUtil.PROP_BASIC_AUTH_PASS, httpBasicAuthPassword);
+    httpClientParams.set(HttpClientUtil.PROP_ALLOW_COMPRESSION, useCompression);
     // Keeping a very high number so that if you have a large number of cores
     // no requests are kept waiting for an idle connection.
     httpClientParams.set(HttpClientUtil.PROP_MAX_CONNECTIONS, 10000);
@@ -132,13 +132,19 @@ public class SnapPuller {
     return httpClient;
   }
 
-  public SnapPuller(NamedList initArgs, ReplicationHandler handler, SolrCore sc) {
+  public SnapPuller(final NamedList initArgs, final ReplicationHandler handler, final SolrCore sc) {
     solrCore = sc;
-    SolrParams params = SolrParams.toSolrParams(initArgs);
-    masterUrl = (String) initArgs.get(MASTER_URL);
+    final SolrParams params = SolrParams.toSolrParams(initArgs);
+    String masterUrl = (String) initArgs.get(MASTER_URL);
     if (masterUrl == null)
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
               "'masterUrl' is required for a slave");
+    if (masterUrl.endsWith("/replication")) {
+      masterUrl = masterUrl.substring(0, masterUrl.length()-12);
+      LOG.warn("'masterUrl' must be specified without the /replication suffix");
+    }
+    this.masterUrl = masterUrl;
+    
     this.replicationHandler = handler;
     pollIntervalStr = (String) initArgs.get(POLL_INTERVAL);
     pollInterval = readInterval(pollIntervalStr);
@@ -149,7 +155,7 @@ public class SnapPuller {
     String readTimeout = (String) initArgs.get(HttpClientUtil.PROP_SO_TIMEOUT);
     String httpBasicAuthUser = (String) initArgs.get(HttpClientUtil.PROP_BASIC_AUTH_USER);
     String httpBasicAuthPassword = (String) initArgs.get(HttpClientUtil.PROP_BASIC_AUTH_PASS);
-    myHttpClient = createHttpClient(connTimeout, readTimeout, httpBasicAuthUser, httpBasicAuthPassword);
+    myHttpClient = createHttpClient(connTimeout, readTimeout, httpBasicAuthUser, httpBasicAuthPassword, useExternal);
     if (pollInterval != null && pollInterval > 0) {
       startExecutorService();
     } else {
@@ -183,95 +189,63 @@ public class SnapPuller {
    */
   @SuppressWarnings("unchecked")
   NamedList getLatestVersion() throws IOException {
-    HttpPost post = new HttpPost(masterUrl);
-    List<BasicNameValuePair> formparams = new ArrayList<BasicNameValuePair>();
-    formparams.add(new BasicNameValuePair("wt", "javabin"));
-    formparams.add(new BasicNameValuePair(COMMAND, CMD_INDEX_VERSION));
-    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
-    post.setEntity(entity);
-    return getNamedListResponse(post);
-  }
-
-  NamedList getCommandResponse(NamedList<String> commands) throws IOException {
-    
-    HttpPost post = new HttpPost(masterUrl);
-
-    List<BasicNameValuePair> formparams = new ArrayList<BasicNameValuePair>();
-    formparams.add(new BasicNameValuePair("wt", "javabin"));
-    
-    for (Map.Entry<String, String> c : commands) {
-      formparams.add(new BasicNameValuePair(c.getKey(), c.getValue()));
-    }
-    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
-    post.setEntity(entity);
-    return getNamedListResponse(post);
-  }
-
-  private NamedList<?> getNamedListResponse(HttpPost method) throws IOException {
-    InputStream input = null;
-    NamedList<?> result = null;
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.set(COMMAND, CMD_INDEX_VERSION);
+    params.set(CommonParams.WT, "javabin");
+    params.set(CommonParams.QT, "/replication");
+    QueryRequest req = new QueryRequest(params);
+    SolrServer server = new HttpSolrServer(masterUrl, myHttpClient); //XXX modify to use shardhandler
     try {
-      HttpResponse response = myHttpClient.execute(method);
-      int status = response.getStatusLine().getStatusCode();
-      if (status != HttpStatus.SC_OK) {
-        throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE,
-                "Request failed for the url " + method);
-      }
-      input = response.getEntity().getContent();
-      result = (NamedList<?>)new JavaBinCodec().unmarshal(input);
-    } finally {
-      try {
-        if (input != null) {
-          input.close();
-        }
-      } catch (Exception e) {
-      }
+      return server.request(req);
+    } catch (SolrServerException e) {
+      throw new IOException(e);
     }
-    return result;
   }
 
   /**
-   * Fetches the list of files in a given index commit point
+   * Fetches the list of files in a given index commit point and updates internal list of files to download.
    */
-  void fetchFileList(long gen) throws IOException {
-    HttpPost post = new HttpPost(masterUrl);
+  private void fetchFileList(long gen) throws IOException {
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.set(COMMAND,  CMD_GET_FILE_LIST);
+    params.set(GENERATION, String.valueOf(gen));
+    params.set(CommonParams.WT, "javabin");
+    params.set(CommonParams.QT, "/replication");
+    QueryRequest req = new QueryRequest(params);
+    SolrServer server = new HttpSolrServer(masterUrl, myHttpClient);  //XXX modify to use shardhandler
+
+    try {
+      NamedList response = server.request(req);
 
-    List<BasicNameValuePair> formparams = new ArrayList<BasicNameValuePair>();
-    formparams.add(new BasicNameValuePair("wt", "javabin"));
-    formparams.add(new BasicNameValuePair(COMMAND, CMD_GET_FILE_LIST));
-    formparams.add(new BasicNameValuePair(GENERATION, String.valueOf(gen)));
-
-    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
-    post.setEntity(entity);
-
-    @SuppressWarnings("unchecked")
-    NamedList<List<Map<String, Object>>> nl 
-      = (NamedList<List<Map<String, Object>>>) getNamedListResponse(post);
-
-    List<Map<String, Object>> f = nl.get(CMD_GET_FILE_LIST);
-    if (f != null)
-      filesToDownload = Collections.synchronizedList(f);
-    else {
-      filesToDownload = Collections.emptyList();
-      LOG.error("No files to download for index generation: "+ gen);
-    }
-
-    f = nl.get(CONF_FILES);
-    if (f != null)
-      confFilesToDownload = Collections.synchronizedList(f);
+      List<Map<String, Object>> files = (List<Map<String,Object>>) response.get(CMD_GET_FILE_LIST);
+      if (files != null)
+        filesToDownload = Collections.synchronizedList(files);
+      else {
+        filesToDownload = Collections.emptyList();
+        LOG.error("No files to download for index generation: "+ gen);
+      }
+
+      files = (List<Map<String,Object>>) response.get(CONF_FILES);
+      if (files != null)
+        confFilesToDownload = Collections.synchronizedList(files);
+
+    } catch (SolrServerException e) {
+      throw new IOException(e);
+    }
   }
 
+  private boolean successfulInstall = false;
+
   /**
    * This command downloads all the necessary files from master to install a index commit point. Only changed files are
    * downloaded. It also downloads the conf files (if they are modified).
    *
    * @param core the SolrCore
+   * @param force force a replication in all cases 
    * @return true on success, false if slave is already in sync
    * @throws IOException if an exception occurs
    */
   @SuppressWarnings("unchecked")
-  boolean successfulInstall = false;
-
   boolean fetchLatestIndex(SolrCore core, boolean force) throws IOException, InterruptedException {
     successfulInstall = false;
     replicationStartTime = System.currentTimeMillis();
@@ -305,7 +279,12 @@ public class SnapPuller {
         if (force && commit.getGeneration() != 0) {
           // since we won't get the files for an empty index,
           // we just clear ours and commit
-          core.getUpdateHandler().getSolrCoreState().getIndexWriter(core).deleteAll();
+          RefCounted<IndexWriter> iw = core.getUpdateHandler().getSolrCoreState().getIndexWriter(core);
+          try {
+            iw.get().deleteAll();
+          } finally {
+            iw.decref();
+          }
           SolrQueryRequest req = new LocalSolrQueryRequest(core,
               new ModifiableSolrParams());
           core.getUpdateHandler().commit(new CommitUpdateCommand(req, false));
@@ -344,9 +323,10 @@ public class SnapPuller {
       LOG.info("Starting download to " + tmpIndexDir + " fullCopy=" + isFullCopyNeeded);
       successfulInstall = false;
       boolean deleteTmpIdxDir = true;
-      File indexDir = null ;
+
+      final File indexDir = new File(core.getIndexDir());
+      Directory oldDirectory = null;
       try {
-        indexDir = new File(core.getIndexDir());
         downloadIndexFiles(isFullCopyNeeded, tmpIndexDir, latestGeneration);
         LOG.info("Total time taken for download : " + ((System.currentTimeMillis() - replicationStartTime) / 1000) + " secs");
         Collection<Map<String, Object>> modifiedConfFiles = getModifiedConfFiles(confFilesToDownload);
@@ -368,14 +348,42 @@ public class SnapPuller {
           if (isFullCopyNeeded) {
             successfulInstall = modifyIndexProps(tmpIndexDir.getName());
             deleteTmpIdxDir =  false;
+            RefCounted<IndexWriter> iw = core.getUpdateHandler().getSolrCoreState().getIndexWriter(core);
+            try {
+               oldDirectory = iw.get().getDirectory();
+            } finally {
+              iw.decref();
+            }
           } else {
             successfulInstall = copyIndexFiles(tmpIndexDir, indexDir);
           }
           if (successfulInstall) {
             logReplicationTimeAndConfFiles(modifiedConfFiles, successfulInstall);
-            doCommit();
           }
         }
+        
+        if (isFullCopyNeeded) {
+          // we have to do this before commit
+          core.getDirectoryFactory().addCloseListener(oldDirectory, new CloseListener(){
+
+            @Override
+            public void onClose() {
+              LOG.info("removing old index directory " + indexDir);
+              delTree(indexDir);
+            }
+            
+          });
+        }
+        
+        if (successfulInstall) {
+          if (isFullCopyNeeded) {
+            // let the system know we are changing dir's and the old one
+            // may be closed
+            core.getDirectoryFactory().doneWithDirectory(oldDirectory);
+          }
+          doCommit();
+        }
+        
         replicationStartTime = 0;
         return successfulInstall;
       } catch (ReplicationHandlerException e) {
@@ -391,10 +399,7 @@ public class SnapPuller {
         if (deleteTmpIdxDir) {
           LOG.info("removing temporary index download directory " + tmpIndexDir);
           delTree(tmpIndexDir);
-        } else {
-          LOG.info("removing old index directory " + indexDir);
-          delTree(indexDir);
-        }
+        } 
       }
     } finally {
       if (!successfulInstall) {
@@ -559,7 +564,7 @@ public class SnapPuller {
    * All the files are copied to a temp dir first
    */
   private File createTempindexDir(SolrCore core) {
-    String tmpIdxDirName = "index." + new SimpleDateFormat(SnapShooter.DATE_FMT, Locale.US).format(new Date());
+    String tmpIdxDirName = "index." + new SimpleDateFormat(SnapShooter.DATE_FMT, Locale.ROOT).format(new Date());
     File tmpIdxDir = new File(core.getDataDir(), tmpIdxDirName);
     tmpIdxDir.mkdirs();
     return tmpIdxDir;
@@ -693,7 +698,7 @@ public class SnapPuller {
   /**
    * Copy all index files from the temp index dir to the actual index. The segments_N file is copied last.
    */
-  private boolean copyIndexFiles(File tmpIdxDir, File indexDir) throws IOException {
+  private boolean copyIndexFiles(File tmpIdxDir, File indexDir) {
     String segmentsFile = null;
     List<String> copiedfiles = new ArrayList<String>();
     for (Map<String, Object> f : filesDownloaded) {
@@ -720,7 +725,7 @@ public class SnapPuller {
   /**
    * The conf files are copied to the tmp dir to the conf dir. A backup of the old file is maintained
    */
-  private void copyTmpConfFiles2Conf(File tmpconfDir) throws IOException {
+  private void copyTmpConfFiles2Conf(File tmpconfDir) {
     File confDir = new File(solrCore.getResourceLoader().getConfigDir());
     for (File file : tmpconfDir.listFiles()) {
       File oldFile = new File(confDir, file.getName());
@@ -742,7 +747,7 @@ public class SnapPuller {
   }
 
   private String getDateAsStr(Date d) {
-    return new SimpleDateFormat(SnapShooter.DATE_FMT, Locale.US).format(d);
+    return new SimpleDateFormat(SnapShooter.DATE_FMT, Locale.ROOT).format(d);
   }
 
   /**
@@ -953,8 +958,6 @@ public class SnapPuller {
 
     private boolean isConf;
 
-    private HttpPost post;
-
     private boolean aborted = false;
 
     private Long indexGen;
@@ -1130,79 +1133,62 @@ public class SnapPuller {
      * Open a new stream using HttpClient
      */
     FastInputStream getStream() throws IOException {
-      post = new HttpPost(masterUrl);
-      //the method is command=filecontent
-      
-      List<BasicNameValuePair> formparams = new ArrayList<BasicNameValuePair>();
-
-      formparams.add(new BasicNameValuePair(COMMAND, CMD_GET_FILE));
+      SolrServer s = new HttpSolrServer(masterUrl, myHttpClient, null);  //XXX use shardhandler
+      ModifiableSolrParams params = new ModifiableSolrParams();
 
+//    //the method is command=filecontent
+      params.set(COMMAND, CMD_GET_FILE);
+      params.set(GENERATION, Long.toString(indexGen));
+      params.set(CommonParams.QT, "/replication");
       //add the version to download. This is used to reserve the download
-      formparams.add(new BasicNameValuePair(GENERATION, indexGen.toString()));
       if (isConf) {
         //set cf instead of file for config file
-        formparams.add(new BasicNameValuePair(CONF_FILE_SHORT, fileName));
+        params.set(CONF_FILE_SHORT, fileName);
       } else {
-        formparams.add(new BasicNameValuePair(FILE, fileName));
+        params.set(FILE, fileName);
       }
       if (useInternal) {
-        formparams.add(new BasicNameValuePair(COMPRESSION, "true"));
-      }
-      if (useExternal) {
-        formparams.add(new BasicNameValuePair("Accept-Encoding", "gzip,deflate"));
+        params.set(COMPRESSION, "internal"); 
       }
       //use checksum
-      if (this.includeChecksum)
-        formparams.add(new BasicNameValuePair(CHECKSUM, "true"));
+      if (this.includeChecksum) {
+        params.set(CHECKSUM, true);
+      }
       //wt=filestream this is a custom protocol
-      formparams.add(new BasicNameValuePair("wt", FILE_STREAM));
-      // This happen if there is a failure there is a retry. the offset=<sizedownloaded> ensures that
-      // the server starts from the offset
+      params.set(CommonParams.WT, FILE_STREAM);
+        // This happen if there is a failure there is a retry. the offset=<sizedownloaded> ensures that
+        // the server starts from the offset
       if (bytesDownloaded > 0) {
-        formparams.add(new BasicNameValuePair(OFFSET, "" + bytesDownloaded));
+        params.set(OFFSET, Long.toString(bytesDownloaded));
       }
       
-      UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
-      post.setEntity(entity);
 
-      HttpResponse response = myHttpClient.execute(post);
-      InputStream is = response.getEntity().getContent();
-      //wrap it using FastInputStream
-      if (useInternal) {
-        is = new InflaterInputStream(is);
-      } else if (useExternal) {
-        is = checkCompressed(post, is);
-      }
-      return new FastInputStream(is);
-    }
-  }
-
-  /*
-   * This is copied from CommonsHttpSolrServer
-   */
-  private InputStream checkCompressed(AbstractHttpMessage method, InputStream respBody) throws IOException {
-    Header contentEncodingHeader = method.getFirstHeader("Content-Encoding");
-    if (contentEncodingHeader != null) {
-      String contentEncoding = contentEncodingHeader.getValue();
-      if (contentEncoding.contains("gzip")) {
-        respBody = new GZIPInputStream(respBody);
-      } else if (contentEncoding.contains("deflate")) {
-        respBody = new InflaterInputStream(respBody);
-      }
-    } else {
-      Header contentTypeHeader = method.getFirstHeader("Content-Type");
-      if (contentTypeHeader != null) {
-        String contentType = contentTypeHeader.getValue();
-        if (contentType != null) {
-          if (contentType.startsWith("application/x-gzip-compressed")) {
-            respBody = new GZIPInputStream(respBody);
-          } else if (contentType.startsWith("application/x-deflate")) {
-            respBody = new InflaterInputStream(respBody);
-          }
+      NamedList response;
+      InputStream is = null;
+      try {
+        QueryRequest req = new QueryRequest(params);
+        response = s.request(req);
+        is = (InputStream) response.get("stream");
+        if(useInternal) {
+          is = new InflaterInputStream(is);
         }
+        return new FastInputStream(is);
+      } catch (Throwable t) {
+        //close stream on error
+        IOUtils.closeQuietly(is);
+        throw new IOException("Could not download file '" + fileName + "'", t);
       }
     }
-    return respBody;
+  }
+  
+  NamedList getDetails() throws IOException, SolrServerException {
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.set(COMMAND, CMD_DETAILS);
+    params.set("slave", false);
+    params.set(CommonParams.QT, "/replication");
+    SolrServer server = new HttpSolrServer(masterUrl, myHttpClient); //XXX use shardhandler
+    QueryRequest request = new QueryRequest(params);
+    return server.request(request);
   }
 
   static Integer readInterval(String interval) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/SnapShooter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/SnapShooter.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/SnapShooter.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/SnapShooter.java Thu Jul 19 15:58:54 2012
@@ -53,7 +53,7 @@ public class SnapShooter {
   private SolrCore solrCore;
   private SimpleFSLockFactory lockFactory;
   
-  public SnapShooter(SolrCore core, String location) throws IOException {
+  public SnapShooter(SolrCore core, String location) {
     solrCore = core;
     if (location == null) snapDir = core.getDataDir();
     else  {
@@ -91,7 +91,7 @@ public class SnapShooter {
       if(numberToKeep<Integer.MAX_VALUE) {
         deleteOldBackups(numberToKeep);
       }
-      SimpleDateFormat fmt = new SimpleDateFormat(DATE_FMT, Locale.US);
+      SimpleDateFormat fmt = new SimpleDateFormat(DATE_FMT, Locale.ROOT);
       directoryName = "snapshot." + fmt.format(new Date());
       lock = lockFactory.makeLock(directoryName + ".lock");
       if (lock.isLocked()) return;
@@ -151,7 +151,7 @@ public class SnapShooter {
         if(m.find()) {
           try {
             this.dir = dir;
-            this.timestamp = new SimpleDateFormat(DATE_FMT).parse(m.group(1));
+            this.timestamp = new SimpleDateFormat(DATE_FMT, Locale.ROOT).parse(m.group(1));
           } catch(Exception e) {
             this.dir = null;
             this.timestamp = null;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Thu Jul 19 15:58:54 2012
@@ -21,17 +21,13 @@ import java.io.File;
 import java.io.IOException;
 import java.util.Date;
 import java.util.Iterator;
-import java.util.Map;
 import java.util.Properties;
-import java.util.Set;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.IOUtils;
-import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.cloud.CloudDescriptor;
-import org.apache.solr.cloud.ZkController;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.CloudState;
@@ -53,8 +49,6 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.handler.component.ShardHandler;
 import org.apache.solr.handler.component.ShardHandlerFactory;
-import org.apache.solr.handler.component.ShardRequest;
-import org.apache.solr.handler.component.ShardResponse;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
@@ -188,11 +182,6 @@ public class CoreAdminHandler extends Re
           break;
         }
         
-        case DISTRIBURL: {
-          this.handleDistribUrlAction(req, rsp);
-          break;
-        }
-        
         default: {
           doPersist = this.handleCustomAction(req, rsp);
           break;
@@ -461,58 +450,102 @@ public class CoreAdminHandler extends Re
    * @return true if a modification has resulted that requires persistance 
    *         of the CoreContainer configuration.
    */
-  protected boolean handleUnloadAction(SolrQueryRequest req, SolrQueryResponse rsp) throws SolrException {
+  protected boolean handleUnloadAction(SolrQueryRequest req,
+      SolrQueryResponse rsp) throws SolrException {
     SolrParams params = req.getParams();
     String cname = params.get(CoreAdminParams.CORE);
     SolrCore core = coreContainer.remove(cname);
-    if(core == null){
-       throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
-          "No such core exists '" + cname + "'");
-    } else {
-      if (coreContainer.getZkController() != null) {
-        log.info("Unregistering core " + cname + " from cloudstate.");
-        try {
-          coreContainer.getZkController().unregister(cname, core.getCoreDescriptor().getCloudDescriptor());
-        } catch (InterruptedException e) {
-          Thread.currentThread().interrupt();
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-              "Could not unregister core " + cname + " from cloudstate: "
-                  + e.getMessage(), e);
-        } catch (KeeperException e) {
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-              "Could not unregister core " + cname + " from cloudstate: "
-                  + e.getMessage(), e);
+    try {
+      if (core == null) {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+            "No such core exists '" + cname + "'");
+      } else {
+        if (coreContainer.getZkController() != null) {
+          log.info("Unregistering core " + core.getName() + " from cloudstate.");
+          try {
+            coreContainer.getZkController().unregister(cname,
+                core.getCoreDescriptor().getCloudDescriptor());
+          } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
+                "Could not unregister core " + cname + " from cloudstate: "
+                    + e.getMessage(), e);
+          } catch (KeeperException e) {
+            throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
+                "Could not unregister core " + cname + " from cloudstate: "
+                    + e.getMessage(), e);
+          }
         }
       }
-    }
-    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());
-          File[] files = dataDir.listFiles();
-          if (files != null) {
-            for (File file : files) {
-              if (!file.delete()) {
-                log.error(file.getAbsolutePath()
-                    + " could not be deleted on core unload");
+      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());
+            File[] files = dataDir.listFiles();
+            if (files != null) {
+              for (File file : files) {
+                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");
+            } else {
+              log.error(dataDir.getAbsolutePath()
+                  + " could not be deleted on core unload");
             }
-            if (!dataDir.delete()) log.error(dataDir.getAbsolutePath()
-                + " could not be deleted on core unload");
-          } else {
-            log.error(dataDir.getAbsolutePath()
-                + " could not be deleted on core unload");
           }
-        }
-      });
+        });
+      }
+      
+      if (params.getBool(CoreAdminParams.DELETE_DATA_DIR, false)) {
+        core.addCloseHook(new CloseHook() {
+          @Override
+          public void preClose(SolrCore core) {}
+          
+          @Override
+          public void postClose(SolrCore core) {
+            File dataDir = new File(core.getDataDir());
+            try {
+              FileUtils.deleteDirectory(dataDir);
+            } catch (IOException e) {
+              SolrException.log(log, "Failed to delete data dir for core:"
+                  + core.getName() + " dir:" + dataDir.getAbsolutePath());
+            }
+          }
+        });
+      }
+      
+      if (params.getBool(CoreAdminParams.DELETE_INSTANCE_DIR, false)) {
+        core.addCloseHook(new CloseHook() {
+          @Override
+          public void preClose(SolrCore core) {}
+          
+          @Override
+          public void postClose(SolrCore core) {
+            CoreDescriptor cd = core.getCoreDescriptor();
+            if (cd != null) {
+              File instanceDir = new File(cd.getInstanceDir());
+              try {
+                FileUtils.deleteDirectory(instanceDir);
+              } catch (IOException e) {
+                SolrException.log(log, "Failed to delete instance dir for core:"
+                    + core.getName() + " dir:" + instanceDir.getAbsolutePath());
+              }
+            }
+          }
+        });
+      }
+    } finally {
+      if (core != null) core.close();
     }
-    core.close();
     return coreContainer.isPersistent();
-
+    
   }
 
   /**
@@ -743,64 +776,6 @@ public class CoreAdminHandler extends Re
     // }
     
   }
-  
-  protected void handleDistribUrlAction(SolrQueryRequest req,
-      SolrQueryResponse rsp) throws IOException, InterruptedException, SolrServerException {
-    // TODO: finish this and tests
-    SolrParams params = req.getParams();
-    final ModifiableSolrParams newParams = new ModifiableSolrParams(params);
-    newParams.remove("action");
-    
-    SolrParams required = params.required();
-    final String subAction = required.get("subAction");
-
-    String collection = required.get("collection");
-    
-    newParams.set(CoreAdminParams.ACTION, subAction);
-
-    
-    SolrCore core = req.getCore();
-    ZkController zkController = core.getCoreDescriptor().getCoreContainer()
-        .getZkController();
-    
-    CloudState cloudState = zkController.getCloudState();
-    Map<String,Slice> slices = cloudState.getCollectionStates().get(collection);
-    for (Map.Entry<String,Slice> entry : slices.entrySet()) {
-      Slice slice = entry.getValue();
-      Map<String,ZkNodeProps> shards = slice.getShards();
-      Set<Map.Entry<String,ZkNodeProps>> shardEntries = shards.entrySet();
-      for (Map.Entry<String,ZkNodeProps> shardEntry : shardEntries) {
-        final ZkNodeProps node = shardEntry.getValue();
-        if (cloudState.liveNodesContain(node.get(ZkStateReader.NODE_NAME_PROP))) {
-          newParams.set(CoreAdminParams.CORE, node.get(ZkStateReader.CORE_NAME_PROP));
-          String replica = node.get(ZkStateReader.BASE_URL_PROP);
-          ShardRequest sreq = new ShardRequest();
-          newParams.set("qt", "/admin/cores");
-          sreq.purpose = 1;
-          // TODO: this sucks
-          if (replica.startsWith("http://"))
-            replica = replica.substring(7);
-          sreq.shards = new String[]{replica};
-          sreq.actualShards = sreq.shards;
-          sreq.params = newParams;
-
-          shardHandler.submit(sreq, replica, sreq.params);
-        }
-      }
-    }
- 
-    ShardResponse srsp;
-    do {
-      srsp = shardHandler.takeCompletedOrError();
-      if (srsp != null) {
-        Throwable e = srsp.getException();
-        if (e != null) {
-          log.error("Error talking to shard: " + srsp.getShard(), e);
-        }
-      }
-    } while(srsp != null);
-    
-  }
 
   protected NamedList<Object> getCoreStatus(CoreContainer cores, String cname) throws IOException {
     NamedList<Object> info = new SimpleOrderedMap<Object>();

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java Thu Jul 19 15:58:54 2012
@@ -101,7 +101,7 @@ public class ShowFileRequestHandler exte
       String[] hidden = invariants.getParams( HIDDEN );
       if( hidden != null ) {
         for( String s : hidden ) {
-          hiddenFiles.add( s.toUpperCase(Locale.ENGLISH) );
+          hiddenFiles.add( s.toUpperCase(Locale.ROOT) );
         }
       }
     }
@@ -138,7 +138,7 @@ public class ShowFileRequestHandler exte
       adminFile = confPath;
     } else {
       fname = fname.replace('\\', '/'); // normalize slashes
-      if (hiddenFiles.contains(fname.toUpperCase(Locale.ENGLISH))) {
+      if (hiddenFiles.contains(fname.toUpperCase(Locale.ROOT))) {
         throw new SolrException(ErrorCode.FORBIDDEN, "Can not access: " + fname);
       }
       if (fname.indexOf("..") >= 0) {
@@ -159,7 +159,7 @@ public class ShowFileRequestHandler exte
       
       NamedList<SimpleOrderedMap<Object>> files = new SimpleOrderedMap<SimpleOrderedMap<Object>>();
       for (String f : children) {
-        if (hiddenFiles.contains(f.toUpperCase(Locale.ENGLISH))) {
+        if (hiddenFiles.contains(f.toUpperCase(Locale.ROOT))) {
           continue; // don't show 'hidden' files
         }
         if (f.startsWith(".")) {
@@ -195,8 +195,7 @@ public class ShowFileRequestHandler exte
     rsp.setHttpCaching(false);
   }
 
-  private void showFromFileSystem(SolrQueryRequest req, SolrQueryResponse rsp)
-      throws IOException {
+  private void showFromFileSystem(SolrQueryRequest req, SolrQueryResponse rsp) {
     File adminFile = null;
     
     final SolrResourceLoader loader = req.getCore().getResourceLoader();
@@ -215,7 +214,7 @@ public class ShowFileRequestHandler exte
     }
     else {
       fname = fname.replace( '\\', '/' ); // normalize slashes
-      if( hiddenFiles.contains( fname.toUpperCase(Locale.ENGLISH) ) ) {
+      if( hiddenFiles.contains( fname.toUpperCase(Locale.ROOT) ) ) {
         throw new SolrException( ErrorCode.FORBIDDEN, "Can not access: "+fname );
       }
       if( fname.indexOf( ".." ) >= 0 ) {
@@ -242,7 +241,7 @@ public class ShowFileRequestHandler exte
       for( File f : adminFile.listFiles() ) {
         String path = f.getAbsolutePath().substring( basePath );
         path = path.replace( '\\', '/' ); // normalize slashes
-        if( hiddenFiles.contains( path.toUpperCase(Locale.ENGLISH) ) ) {
+        if( hiddenFiles.contains( path.toUpperCase(Locale.ROOT) ) ) {
           continue; // don't show 'hidden' files
         }
         if( f.isHidden() || f.getName().startsWith( "." ) ) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java Thu Jul 19 15:58:54 2012
@@ -255,9 +255,9 @@ public class SolrInfoMBeanHandler extend
      .append(ref).append(", Now: ").append(now);
     
     if(ref instanceof Number) {
-      NumberFormat nf = NumberFormat.getIntegerInstance(Locale.ENGLISH);
+      NumberFormat nf = NumberFormat.getIntegerInstance(Locale.ROOT);
       if((ref instanceof Double) || (ref instanceof Float)) {
-        nf = NumberFormat.getInstance(Locale.ENGLISH);
+        nf = NumberFormat.getInstance(Locale.ROOT);
       }
       double dref = ((Number)ref).doubleValue();
       double dnow = ((Number)now).doubleValue();

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java Thu Jul 19 15:58:54 2012
@@ -19,13 +19,16 @@ package org.apache.solr.handler.admin;
 
 import java.io.DataInputStream;
 import java.io.File;
+import java.io.InputStreamReader;
 import java.lang.management.ManagementFactory;
 import java.lang.management.OperatingSystemMXBean;
 import java.lang.management.RuntimeMXBean;
 import java.lang.reflect.Method;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.nio.charset.Charset;
 import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
 import java.util.Date;
 import java.util.Locale;
 
@@ -81,8 +84,7 @@ public class SystemInfoHandler extends R
   /**
    * Get system info
    */
-  private SimpleOrderedMap<Object> getCoreInfo( SolrCore core ) throws Exception 
-  {
+  private SimpleOrderedMap<Object> getCoreInfo( SolrCore core ) {
     SimpleOrderedMap<Object> info = new SimpleOrderedMap<Object>();
     
     IndexSchema schema = core.getSchema();
@@ -110,8 +112,7 @@ public class SystemInfoHandler extends R
   /**
    * Get system info
    */
-  public static SimpleOrderedMap<Object> getSystemInfo() throws Exception 
-  {
+  public static SimpleOrderedMap<Object> getSystemInfo() {
     SimpleOrderedMap<Object> info = new SimpleOrderedMap<Object>();
     
     OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
@@ -133,7 +134,7 @@ public class SystemInfoHandler extends R
     addGetterIfAvaliable( os, "maxFileDescriptorCount", info );
 
     try { 
-      if( !os.getName().toLowerCase(Locale.ENGLISH).startsWith( "windows" ) ) {
+      if( !os.getName().toLowerCase(Locale.ROOT).startsWith( "windows" ) ) {
         // Try some command line things
         info.add( "uname",  execute( "uname -a" ) );
         info.add( "uptime", execute( "uptime" ) );
@@ -182,7 +183,7 @@ public class SystemInfoHandler extends R
       process = Runtime.getRuntime().exec(cmd);
       in = new DataInputStream( process.getInputStream() );
       // use default charset from locale here, because the command invoked also uses the default locale:
-      return IOUtils.toString(in);
+      return IOUtils.toString(new InputStreamReader(in, Charset.defaultCharset()));
     }
     catch( Exception ex ) {
       // ignore - log.warn("Error executing command", ex);
@@ -210,7 +211,7 @@ public class SystemInfoHandler extends R
     jvm.add( "processors", runtime.availableProcessors() );
     
     // not thread safe, but could be thread local
-    DecimalFormat df = new DecimalFormat("#.#");
+    DecimalFormat df = new DecimalFormat("#.#", DecimalFormatSymbols.getInstance(Locale.ROOT));
 
     SimpleOrderedMap<Object> mem = new SimpleOrderedMap<Object>();
     SimpleOrderedMap<Object> raw = new SimpleOrderedMap<Object>();
@@ -255,8 +256,7 @@ public class SystemInfoHandler extends R
     return jvm;
   }
   
-  private static SimpleOrderedMap<Object> getLuceneInfo() throws Exception 
-  {
+  private static SimpleOrderedMap<Object> getLuceneInfo() {
     SimpleOrderedMap<Object> info = new SimpleOrderedMap<Object>();
 
     Package p = SolrCore.class.getPackage();

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java Thu Jul 19 15:58:54 2012
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.lang.management.ThreadInfo;
 import java.lang.management.ThreadMXBean;
+import java.util.Locale;
 
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
@@ -79,8 +80,7 @@ public class ThreadDumpHandler extends R
   //--------------------------------------------------------------------------------
   //--------------------------------------------------------------------------------
   
-  private static SimpleOrderedMap<Object> getThreadInfo( ThreadInfo ti, ThreadMXBean tmbean ) throws IOException 
-  {
+  private static SimpleOrderedMap<Object> getThreadInfo( ThreadInfo ti, ThreadMXBean tmbean ) {
     SimpleOrderedMap<Object> info = new SimpleOrderedMap<Object>();
     long tid = ti.getThreadId();
 
@@ -120,7 +120,7 @@ public class ThreadDumpHandler extends R
   }
   
   private static String formatNanos(long ns) {
-    return String.format("%.4fms", ns / (double) 1000000);
+    return String.format(Locale.ROOT, "%.4fms", ns / (double) 1000000);
   }
 
   //////////////////////// SolrInfoMBeans methods //////////////////////

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java Thu Jul 19 15:58:54 2012
@@ -20,9 +20,11 @@ package org.apache.solr.handler.componen
 import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.util.OpenBitSet;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.FacetParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
@@ -291,7 +293,16 @@ public class FacetComponent extends Sear
 
     for (ShardResponse srsp: sreq.responses) {
       int shardNum = rb.getShardNum(srsp.getShard());
-      NamedList facet_counts = (NamedList)srsp.getSolrResponse().getResponse().get("facet_counts");
+      NamedList facet_counts = null;
+      try {
+        facet_counts = (NamedList)srsp.getSolrResponse().getResponse().get("facet_counts");
+      }
+      catch(Exception ex) {
+        if(rb.req.getParams().getBool(ShardParams.SHARDS_TOLERANT, false)) {
+          continue; // looks like a shard did not return anything
+        }
+        throw new SolrException(ErrorCode.SERVER_ERROR, "Unable to read facet info for shard: "+srsp.getShard(), ex);
+      }
 
       // handle facet queries
       NamedList facet_queries = (NamedList)facet_counts.get("facet_queries");
@@ -439,7 +450,7 @@ public class FacetComponent extends Sear
           long maxCount = sfc.count;
           for (int shardNum=0; shardNum<rb.shards.length; shardNum++) {
             OpenBitSet obs = dff.counted[shardNum];
-            if (!obs.get(sfc.termNum)) {
+            if (obs!=null && !obs.get(sfc.termNum)) {  // obs can be null if a shard request failed
               // if missing from this shard, add the max it could be
               maxCount += dff.maxPossible(sfc,shardNum);
             }
@@ -454,7 +465,7 @@ public class FacetComponent extends Sear
           // add a query for each shard missing the term that needs refinement
           for (int shardNum=0; shardNum<rb.shards.length; shardNum++) {
             OpenBitSet obs = dff.counted[shardNum];
-            if (!obs.get(sfc.termNum) && dff.maxPossible(sfc,shardNum)>0) {
+            if(obs!=null && !obs.get(sfc.termNum) && dff.maxPossible(sfc,shardNum)>0) {
               dff.needRefinements = true;
               List<String> lst = dff._toRefine[shardNum];
               if (lst == null) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java Thu Jul 19 15:58:54 2012
@@ -21,6 +21,7 @@ import org.apache.lucene.document.Field;
 import org.apache.lucene.document.StringField;
 import org.apache.lucene.index.AtomicReaderContext;
 import org.apache.lucene.index.IndexReaderContext;
+import org.apache.lucene.index.ReaderUtil;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.lucene.search.*;
@@ -29,7 +30,6 @@ import org.apache.lucene.search.grouping
 import org.apache.lucene.search.grouping.TopGroups;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.CharsRef;
-import org.apache.lucene.util.ReaderUtil;
 import org.apache.lucene.util.UnicodeUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.common.SolrDocument;
@@ -180,7 +180,7 @@ public class QueryComponent extends Sear
     try {
        responseFormat = Grouping.Format.valueOf(formatStr);
     } catch (IllegalArgumentException e) {
-      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, String.format("Illegal %s parameter", GroupParams.GROUP_FORMAT));
+      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, String.format(Locale.ROOT, "Illegal %s parameter", GroupParams.GROUP_FORMAT));
     }
     groupingSpec.setResponseFormat(responseFormat);
 
@@ -386,7 +386,7 @@ public class QueryComponent extends Sear
         if (grouping.isSignalCacheWarning()) {
           rsp.add(
               "cacheWarning",
-              String.format("Cache limit of %d percent relative to maxdoc has exceeded. Please increase cache size or disable caching.", maxDocsPercentageToCache)
+              String.format(Locale.ROOT, "Cache limit of %d percent relative to maxdoc has exceeded. Please increase cache size or disable caching.", maxDocsPercentageToCache)
           );
         }
         rb.setResult(result);

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java Thu Jul 19 15:58:54 2012
@@ -480,7 +480,7 @@ public class QueryElevationComponent ext
   private SentinelIntSet ordSet; //the key half of the map
   private BytesRef[] termValues;//the value half of the map
 
-  public ElevationComparatorSource(final QueryElevationComponent.ElevationObj elevations) throws IOException {
+  public ElevationComparatorSource(final QueryElevationComponent.ElevationObj elevations) {
     this.elevations = elevations;
     int size = elevations.ids.size();
     ordSet = new SentinelIntSet(size, -1);
@@ -506,7 +506,7 @@ public class QueryElevationComponent ext
         bottomVal = values[slot];
       }
 
-      private int docVal(int doc) throws IOException {
+      private int docVal(int doc) {
         if (ordSet.size() > 0) {
           int slot = ordSet.find(doc);
           if (slot >= 0) {
@@ -519,12 +519,12 @@ public class QueryElevationComponent ext
       }
 
       @Override
-      public int compareBottom(int doc) throws IOException {
+      public int compareBottom(int doc) {
         return bottomVal - docVal(doc);
       }
 
       @Override
-      public void copy(int slot, int doc) throws IOException {
+      public void copy(int slot, int doc) {
         values[slot] = docVal(doc);
       }
 
@@ -562,7 +562,7 @@ public class QueryElevationComponent ext
       }
 
       @Override
-      public int compareDocToValue(int doc, Integer valueObj) throws IOException {
+      public int compareDocToValue(int doc, Integer valueObj) {
         final int value = valueObj.intValue();
         final int docValue = docVal(doc);
         return docValue - value;  // values will be small enough that there is no overflow concern

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/SearchHandler.java Thu Jul 19 15:58:54 2012
@@ -17,7 +17,6 @@
 
 package org.apache.solr.handler.component;
 
-import org.apache.lucene.queryparser.classic.ParseException;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -35,7 +34,10 @@ import org.apache.solr.util.plugin.SolrC
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
 
 /**
  *
@@ -156,7 +158,7 @@ public class SearchHandler extends Reque
   
 
   @Override
-  public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception, ParseException, InstantiationException, IllegalAccessException
+  public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception
   {
     // int sleep = req.getParams().getInt("sleep",0);
     // if (sleep > 0) {log.error("SLEEPING for " + sleep);  Thread.sleep(sleep);}

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java Thu Jul 19 15:58:54 2012
@@ -429,11 +429,11 @@ class StringStatsValues extends Abstract
   }
 
   /**
-   * Determines which of the given Strings is the maximum, as computed by {@link String#compareTo(Object)}
+   * Determines which of the given Strings is the maximum, as computed by {@link String#compareTo(String)}
    *
    * @param str1 String to compare against b
    * @param str2 String compared against a
-   * @return str1 if it is considered greater by {@link String#compareTo(Object)}, str2 otherwise
+   * @return str1 if it is considered greater by {@link String#compareTo(String)}, str2 otherwise
    */
   private static String max(String str1, String str2) {
     if (str1 == null) {
@@ -445,11 +445,11 @@ class StringStatsValues extends Abstract
   }
 
   /**
-   * Determines which of the given Strings is the minimum, as computed by {@link String#compareTo(Object)}
+   * Determines which of the given Strings is the minimum, as computed by {@link String#compareTo(String)}
    *
    * @param str1 String to compare against b
    * @param str2 String compared against a
-   * @return str1 if it is considered less by {@link String#compareTo(Object)}, str2 otherwise
+   * @return str1 if it is considered less by {@link String#compareTo(String)}, str2 otherwise
    */
   private static String min(String str1, String str2) {
     if (str1 == null) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java Thu Jul 19 15:58:54 2012
@@ -92,7 +92,7 @@ public class TermVectorComponent extends
    * <p>
    * Does simple (non-glob-supporting) parsing on the 
    * {@link TermVectorParams#FIELDS} param if specified, otherwise it returns 
-   * the concrete field values specified in {@link CommonParams.FL} -- 
+   * the concrete field values specified in {@link CommonParams#FL} -- 
    * ignoring functions, transformers, or literals.  
    * </p>
    * <p>
@@ -252,22 +252,22 @@ public class TermVectorComponent extends
     // once we find it...
     final StoredFieldVisitor getUniqValue = new StoredFieldVisitor() {
       @Override 
-      public void stringField(FieldInfo fieldInfo, String value) throws IOException {
+      public void stringField(FieldInfo fieldInfo, String value) {
         uniqValues.add(value);
       }
 
       @Override 
-      public void intField(FieldInfo fieldInfo, int value) throws IOException {
+      public void intField(FieldInfo fieldInfo, int value) {
         uniqValues.add(Integer.toString(value));
       }
 
       @Override 
-      public void longField(FieldInfo fieldInfo, long value) throws IOException {
+      public void longField(FieldInfo fieldInfo, long value) {
         uniqValues.add(Long.toString(value));
       }
 
       @Override
-      public Status needsField(FieldInfo fieldInfo) throws IOException {
+      public Status needsField(FieldInfo fieldInfo) {
         return (fieldInfo.name.equals(finalUniqFieldName)) ? Status.YES : Status.NO;
       }
     };

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java Thu Jul 19 15:58:54 2012
@@ -242,7 +242,7 @@ public class TermsComponent extends Sear
       int flags = 0;
       for (String flagParam : flagParams) {
           try {
-            flags |= TermsParams.TermsRegexpFlag.valueOf(flagParam.toUpperCase(Locale.ENGLISH)).getValue();
+            flags |= TermsParams.TermsRegexpFlag.valueOf(flagParam.toUpperCase(Locale.ROOT)).getValue();
           } catch (IllegalArgumentException iae) {
               throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unknown terms regex flag '" + flagParam + "'");
           }

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java Thu Jul 19 15:58:54 2012
@@ -48,7 +48,6 @@ import javax.xml.stream.FactoryConfigura
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.dom.DOMSource;
@@ -190,9 +189,7 @@ public class XMLLoader extends ContentSt
    * @since solr 1.2
    */
   void processUpdate(SolrQueryRequest req, UpdateRequestProcessor processor, XMLStreamReader parser)
-          throws XMLStreamException, IOException, FactoryConfigurationError,
-          InstantiationException, IllegalAccessException,
-          TransformerConfigurationException {
+          throws XMLStreamException, IOException, FactoryConfigurationError {
     AddUpdateCommand addCmd = null;
     SolrParams params = req.getParams();
     while (true) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/highlight/BreakIteratorBoundaryScanner.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/highlight/BreakIteratorBoundaryScanner.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/highlight/BreakIteratorBoundaryScanner.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/highlight/BreakIteratorBoundaryScanner.java Thu Jul 19 15:58:54 2012
@@ -40,22 +40,24 @@ public class BreakIteratorBoundaryScanne
     Locale locale = null;
     if(language != null){
       locale = country == null ? new Locale(language) : new Locale(language, country);
+    } else {
+      locale = Locale.ROOT;
     }
 
     // construct BreakIterator
-    String type = params.getFieldParam(fieldName, HighlightParams.BS_TYPE, "WORD").toLowerCase();
+    String type = params.getFieldParam(fieldName, HighlightParams.BS_TYPE, "WORD").toLowerCase(Locale.ROOT);
     BreakIterator bi = null;
     if(type.equals("character")){
-      bi = locale == null ? BreakIterator.getCharacterInstance() : BreakIterator.getCharacterInstance(locale);
+      bi = BreakIterator.getCharacterInstance(locale);
     }
     else if(type.equals("word")){
-      bi = locale == null ? BreakIterator.getWordInstance() : BreakIterator.getWordInstance(locale);
+      bi = BreakIterator.getWordInstance(locale);
     }
     else if(type.equals("line")){
-      bi = locale == null ? BreakIterator.getLineInstance() : BreakIterator.getLineInstance(locale);
+      bi = BreakIterator.getLineInstance(locale);
     }
     else if(type.equals("sentence")){
-      bi = locale == null ? BreakIterator.getSentenceInstance() : BreakIterator.getSentenceInstance(locale);
+      bi = BreakIterator.getSentenceInstance(locale);
     }
     else
       throw new SolrException(ErrorCode.BAD_REQUEST, type + " is invalid for parameter " + HighlightParams.BS_TYPE);

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java Thu Jul 19 15:58:54 2012
@@ -202,9 +202,8 @@ public class DefaultSolrHighlighter exte
    * @param tokenStream document text CachingTokenStream
    * @param fieldName The name of the field
    * @param request The SolrQueryRequest
-   * @throws IOException 
    */
-  private QueryScorer getSpanQueryScorer(Query query, String fieldName, TokenStream tokenStream, SolrQueryRequest request) throws IOException {
+  private QueryScorer getSpanQueryScorer(Query query, String fieldName, TokenStream tokenStream, SolrQueryRequest request) {
     boolean reqFieldMatch = request.getParams().getFieldBool(fieldName, HighlightParams.FIELD_MATCH, false);
     Boolean highlightMultiTerm = request.getParams().getBool(HighlightParams.HIGHLIGHT_MULTI_TERM, true);
     if(highlightMultiTerm == null) {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/internal/csv/CSVParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/internal/csv/CSVParser.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/internal/csv/CSVParser.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/internal/csv/CSVParser.java Thu Jul 19 15:58:54 2012
@@ -106,16 +106,6 @@ public class CSVParser {
   // ======================================================
   
   /**
-   * Default strategy for the parser follows the default {@link CSVStrategy}.
-   * 
-   * @param input an InputStream containing "csv-formatted" stream
-   * @deprecated use {@link #CSVParser(Reader)}.
-   */
-  public CSVParser(InputStream input) {
-    this(new InputStreamReader(input));
-  }
-  
-  /**
    * CSV parser using the default {@link CSVStrategy}.
    * 
    * @param input a Reader containing "csv-formatted" input

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/internal/csv/writer/CSVConfigGuesser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/internal/csv/writer/CSVConfigGuesser.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/internal/csv/writer/CSVConfigGuesser.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/internal/csv/writer/CSVConfigGuesser.java Thu Jul 19 15:58:54 2012
@@ -22,6 +22,8 @@ import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 
+import org.apache.lucene.util.IOUtils;
+
 /**
  * Tries to guess a config based on an InputStream.
  *
@@ -74,7 +76,7 @@ public class CSVConfigGuesser {
     public CSVConfig guess() {
         try {
             // tralalal
-            BufferedReader bIn = new BufferedReader(new InputStreamReader((getInputStream())));
+            BufferedReader bIn = new BufferedReader(new InputStreamReader(getInputStream(), IOUtils.CHARSET_UTF_8));
             String[] lines = new String[10];
             String line = null;
             int counter = 0;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java Thu Jul 19 15:58:54 2012
@@ -22,9 +22,9 @@ import java.util.Map;
 
 import org.apache.lucene.index.AtomicReaderContext;
 import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.ReaderUtil;
 import org.apache.lucene.queries.function.FunctionValues;
 import org.apache.lucene.queries.function.ValueSource;
-import org.apache.lucene.util.ReaderUtil;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.search.QParser;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/BoolField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/BoolField.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/BoolField.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/BoolField.java Thu Jul 19 15:58:54 2012
@@ -71,9 +71,9 @@ public class BoolField extends Primitive
         boolean done = false;
 
         @Override
-        public void reset(Reader input) throws IOException {
+        public void setReader(Reader input) throws IOException {
           done = false;
-          super.reset(input);
+          super.setReader(input);
         }
 
         @Override

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/DateField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/DateField.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/DateField.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/DateField.java Thu Jul 19 15:58:54 2012
@@ -127,7 +127,7 @@ public class DateField extends Primitive
    * Fixed Locale needed for parsing/formating Milliseconds in the 
    * canonical representation.
    */
-  protected static final Locale CANONICAL_LOCALE = Locale.US;
+  protected static final Locale CANONICAL_LOCALE = Locale.ROOT;
   
   // The XML (external) date format will sort correctly, except if
   // fractions of seconds are present (because '.' is lower than 'Z').

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/IndexSchema.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/IndexSchema.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/IndexSchema.java Thu Jul 19 15:58:54 2012
@@ -20,14 +20,12 @@ package org.apache.solr.schema;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.AnalyzerWrapper;
 import org.apache.lucene.index.IndexableField;
-import org.apache.lucene.search.similarities.DefaultSimilarity;
 import org.apache.lucene.search.similarities.Similarity;
 import org.apache.lucene.util.Version;
 import org.apache.lucene.analysis.util.ResourceLoader;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.util.DOMUtil;
-import org.apache.solr.common.util.NamedList;
 import org.apache.solr.util.SystemIdResolver;
 import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.Config;
@@ -39,11 +37,18 @@ import org.xml.sax.InputSource;
 
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import java.util.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
 /**
  * <code>IndexSchema</code> contains information about the valid fields in an index
  * and the types of those fields.
@@ -435,6 +440,16 @@ public final class IndexSchema {
     }
     if (simFactory instanceof SchemaAware) {
       ((SchemaAware)simFactory).inform(this);
+    } else {
+      // if the sim facotry isn't schema aware, then we are responsible for
+      // erroring if a field type is trying to specify a sim.
+      for (FieldType ft : fieldTypes.values()) {
+        if (null != ft.getSimilarity()) {
+          String msg = "FieldType '" + ft.getTypeName() + "' is configured with a similarity, but the global similarity does not support it: " + simFactory.getClass();
+          log.error(msg);
+          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg);
+        }
+      }
     }
     similarity = simFactory.getSimilarity();
 
@@ -678,7 +693,7 @@ public final class IndexSchema {
     return newArr;
   }
 
-  static SimilarityFactory readSimilarity(ResourceLoader loader, Node node) throws XPathExpressionException {
+  static SimilarityFactory readSimilarity(ResourceLoader loader, Node node) {
     if (node==null) {
       return null;
     } else {

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/JsonPreAnalyzedParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/JsonPreAnalyzedParser.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/JsonPreAnalyzedParser.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/JsonPreAnalyzedParser.java Thu Jul 19 15:58:54 2012
@@ -2,7 +2,7 @@ package org.apache.solr.schema;
 
 import java.io.IOException;
 import java.io.Reader;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -208,7 +208,7 @@ public class JsonPreAnalyzedParser imple
 
   @Override
   public String toFormattedString(Field f) throws IOException {
-    Map<String,Object> map = new HashMap<String,Object>();
+    Map<String,Object> map = new LinkedHashMap<String,Object>();
     map.put(VERSION_KEY, VERSION);
     if (f.fieldType().stored()) {
       String stringValue = f.stringValue();

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/LatLonType.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/LatLonType.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/LatLonType.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/LatLonType.java Thu Jul 19 15:58:54 2012
@@ -485,6 +485,11 @@ class SpatialDistanceQuery extends Exten
       return (float)(dist * qWeight);
     }
 
+    @Override
+    public float freq() throws IOException {
+      return 1;
+    }
+
     public Explanation explain(int doc) throws IOException {
       advance(doc);
       boolean matched = this.doc == doc;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/OpenExchangeRatesOrgProvider.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/OpenExchangeRatesOrgProvider.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/OpenExchangeRatesOrgProvider.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/OpenExchangeRatesOrgProvider.java Thu Jul 19 15:58:54 2012
@@ -26,6 +26,7 @@ import java.util.Set;
 
 import org.apache.noggit.JSONParser;
 import org.apache.lucene.analysis.util.ResourceLoader;
+import org.apache.lucene.util.IOUtils;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.slf4j.Logger;
@@ -181,7 +182,7 @@ public class OpenExchangeRatesOrgProvide
     private JSONParser parser;
     
     public OpenExchangeRates(InputStream ratesStream) throws IOException {
-      parser = new JSONParser(new InputStreamReader(ratesStream));
+      parser = new JSONParser(new InputStreamReader(ratesStream, IOUtils.CHARSET_UTF_8));
       rates = new HashMap<String, Double>();
       
       int ev;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/PreAnalyzedField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/PreAnalyzedField.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/PreAnalyzedField.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/PreAnalyzedField.java Thu Jul 19 15:58:54 2012
@@ -199,7 +199,7 @@ public class PreAnalyzedField extends Fi
     public PreAnalyzedTokenizer(Reader reader, PreAnalyzedParser parser) throws IOException {
       super(reader);
       this.parser = parser;
-      reset(reader);
+      setReader(reader);
     }
     
     public boolean hasTokenStream() {
@@ -214,7 +214,7 @@ public class PreAnalyzedField extends Fi
       return binaryValue;
     }
     
-    public final boolean incrementToken() throws IOException {
+    public final boolean incrementToken() {
       // lazy init the iterator
       if (it == null) {
         it = cachedStates.iterator();
@@ -234,8 +234,8 @@ public class PreAnalyzedField extends Fi
     }
 
     @Override
-    public void reset(Reader input) throws IOException {
-      super.reset(input);
+    public void setReader(Reader input) throws IOException {
+      super.setReader(input);
       cachedStates.clear();
       stringValue = null;
       binaryValue = null;

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/RandomSortField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/RandomSortField.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/RandomSortField.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/RandomSortField.java Thu Jul 19 15:58:54 2012
@@ -23,11 +23,11 @@ import java.util.Map;
 import org.apache.lucene.index.IndexableField;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.AtomicReaderContext;
+import org.apache.lucene.index.ReaderUtil;
 import org.apache.lucene.queries.function.FunctionValues;
 import org.apache.lucene.queries.function.ValueSource;
 import org.apache.lucene.queries.function.docvalues.IntDocValues;
 import org.apache.lucene.search.*;
-import org.apache.lucene.util.ReaderUtil;
 import org.apache.solr.response.TextResponseWriter;
 import org.apache.solr.search.QParser;
 
@@ -102,7 +102,7 @@ public class RandomSortField extends Fie
 
   private static FieldComparatorSource randomComparatorSource = new FieldComparatorSource() {
     @Override
-    public FieldComparator<Integer> newComparator(final String fieldname, final int numHits, int sortPos, boolean reversed) throws IOException {
+    public FieldComparator<Integer> newComparator(final String fieldname, final int numHits, int sortPos, boolean reversed) {
       return new FieldComparator<Integer>() {
         int seed;
         private final int[] values = new int[numHits];
@@ -119,17 +119,17 @@ public class RandomSortField extends Fie
         }
 
         @Override
-        public int compareBottom(int doc) throws IOException {
+        public int compareBottom(int doc) {
           return bottomVal - hash(doc+seed);
         }
 
         @Override
-        public void copy(int slot, int doc) throws IOException {
+        public void copy(int slot, int doc) {
           values[slot] = hash(doc+seed);
         }
 
         @Override
-        public FieldComparator setNextReader(AtomicReaderContext context) throws IOException {
+        public FieldComparator setNextReader(AtomicReaderContext context) {
           seed = getSeed(fieldname, context);
           return this;
         }

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/SimilarityFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/SimilarityFactory.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/SimilarityFactory.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/SimilarityFactory.java Thu Jul 19 15:58:54 2012
@@ -17,8 +17,26 @@ package org.apache.solr.schema;
  */
 
 import org.apache.lucene.search.similarities.Similarity;
+import org.apache.solr.schema.SchemaAware; // javadocs
+import org.apache.solr.schema.FieldType; // javadocs
 import org.apache.solr.common.params.SolrParams;
 
+
+/**
+ * A factory interface for configuring a {@link Similarity} in the Solr 
+ * schema.xml.  
+ * 
+ * <p>
+ * Subclasses of <code>SimilarityFactory</code> which are {@link SchemaAware} 
+ * must take responsibility for either consulting the similarities configured 
+ * on individual field types, or generating appropriate error/warning messages 
+ * if field type specific similarities exist but are being ignored.  The 
+ * <code>IndexSchema</code> will provide such error checking if a 
+ * non-<code>SchemaAware</code> instance of <code>SimilarityFactory</code> 
+ * is used.
+ * 
+ * @see FieldType#getSimilarity
+ */
 public abstract class SimilarityFactory {
   protected SolrParams params;
 

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/TextField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/TextField.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/TextField.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/TextField.java Thu Jul 19 15:58:54 2012
@@ -186,11 +186,7 @@ public class TextField extends FieldType
     PositionIncrementAttribute posIncrAtt = null;
     int numTokens = 0;
 
-    try {
-      buffer.reset();
-    } catch (IOException e) {
-      throw new RuntimeException("Unable to initialize TokenStream to analyze query text", e);
-    }
+    buffer.reset();
 
     if (buffer.hasAttribute(CharTermAttribute.class)) {
       termAtt = buffer.getAttribute(CharTermAttribute.class);

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/TrieField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/TrieField.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/TrieField.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/TrieField.java Thu Jul 19 15:58:54 2012
@@ -96,7 +96,7 @@ public class TrieField extends Primitive
 
     if (t != null) {
       try {
-        type = TrieTypes.valueOf(t.toUpperCase(Locale.ENGLISH));
+        type = TrieTypes.valueOf(t.toUpperCase(Locale.ROOT));
       } catch (IllegalArgumentException e) {
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
                 "Invalid type specified in schema.xml for field: " + args.get("name"), e);

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/UUIDField.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/UUIDField.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/UUIDField.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/schema/UUIDField.java Thu Jul 19 15:58:54 2012
@@ -70,7 +70,7 @@ public class UUIDField extends StrField 
   @Override
   public String toInternal(String val) {
     if (val == null || 0==val.length() || NEW.equals(val)) {
-      return UUID.randomUUID().toString().toLowerCase(Locale.ENGLISH);
+      return UUID.randomUUID().toString().toLowerCase(Locale.ROOT);
     } else {
       // we do some basic validation if 'val' looks like an UUID
       if (val.length() != 36 || val.charAt(8) != DASH || val.charAt(13) != DASH
@@ -79,12 +79,12 @@ public class UUIDField extends StrField 
             "Invalid UUID String: '" + val + "'");
       }
 
-      return val.toLowerCase(Locale.ENGLISH);
+      return val.toLowerCase(Locale.ROOT);
     }
   }
 
   public String toInternal(UUID uuid) {
-    return uuid.toString().toLowerCase(Locale.ENGLISH);
+    return uuid.toString().toLowerCase(Locale.ROOT);
   }
 
   @Override

Modified: lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/BitDocSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/BitDocSet.java?rev=1363400&r1=1363399&r2=1363400&view=diff
==============================================================================
--- lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/BitDocSet.java (original)
+++ lucene/dev/branches/pforcodec_3892/solr/core/src/java/org/apache/solr/search/BitDocSet.java Thu Jul 19 15:58:54 2012
@@ -18,7 +18,6 @@
 package org.apache.solr.search;
 
 import org.apache.lucene.index.AtomicReader;
-import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.AtomicReaderContext;
 import org.apache.lucene.search.BitsFilteredDocIdSet;
 import org.apache.lucene.search.DocIdSet;
@@ -28,8 +27,6 @@ import org.apache.lucene.util.OpenBitSet
 import org.apache.lucene.util.OpenBitSetIterator;
 import org.apache.lucene.search.DocIdSetIterator;
 
-import java.io.IOException;
-
 /**
  * <code>BitDocSet</code> represents an unordered set of Lucene Document Ids
  * using a BitSet.  A set bit represents inclusion in the set for that document.
@@ -249,7 +246,7 @@ public class BitDocSet extends DocSetBas
 
     return new Filter() {
       @Override
-      public DocIdSet getDocIdSet(final AtomicReaderContext context, final Bits acceptDocs) throws IOException {
+      public DocIdSet getDocIdSet(final AtomicReaderContext context, final Bits acceptDocs) {
         AtomicReader reader = context.reader();
         // all Solr DocSets that are used as filters only include live docs
         final Bits acceptDocs2 = acceptDocs == null ? null : (reader.getLiveDocs() == acceptDocs ? null : acceptDocs);
@@ -264,7 +261,7 @@ public class BitDocSet extends DocSetBas
 
         return BitsFilteredDocIdSet.wrap(new DocIdSet() {
           @Override
-          public DocIdSetIterator iterator() throws IOException {
+          public DocIdSetIterator iterator() {
             return new DocIdSetIterator() {
               int pos=base-1;
               int adjustedDoc=-1;
@@ -275,13 +272,13 @@ public class BitDocSet extends DocSetBas
               }
 
               @Override
-              public int nextDoc() throws IOException {
+              public int nextDoc() {
                 pos = bs.nextSetBit(pos+1);
                 return adjustedDoc = (pos>=0 && pos<max) ? pos-base : NO_MORE_DOCS;
               }
 
               @Override
-              public int advance(int target) throws IOException {
+              public int advance(int target) {
                 if (target==NO_MORE_DOCS) return adjustedDoc=NO_MORE_DOCS;
                 pos = bs.nextSetBit(target+base);
                 return adjustedDoc = (pos>=0 && pos<max) ? pos-base : NO_MORE_DOCS;
@@ -295,7 +292,7 @@ public class BitDocSet extends DocSetBas
           }
 
           @Override
-          public Bits bits() throws IOException {
+          public Bits bits() {
             return new Bits() {
               @Override
               public boolean get(int index) {