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 ho...@apache.org on 2006/05/26 07:44:03 UTC

svn commit: r409560 - in /incubator/solr/trunk: ./ example/solr/conf/ src/java/org/apache/solr/core/ src/java/org/apache/solr/util/ src/test/org/apache/solr/ src/test/test-files/solr/ src/webapp/src/org/apache/solr/servlet/

Author: hossman
Date: Thu May 25 22:44:02 2006
New Revision: 409560

URL: http://svn.apache.org/viewvc?rev=409560&view=rev
Log:
Support for customizing the QueryResponseWriter per request - SOLR-16

Added:
    incubator/solr/trunk/src/test/org/apache/solr/OutputWriterTest.java
Modified:
    incubator/solr/trunk/CHANGES.txt
    incubator/solr/trunk/example/solr/conf/solrconfig.xml
    incubator/solr/trunk/src/java/org/apache/solr/core/SolrCore.java
    incubator/solr/trunk/src/java/org/apache/solr/util/TestHarness.java
    incubator/solr/trunk/src/test/test-files/solr/crazy-path-to-config.xml
    incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServlet.java

Modified: incubator/solr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/CHANGES.txt?rev=409560&r1=409559&r2=409560&view=diff
==============================================================================
--- incubator/solr/trunk/CHANGES.txt (original)
+++ incubator/solr/trunk/CHANGES.txt Thu May 25 22:44:02 2006
@@ -12,8 +12,9 @@
  6. The default search field may now be overridden by requests to the
     standard request handler using the df query parameter. (Erik Hatcher)
  7. Added DisMaxRequestHandler and SolrPluginUtils. (Chris Hostetter)
-
-
+ 8. Support for customizing the QueryResponseWriter per request
+    (Mike Baranczak / SOLR-16 / hossman)
+ 
 Changes in runtime behavior
  1. classes reorganized into different packages, package names changed to Apache
  2. force read of document stored fields in QuerySenderListener

Modified: incubator/solr/trunk/example/solr/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/example/solr/conf/solrconfig.xml?rev=409560&r1=409559&r2=409560&view=diff
==============================================================================
--- incubator/solr/trunk/example/solr/conf/solrconfig.xml (original)
+++ incubator/solr/trunk/example/solr/conf/solrconfig.xml Thu May 25 22:44:02 2006
@@ -218,6 +218,17 @@
      </str>
   </requestHandler>
   
+  <!-- queryResponseWriter plugins... query responses will be written using the
+    writer specified by the 'wt' request parameter matching the name of a registered
+    writer.
+    The "standard" writer is the default and will be used if 'wt' is not specified 
+    in the request. XMLResponseWriter will be used if nothing specified here.
+    
+    <queryResponseWriter name="standard" class="org.apache.solr.request.XMLResponseWriter"/>
+    <queryResponseWriter name="custom" class="com.example.MyResponseWriter"/>
+  -->
+
+    
   <!-- config for the admin interface --> 
   <admin>
     <defaultQuery>solr</defaultQuery>

Modified: incubator/solr/trunk/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/java/org/apache/solr/core/SolrCore.java?rev=409560&r1=409559&r2=409560&view=diff
==============================================================================
--- incubator/solr/trunk/src/java/org/apache/solr/core/SolrCore.java (original)
+++ incubator/solr/trunk/src/java/org/apache/solr/core/SolrCore.java Thu May 25 22:44:02 2006
@@ -16,13 +16,17 @@
 
 package org.apache.solr.core;
 
+import java.util.Map;
+import java.util.TreeMap;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
+import org.apache.solr.request.QueryResponseWriter;
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrQueryResponse;
+import org.apache.solr.request.XMLResponseWriter;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.update.*;
@@ -30,6 +34,7 @@
 import org.apache.solr.util.RefCounted;
 import org.apache.solr.util.StrUtils;
 import org.apache.solr.util.XML;
+import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xmlpull.v1.XmlPullParser;
@@ -52,6 +57,7 @@
 
 /**
  * @author yonik
+ * @author <a href='mailto:mbaranczak@epublishing.com'> Mike Baranczak </a> 
  * @version $Id$
  */
 
@@ -196,6 +202,8 @@
       parseListeners();
 
       initIndex();
+      
+      initWriters();
 
       try {
         // Open the searcher *before* the handler so we don't end up opening
@@ -936,6 +944,61 @@
     } catch (Exception ee) {
       log.severe("Error writing to putput stream: "+ee);
     }
+  }
+  
+  
+  
+  private QueryResponseWriter defaultResponseWriter;
+  private Map<String, QueryResponseWriter> responseWriters
+    = new TreeMap<String, QueryResponseWriter>();
+  
+  /** Configure the query response writers. There will always be a default writer; additional 
+   * writers may also be configured. */
+  private void initWriters() {
+    String xpath = "queryResponseWriter";
+    NodeList nodes = (NodeList) SolrConfig.config.evaluate(xpath, XPathConstants.NODESET);
+    int length = nodes.getLength();
+    for (int i=0; i<length; i++) {
+      Element elm = (Element) nodes.item(i);
+      
+      try {
+        String name = DOMUtil.getAttr(elm,"name", xpath+" config");
+        String className = DOMUtil.getAttr(elm,"class", xpath+" config");
+        log.info("adding queryResponseWriter "+name+"="+className);
+          
+        QueryResponseWriter writer = (QueryResponseWriter) Config.newInstance(className);
+        responseWriters.put(name, writer);
+      } catch (Exception ex) {
+        SolrException.logOnce(log,null, ex);
+        // if a writer can't be created, skip it and continue
+      }
+    }
+
+    // configure the default response writer; this one should never be null
+    if (responseWriters.containsKey("standard")) {
+      defaultResponseWriter = responseWriters.get("standard");
+    }
+    if (defaultResponseWriter == null) {
+      defaultResponseWriter = new XMLResponseWriter();
+    }
+  }
+  
+  /** Finds a writer by name, or returns the default writer if not found. */
+  public final QueryResponseWriter getQueryResponseWriter(String writerName) {
+    if (writerName != null) {
+        QueryResponseWriter writer = responseWriters.get(writerName);
+        if (writer != null) {
+            return writer;
+        }
+    }
+    return defaultResponseWriter;
+  }
+
+  /** Returns the appropriate writer for a request. If the request specifies a writer via the
+   * 'wt' parameter, attempts to find that one; otherwise return the default writer.
+   */
+  public final QueryResponseWriter getQueryResponseWriter(SolrQueryRequest request) {
+    return getQueryResponseWriter(request.getParam("wt")); 
   }
 
 

Modified: incubator/solr/trunk/src/java/org/apache/solr/util/TestHarness.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/java/org/apache/solr/util/TestHarness.java?rev=409560&r1=409559&r2=409560&view=diff
==============================================================================
--- incubator/solr/trunk/src/java/org/apache/solr/util/TestHarness.java (original)
+++ incubator/solr/trunk/src/java/org/apache/solr/util/TestHarness.java Thu May 25 22:44:02 2006
@@ -51,7 +51,6 @@
 public class TestHarness {
 
   private SolrCore core;
-  private XMLResponseWriter xmlwriter = new XMLResponseWriter();
   private XPath xpath = XPathFactory.newInstance().newXPath();
   private DocumentBuilder builder;
         
@@ -183,12 +182,13 @@
       throw rsp.getException();
     }
                 
-    StringWriter writer = new StringWriter(32000);
-    xmlwriter.write(writer,req,rsp);
+    StringWriter sw = new StringWriter(32000);
+    QueryResponseWriter responseWriter = core.getQueryResponseWriter(req);
+    responseWriter.write(sw,req,rsp);
 
     req.close();
     
-    return writer.toString();
+    return sw.toString();
   }
 
 

Added: incubator/solr/trunk/src/test/org/apache/solr/OutputWriterTest.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/test/org/apache/solr/OutputWriterTest.java?rev=409560&view=auto
==============================================================================
--- incubator/solr/trunk/src/test/org/apache/solr/OutputWriterTest.java (added)
+++ incubator/solr/trunk/src/test/org/apache/solr/OutputWriterTest.java Thu May 25 22:44:02 2006
@@ -0,0 +1,73 @@
+/**
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.solr;
+
+import java.io.IOException;
+import java.io.Writer;
+import org.apache.solr.request.QueryResponseWriter;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.request.SolrQueryResponse;
+import org.apache.solr.util.AbstractSolrTestCase;
+import org.apache.solr.util.TestHarness;
+
+/** Tests the ability to configure multiple query output writers, and select those
+ * at query time.
+ *
+ * @author <a href='mailto:mbaranczak@epublishing.com'> Mike Baranczak </a>
+ */
+public class OutputWriterTest extends AbstractSolrTestCase {
+    
+    /** The XML string that's output for testing purposes. */
+    public static final String USELESS_OUTPUT = "useless output";
+    
+    
+    public String getSchemaFile() { return "solr/crazy-path-to-schema.xml"; }
+    
+    public String getSolrConfigFile() { return "solr/crazy-path-to-config.xml"; }
+    
+    
+    public void testOriginalSolrWriter() {
+        lrf.args.put("wt", "standard");
+        assertQ(req("foo"), "//response/responseHeader/status");
+        
+        lrf.args.remove("wt");
+        assertQ(req("foo"), "//response/responseHeader/status");
+    }
+    
+    public void testUselessWriter() throws Exception {
+        lrf.args.put("wt", "useless");
+        String out = h.query(req("foo"));
+        assertEquals(USELESS_OUTPUT, out);
+    }
+    
+    
+    ////////////////////////////////////////////////////////////////////////////
+    /** An output writer that doesn't do anything useful. */
+    
+    public static class UselessOutputWriter implements QueryResponseWriter {
+        
+        public UselessOutputWriter() {}
+        
+        public void write(Writer writer, SolrQueryRequest request, SolrQueryResponse response)
+        throws IOException {
+            
+            writer.write(USELESS_OUTPUT);
+        }
+        
+    }
+    
+}

