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 2007/04/29 20:09:32 UTC

svn commit: r533538 - in /lucene/solr/trunk/src: test/org/apache/solr/servlet/DirectSolrConnectionTest.java test/test-files/solr/crazy-path-to-config.xml webapp/src/org/apache/solr/servlet/DirectSolrConnection.java

Author: ryan
Date: Sun Apr 29 11:09:30 2007
New Revision: 533538

URL: http://svn.apache.org/viewvc?view=rev&rev=533538
Log:
SOLR-212 - Adding DirectSolrConnection.java this give you a text interfave to solr without HTTP

Added:
    lucene/solr/trunk/src/test/org/apache/solr/servlet/DirectSolrConnectionTest.java   (with props)
    lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/DirectSolrConnection.java   (with props)
Modified:
    lucene/solr/trunk/src/test/test-files/solr/crazy-path-to-config.xml

Added: lucene/solr/trunk/src/test/org/apache/solr/servlet/DirectSolrConnectionTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/servlet/DirectSolrConnectionTest.java?view=auto&rev=533538
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/servlet/DirectSolrConnectionTest.java (added)
+++ lucene/solr/trunk/src/test/org/apache/solr/servlet/DirectSolrConnectionTest.java Sun Apr 29 11:09:30 2007
@@ -0,0 +1,83 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.servlet;
+
+import org.apache.solr.request.SolrParams;
+import org.apache.solr.util.AbstractSolrTestCase;
+
+
+
+public class DirectSolrConnectionTest extends AbstractSolrTestCase 
+{
+  public String getSchemaFile() { return "solr/crazy-path-to-schema.xml"; }
+  public String getSolrConfigFile() { return "solr/crazy-path-to-config.xml"; }
+  
+  DirectSolrConnection direct;
+  
+  @Override
+  public void setUp() throws Exception
+  {
+    super.setUp();
+    direct = new DirectSolrConnection();
+  }
+
+  // Check that a request gets back the echoParams call
+  public void testSimpleRequest() throws Exception 
+  { 
+    String pathAndParams = "/select?wt=xml&version=2.2&echoParams=explicit&q=*:*";
+    
+    String got = direct.request( pathAndParams, null );
+    
+    assertTrue( got.indexOf( "<str name=\"echoParams\">explicit</str>" ) > 5 );
+    
+    
+    // It should throw an exception for unknown handler
+    try {
+      direct.request( "/path to nonexistang thingy!!", null );
+      fail( "should throw an exception" );
+    }
+    catch( Exception ex ){}
+  }
+  
+
+  // Check that a request gets back the echoParams call
+  public void testInsertThenSelect() throws Exception 
+  { 
+    String value = "Kittens!!! \u20AC";
+    String[] cmds = new String[] {
+      "<delete><id>42</id></delete>",
+      "<add><doc><field name=\"id\">42</field><field name=\"subject\">"+value+"</field></doc></add>",
+      "<commit/>"
+    };
+    String getIt = "/select?wt=xml&q=id:42";
+    
+    // Test using the Stream body parameter
+    for( String cmd : cmds ) {
+      direct.request( "/update?"+SolrParams.STREAM_BODY+"="+cmd, null );
+    }
+    String got = direct.request( getIt, null );
+    assertTrue( got.indexOf( value ) > 0 );
+    
+    // Same thing using the posted body
+    for( String cmd : cmds ) {
+      direct.request( "/update", cmd );
+    }
+    got = direct.request( getIt, null );
+    assertTrue( got.indexOf( value ) > 0 );
+  }
+}

Propchange: lucene/solr/trunk/src/test/org/apache/solr/servlet/DirectSolrConnectionTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: lucene/solr/trunk/src/test/org/apache/solr/servlet/DirectSolrConnectionTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: lucene/solr/trunk/src/test/test-files/solr/crazy-path-to-config.xml
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/test-files/solr/crazy-path-to-config.xml?view=diff&rev=533538&r1=533537&r2=533538
==============================================================================
--- lucene/solr/trunk/src/test/test-files/solr/crazy-path-to-config.xml (original)
+++ lucene/solr/trunk/src/test/test-files/solr/crazy-path-to-config.xml Sun Apr 29 11:09:30 2007
@@ -62,6 +62,8 @@
       <str name="fl">implicit</str>
     </lst>
   </requestHandler>
+  <requestHandler name="/update" class="solr.XmlUpdateRequestHandler" />
+  
   
   <queryResponseWriter name="standard" class="org.apache.solr.request.XMLResponseWriter"/>
   <queryResponseWriter name="useless" class="org.apache.solr.OutputWriterTest$UselessOutputWriter"/>

Added: lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/DirectSolrConnection.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/DirectSolrConnection.java?view=auto&rev=533538
==============================================================================
--- lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/DirectSolrConnection.java (added)
+++ lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/DirectSolrConnection.java Sun Apr 29 11:09:30 2007
@@ -0,0 +1,180 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.servlet;
+
+import java.io.File;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.solr.core.Config;
+import org.apache.solr.core.SolrConfig;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.core.SolrException;
+import org.apache.solr.request.MapSolrParams;
+import org.apache.solr.request.QueryResponseWriter;
+import org.apache.solr.request.SolrParams;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.request.SolrQueryResponse;
+import org.apache.solr.request.SolrRequestHandler;
+import org.apache.solr.schema.IndexSchema;
+import org.apache.solr.util.ContentStream;
+import org.apache.solr.util.ContentStreamBase;
+
+/**
+ * DirectSolrConnection provides an interface to solr that is similar to 
+ * the the HTTP interface, but does not require an HTTP connection.
+ * 
+ * This class is designed to be as simple as possible and alow for more flexibility
+ * in how you interface to solr.
+ * 
+ * @author ryan
+ * @version $Id$
+ * @since solr 1.2
+ */
+public class DirectSolrConnection 
+{
+  final SolrCore core;
+  final SolrRequestParsers parser;
+  
+  /**
+   * Initialize using the static singleton SolrCore.getSolrCore().
+   */
+  public DirectSolrConnection()
+  {
+    core = SolrCore.getSolrCore();
+    parser = new SolrRequestParsers( core, SolrConfig.config );
+  }
+
+  /**
+   * Initialize using an explicit SolrCore
+   */
+  public DirectSolrConnection( SolrCore c )
+  {
+    core = c;
+    parser = new SolrRequestParsers( core, SolrConfig.config );
+  }
+
+  /**
+   * This constructor is designed to make it easy for JNI embedded applications 
+   * to setup the entire solr environment with a simple interface.  It takes three parameters:
+   * 
+   * <code>instanceDir:</code> The solr instance directory.  If null, it will check the standard 
+   * places first (JNDI,properties,"solr" directory)
+   * 
+   * <code>dataDir:</code> where the index is stored. 
+   * 
+   * <code>loggingPath:</code> Path to a java.util.logging.config.file.  If the path represents
+   * an absolute path or is relative to the CWD, it will use that.  Next it will try a path 
+   * relative to the instanceDir.  If none of these files exist, it will error.
+   */
+  public DirectSolrConnection( String instanceDir, String dataDir, String loggingPath )
+  {
+    // Set the instance directory
+    if( instanceDir != null ) {
+      if( Config.isInstanceDirInitialized() ) {
+        String dir = Config.getInstanceDir();
+        if( !dir.equals( instanceDir ) ) {
+          throw new SolrException( 500, "already initalized: "+dir  );
+        }
+      }
+      Config.setInstanceDir( instanceDir );
+    }
+    
+    // If a loggingPath is specified, try using that
+    if( loggingPath != null ) {
+      File loggingConfig = new File( loggingPath );
+      if( !loggingConfig.exists() ) {
+        loggingConfig = new File( new File(Config.getInstanceDir()), loggingPath  );
+      }
+      if( loggingConfig.exists() ) {
+        System.setProperty("java.util.logging.config.file", loggingConfig.getAbsolutePath() ); 
+      }
+      else {
+        throw new SolrException( 500, "can not find logging file: "+loggingConfig );
+      }
+    }
+    
+    // If the Data directory is specified, initalize SolrCore directly
+    if( dataDir != null ) {
+      core = new SolrCore( dataDir, new IndexSchema(instanceDir+"/conf/schema.xml"));
+    }
+    else {
+      core = SolrCore.getSolrCore();
+    }
+    parser = new SolrRequestParsers( core, SolrConfig.config );
+  }
+  
+
+  /**
+   * For example:
+   * 
+   * String json = solr.request( "/select?qt=dismax&wt=json&q=...", null );
+   * String xml = solr.request( "/update", "<add><doc><field ..." );
+   * 
+   */
+  public String request( String pathAndParams, String body ) throws Exception
+  {
+    String path = null;
+    SolrParams params = null;
+    int idx = pathAndParams.indexOf( '?' );
+    if( idx > 0 ) {
+      path = pathAndParams.substring( 0, idx );
+      params = SolrRequestParsers.parseQueryString( pathAndParams.substring(idx+1) );
+    }
+    else {
+      path= pathAndParams;
+      params = new MapSolrParams( new HashMap<String, String>() );
+    }
+    
+    // Extract the handler from the path or params
+    SolrRequestHandler handler = core.getRequestHandler( path );
+    if( handler == null ) {
+      if( "/select".equals( path ) || "/select/".equalsIgnoreCase( path) ) {
+        String qt = params.get( SolrParams.QT );
+        handler = core.getRequestHandler( qt );
+        if( handler == null ) {
+          throw new SolrException( 400, "unknown handler: "+qt);
+        }
+      }
+    }
+    if( handler == null ) {
+      throw new SolrException( 400, "unknown handler: "+path );
+    }
+    
+    // Make a stream for the 'body' content
+    List<ContentStream> streams = new ArrayList<ContentStream>( 1 );
+    if( body != null && body.length() > 0 ) {
+      streams.add( new ContentStreamBase.StringStream( body ) );
+    }
+    
+    SolrQueryRequest req = parser.buildRequestFrom( params, streams );
+    SolrQueryResponse rsp = new SolrQueryResponse();
+    core.execute( handler, req, rsp );
+    if( rsp.getException() != null ) {
+      throw rsp.getException();
+    }
+    
+    // Now write it out
+    QueryResponseWriter responseWriter = core.getQueryResponseWriter(req);
+    StringWriter out = new StringWriter();
+    responseWriter.write(out, req, rsp);
+    return out.toString();
+  }
+}

Propchange: lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/DirectSolrConnection.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/DirectSolrConnection.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL