You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rj...@apache.org on 2015/03/31 07:22:50 UTC

svn commit: r1670257 [37/39] - in /lucene/dev/branches/lucene6271: ./ dev-tools/ dev-tools/idea/.idea/libraries/ dev-tools/scripts/ lucene/ lucene/analysis/ lucene/analysis/common/ lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneou...

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java Tue Mar 31 05:22:40 2015
@@ -21,7 +21,6 @@ import org.apache.http.Header;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
 import org.apache.http.NameValuePair;
-import org.apache.http.NoHttpResponseException;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
@@ -43,15 +42,12 @@ import org.apache.http.message.BasicHead
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
 import org.apache.solr.client.solrj.ResponseParser;
-import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.RequestWriter;
-import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.client.solrj.util.ClientUtils;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
@@ -78,6 +74,27 @@ import java.util.concurrent.ExecutorServ
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 
+/**
+ * A SolrClient implementation that talks directly to a Solr server via HTTP
+ *
+ * There are two ways to use an HttpSolrClient:
+ *
+ * 1) Pass a URL to the constructor that points directly at a particular core
+ * <pre>
+ *   SolrClient client = new HttpSolrClient("http://my-solr-server:8983/solr/core1");
+ *   QueryResponse resp = client.query(new SolrQuery("*:*"));
+ * </pre>
+ * In this case, you can query the given core directly, but you cannot query any other
+ * cores or issue CoreAdmin requests with this client.
+ *
+ * 2) Pass the base URL of the node to the constructor
+ * <pre>
+ *   SolrClient client = new HttpSolrClient("http://my-solr-server:8983/solr");
+ *   QueryResponse resp = client.query("core1", new SolrQuery("*:*"));
+ * </pre>
+ * In this case, you must pass the name of the required core for all queries and updates,
+ * but you may use the same client for all cores, and for CoreAdmin requests.
+ */
 public class HttpSolrClient extends SolrClient {
 
   private static final String UTF_8 = StandardCharsets.UTF_8.name();
@@ -125,8 +142,6 @@ public class HttpSolrClient extends Solr
   
   private volatile boolean followRedirects = false;
   
-  private volatile int maxRetries = 0;
-  
   private volatile boolean useMultiPartPost;
   private final boolean internalClient;
 
@@ -201,17 +216,21 @@ public class HttpSolrClient extends Solr
    *      org.apache.solr.client.solrj.ResponseParser)
    */
   @Override
-  public NamedList<Object> request(final SolrRequest request)
+  public NamedList<Object> request(final SolrRequest request, String collection)
       throws SolrServerException, IOException {
     ResponseParser responseParser = request.getResponseParser();
     if (responseParser == null) {
       responseParser = parser;
     }
-    return request(request, responseParser);
+    return request(request, responseParser, collection);
   }
