SOLR-269: Using a factory pattern to generate UpdateRequestProcessor.

git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@552195 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Ryan McKinley 2007-06-30 18:34:47 +00:00
parent 1e65246689
commit 579b316839
2 changed files with 67 additions and 42 deletions

View File

@ -20,7 +20,6 @@ package org.apache.solr.handler;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.logging.Logger;
@ -57,15 +56,18 @@ import org.apache.solr.update.DeleteUpdateCommand;
* To change the UpdateRequestProcessor implementation, add the configuration parameter:
*
* <requestHandler name="/update" class="solr.StaxUpdateRequestHandler" >
* <str name="update.processor.class">org.apache.solr.handler.UpdateRequestProcessor</str>
* <str name="update.processor.class">org.apache.solr.handler.UpdateRequestProcessor</str>
* <lst name="update.processor.args">
* ... (optionally pass in arguments to the factory init method) ...
* </lst>
* </requestHandler>
*
*/
public class StaxUpdateRequestHandler extends XmlUpdateRequestHandler
{
public static Logger log = Logger.getLogger(StaxUpdateRequestHandler.class.getName());
public static final String UPDATE_PROCESSOR_CLASS = "update.processor.class";
public static final String UPDATE_PROCESSOR_FACTORY = "update.processor.factory";
public static final String UPDATE_PROCESSOR_ARGS = "update.processor.args";
// XML Constants
public static final String ADD = "add";
@ -82,7 +84,7 @@ public class StaxUpdateRequestHandler extends XmlUpdateRequestHandler
public static final String ALLOW_DUPS = "allowDups";
private XMLInputFactory inputFactory;
private Constructor<? extends UpdateRequestProcessor> processorConstructor;
private UpdateRequestProcessorFactory processorFactory;
@SuppressWarnings("unchecked")
@Override
@ -90,44 +92,20 @@ public class StaxUpdateRequestHandler extends XmlUpdateRequestHandler
{
super.init(args);
inputFactory = BaseXMLInputFactory.newInstance();
Class<? extends UpdateRequestProcessor> clazz = null;
String className = null;
try {
if( args != null ) {
className = (String)args.get( UPDATE_PROCESSOR_CLASS );
if( className != null ) {
clazz = Config.findClass( className, new String[]{} );
}
}
if( clazz == null ) {
clazz = UpdateRequestProcessor.class;
}
processorConstructor = clazz.getConstructor( SolrQueryRequest.class );
}
catch (Exception e) {
throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
"error initializing processor class: "+className, e );
}
if( processorConstructor == null ) {
throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
"invalid processor: " + clazz );
}
}
/**
* Let subclasses override what processor is used. The default behavior is
* to use one configured through the init parameter "processor"
*/
protected UpdateRequestProcessor getUpdateRequestProcessor( SolrQueryRequest req )
{
try {
return processorConstructor.newInstance( new Object[] {req} );
// Initialize the UpdateRequestProcessorFactory
NamedList<Object> factoryargs = null;
if( args != null ) {
String className = (String)args.get( UPDATE_PROCESSOR_FACTORY );
factoryargs = (NamedList<Object>)args.get( UPDATE_PROCESSOR_ARGS );
if( className != null ) {
processorFactory = (UpdateRequestProcessorFactory)Config.newInstance( className, new String[]{} );
}
}
catch( Exception ex ) {
throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
"error making UpdateRequestProcessor", ex );
if( processorFactory == null ) {
processorFactory = new UpdateRequestProcessorFactory();
}
processorFactory.init( factoryargs );
}
@Override
@ -167,7 +145,7 @@ public class StaxUpdateRequestHandler extends XmlUpdateRequestHandler
InstantiationException, IllegalAccessException,
TransformerConfigurationException
{
UpdateRequestProcessor processor = getUpdateRequestProcessor( req );
UpdateRequestProcessor processor = processorFactory.getInstance( req );
AddUpdateCommand addCmd = null;
while (true) {
@ -352,7 +330,6 @@ public class StaxUpdateRequestHandler extends XmlUpdateRequestHandler
}
else if ("field".equals(parser.getLocalName())) {
if (!isNull) {
doc.addField(name, text.toString() );
if(boost != null) {
// The lucene API and solr XML field specification make it possible to set boosts
// on multi-value fields even though lucene indexing does not support this.
@ -366,6 +343,7 @@ public class StaxUpdateRequestHandler extends XmlUpdateRequestHandler
doc.setBoost( name, boost );
}
}
doc.addField(name, text.toString() );
}
}
break;

View File

@ -0,0 +1,47 @@
/**
* 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.handler;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.request.SolrQueryRequest;
/**
* A factory to generate UpdateRequestProcessors for each request. The default
* implementation does nothing except pass the commands directly to the
* UpdateHandler
*
* @author ryan
* @since solr 1.3
*/
public class UpdateRequestProcessorFactory
{
public UpdateRequestProcessorFactory()
{
}
public void init( NamedList<Object> args )
{
// by default nothing...
}
public UpdateRequestProcessor getInstance( SolrQueryRequest req )
{
return new UpdateRequestProcessor( req );
}
}