Modified: incubator/solr/trunk/src/test/test-files/solr/crazy-path-to-config.xml
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/test/test-files/solr/crazy-path-to-config.xml?rev=409560&r1=409559&r2=409560&view=diff
==============================================================================
--- incubator/solr/trunk/src/test/test-files/solr/crazy-path-to-config.xml (original)
+++ incubator/solr/trunk/src/test/test-files/solr/crazy-path-to-config.xml Thu May 25 22:44:02 2006
@@ -40,8 +40,13 @@
     <HashDocSet maxSize="3000" loadFactor="0.75"/>
     <boolTofilterOptimizer enabled="true" cacheSize="32" threshold=".05"/>
   </query>
+  
   <requestHandler name="standard" class="solr.StandardRequestHandler" />
   <requestHandler name="crazy_custom_qt" class="solr.StandardRequestHandler" />
+  
+  <queryResponseWriter name="standard" class="org.apache.solr.request.XMLResponseWriter"/>
+  <queryResponseWriter name="useless" class="org.apache.solr.OutputWriterTest$UselessOutputWriter"/>
+
 
   <admin>
     <defaultQuery>solr</defaultQuery>

Modified: incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServlet.java
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServlet.java?rev=409560&r1=409559&r2=409560&view=diff
==============================================================================
--- incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServlet.java (original)
+++ incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServlet.java Thu May 25 22:44:02 2006
@@ -20,7 +20,7 @@
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrException;
 import org.apache.solr.request.SolrQueryResponse;
-import org.apache.solr.request.XMLResponseWriter;
+import org.apache.solr.request.QueryResponseWriter;
 
 import javax.naming.Context;
 import javax.naming.InitialContext;
@@ -36,17 +36,17 @@
 
 /**
  * @author yonik
+ * @author <a href='mailto:mbaranczak@epublishing.com'> Mike Baranczak </a>
  */
 
 public class SolrServlet extends HttpServlet {
+    
   final Logger log = Logger.getLogger(SolrServlet.class.getName());
   SolrCore core;
   private static String CONTENT_TYPE="text/xml;charset=UTF-8";
-
-  XMLResponseWriter xmlResponseWriter;
-
-  public void init() throws ServletException
-  {
+    
+    
+  public void init() throws ServletException {
     log.info("SolrServlet.init()");
     try {
       Context c = new InitialContext();
@@ -71,7 +71,7 @@
 
     log.info("user.dir=" + System.getProperty("user.dir"));
     core = SolrCore.getSolrCore();
-    xmlResponseWriter=new XMLResponseWriter();
+                
     log.info("SolrServlet.init() done");
   }
 
@@ -94,14 +94,15 @@
       core.execute(solrReq, solrRsp);
       if (solrRsp.getException() == null) {
         response.setContentType(CONTENT_TYPE);
-        PrintWriter writer = response.getWriter();
-        // if (solrReq.getStrParam("version","2").charAt(0) == '1')
-        xmlResponseWriter.write(writer, solrReq, solrRsp);
+        PrintWriter out = response.getWriter();
+
+        QueryResponseWriter responseWriter = core.getQueryResponseWriter(solrReq);
+        responseWriter.write(out, solrReq, solrRsp);
       } else {
         Exception e = solrRsp.getException();
         int rc=500;
         if (e instanceof SolrException) {
-          rc=((SolrException)e).code();
+           rc=((SolrException)e).code();
         }
         sendErr(rc, SolrException.toStr(e), request, response);
       }
@@ -115,7 +116,6 @@
       // This releases the IndexReader associated with the request
       solrReq.close();
     }
-
   }
 
   final void sendErr(int rc, String msg, HttpServletRequest request, HttpServletResponse response) {
@@ -142,4 +142,4 @@
     return request.getParameter(param)!=null ? true : false;
   }
 
-}
\ No newline at end of file
+}