You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by ry...@apache.org on 2008/02/29 06:34:55 UTC

svn commit: r632228 - in /lucene/solr/trunk/client/java/solrj: CHANGES.txt src/org/apache/solr/client/solrj/ResponseParser.java src/org/apache/solr/client/solrj/SolrRequest.java src/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java

Author: ryan
Date: Thu Feb 28 21:34:51 2008
New Revision: 632228

URL: http://svn.apache.org/viewvc?rev=632228&view=rev
Log:
SOLR-476: CommonsHttpSolrServer can set the ResponseParser on a per request basis.

Modified:
    lucene/solr/trunk/client/java/solrj/CHANGES.txt
    lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/ResponseParser.java
    lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/SolrRequest.java
    lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java

Modified: lucene/solr/trunk/client/java/solrj/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/client/java/solrj/CHANGES.txt?rev=632228&r1=632227&r2=632228&view=diff
==============================================================================
--- lucene/solr/trunk/client/java/solrj/CHANGES.txt (original)
+++ lucene/solr/trunk/client/java/solrj/CHANGES.txt Thu Feb 28 21:34:51 2008
@@ -40,6 +40,9 @@
  4. SOLR-436: To make future changes easier, SolrServer changed from an
     interface to an abstract super class. (ryan)
 
+ 5. SOLR-476: CommonsHttpSolrServer can set the ResponseParser on a per 
+    request basis.  (Grant Ingersoll, ryan)
+
 Bug Fixes
 
 Other Changes

Modified: lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/ResponseParser.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/ResponseParser.java?rev=632228&r1=632227&r2=632228&view=diff
==============================================================================
--- lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/ResponseParser.java (original)
+++ lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/ResponseParser.java Thu Feb 28 21:34:51 2008
@@ -33,4 +33,12 @@
   public abstract NamedList<Object> processResponse(InputStream body, String encoding);
 
   public abstract NamedList<Object> processResponse(Reader reader);
+  
+  /**
+   * @return the version param passed to solr
+   */
+  public String getVersion()
+  {
+    return "2.2";
+  }
 }

Modified: lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/SolrRequest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/SolrRequest.java?rev=632228&r1=632227&r2=632228&view=diff
==============================================================================
--- lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/SolrRequest.java (original)
+++ lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/SolrRequest.java Thu Feb 28 21:34:51 2008
@@ -39,6 +39,7 @@
   private METHOD method = METHOD.GET;
   private String path = null;
 
+  private ResponseParser responseParser;
   //---------------------------------------------------------
   //---------------------------------------------------------
 
@@ -63,6 +64,23 @@
   }
   public void setPath(String path) {
     this.path = path;
+  }
+
+  /**
+   *
+   * @return The {@link org.apache.solr.client.solrj.ResponseParser}
+   */
+  public ResponseParser getResponseParser() {
+    return responseParser;
+  }
+
+  /**
+   * Optionally specify how the Response should be parsed.  Not all server implementations require a ResponseParser
+   * to be specified.
+   * @param responseParser The {@link org.apache.solr.client.solrj.ResponseParser}
+   */
+  public void setResponseParser(ResponseParser responseParser) {
+    this.responseParser = responseParser;
   }
 
   public abstract SolrParams getParams();

Modified: lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java?rev=632228&r1=632227&r2=632228&view=diff
==============================================================================
--- lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java (original)
+++ lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java Thu Feb 28 21:34:51 2008
@@ -62,7 +62,7 @@
    */
   protected String _baseURL;
   protected ModifiableSolrParams _invariantParams;
-  protected ResponseParser _processor;
+  protected ResponseParser _parser;
   
   private final HttpClient _httpClient;
   private boolean _followRedirects = false;
@@ -85,7 +85,11 @@
    * will use this SolrServer.
    */
   public CommonsHttpSolrServer(String solrServerUrl, HttpClient httpClient) throws MalformedURLException {
-    this(new URL(solrServerUrl), httpClient);
+    this(new URL(solrServerUrl), httpClient, new XMLResponseParser());
+  }
+
+  public CommonsHttpSolrServer(String solrServerUrl, HttpClient httpClient, ResponseParser parser) throws MalformedURLException {
+    this(new URL(solrServerUrl), httpClient, parser);
   }
 
   /**
@@ -96,11 +100,15 @@
    */
   public CommonsHttpSolrServer(URL baseURL) 
   {
-    this(baseURL, null);
+    this(baseURL, null, new XMLResponseParser());
   }
 
+  public CommonsHttpSolrServer(URL baseURL, HttpClient client){
+    this(baseURL, client, new XMLResponseParser());
+  }
 
-  private CommonsHttpSolrServer(URL baseURL, HttpClient client) {
+
+  public CommonsHttpSolrServer(URL baseURL, HttpClient client, ResponseParser parser) {
     this._baseURL = baseURL.toExternalForm();
     if( this._baseURL.endsWith( "/" ) ) {
       this._baseURL = this._baseURL.substring( 0, this._baseURL.length()-1 );
@@ -117,24 +125,36 @@
     }
 
     // by default use the XML one
-    _processor = new XMLResponseParser();
-
-    // TODO -- expose these so that people can add things like 'u' & 'p'
-    _invariantParams = new ModifiableSolrParams();
-    _invariantParams.set( CommonParams.WT, _processor.getWriterType() );
-    _invariantParams.set( CommonParams.VERSION, "2.2" );
+    _parser = parser;
   }
 
 
   //------------------------------------------------------------------------
   //------------------------------------------------------------------------
 
+  /**
+   * Process the request.  If {@link org.apache.solr.client.solrj.SolrRequest#getResponseParser()} is null, then use
+   * {@link #getParser()}
+   * @param request The {@link org.apache.solr.client.solrj.SolrRequest} to process
+   * @return The {@link org.apache.solr.common.util.NamedList} result
+   * @throws SolrServerException
+   * @throws IOException
+   *
+   * @see #request(org.apache.solr.client.solrj.SolrRequest, org.apache.solr.client.solrj.ResponseParser)
+   */
   @Override
   public NamedList<Object> request( final SolrRequest request ) throws SolrServerException, IOException
   {
-    // TODO -- need to set the WRITER TYPE!!!
-    // params.set( SolrParams.WT, wt );
-   
+    ResponseParser responseParser = request.getResponseParser();
+    if (responseParser == null) {
+      responseParser = _parser;
+    }
+    return request(request, responseParser);
+  }
+
+  
+  public NamedList<Object> request(final SolrRequest request, ResponseParser processor) throws SolrServerException, IOException{
+    
     HttpMethod method = null;
     SolrParams params = request.getParams();
     Collection<ContentStream> streams = request.getContentStreams();
@@ -142,15 +162,29 @@
     if( path == null || !path.startsWith( "/" ) ) {
       path = "/select";
     }
-        
+    
+    ResponseParser parser = request.getResponseParser();
+    if( parser == null ) {
+      parser = _parser;
+    }
+    
+    // The parser 'wt=' and 'version=' params are used instead of the original params
+    ModifiableSolrParams wparams = new ModifiableSolrParams();
+    wparams = new ModifiableSolrParams();
+    wparams.set( CommonParams.WT, parser.getWriterType() );
+    wparams.set( CommonParams.VERSION, parser.getVersion() );
     if( params == null ) {
-      params = new ModifiableSolrParams();
+      params = wparams;
     }
+    else {
+      params = new DefaultSolrParams( wparams, params );
+    }
+    
     if( _invariantParams != null ) {
       params = new DefaultSolrParams( _invariantParams, params );
     }
-    
-    int tries = _maxRetries + 1;        
+
+    int tries = _maxRetries + 1;
     try {
       while( tries-- > 0 ) {
         // Note: since we aren't do intermittent time keeping
@@ -165,14 +199,14 @@
             method = new GetMethod( _baseURL + path + ClientUtils.toQueryString( params, false ) );
           }
           else if( SolrRequest.METHOD.POST == request.getMethod() ) {
-            
+
             String url = _baseURL + path;
             boolean isMultipart = ( streams != null && streams.size() > 1 );
-            
+
             if( streams == null || isMultipart ) {
               // Without streams, just post the parameters
               PostMethod post = new PostMethod( url );
-            
+
               Iterator<String> iter = params.getParameterNamesIterator();
               while( iter.hasNext() ) {
                 String p = iter.next();
@@ -186,16 +220,16 @@
                   post.addParameter( p, null );
                 }
               }
-              
-              post.getParams().setContentCharset("UTF-8");   
+
+              post.getParams().setContentCharset("UTF-8");
 
               if( isMultipart ) {
                 int i=0;
                 Part[] parts = new Part[streams.size()];
-                
+
                 for( ContentStream content : streams ) {
                   final ContentStream c = content;
-                  
+
                   String charSet = null;
                   String transferEncoding = null;
                   parts[i++] = new PartBase( c.getName(), c.getContentType(), charSet, transferEncoding ) {
@@ -203,14 +237,14 @@
                     protected long lengthOfData() throws IOException {
                       return c.getSize();
                     }
-                    
+
                     @Override
                       protected void sendData(OutputStream out) throws IOException {
                       IOUtils.copy( c.getReader(), out );
                     }
-                  }; 
+                  };
                 }
-                
+
                 // Set the multi-part request
                 post.setRequestEntity( new MultipartRequestEntity( parts, post.getParams() ) );
                 method = post;
@@ -222,11 +256,11 @@
             else {
               String pstr = ClientUtils.toQueryString( params, false );
               PostMethod post = new PostMethod( url+pstr );
-              
+
               // Single stream as body
               // Using a loop just to get the first one
               for( ContentStream content : streams ) {
-                post.setRequestEntity( 
+                post.setRequestEntity(
                     new InputStreamRequestEntity( content.getStream(), content.getContentType())
                 );
                 break;
@@ -253,17 +287,17 @@
     catch( IOException ex ) {
       throw new SolrServerException("error reading streams", ex );
     }
-    
+
     method.setFollowRedirects( _followRedirects );
     method.addRequestHeader( "User-Agent", AGENT );
     if( _allowCompression ) {
       method.setRequestHeader( new Header( "Accept-Encoding", "gzip,deflate" ) );
     }
-    
+
     try {
       // Execute the method.
       //System.out.println( "EXECUTE:"+method.getURI() );
-    
+
       int statusCode = _httpClient.executeMethod(method);
       if (statusCode != HttpStatus.SC_OK) {
         StringBuilder msg = new StringBuilder();
@@ -274,7 +308,7 @@
         msg.append( "request: "+method.getURI() );
         throw new SolrException(statusCode, java.net.URLDecoder.decode(msg.toString(), "UTF-8") );
       }
-      
+
       // Read the contents
       String charset = "UTF-8";
       if( method instanceof HttpMethodBase ) {
@@ -314,8 +348,8 @@
           }
         }
       }
-      return _processor.processResponse(respBody, charset);
-    } 
+      return processor.processResponse(respBody, charset);
+    }
     catch (HttpException e) {
       throw new SolrServerException( e );
     }
@@ -347,12 +381,16 @@
     this._baseURL = baseURL;
   }
 
-  public ResponseParser getProcessor() {
-    return _processor;
+  public ResponseParser getParser() {
+    return _parser;
   }
 
-  public void setProcessor(ResponseParser processor) {
-    _processor = processor;
+  /**
+   * Note: Setting this value is not thread-safe.
+   * @param processor The {@link org.apache.solr.client.solrj.ResponseParser}
+   */
+  public void setParser(ResponseParser processor) {
+    _parser = processor;
   }
 
   public HttpClient getHttpClient() {