blob: 27da6a2e94bdea62303ac7d4295d744077d5fc9f [file] [log] [blame]
/*
* 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.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.MapSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.ContentStream;
import org.apache.solr.common.util.ContentStreamBase;
import org.apache.solr.core.SolrCore;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.request.SolrRequestInfo;
import org.apache.solr.response.QueryResponseWriter;
import org.apache.solr.response.SolrQueryResponse;
/**
* 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 allow for more flexibility
* in how you interface to Solr.
*
*
* @since solr 1.2
*/
public class DirectSolrConnection
{
protected final SolrCore core;
protected final SolrRequestParsers parser;
/**
* Initialize using an explicit SolrCore
*/
public DirectSolrConnection( SolrCore c )
{
core = c;
parser = new SolrRequestParsers( c.getSolrConfig() );
}
/**
* For example:
*
* String json = solr.request( "/select?qt=dismax&wt=json&q=...", null );
* String xml = solr.request( "/select?qt=dismax&wt=xml&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>() );
}
return request(path, params, body);
}
public String request(String path, SolrParams params, String body) throws Exception
{
// Extract the handler from the path or params
SolrRequestHandler handler = core.getRequestHandler( path );
if( handler == null ) {
if( "/select".equals( path ) || "/select/".equalsIgnoreCase( path) ) {
if (params == null)
params = new MapSolrParams( new HashMap<String, String>() );
String qt = params.get( CommonParams.QT );
handler = core.getRequestHandler( qt );
if( handler == null ) {
throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "unknown handler: "+qt);
}
}
}
if( handler == null ) {
throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "unknown handler: "+path );
}
return request(handler, params, body);
}
public String request(SolrRequestHandler handler, SolrParams params, String body) throws Exception
{
if (params == null)
params = new MapSolrParams( new HashMap<String, String>() );
// Make a stream for the 'body' content
List<ContentStream> streams = new ArrayList<>( 1 );
if( body != null && body.length() > 0 ) {
streams.add( new ContentStreamBase.StringStream( body ) );
}
SolrQueryRequest req = null;
try {
req = parser.buildRequestFrom( core, params, streams );
SolrQueryResponse rsp = new SolrQueryResponse();
SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp));
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();
} finally {
if (req != null) {
req.close();
SolrRequestInfo.clearRequestInfo();
}
}
}
/**
* Use this method to close the underlying SolrCore.
*
* @since solr 1.3
*/
public void close() {
core.close();
}
}