-  
+
   public NamedList<Object> request(final SolrRequest request, final ResponseParser processor) throws SolrServerException, IOException {
-    return executeMethod(createMethod(request),processor);
+    return request(request, processor, null);
+  }
+  
+  public NamedList<Object> request(final SolrRequest request, final ResponseParser processor, String collection) throws SolrServerException, IOException {
+    return executeMethod(createMethod(request, collection),processor);
   }
   
   /**
@@ -239,7 +258,7 @@ public class HttpSolrClient extends Solr
    */
   public HttpUriRequestResponse httpUriRequest(final SolrRequest request, final ResponseParser processor) throws SolrServerException, IOException {
     HttpUriRequestResponse mrr = new HttpUriRequestResponse();
-    final HttpRequestBase method = createMethod(request);
+    final HttpRequestBase method = createMethod(request, null);
     ExecutorService pool = Executors.newFixedThreadPool(1, new SolrjNamedThreadFactory("httpUriRequest"));
     try {
       mrr.future = pool.submit(new Callable<NamedList<Object>>(){
@@ -274,9 +293,8 @@ public class HttpSolrClient extends Solr
     return queryModParams;
   }
 
-  protected HttpRequestBase createMethod(final SolrRequest request) throws IOException, SolrServerException {
-    HttpRequestBase method = null;
-    InputStream is = null;
+  protected HttpRequestBase createMethod(final SolrRequest request, String collection) throws IOException, SolrServerException {
+
     SolrParams params = request.getParams();
     Collection<ContentStream> streams = requestWriter.getContentStreams(request);
     String path = requestWriter.getPath(request);
@@ -299,158 +317,138 @@ public class HttpSolrClient extends Solr
     if (invariantParams != null) {
       wparams.add(invariantParams);
     }
-    
-    int tries = maxRetries + 1;
-    try {
-      while( tries-- > 0 ) {
-        // Note: since we aren't do intermittent time keeping
-        // ourselves, the potential non-timeout latency could be as
-        // much as tries-times (plus scheduling effects) the given
-        // timeAllowed.
-        try {
-          if( SolrRequest.METHOD.GET == request.getMethod() ) {
-            if( streams != null ) {
-              throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "GET can't send streams!" );
-            }
-            method = new HttpGet( baseUrl + path + ClientUtils.toQueryString( wparams, false ) );
-          }
-          else if( SolrRequest.METHOD.POST == request.getMethod() || SolrRequest.METHOD.PUT == request.getMethod() ) {
 
-            String url = baseUrl + path;
-            boolean hasNullStreamName = false;
-            if (streams != null) {
-              for (ContentStream cs : streams) {
-                if (cs.getName() == null) {
-                  hasNullStreamName = true;
-                  break;
-                }
-              }
-            }
-            boolean isMultipart = ((this.useMultiPartPost && SolrRequest.METHOD.POST == request.getMethod())
-              || ( streams != null && streams.size() > 1 )) && !hasNullStreamName;
-
-            LinkedList<NameValuePair> postOrPutParams = new LinkedList<>();
-            if (streams == null || isMultipart) {
-              // send server list and request list as query string params
-              ModifiableSolrParams queryParams = calculateQueryParams(this.queryParams, wparams);
-              queryParams.add(calculateQueryParams(request.getQueryParams(), wparams));
-              String fullQueryUrl = url + ClientUtils.toQueryString( queryParams, false );
-              HttpEntityEnclosingRequestBase postOrPut = SolrRequest.METHOD.POST == request.getMethod() ?
-                new HttpPost(fullQueryUrl) : new HttpPut(fullQueryUrl);
-              if (!isMultipart) {
-                postOrPut.addHeader("Content-Type",
-                    "application/x-www-form-urlencoded; charset=UTF-8");
-              }
+    String basePath = baseUrl;
+    if (collection != null)
+      basePath += "/" + collection;
+
+    if (SolrRequest.METHOD.GET == request.getMethod()) {
+      if (streams != null) {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "GET can't send streams!");
+      }
+      return new HttpGet(basePath + path + ClientUtils.toQueryString(wparams, false));
+    }
+
+    if (SolrRequest.METHOD.POST == request.getMethod() || SolrRequest.METHOD.PUT == request.getMethod()) {
+
+      String url = basePath + path;
+      boolean hasNullStreamName = false;
+      if (streams != null) {
+        for (ContentStream cs : streams) {
+          if (cs.getName() == null) {
+            hasNullStreamName = true;
+            break;
+          }
+        }
+      }
+      boolean isMultipart = ((this.useMultiPartPost && SolrRequest.METHOD.POST == request.getMethod())
+          || (streams != null && streams.size() > 1)) && !hasNullStreamName;
 
-              List<FormBodyPart> parts = new LinkedList<>();
-              Iterator<String> iter = wparams.getParameterNamesIterator();
-              while (iter.hasNext()) {
-                String p = iter.next();
-                String[] vals = wparams.getParams(p);
-                if (vals != null) {
-                  for (String v : vals) {
-                    if (isMultipart) {
-                      parts.add(new FormBodyPart(p, new StringBody(v, StandardCharsets.UTF_8)));
-                    } else {
-                      postOrPutParams.add(new BasicNameValuePair(p, v));
-                    }
-                  }
-                }
-              }
+      LinkedList<NameValuePair> postOrPutParams = new LinkedList<>();
+      if (streams == null || isMultipart) {
+        // send server list and request list as query string params
+        ModifiableSolrParams queryParams = calculateQueryParams(this.queryParams, wparams);
+        queryParams.add(calculateQueryParams(request.getQueryParams(), wparams));
+        String fullQueryUrl = url + ClientUtils.toQueryString(queryParams, false);
+        HttpEntityEnclosingRequestBase postOrPut = SolrRequest.METHOD.POST == request.getMethod() ?
+            new HttpPost(fullQueryUrl) : new HttpPut(fullQueryUrl);
+        if (!isMultipart) {
+          postOrPut.addHeader("Content-Type",
+              "application/x-www-form-urlencoded; charset=UTF-8");
+        }
 
-              if (isMultipart && streams != null) {
-                for (ContentStream content : streams) {
-                  String contentType = content.getContentType();
-                  if(contentType==null) {
-                    contentType = BinaryResponseParser.BINARY_CONTENT_TYPE; // default
-                  }
-                  String name = content.getName();
-                  if(name==null) {
-                    name = "";
-                  }
-                  parts.add(new FormBodyPart(name, 
-                       new InputStreamBody(
-                           content.getStream(), 
-                           contentType, 
-                           content.getName())));
-                }
-              }
-              
-              if (parts.size() > 0) {
-                MultipartEntity entity = new MultipartEntity(HttpMultipartMode.STRICT);
-                for(FormBodyPart p: parts) {
-                  entity.addPart(p);
-                }
-                postOrPut.setEntity(entity);
+        List<FormBodyPart> parts = new LinkedList<>();
+        Iterator<String> iter = wparams.getParameterNamesIterator();
+        while (iter.hasNext()) {
+          String p = iter.next();
+          String[] vals = wparams.getParams(p);
+          if (vals != null) {
+            for (String v : vals) {
+              if (isMultipart) {
+                parts.add(new FormBodyPart(p, new StringBody(v, StandardCharsets.UTF_8)));
               } else {
-                //not using multipart
-                postOrPut.setEntity(new UrlEncodedFormEntity(postOrPutParams, StandardCharsets.UTF_8));
+                postOrPutParams.add(new BasicNameValuePair(p, v));
               }
+            }
+          }
+        }
 
-              method = postOrPut;
+        if (isMultipart && streams != null) {
+          for (ContentStream content : streams) {
+            String contentType = content.getContentType();
+            if (contentType == null) {
+              contentType = BinaryResponseParser.BINARY_CONTENT_TYPE; // default
             }
-            // It is has one stream, it is the post body, put the params in the URL
-            else {
-              String pstr = ClientUtils.toQueryString(wparams, false);
-              HttpEntityEnclosingRequestBase postOrPut = SolrRequest.METHOD.POST == request.getMethod() ?
-                new HttpPost(url + pstr) : new HttpPut(url + pstr);
-
-              // Single stream as body
-              // Using a loop just to get the first one
-              final ContentStream[] contentStream = new ContentStream[1];
-              for (ContentStream content : streams) {
-                contentStream[0] = content;
-                break;
-              }
-              if (contentStream[0] instanceof RequestWriter.LazyContentStream) {
-                postOrPut.setEntity(new InputStreamEntity(contentStream[0].getStream(), -1) {
-                  @Override
-                  public Header getContentType() {
-                    return new BasicHeader("Content-Type", contentStream[0].getContentType());
-                  }
-                  
-                  @Override
-                  public boolean isRepeatable() {
-                    return false;
-                  }
-                  
-                });
-              } else {
-                postOrPut.setEntity(new InputStreamEntity(contentStream[0].getStream(), -1) {
-                  @Override
-                  public Header getContentType() {
-                    return new BasicHeader("Content-Type", contentStream[0].getContentType());
-                  }
-                  
-                  @Override
-                  public boolean isRepeatable() {
-                    return false;
-                  }
-                });
-              }
-              method = postOrPut;
+            String name = content.getName();
+            if (name == null) {
+              name = "";
             }
-          }
-          else {
-            throw new SolrServerException("Unsupported method: "+request.getMethod() );
+            parts.add(new FormBodyPart(name,
+                new InputStreamBody(
+                    content.getStream(),
+                    contentType,
+                    content.getName())));
           }
         }
-        catch( NoHttpResponseException r ) {
-          method = null;
-          if(is != null) {
-            is.close();
-          }
-          // If out of tries then just rethrow (as normal error).
-          if (tries < 1) {
-            throw r;
-          }
+
+        if (parts.size() > 0) {
+          MultipartEntity entity = new MultipartEntity(HttpMultipartMode.STRICT);
+          for (FormBodyPart p : parts) {
+            entity.addPart(p);
+          }
+          postOrPut.setEntity(entity);
+        } else {
+          //not using multipart
+          postOrPut.setEntity(new UrlEncodedFormEntity(postOrPutParams, StandardCharsets.UTF_8));
+        }
+
+        return postOrPut;
+      }
+      // It is has one stream, it is the post body, put the params in the URL
+      else {
+        String pstr = ClientUtils.toQueryString(wparams, false);
+        HttpEntityEnclosingRequestBase postOrPut = SolrRequest.METHOD.POST == request.getMethod() ?
+            new HttpPost(url + pstr) : new HttpPut(url + pstr);
+
+        // Single stream as body
+        // Using a loop just to get the first one
+        final ContentStream[] contentStream = new ContentStream[1];
+        for (ContentStream content : streams) {
+          contentStream[0] = content;
+          break;
+        }
+        if (contentStream[0] instanceof RequestWriter.LazyContentStream) {
+          postOrPut.setEntity(new InputStreamEntity(contentStream[0].getStream(), -1) {
+            @Override
+            public Header getContentType() {
+              return new BasicHeader("Content-Type", contentStream[0].getContentType());
+            }
+
+            @Override
+            public boolean isRepeatable() {
+              return false;
+            }
+
+          });
+        } else {
+          postOrPut.setEntity(new InputStreamEntity(contentStream[0].getStream(), -1) {
+            @Override
+            public Header getContentType() {
+              return new BasicHeader("Content-Type", contentStream[0].getContentType());
+            }
+
+            @Override
+            public boolean isRepeatable() {
+              return false;
+            }
+          });
         }
+        return postOrPut;
       }
-    } catch (IOException ex) {
-      throw new SolrServerException("error reading streams", ex);
     }
-    
-    return method;
+
+    throw new SolrServerException("Unsupported method: " + request.getMethod());
+
   }
   
   protected NamedList<Object> executeMethod(HttpRequestBase method, final ResponseParser processor) throws SolrServerException {
@@ -494,7 +492,7 @@ public class HttpSolrClient extends Solr
                 null);
           }
       }
-      if (processor == null) {
+      if (processor == null || processor instanceof InputStreamResponseParser) {
         
         // no processor specified, return raw stream
         NamedList<Object> rsp = new NamedList<>();
@@ -680,75 +678,15 @@ public class HttpSolrClient extends Solr
   }
   
   /**
-   * Set maximum number of retries to attempt in the event of transient errors.
-   * <p>
-   * Maximum number of retries to attempt in the event of transient errors.
-   * Default: 0 (no) retries. No more than 1 recommended.
-   * </p>
-   * @param maxRetries
-   *          No more than 1 recommended
+   * @deprecated retries should be implemented in client code, and should be considered carefully per-request
    */
-  public void setMaxRetries(int maxRetries) {
-    if (maxRetries > 1) {
-      log.warn("HttpSolrServer: maximum Retries " + maxRetries
-          + " > 1. Maximum recommended retries is 1.");
-    }
-    this.maxRetries = maxRetries;
-  }
+  public void setMaxRetries(int maxRetries) { }
   
   public void setRequestWriter(RequestWriter requestWriter) {
     this.requestWriter = requestWriter;
   }
   
   /**
-   * Adds the documents supplied by the given iterator.
-   * 
-   * @param docIterator
-   *          the iterator which returns SolrInputDocument instances
-   * 
-   * @return the response from the SolrServer
-   */
-  public UpdateResponse add(Iterator<SolrInputDocument> docIterator)
-      throws SolrServerException, IOException {
-    UpdateRequest req = new UpdateRequest();
-    req.setDocIterator(docIterator);
-    return req.process(this);
-  }
-  
-  /**
-   * Adds the beans supplied by the given iterator.
-   * 
-   * @param beanIterator
-   *          the iterator which returns Beans
-   * 
-   * @return the response from the SolrServer
-   */
-  public UpdateResponse addBeans(final Iterator<?> beanIterator)
-      throws SolrServerException, IOException {
-    UpdateRequest req = new UpdateRequest();
-    req.setDocIterator(new Iterator<SolrInputDocument>() {
-      
-      @Override
-      public boolean hasNext() {
-        return beanIterator.hasNext();
-      }
-      
-      @Override
-      public SolrInputDocument next() {
-        Object o = beanIterator.next();
-        if (o == null) return null;
-        return getBinder().toSolrInputDocument(o);
-      }
-      
-      @Override
-      public void remove() {
-        beanIterator.remove();
-      }
-    });
-    return req.process(this);
-  }
-  
-  /**
    * Close the {@link ClientConnectionManager} from the internal client.
    */
   @Override

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java Tue Mar 31 05:22:40 2015
@@ -367,7 +367,7 @@ public class LBHttpSolrClient extends So
       boolean isZombie, String zombieKey) throws SolrServerException, IOException {
     Exception ex = null;
     try {
-      rsp.rsp = client.request(req.getRequest());
+      rsp.rsp = client.request(req.getRequest(), (String) null);
       if (isZombie) {
         zombieServers.remove(zombieKey);
       }
@@ -491,7 +491,7 @@ public class LBHttpSolrClient extends So
    * @throws IOException If there is a low-level I/O error.
    */
   @Override
-  public NamedList<Object> request(final SolrRequest request)
+  public NamedList<Object> request(final SolrRequest request, String collection)
           throws SolrServerException, IOException {
     Exception ex = null;
     ServerWrapper[] serverList = aliveServerList;
@@ -511,7 +511,7 @@ public class LBHttpSolrClient extends So
       wrapper.lastUsed = System.currentTimeMillis();
 
       try {
-        return wrapper.client.request(request);
+        return wrapper.client.request(request, collection);
       } catch (SolrException e) {
         // Server is alive but the request was malformed or invalid
         throw e;
@@ -537,7 +537,7 @@ public class LBHttpSolrClient extends So
       
       if (wrapper.standard==false || justFailed!=null && justFailed.containsKey(wrapper.getKey())) continue;
       try {
-        NamedList<Object> rsp = wrapper.client.request(request);
+        NamedList<Object> rsp = wrapper.client.request(request, collection);
         // remove from zombie list *before* adding to alive to avoid a race that could lose a server
         zombieServers.remove(wrapper.getKey());
         addToAlive(wrapper);

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/AbstractUpdateRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/AbstractUpdateRequest.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/AbstractUpdateRequest.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/AbstractUpdateRequest.java Tue Mar 31 05:22:40 2015
@@ -16,22 +16,18 @@ package org.apache.solr.client.solrj.req
  * limitations under the License.
  */
 
-import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.UpdateParams;
 
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
 
 /**
  *
  *
  **/
-public abstract class AbstractUpdateRequest extends SolrRequest implements IsUpdateRequest {
+public abstract class AbstractUpdateRequest extends SolrRequest<UpdateResponse> implements IsUpdateRequest {
   protected ModifiableSolrParams params;
   protected int commitWithin = -1;
 
@@ -117,14 +113,8 @@ public abstract class AbstractUpdateRequ
   }
 
   @Override
-  public UpdateResponse process(SolrClient client) throws SolrServerException, IOException
-  {
-    long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    UpdateResponse res = new UpdateResponse();
-    res.setResponse(client.request(this));
-    long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    res.setElapsedTime(endTime - startTime);
-    return res;
+  protected UpdateResponse createResponse(SolrClient client) {
+    return new UpdateResponse();
   }
 
   public boolean isWaitSearcher() {

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java Tue Mar 31 05:22:40 2015
@@ -17,9 +17,8 @@
 
 package org.apache.solr.client.solrj.request;
 
-import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.DocCollection;
@@ -36,39 +35,37 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Properties;
-import java.util.concurrent.TimeUnit;
 
 /**
  * This class is experimental and subject to change.
  *
  * @since solr 4.5
  */
-public class CollectionAdminRequest extends SolrRequest {
+public class CollectionAdminRequest extends SolrRequest<CollectionAdminResponse> {
+
   protected CollectionAction action = null;
 
   private static String PROPERTY_PREFIX = "property.";
 
-  protected void setAction( CollectionAction action ) {
+  protected void setAction(CollectionAction action) {
     this.action = action;
   }
 
-  public CollectionAdminRequest()
-  {
-    super( METHOD.GET, "/admin/collections" );
+  public CollectionAdminRequest() {
+    super(METHOD.GET, "/admin/collections");
   }
 
-  public CollectionAdminRequest( String path )
-  {
-    super( METHOD.GET, path );
+  public CollectionAdminRequest(String path) {
+    super(METHOD.GET, path);
   }
 
   @Override
   public SolrParams getParams() {
-    if( action == null ) {
+    if (action == null) {
       throw new RuntimeException( "no action specified!" );
     }
     ModifiableSolrParams params = new ModifiableSolrParams();
-    params.set( CoreAdminParams.ACTION, action.toString() );
+    params.set(CoreAdminParams.ACTION, action.toString());
     return params;
   }
 
@@ -78,14 +75,8 @@ public class CollectionAdminRequest exte
   }
 
   @Override
-  public CollectionAdminResponse process(SolrClient server) throws SolrServerException, IOException
-  {
-    long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    CollectionAdminResponse res = new CollectionAdminResponse();
-    res.setResponse( server.request( this ) );
-    long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    res.setElapsedTime(endTime - startTime);
-    return res;
+  protected CollectionAdminResponse createResponse(SolrClient client) {
+    return new CollectionAdminResponse();
   }
   
   protected void addProperties(ModifiableSolrParams params, Properties props) {
@@ -105,8 +96,7 @@ public class CollectionAdminRequest exte
   protected static class CollectionSpecificAdminRequest extends CollectionAdminRequest {
     protected String collection = null;
 
-    public final void setCollectionName( String collectionName )
-    {
+    public final void setCollectionName(String collectionName) {
       this.collection = collectionName;
     }
     
@@ -120,16 +110,30 @@ public class CollectionAdminRequest exte
 
   }
   
-  protected static class CollectionShardAdminRequest extends CollectionSpecificAdminRequest {
+  protected static class CollectionShardAdminRequest extends CollectionAdminRequest {
     protected String shardName = null;
+    protected String collection = null;
 
-    public void setShardName(String shard) { this.shardName = shard; }
-    public String getShardName() { return this.shardName; }
+    public void setCollectionName(String collectionName) {
+      this.collection = collectionName;
+    }
+    
+    public String getCollectionName() {
+      return collection;
+    }
+    
+    public void setShardName(String shard) {
+      this.shardName = shard;
+    }
+    
+    public String getShardName() {
+      return this.shardName;
+    }
 
     public ModifiableSolrParams getCommonParams() {
       ModifiableSolrParams params = (ModifiableSolrParams) super.getParams();
-      params.set( "collection", collection );
-      params.set( "shard", shardName);
+      params.set(CoreAdminParams.COLLECTION, collection);
+      params.set(CoreAdminParams.SHARD, shardName);
       return params;
     }
 
@@ -187,7 +191,6 @@ public class CollectionAdminRequest exte
     protected Integer stateFormat;
     protected String asyncId;
 
-
     public Create() {
       action = CollectionAction.CREATE;
     }
@@ -304,8 +307,10 @@ public class CollectionAdminRequest exte
     @Override
     public SolrParams getParams() {
       ModifiableSolrParams params = getCommonParams();
-      params.set( "createNodeSet", nodeSet);
-      if(properties != null) {
+      if (nodeSet != null) {
+        params.set("createNodeSet", nodeSet);
+      }
+      if (properties != null) {
         addProperties(params, properties);
       }
       return params;
@@ -383,13 +388,18 @@ public class CollectionAdminRequest exte
       action = CollectionAction.REQUESTSTATUS;
     }
 
-    public void setRequestId(String requestId) {this.requestId = requestId; }
-    public String getRequestId() { return this.requestId; }
+    public void setRequestId(String requestId) {
+      this.requestId = requestId;
+    }
+    
+    public String getRequestId() {
+      return this.requestId;
+    }
 
     @Override
     public SolrParams getParams() {
       ModifiableSolrParams params = (ModifiableSolrParams) super.getParams();
-      params.set("requestid", requestId);
+      params.set(CoreAdminParams.REQUESTID, requestId);
       return params;
     }
   }
@@ -411,8 +421,13 @@ public class CollectionAdminRequest exte
       return aliasName;
     }
     
-    public void setAliasedCollections(String alias) { this.aliasedCollections = alias; }
-    public String getAliasedCollections() { return this.aliasedCollections; }
+    public void setAliasedCollections(String alias) {
+      this.aliasedCollections = alias;
+    }
+    
+    public String getAliasedCollections() {
+      return this.aliasedCollections;
+    }
     
     @Deprecated
     public void setCollectionName(String aliasName) {
@@ -422,8 +437,8 @@ public class CollectionAdminRequest exte
     @Override
     public SolrParams getParams() {
       ModifiableSolrParams params = (ModifiableSolrParams) super.getParams();
-      params.set("name", aliasName);
-      params.set( "collections", aliasedCollections );
+      params.set(CoreAdminParams.NAME, aliasName);
+      params.set("collections", aliasedCollections);
       return params;
     }
   }
@@ -443,7 +458,7 @@ public class CollectionAdminRequest exte
     @Override
     public SolrParams getParams() {
       ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
-      params.set("name", aliasName);
+      params.set(CoreAdminParams.NAME, aliasName);
       return params;
     }
   }
@@ -505,13 +520,15 @@ public class CollectionAdminRequest exte
     public SolrParams getParams() {
       ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
       if (shardName == null || shardName.isEmpty()) {
-        params.remove("shard");
+        params.remove(CoreAdminParams.SHARD);
         if (routeKey == null) {
           throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Either shard or routeKey must be provided");
         }
         params.add(ShardParams._ROUTE_, routeKey);
       }
-      params.set("async", asyncId);
+      if (asyncId != null) {
+        params.set("async", asyncId);
+      }
       if (node != null) {
         params.add("node", node);
       }
@@ -598,9 +615,10 @@ public class CollectionAdminRequest exte
       return this.propertyValue;
     }
     
+    @Override
     public SolrParams getParams() {
       ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
-      params.add("name", propertyName);
+      params.add(CoreAdminParams.NAME, propertyName);
       params.add("val", propertyValue);
       
       return params;
@@ -609,7 +627,8 @@ public class CollectionAdminRequest exte
   }
   
   // MIGRATE request
-  public static class Migrate extends CollectionSpecificAdminRequest {
+  public static class Migrate extends CollectionAdminRequest {
+    private String collection;
     private String targetCollection;
     private String splitKey;
     private Integer forwardTimeout;
@@ -620,6 +639,14 @@ public class CollectionAdminRequest exte
       action = CollectionAction.MIGRATE;
     }
     
+    public void setCollectionName(String collection) {
+      this.collection = collection;
+    }
+    
+    public String getCollectionName() {
+      return collection;
+    }
+    
     public void setTargetCollection(String targetCollection) {
       this.targetCollection = targetCollection;
     }
@@ -655,15 +682,15 @@ public class CollectionAdminRequest exte
     @Override
     public SolrParams getParams() {
       ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
-      params.set( "collection", collection );
+      params.set(CoreAdminParams.COLLECTION, collection);
       params.set("target.collection", targetCollection);
       params.set("split.key", splitKey);
-      if(forwardTimeout != null) {
+      if (forwardTimeout != null) {
         params.set("forward.timeout", forwardTimeout);
       }
       params.set("async", asyncId);
       
-      if(properties != null) {
+      if (properties != null) {
         addProperties(params, properties);
       }
       
@@ -701,12 +728,43 @@ public class CollectionAdminRequest exte
   }
 
   // CLUSTERSTATUS request
-  public static class ClusterStatus extends CollectionShardAdminRequest {
+  public static class ClusterStatus extends CollectionAdminRequest {
+    
+    protected String shardName = null;
+    protected String collection = null;
     
     public ClusterStatus () {
       action = CollectionAction.CLUSTERSTATUS;
     }
     
+    public void setCollectionName(String collectionName) {
+      this.collection = collectionName;
+    }
+    
+    public String getCollectionName() {
+      return collection;
+    }
+    
+    public void setShardName(String shard) {
+      this.shardName = shard;
+    }
+    
+    public String getShardName() {
+      return this.shardName;
+    }
+
+    @Override
+    public SolrParams getParams() {
+      ModifiableSolrParams params = (ModifiableSolrParams) super.getParams();
+      if (collection != null) {
+        params.set(CoreAdminParams.COLLECTION, collection);
+      }
+      if (shardName != null) {
+        params.set(CoreAdminParams.SHARD, shardName);
+      }
+      return params;
+    }
+    
   }
 
   // LIST request
@@ -762,12 +820,13 @@ public class CollectionAdminRequest exte
     @Override
     public SolrParams getParams() {
       ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
-      params.set("replica", replica);
+      params.set(CoreAdminParams.REPLICA, replica);
       params.set("property", propertyName);
       params.set("property.value", propertyValue);
       
-      if(shardUnique != null)
+      if (shardUnique != null) {
         params.set("shardUnique", shardUnique);
+      }
       
       return params;
     }
@@ -854,7 +913,7 @@ public class CollectionAdminRequest exte
     @Override
     public SolrParams getParams() {
       ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
-      params.set("collection", collection);
+      params.set(CoreAdminParams.COLLECTION, collection);
       params.set("property", propertyName);
       if(onlyActiveNodes != null)
         params.set("onlyactivenodes", onlyActiveNodes);

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreAdminRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreAdminRequest.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreAdminRequest.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreAdminRequest.java Tue Mar 31 05:22:40 2015
@@ -17,8 +17,8 @@
 
 package org.apache.solr.client.solrj.request;
 
-import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.response.CoreAdminResponse;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -32,15 +32,14 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 /**
  * This class is experimental and subject to change.
  *
  * @since solr 1.3
  */
-public class CoreAdminRequest extends SolrRequest
-{
+public class CoreAdminRequest extends SolrRequest<CoreAdminResponse> {
+
   protected String core = null;
   protected String other = null;
   protected boolean isIndexInfoNeeded = true;
@@ -48,6 +47,7 @@ public class CoreAdminRequest extends So
   
   //a create core request
   public static class Create extends CoreAdminRequest {
+
     protected String instanceDir;
     protected String configName = null;
     protected String schemaName = null;
@@ -503,14 +503,8 @@ public class CoreAdminRequest extends So
   }
 
   @Override
-  public CoreAdminResponse process(SolrClient client) throws SolrServerException, IOException
-  {
-    long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    CoreAdminResponse res = new CoreAdminResponse();
-    res.setResponse(client.request(this));
-    long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    res.setElapsedTime(endTime - startTime);
-    return res;
+  protected CoreAdminResponse createResponse(SolrClient client) {
+    return new CoreAdminResponse();
   }
 
   //---------------------------------------------------------------------------------------

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/DirectXmlRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/DirectXmlRequest.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/DirectXmlRequest.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/DirectXmlRequest.java Tue Mar 31 05:22:40 2015
@@ -19,15 +19,12 @@ package org.apache.solr.client.solrj.req
 
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.client.solrj.util.ClientUtils;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.ContentStream;
 
-import java.io.IOException;
 import java.util.Collection;
-import java.util.concurrent.TimeUnit;
 
 /**
  * Send arbitrary XML to a request handler
@@ -35,8 +32,8 @@ import java.util.concurrent.TimeUnit;
  *
  * @since solr 1.3
  */
-public class DirectXmlRequest extends SolrRequest implements IsUpdateRequest
-{
+public class DirectXmlRequest extends SolrRequest<UpdateResponse> implements IsUpdateRequest {
+
   final String xml;
   private SolrParams params;
   
@@ -52,6 +49,11 @@ public class DirectXmlRequest extends So
   }
 
   @Override
+  protected UpdateResponse createResponse(SolrClient client) {
+    return new UpdateResponse();
+  }
+
+  @Override
   public SolrParams getParams() {
     return params;
   }
@@ -61,13 +63,4 @@ public class DirectXmlRequest extends So
     this.params = params;
   }
 
-  @Override
-  public UpdateResponse process(SolrClient client) throws SolrServerException, IOException
-  {
-    long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    UpdateResponse res = new UpdateResponse();
-    res.setResponse(client.request(this));
-    res.setElapsedTime( TimeUnit.MILLISECONDS.convert(System.nanoTime()-startTime, TimeUnit.NANOSECONDS) );
-    return res;
-  }
 }

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/DocumentAnalysisRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/DocumentAnalysisRequest.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/DocumentAnalysisRequest.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/DocumentAnalysisRequest.java Tue Mar 31 05:22:40 2015
@@ -17,9 +17,8 @@
 
 package org.apache.solr.client.solrj.request;
 
-import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.response.DocumentAnalysisResponse;
 import org.apache.solr.client.solrj.util.ClientUtils;
 import org.apache.solr.common.SolrInputDocument;
@@ -32,7 +31,6 @@ import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 /**
  * A request for the org.apache.solr.handler.DocumentAnalysisRequestHandler.
@@ -40,7 +38,7 @@ import java.util.concurrent.TimeUnit;
  *
  * @since solr 1.4
  */
-public class DocumentAnalysisRequest extends SolrRequest {
+public class DocumentAnalysisRequest extends SolrRequest<DocumentAnalysisResponse> {
 
   private List<SolrInputDocument> documents = new ArrayList<>();
   private String query;
@@ -70,6 +68,11 @@ public class DocumentAnalysisRequest ext
     return ClientUtils.toContentStreams(getXML(), ClientUtils.TEXT_XML);
   }
 
+  @Override
+  protected DocumentAnalysisResponse createResponse(SolrClient client) {
+    return new DocumentAnalysisResponse();
+  }
+
   /**
    * {@inheritDoc}
    */
@@ -83,19 +86,6 @@ public class DocumentAnalysisRequest ext
     return params;
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public DocumentAnalysisResponse process(SolrClient client) throws SolrServerException, IOException {
-    long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    DocumentAnalysisResponse res = new DocumentAnalysisResponse();
-    res.setResponse(client.request(this));
-    long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    res.setElapsedTime(endTime - startTime);
-    return res;
-  }
-
   //================================================ Helper Methods ==================================================
 
   /**

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/FieldAnalysisRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/FieldAnalysisRequest.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/FieldAnalysisRequest.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/FieldAnalysisRequest.java Tue Mar 31 05:22:40 2015
@@ -17,9 +17,8 @@
 
 package org.apache.solr.client.solrj.request;
 
-import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.response.FieldAnalysisResponse;
 import org.apache.solr.common.params.AnalysisParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -30,7 +29,6 @@ import java.io.IOException;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 /**
  * A request for the org.apache.solr.handler.FieldAnalysisRequestHandler.
@@ -38,7 +36,7 @@ import java.util.concurrent.TimeUnit;
  *
  * @since solr.14
  */
-public class FieldAnalysisRequest extends SolrRequest {
+public class FieldAnalysisRequest extends SolrRequest<FieldAnalysisResponse> {
 
   private String fieldValue;
   private String query;
@@ -70,6 +68,17 @@ public class FieldAnalysisRequest extend
     return null;
   }
 
+  @Override
+  protected FieldAnalysisResponse createResponse(SolrClient client) {
+    if (fieldTypes == null && fieldNames == null) {
+      throw new IllegalStateException("At least one field type or field name need to be specified");
+    }
+    if (fieldValue == null) {
+      throw new IllegalStateException("The field value must be set");
+    }
+    return new FieldAnalysisResponse();
+  }
+
   /**
    * {@inheritDoc}
    */
@@ -92,26 +101,6 @@ public class FieldAnalysisRequest extend
     return params;
   }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public FieldAnalysisResponse process(SolrClient server) throws SolrServerException, IOException {
-    if (fieldTypes == null && fieldNames == null) {
-      throw new IllegalStateException("At least one field type or field name need to be specified");
-    }
-    if (fieldValue == null) {
-      throw new IllegalStateException("The field value must be set");
-    }
-    long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    FieldAnalysisResponse res = new FieldAnalysisResponse();
-    res.setResponse(server.request(this));
-    long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    res.setElapsedTime(endTime - startTime);
-    return res;
-  }
-
-
   //================================================ Helper Methods ==================================================
 
   /**

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/LukeRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/LukeRequest.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/LukeRequest.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/LukeRequest.java Tue Mar 31 05:22:40 2015
@@ -19,26 +19,23 @@ package org.apache.solr.client.solrj.req
 
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.response.LukeResponse;
 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.ContentStream;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 /**
  * 
  *
  * @since solr 1.3
  */
-public class LukeRequest extends SolrRequest
-{
+public class LukeRequest extends SolrRequest<LukeResponse> {
+
   private List<String> fields;
   private int numTerms = -1;
   private boolean showSchema = false;
@@ -100,6 +97,11 @@ public class LukeRequest extends SolrReq
   }
 
   @Override
+  protected LukeResponse createResponse(SolrClient client) {
+    return new LukeResponse();
+  }
+
+  @Override
   public SolrParams getParams() {
     ModifiableSolrParams params = new ModifiableSolrParams();
     if( fields != null && fields.size() > 0 ) {
@@ -114,15 +116,5 @@ public class LukeRequest extends SolrReq
     return params;
   }
 
-  @Override
-  public LukeResponse process( SolrClient client ) throws SolrServerException, IOException
-  {
-    long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    LukeResponse res = new LukeResponse();
-    res.setResponse(client.request(this));
-    long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    res.setElapsedTime(endTime - startTime);
-    return res;
-  }
 }
 

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/QueryRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/QueryRequest.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/QueryRequest.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/QueryRequest.java Tue Mar 31 05:22:40 2015
@@ -17,25 +17,22 @@
 
 package org.apache.solr.client.solrj.request;
 
-import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.ContentStream;
 
 import java.util.Collection;
-import java.util.concurrent.TimeUnit;
 
 /**
  * 
  *
  * @since solr 1.3
  */
-public class QueryRequest extends SolrRequest
-{
+public class QueryRequest extends SolrRequest<QueryResponse> {
+
   private SolrParams query;
   
   public QueryRequest()
@@ -79,24 +76,14 @@ public class QueryRequest extends SolrRe
   }
 
   @Override
-  public SolrParams getParams() {
-    return query;
+  protected QueryResponse createResponse(SolrClient client) {
+    return new QueryResponse(client);
   }
 
   @Override
-  public QueryResponse process( SolrClient client ) throws SolrServerException
-  {
-    try {
-      long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-      QueryResponse res = new QueryResponse( client.request( this ), client );
-      long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-      res.setElapsedTime(endTime - startTime);
-      return res;
-    } catch (SolrServerException | SolrException e){
-      throw e;
-    } catch (Exception e) {
-      throw new SolrServerException("Error executing query", e);
-    }
+  public SolrParams getParams() {
+    return query;
   }
+
 }
 

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/SolrPing.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/SolrPing.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/SolrPing.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/SolrPing.java Tue Mar 31 05:22:40 2015
@@ -19,15 +19,12 @@ package org.apache.solr.client.solrj.req
 
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.response.SolrPingResponse;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.ContentStream;
 
-import java.io.IOException;
 import java.util.Collection;
-import java.util.concurrent.TimeUnit;
 
 /**
  * Verify that there is a working Solr core at the URL of a {@link org.apache.solr.client.solrj.SolrClient}.
@@ -36,7 +33,7 @@ import java.util.concurrent.TimeUnit;
  * 
  * @since solr 1.3
  */
-public class SolrPing extends SolrRequest {
+public class SolrPing extends SolrRequest<SolrPingResponse> {
   
   /** serialVersionUID. */
   private static final long serialVersionUID = 5828246236669090017L;
@@ -56,21 +53,15 @@ public class SolrPing extends SolrReques
   public Collection<ContentStream> getContentStreams() {
     return null;
   }
-  
+
   @Override
-  public ModifiableSolrParams getParams() {
-    return params;
+  protected SolrPingResponse createResponse(SolrClient client) {
+    return new SolrPingResponse();
   }
-  
+
   @Override
-  public SolrPingResponse process(SolrClient client)
-      throws SolrServerException, IOException {
-    long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    SolrPingResponse res = new SolrPingResponse();
-    res.setResponse(client.request(this));
-    long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
-    res.setElapsedTime(endTime - startTime);
-    return res;
+  public ModifiableSolrParams getParams() {
+    return params;
   }
   
   /**

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java Tue Mar 31 05:22:40 2015
@@ -17,6 +17,16 @@
 
 package org.apache.solr.client.solrj.request;
 
+import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
+import org.apache.solr.client.solrj.util.ClientUtils;
+import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.cloud.DocCollection;
+import org.apache.solr.common.cloud.DocRouter;
+import org.apache.solr.common.cloud.Slice;
+import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.util.ContentStream;
+import org.apache.solr.common.util.XML;
+
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.Writer;
@@ -24,21 +34,11 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.LinkedHashMap;
-
-import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
-import org.apache.solr.client.solrj.util.ClientUtils;
-import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.DocRouter;
-import org.apache.solr.common.cloud.Slice;
-import org.apache.solr.common.params.ModifiableSolrParams;
-import org.apache.solr.common.util.ContentStream;
-import org.apache.solr.common.util.XML;
 
 /**
  * 
@@ -46,6 +46,7 @@ import org.apache.solr.common.util.XML;
  * @since solr 1.3
  */
 public class UpdateRequest extends AbstractUpdateRequest {
+
   public static final String REPFACT = "rf";
   public static final String MIN_REPFACT = "min_rf";
   public static final String VER = "ver";

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/FieldStatsInfo.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/FieldStatsInfo.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/FieldStatsInfo.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/FieldStatsInfo.java Tue Mar 31 05:22:40 2015
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -47,6 +48,8 @@ public class FieldStatsInfo implements S
   
   Map<String,List<FieldStatsInfo>> facets;
   
+  Map<Double, Double> percentiles;
+  
   public FieldStatsInfo( NamedList<Object> nl, String fname )
   {
     name = fname;
@@ -96,6 +99,13 @@ public class FieldStatsInfo implements S
             vals.add( new FieldStatsInfo( vnl.getVal(i), n ) );
           }
         }
+      } else if ( "percentiles".equals( entry.getKey() ) ){
+        @SuppressWarnings("unchecked")
+        NamedList<Object> fields = (NamedList<Object>) entry.getValue();
+        percentiles = new LinkedHashMap<>();
+        for( Map.Entry<String, Object> ev : fields ) {
+          percentiles.put(Double.parseDouble(ev.getKey()), (Double)ev.getValue());
+        }
       }
       else {
         throw new RuntimeException( "unknown key: "+entry.getKey() + " ["+entry.getValue()+"]" );
@@ -136,6 +146,10 @@ public class FieldStatsInfo implements S
     if( stddev != null ) {
       sb.append( " stddev:").append(stddev);
     }
+    if( percentiles != null ) {
+      sb.append( " percentiles:").append(percentiles);
+    }
+    
     sb.append( " }" );
     return sb.toString();
   }
@@ -155,7 +169,7 @@ public class FieldStatsInfo implements S
   public Object getSum() {
     return sum;
   }
-
+     
   public Long getCount() {
     return count;
   }
@@ -188,4 +202,11 @@ public class FieldStatsInfo implements S
     return facets;
   }
   
+  /**
+   * The percentiles requested if any, otherwise null.  If non-null then the
+   * iteration order will match the order the percentiles were originally specified in.
+   */
+  public Map<Double, Double> getPercentiles() {
+    return percentiles;
+  }
 }

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/client/solrj/response/QueryResponse.java Tue Mar 31 05:22:40 2015
@@ -17,6 +17,13 @@
 
 package org.apache.solr.client.solrj.response;
 
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
+import org.apache.solr.common.SolrDocumentList;
+import org.apache.solr.common.params.CursorMarkParams;
+import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.SimpleOrderedMap;
+
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -25,13 +32,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
-import org.apache.solr.common.SolrDocumentList;
-import org.apache.solr.common.params.CursorMarkParams;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.SimpleOrderedMap;
-
 /**
  * 
  *
@@ -99,6 +99,10 @@ public class QueryResponse extends SolrR
     this.solrClient = solrClient;
   }
 
+  public QueryResponse(SolrClient solrClient) {
+    this.solrClient = solrClient;
+  }
+
   @Override
   public void setResponse( NamedList<Object> res )
   {

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/SolrException.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/SolrException.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/SolrException.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/SolrException.java Tue Mar 31 05:22:40 2015
@@ -19,18 +19,21 @@ package org.apache.solr.common;
 
 import java.io.CharArrayWriter;
 import java.io.PrintWriter;
+import java.util.Map;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-
 import org.apache.solr.common.util.NamedList;
 import org.slf4j.Logger;
+import org.slf4j.MDC;
 
 /**
  *
  */
 public class SolrException extends RuntimeException {
 
+  final private Map mdcContext;
+
   /**
    * This list of valid HTTP Status error codes that Solr may return in 
    * the case of a "Server Side" error.
@@ -65,15 +68,18 @@ public class SolrException extends Runti
   public SolrException(ErrorCode code, String msg) {
     super(msg);
     this.code = code.code;
+    this.mdcContext = MDC.getCopyOfContextMap();
   }
   public SolrException(ErrorCode code, String msg, Throwable th) {
     super(msg, th);
     this.code = code.code;
+    this.mdcContext = MDC.getCopyOfContextMap();
   }
 
   public SolrException(ErrorCode code, Throwable th) {
     super(th);
     this.code = code.code;
+    this.mdcContext = MDC.getCopyOfContextMap();
   }
 
   /**
@@ -84,6 +90,7 @@ public class SolrException extends Runti
   protected SolrException(int code, String msg, Throwable th) {
     super(msg, th);
     this.code = code;
+    this.mdcContext = MDC.getCopyOfContextMap();
   }
   
   int code=0;
@@ -205,4 +212,34 @@ public class SolrException extends Runti
     return t;
   }
 
+  public void logInfoWithMdc(Logger logger, String msg) {
+    Map previousMdcContext = MDC.getCopyOfContextMap();
+    MDC.setContextMap(mdcContext);
+    try {
+      logger.info(msg);
+    } finally{
+      MDC.setContextMap(previousMdcContext);
+    }
+  }
+
+  public void logDebugWithMdc(Logger logger, String msg) {
+    Map previousMdcContext = MDC.getCopyOfContextMap();
+    MDC.setContextMap(mdcContext);
+    try {
+      logger.debug(msg);
+    } finally{
+      MDC.setContextMap(previousMdcContext);
+    }
+  }
+
+  public void logWarnWithMdc(Logger logger, String msg) {
+    Map previousMdcContext = MDC.getCopyOfContextMap();
+    MDC.setContextMap(mdcContext);
+    try {
+      logger.warn(msg);
+    } finally{
+      MDC.setContextMap(previousMdcContext);
+    }
+  }
+
 }

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java Tue Mar 31 05:22:40 2015
@@ -228,7 +228,7 @@ public class ClusterState implements JSO
   public String toString() {
     StringBuilder sb = new StringBuilder();
     sb.append("live nodes:" + liveNodes);
-    sb.append(" collections:" + collectionStates);
+    sb.append("collections:" + collectionStates);
     return sb.toString();
   }
 
@@ -391,6 +391,15 @@ public class ClusterState implements JSO
     }
 
     public boolean isLazilyLoaded() { return false; }
+    
+    @Override
+    public String toString() {
+      if (coll != null) {
+        return coll.toString();
+      } else {
+        return "null DocCollection ref";
+      }
+    }
 
   }
 

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java Tue Mar 31 05:22:40 2015
@@ -29,6 +29,8 @@ import org.apache.zookeeper.KeeperExcept
 import org.apache.zookeeper.KeeperException.NoNodeException;
 import org.apache.zookeeper.KeeperException.NodeExistsException;
 import org.apache.zookeeper.KeeperException.NotEmptyException;
+import org.apache.zookeeper.Op;
+import org.apache.zookeeper.OpResult;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
 import org.apache.zookeeper.ZooKeeper;
@@ -560,6 +562,19 @@ public class SolrZkClient implements Clo
     return setData(path, data, retryOnConnLoss);
   }
 
+  public List<OpResult> multi(final Iterable<Op> ops, boolean retryOnConnLoss) throws InterruptedException, KeeperException  {
+    if (retryOnConnLoss) {
+      return zkCmdExecutor.retryOperation(new ZkOperation() {
+        @Override
+        public List<OpResult> execute() throws KeeperException, InterruptedException {
+          return keeper.multi(ops);
+        }
+      });
+    } else {
+      return keeper.multi(ops);
+    }
+  }
+
   /**
    * Fills string with printout of current ZooKeeper layout.
    */
@@ -733,4 +748,14 @@ public class SolrZkClient implements Clo
     return e;
   }
 
+  /**
+   * @return the address of the zookeeper cluster
+   */
+  public String getZkServerAddress() {
+    return zkServerAddress;
+  }
+
+  public ZkACLProvider getZkACLProvider() {
+    return zkACLProvider;
+  }
 }

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ZkConfigManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ZkConfigManager.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ZkConfigManager.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ZkConfigManager.java Tue Mar 31 05:22:40 2015
@@ -61,7 +61,7 @@ public class ZkConfigManager {
         String filename = file.getFileName().toString();
         if (filename.startsWith("."))
           return FileVisitResult.CONTINUE;
-        String zkNode = zkPath + "/" + rootPath.relativize(file).toString();
+        String zkNode = createZkNodeName(zkPath, rootPath, file);
         try {
           zkClient.makePath(zkNode, file.toFile(), false, true);
         } catch (KeeperException | InterruptedException e) {
@@ -78,6 +78,15 @@ public class ZkConfigManager {
     });
   }
 
+  private static String createZkNodeName(String zkRoot, Path root, Path file) {
+    String relativePath = root.relativize(file).toString();
+    // Windows shenanigans
+    String separator = root.getFileSystem().getSeparator();
+    if ("\\".equals(separator))
+      relativePath = relativePath.replaceAll("\\\\", "/");
+    return zkRoot + "/" + relativePath;
+  }
+
   private void downloadFromZK(String zkPath, Path dir) throws IOException {
     try {
       List<String> files = zkClient.getChildren(zkPath, null, true);

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java Tue Mar 31 05:22:40 2015
@@ -102,6 +102,8 @@ public class ZkStateReader implements Cl
   protected volatile ClusterState clusterState;
 
   private static final long SOLRCLOUD_UPDATE_DELAY = Long.parseLong(System.getProperty("solrcloud.update.delay", "5000"));
+  private static final int GET_LEADER_RETRY_INTERVAL_MS = 50;
+  private static final int GET_LEADER_RETRY_DEFAULT_TIMEOUT = 4000;
 
   public static final String LEADER_ELECT_ZKNODE = "leader_elect";
 
@@ -268,13 +270,13 @@ public class ZkStateReader implements Cl
     return aliases;
   }
 
-  public Boolean checkValid(String coll, int version) {
+  public Integer compareStateVersions(String coll, int version) {
     DocCollection collection = clusterState.getCollectionOrNull(coll);
     if (collection == null) return null;
     if (collection.getZNodeVersion() < version) {
       log.debug("server older than client {}<{}", collection.getZNodeVersion(), version);
       DocCollection nu = getCollectionLive(this, coll);
-      if (nu == null) return null;
+      if (nu == null) return -1 ;
       if (nu.getZNodeVersion() > collection.getZNodeVersion()) {
         updateWatchedCollection(nu);
         collection = nu;
@@ -282,12 +284,12 @@ public class ZkStateReader implements Cl
     }
     
     if (collection.getZNodeVersion() == version) {
-      return Boolean.TRUE;
+      return null;
     }
     
     log.debug("wrong version from client {}!={} ", version, collection.getZNodeVersion());
     
-    return Boolean.FALSE;
+    return collection.getZNodeVersion();
   }
   
   public synchronized void createClusterStateWatchersAndUpdate() throws KeeperException,
@@ -295,12 +297,10 @@ public class ZkStateReader implements Cl
     // We need to fetch the current cluster state and the set of live nodes
     
     synchronized (getUpdateLock()) {
-      cmdExecutor.ensureExists(CLUSTER_STATE, zkClient);
-      cmdExecutor.ensureExists(ALIASES, zkClient);
-      
+
       log.info("Updating cluster state from ZooKeeper... ");
       
-      zkClient.exists(CLUSTER_STATE, new Watcher() {
+      Stat stat = zkClient.exists(CLUSTER_STATE, new Watcher() {
         
         @Override
         public void process(WatchedEvent event) {
@@ -339,6 +339,10 @@ public class ZkStateReader implements Cl
         }
         
       }, true);
+
+      if (stat == null)
+        throw new SolrException(ErrorCode.SERVICE_UNAVAILABLE,
+            "Cannot connect to cluster at " + zkClient.getZkServerAddress() + ": cluster not found/not ready");
     }
    
     
@@ -640,12 +644,22 @@ public class ZkStateReader implements Cl
         shard, timeout));
     return props.getCoreUrl();
   }
-  
+
+  public Replica getLeader(String collection, String shard) throws InterruptedException {
+    if (clusterState != null) {
+      Replica replica = clusterState.getLeader(collection, shard);
+      if (replica != null && getClusterState().liveNodesContain(replica.getNodeName())) {
+        return replica;
+      }
+    }
+    return null;
+  }
+
   /**
    * Get shard leader properties, with retry if none exist.
    */
   public Replica getLeaderRetry(String collection, String shard) throws InterruptedException {
-    return getLeaderRetry(collection, shard, 4000);
+    return getLeaderRetry(collection, shard, GET_LEADER_RETRY_DEFAULT_TIMEOUT);
   }
 
   /**
@@ -653,14 +667,11 @@ public class ZkStateReader implements Cl
    */
   public Replica getLeaderRetry(String collection, String shard, int timeout) throws InterruptedException {
     long timeoutAt = System.nanoTime() + TimeUnit.NANOSECONDS.convert(timeout, TimeUnit.MILLISECONDS);
-    while (System.nanoTime() < timeoutAt && !closed) {
-      if (clusterState != null) {    
-        Replica replica = clusterState.getLeader(collection, shard);
-        if (replica != null && getClusterState().liveNodesContain(replica.getNodeName())) {
-          return replica;
-        }
-      }
-      Thread.sleep(50);
+    while (true) {
+      Replica leader = getLeader(collection, shard);
+      if (leader != null) return leader;
+      if (System.nanoTime() >= timeoutAt || closed) break;
+      Thread.sleep(GET_LEADER_RETRY_INTERVAL_MS);
     }
     throw new SolrException(ErrorCode.SERVICE_UNAVAILABLE, "No registered leader was found after waiting for "
         + timeout + "ms " + ", collection: " + collection + " slice: " + shard);

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/luke/FieldFlag.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/luke/FieldFlag.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/luke/FieldFlag.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/luke/FieldFlag.java Tue Mar 31 05:22:40 2015
@@ -30,6 +30,7 @@ public enum FieldFlag {
   TERM_VECTOR_STORED('V', "TermVector Stored"), 
   TERM_VECTOR_OFFSET('o', "Store Offset With TermVector"),
   TERM_VECTOR_POSITION('p', "Store Position With TermVector"),
+  TERM_VECTOR_PAYLOADS('y', "Store Payloads With TermVector"),
   OMIT_NORMS('O', "Omit Norms"), 
   OMIT_TF('F', "Omit Term Frequencies & Positions"), 
   OMIT_POSITIONS('P', "Omit Positions"),

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/CoreAdminParams.java Tue Mar 31 05:22:40 2015
@@ -74,6 +74,9 @@ public abstract class CoreAdminParams
   /** The collection name in solr cloud */
   public final static String COLLECTION = "collection";
 
+  /** The replica name in solr cloud */
+  public final static String REPLICA = "replica";
+  
   /** The shard id in solr cloud */
   public final static String SHARD = "shard";
   

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/FacetParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/FacetParams.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/FacetParams.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/FacetParams.java Tue Mar 31 05:22:40 2015
@@ -149,6 +149,16 @@ public interface FacetParams {
    */
   public static final String FACET_PREFIX = FACET + ".prefix";
 
+  /**
+   * Only return constraints of a facet field containing the given string.
+   */
+  public static final String FACET_CONTAINS = FACET + ".contains";
+
+  /**
+   * If using facet contains, ignore case when comparing values.
+   */
+  public static final String FACET_CONTAINS_IGNORE_CASE = FACET_CONTAINS + ".ignoreCase";
+
  /**
    * When faceting by enumerating the terms in a field,
    * only use the filterCache for terms with a df &gt;= to this parameter.
@@ -165,7 +175,7 @@ public interface FacetParams {
    */
   public static final String FACET_DATE_START = FACET_DATE + ".start";
   /**
-   * Date string indicating the endinging point for a date facet range.
+   * Date string indicating the ending point for a date facet range.
    * Can be overriden on a per field basis.
    */
   public static final String FACET_DATE_END = FACET_DATE + ".end";

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/ModifiableSolrParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/ModifiableSolrParams.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/ModifiableSolrParams.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/ModifiableSolrParams.java Tue Mar 31 05:22:40 2015
@@ -57,6 +57,11 @@ public class ModifiableSolrParams extend
     }
   }
 
+  public Map<String,String[]> getMap() {
+    return vals;
+  }
+
+
   //----------------------------------------------------------------
   //----------------------------------------------------------------
 

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/MultiMapSolrParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/MultiMapSolrParams.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/MultiMapSolrParams.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/MultiMapSolrParams.java Tue Mar 31 05:22:40 2015
@@ -19,6 +19,7 @@ package org.apache.solr.common.params;
 
 import org.apache.solr.common.util.StrUtils;
 
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.io.IOException;
@@ -30,18 +31,33 @@ public class MultiMapSolrParams extends
   protected final Map<String,String[]> map;
 
   public static void addParam(String name, String val, Map<String,String[]> map) {
-      String[] arr = map.get(name);
-      if (arr ==null) {
-        arr =new String[]{val};
-      } else {
-        String[] newarr = new String[arr.length+1];
-        System.arraycopy(arr,0,newarr,0,arr.length);
-        newarr[arr.length]=val;
-        arr =newarr;
-      }
-      map.put(name, arr);
+    String[] arr = map.get(name);
+    if (arr == null) {
+      arr = new String[]{val};
+    } else {
+      String[] newarr = new String[arr.length+1];
+      System.arraycopy(arr, 0, newarr, 0, arr.length);
+      newarr[arr.length] = val;
+      arr = newarr;
+    }
+    map.put(name, arr);
   }
 
+  public static void addParam(String name, String[] vals, Map<String,String[]> map) {
+    String[] arr = map.put(name, vals);
+    if (arr == null) {
+      return;
+    }
+
+    String[] newarr = new String[arr.length+vals.length];
+    System.arraycopy(arr, 0, newarr, 0, arr.length);
+    System.arraycopy(vals, 0, newarr, arr.length, vals.length);
+    arr = newarr;
+
+    map.put(name, arr);
+  }
+
+
   public MultiMapSolrParams(Map<String,String[]> map) {
     this.map = map;
   }
@@ -88,5 +104,35 @@ public class MultiMapSolrParams extends
     return sb.toString();
   }
 
+  /** Returns a MultiMap view of the SolrParams as efficiently as possible.  The returned map may or may not be a backing implementation. */
+  public static Map<String,String[]> asMultiMap(SolrParams params) {
+    return asMultiMap(params, false);
+  }
+
+  /** Returns a MultiMap view of the SolrParams.  A new map will be created if newCopy==true */
+  public static Map<String,String[]> asMultiMap(SolrParams params, boolean newCopy) {
+    if (params instanceof MultiMapSolrParams) {
+      Map<String,String[]> map = ((MultiMapSolrParams)params).getMap();
+      if (newCopy) {
+        return new HashMap<>(map);
+      }
+      return map;
+    } else if (params instanceof ModifiableSolrParams) {
+      Map<String,String[]> map = ((ModifiableSolrParams)params).getMap();
+      if (newCopy) {
+        return new HashMap<>(map);
+      }
+      return map;
+    } else {
+      Map<String,String[]> map = new HashMap<>();
+      Iterator<String> iterator = params.getParameterNamesIterator();
+      while (iterator.hasNext()) {
+        String name = iterator.next();
+        map.put(name, params.getParams(name));
+      }
+      return map;
+    }
+  }
+
 
 }

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/SolrParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/SolrParams.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/SolrParams.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/SolrParams.java Tue Mar 31 05:22:40 2015
@@ -320,13 +320,8 @@ public abstract class SolrParams impleme
 
   /** Create SolrParams from NamedList. */
   public static SolrParams toSolrParams(NamedList params) {
-    // if no keys are repeated use the faster MapSolrParams
-    HashMap<String,String> map = new HashMap<>();
-    for (int i=0; i<params.size(); i++) {
-      String prev = map.put(params.getName(i), params.getVal(i).toString());
-      if (prev!=null) return new MultiMapSolrParams(toMultiMap(params));
-    }
-    return new MapSolrParams(map);
+    // always use MultiMap for easier processing further down the chain
+    return new MultiMapSolrParams(toMultiMap(params));
   }
   
   /** Create filtered SolrParams. */

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/TermVectorParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/TermVectorParams.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/TermVectorParams.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/params/TermVectorParams.java Tue Mar 31 05:22:40 2015
@@ -35,6 +35,11 @@ public interface TermVectorParams {
   * */
   public static final String POSITIONS = TV_PREFIX + "positions";
   /**
+  * Return Term Vector payloads information
+  *
+  * */
+  public static final String PAYLOADS = TV_PREFIX + "payloads";
+  /**
   * Return offset information, if available
   * */
   public static final String OFFSETS = TV_PREFIX + "offsets";

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/util/ContentStreamBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/util/ContentStreamBase.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/util/ContentStreamBase.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/util/ContentStreamBase.java Tue Mar 31 05:22:40 2015
@@ -107,6 +107,7 @@ public abstract class ContentStreamBase
     @Override
     public String getContentType() {
       if(contentType==null) {
+        // TODO: this is buggy... does not allow for whitespace, JSON comments, etc.
         InputStream stream = null;
         try {
           stream = new FileInputStream(file);
@@ -140,29 +141,40 @@ public abstract class ContentStreamBase
   public static class StringStream extends ContentStreamBase
   {
     private final String str;
-    
+
     public StringStream( String str ) {
-      this.str = str; 
-      
-      contentType = null;
+      this(str, detect(str));
+    }
+
+    public StringStream( String str, String contentType ) {
+      this.str = str;
+      this.contentType = contentType;
       name = null;
       size = new Long( str.length() );
       sourceInfo = "string";
     }
 
-    @Override
-    public String getContentType() {
-      if(contentType==null && str.length() > 0) {
-        char first = str.charAt(0);
-        if(first == '<') {
-          return "application/xml";
+    public static String detect(String str) {
+      String detectedContentType = null;
+      int lim = str.length() - 1;
+      for (int i=0; i<lim; i++) {
+        char ch = str.charAt(i);
+        if (Character.isWhitespace(ch)) {
+          continue;
         }
-        if(first == '{') {
-          return "application/json";
+        // first non-whitespace chars
+        if (ch == '#'                         // single line comment
+            || (ch == '/' && (str.charAt(i + 1) == '/' || str.charAt(i + 1) == '*'))  // single line or multi-line comment
+            || (ch == '{' || ch == '[')       // start of JSON object
+            )
+        {
+          detectedContentType = "application/json";
+        } else if (ch == '<') {
+          detectedContentType = "text/xml";
         }
-        // find a comma? for CSV?
+        break;
       }
-      return contentType;
+      return detectedContentType;
     }
 
     @Override

Modified: lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/util/FastInputStream.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/util/FastInputStream.java?rev=1670257&r1=1670256&r2=1670257&view=diff
==============================================================================
--- lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/util/FastInputStream.java (original)
+++ lucene/dev/branches/lucene6271/solr/solrj/src/java/org/apache/solr/common/util/FastInputStream.java Tue Mar 31 05:22:40 2015
@@ -96,6 +96,21 @@ public class FastInputStream extends Dat
     return end - pos;
   }
 
+  /** Returns the internal buffer used for caching */
+  public byte[] getBuffer() {
+    return buf;
+  }
+
+  /** Current position within the internal buffer */
+  public int getPositionInBuffer() {
+    return pos;
+  }
+
+  /** Current end-of-data position within the internal buffer.  This is one past the last valid byte. */
+  public int getEndInBuffer() {
+    return end;
+  }
+
   @Override
   public int read(byte b[], int off, int len) throws IOException {
     int r=0;  // number of bytes we have read