mirror of https://github.com/apache/lucene.git
make solr more easily embeddable: SOLR-149
git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@508859 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a6f0f036ac
commit
28d75b04bc
|
@ -103,6 +103,10 @@ New Features
|
|||
configuration files loaded, including schema.xml and solrconfig.xml.
|
||||
(Erik Hatcher with inspiration from Andrew Saar)
|
||||
|
||||
12. SOLR-149: Changes to make Solr more easily embeddable, in addition
|
||||
to logging which request handler handled each request.
|
||||
(Ryan McKinley via yonik)
|
||||
|
||||
Changes in runtime behavior
|
||||
1. Highlighting using DisMax will only pick up terms from the main
|
||||
user query, not boost or filter queries (klaas).
|
||||
|
|
|
@ -248,6 +248,11 @@ public class Config {
|
|||
}
|
||||
return instanceDir;
|
||||
}
|
||||
|
||||
public static boolean isInstanceDirInitalized()
|
||||
{
|
||||
return instanceDir != null;
|
||||
}
|
||||
|
||||
// The directory where solr will look for config files by default.
|
||||
// defaults to "./solr/conf/"
|
||||
|
|
|
@ -608,7 +608,8 @@ public final class SolrCore {
|
|||
handler.handleRequest(req,rsp);
|
||||
setResponseHeaderValues(responseHeader,req,rsp);
|
||||
|
||||
log.info(req.getParamString()+ " 0 "+
|
||||
log.info(req.getContext().get("path") + " "
|
||||
+ req.getParamString()+ " 0 "+
|
||||
(int)(rsp.getEndTime() - req.getStartTime()));
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
|
||||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
|
@ -34,6 +34,16 @@
|
|||
<filter>
|
||||
<filter-name>SolrRequestFilter</filter-name>
|
||||
<filter-class>org.apache.solr.servlet.SolrDispatchFilter</filter-class>
|
||||
<!--
|
||||
<init-param>
|
||||
<param-name>handle-select</param-name>
|
||||
<param-value>true</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>path-prefix</param-name>
|
||||
<param-value>/xxx</param-value>
|
||||
</init-param>
|
||||
-->
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>SolrRequestFilter</filter-name>
|
||||
|
|
|
@ -40,6 +40,7 @@ import org.apache.solr.core.SolrConfig;
|
|||
import org.apache.solr.core.SolrCore;
|
||||
import org.apache.solr.core.SolrException;
|
||||
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;
|
||||
|
@ -53,31 +54,30 @@ public class SolrDispatchFilter implements Filter
|
|||
|
||||
protected SolrCore core;
|
||||
protected SolrRequestParsers parsers;
|
||||
protected boolean handleSelect = false;
|
||||
protected String pathPrefix = null; // strip this from the begging of a path
|
||||
|
||||
public void init(FilterConfig config) throws ServletException
|
||||
{
|
||||
log.info("SolrDispatchFilter.init()");
|
||||
try {
|
||||
Context c = new InitialContext();
|
||||
|
||||
/***
|
||||
System.out.println("Enumerating JNDI Context=" + c);
|
||||
NamingEnumeration<NameClassPair> en = c.list("java:comp/env");
|
||||
while (en.hasMore()) {
|
||||
NameClassPair ncp = en.next();
|
||||
System.out.println(" ENTRY:" + ncp);
|
||||
|
||||
// Only initalize the directory if it has not been done yet
|
||||
if( !Config.isInstanceDirInitalized() ) {
|
||||
try {
|
||||
Context c = new InitialContext();
|
||||
String home = (String)c.lookup("java:comp/env/solr/home");
|
||||
if (home!=null) Config.setInstanceDir(home);
|
||||
} catch (NoInitialContextException e) {
|
||||
log.info("JNDI not configured for Solr (NoInitialContextEx)");
|
||||
} catch (NamingException e) {
|
||||
log.info("No /solr/home in JNDI");
|
||||
}
|
||||
System.out.println("JNDI lookup=" + c.lookup("java:comp/env/solr/home"));
|
||||
***/
|
||||
|
||||
String home = (String)c.lookup("java:comp/env/solr/home");
|
||||
if (home!=null) Config.setInstanceDir(home);
|
||||
} catch (NoInitialContextException e) {
|
||||
log.info("JNDI not configured for Solr (NoInitialContextEx)");
|
||||
} catch (NamingException e) {
|
||||
log.info("No /solr/home in JNDI");
|
||||
}
|
||||
|
||||
|
||||
// web.xml configuration
|
||||
this.pathPrefix = config.getInitParameter( "path-prefix" );
|
||||
this.handleSelect = "true".equals( config.getInitParameter( "handle-select" ) );
|
||||
|
||||
log.info("user.dir=" + System.getProperty("user.dir"));
|
||||
core = SolrCore.getSolrCore();
|
||||
parsers = new SolrRequestParsers( core, SolrConfig.config );
|
||||
|
@ -99,17 +99,34 @@ public class SolrDispatchFilter implements Filter
|
|||
// this lets you handle /update/commit when /update is a servlet
|
||||
path += req.getPathInfo();
|
||||
}
|
||||
if( pathPrefix != null && path.startsWith( pathPrefix ) ) {
|
||||
path = path.substring( pathPrefix.length() );
|
||||
}
|
||||
|
||||
int idx = path.indexOf( ':' );
|
||||
if( idx > 0 ) {
|
||||
// save the portion after the ':' for a 'handler' path parameter
|
||||
path = path.substring( 0, idx );
|
||||
}
|
||||
|
||||
SolrQueryRequest solrReq = null;
|
||||
SolrRequestHandler handler = core.getRequestHandler( path );
|
||||
if( handler == null && handleSelect ) {
|
||||
if( "/select".equals( path ) || "/select/".equals( path ) ) {
|
||||
solrReq = parsers.parse( path, req );
|
||||
String qt = solrReq.getParams().get( SolrParams.QT );
|
||||
handler = core.getRequestHandler( qt );
|
||||
if( handler == null ) {
|
||||
throw new SolrException( 400, "unknown handler: "+qt);
|
||||
}
|
||||
}
|
||||
}
|
||||
if( handler != null ) {
|
||||
SolrQueryRequest solrReq = parsers.parse( path, req );
|
||||
if( solrReq == null ) {
|
||||
solrReq = parsers.parse( path, req );
|
||||
}
|
||||
SolrQueryResponse solrRsp = new SolrQueryResponse();
|
||||
core.execute( handler, solrReq, solrRsp );
|
||||
this.execute( req, handler, solrReq, solrRsp );
|
||||
if( solrRsp.getException() != null ) {
|
||||
sendError( (HttpServletResponse)response, solrRsp.getException() );
|
||||
return;
|
||||
|
@ -132,6 +149,12 @@ public class SolrDispatchFilter implements Filter
|
|||
// Otherwise let the webapp handle the request
|
||||
chain.doFilter(request, response);
|
||||
}
|
||||
|
||||
protected void execute( HttpServletRequest req, SolrRequestHandler handler, SolrQueryRequest sreq, SolrQueryResponse rsp) {
|
||||
// a custom filter could add more stuff to the request before passing it on.
|
||||
// for example: sreq.getContext().put( "HttpServletRequest", req );
|
||||
core.execute( handler, sreq, rsp );
|
||||
}
|
||||
|
||||
protected void sendError(HttpServletResponse res, Throwable ex) throws IOException
|
||||
{
|
||||
|
@ -157,4 +180,49 @@ public class SolrDispatchFilter implements Filter
|
|||
}
|
||||
res.sendError( code, ex.getMessage() + trace );
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Should the filter handle /select even if it is not mapped in solrconfig.xml
|
||||
*
|
||||
* This will use consistent error handling for /select?qt=xxx and /update/xml
|
||||
*
|
||||
*/
|
||||
public boolean isHandleSelect() {
|
||||
return handleSelect;
|
||||
}
|
||||
|
||||
public void setHandleSelect(boolean handleSelect) {
|
||||
this.handleSelect = handleSelect;
|
||||
}
|
||||
|
||||
/**
|
||||
* set the prefix for all paths. This is useful if you want to apply the
|
||||
* filter to something other then *.
|
||||
*
|
||||
* For example, if web.xml specifies:
|
||||
*
|
||||
* <filter-mapping>
|
||||
* <filter-name>SolrRequestFilter</filter-name>
|
||||
* <url-pattern>/xxx/*</url-pattern>
|
||||
* </filter-mapping>
|
||||
*
|
||||
* Make sure to set the PathPrefix to "/xxx" either with this function
|
||||
* or in web.xml
|
||||
*
|
||||
* <init-param>
|
||||
* <param-name>path-prefix</param-name>
|
||||
* <param-value>/xxx</param-value>
|
||||
* </init-param>
|
||||
*
|
||||
*/
|
||||
public void setPathPrefix(String pathPrefix) {
|
||||
this.pathPrefix = pathPrefix;
|
||||
}
|
||||
|
||||
public String getPathPrefix() {
|
||||
return pathPrefix;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -109,11 +109,9 @@ public class SolrRequestParsers
|
|||
SolrParams params = parser.parseParamsAndFillStreams( req, streams );
|
||||
SolrQueryRequest sreq = buildRequestFrom( params, streams );
|
||||
|
||||
// If there is some path left over, add it to the context
|
||||
int idx = req.getServletPath().indexOf( ':' );
|
||||
if( idx > 0 ) {
|
||||
sreq.getContext().put( "path", req.getServletPath().substring( idx+1 ) );
|
||||
}
|
||||
// Handlers and loggin will want to know the path. If it contains a ':'
|
||||
// the handler could use it for RESTfull URLs
|
||||
sreq.getContext().put( "path", path );
|
||||
return sreq;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue