Author: noble
Date: Mon Jun 8 07:55:57 2009
New Revision: 782552
URL: http://svn.apache.org/viewvc?rev=782552&view=rev
Log:
SOLR-1198 moved valueSourceParser, listeners,
deletionPolicy,directoryFactory,queryParser,responseWriter to solconfig
Modified:
lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java
lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java
lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java
Modified: lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java?rev=782552&r1=782551&r2=782552&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java
(original)
+++ lucene/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java Mon
Jun 8 07:55:57 2009
@@ -131,7 +131,7 @@
void initHandlersFromConfig(SolrConfig config ){
Map<SolrConfig.PluginInfo,SolrRequestHandler> handlers = new
HashMap<SolrConfig.PluginInfo,SolrRequestHandler>();
- for (SolrConfig.PluginInfo info : config.reqHandlerInfo) {
+ for (SolrConfig.PluginInfo info : config.getReqHandlerInfo()) {
try {
SolrRequestHandler requestHandler;
if( info.startup != null ) {
Modified: lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java?rev=782552&r1=782551&r2=782552&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java Mon Jun 8
07:55:57 2009
@@ -167,7 +167,8 @@
jmxConfig = new JmxConfiguration(false, null, null);
}
maxWarmingSearchers =
getInt("query/maxWarmingSearchers",Integer.MAX_VALUE);
- reqHandlerInfo = loadRequestHandlerInfo();
+
+ loadPluginInfo();
Config.log.info("Loaded SolrConfig: " + name);
@@ -175,11 +176,27 @@
config = this;
}
- private List<PluginInfo> loadRequestHandlerInfo() {
+ protected void loadPluginInfo() {
+ List<String> reqFields = Arrays.asList("name","class");
+ reqHandlerInfo = loadPluginInfo("requestHandler",reqFields);
+ respWriterInfo = loadPluginInfo("queryResponseWriter",reqFields);
+ valueSourceParserInfo = loadPluginInfo("valueSourceParser",reqFields);
+ queryParserInfo = loadPluginInfo("queryParser",reqFields);
+ searchComponentInfo = loadPluginInfo("searchComponent",reqFields);
+ List<PluginInfo> plugins = loadPluginInfo("directoryFactory",reqFields);
+ directoryfactoryInfo = plugins.isEmpty() ? null:plugins.get(0);
+ reqFields = Arrays.asList("class");
+ plugins = loadPluginInfo("mainIndex/deletionPolicy",reqFields);
+ deletionPolicyInfo = plugins.isEmpty() ? null : plugins.get(0);
+ firstSearcherListenerInfo =
loadPluginInfo("//listen...@event='firstSearcher']",reqFields);
+ newSearcherListenerInfo =
loadPluginInfo("//listen...@event='newSearcher']",reqFields);
+ }
+
+ private List<PluginInfo> loadPluginInfo(String tag, List<String> reqFields) {
ArrayList<PluginInfo> result = new ArrayList<PluginInfo>();
- NodeList nodes = (NodeList) evaluate("requestHandler",
XPathConstants.NODESET);
+ NodeList nodes = (NodeList) evaluate(tag, XPathConstants.NODESET);
for (int i=0; i<nodes.getLength(); i++) {
- result.add(new PluginInfo(nodes.item(i) ,"[solrconfig.xml]
requestHandler","name","class"));
+ result.add(new PluginInfo(nodes.item(i) ,"[solrconfig.xml]
"+tag,reqFields));
}
return Collections.unmodifiableList(result) ;
}
@@ -208,7 +225,16 @@
// default & main index configurations
public final SolrIndexConfig defaultIndexConfig;
public final SolrIndexConfig mainIndexConfig;
- public final List<PluginInfo> reqHandlerInfo;
+
+ protected List<PluginInfo> reqHandlerInfo;
+ protected List<PluginInfo> queryParserInfo;
+ protected List<PluginInfo> respWriterInfo;
+ protected List<PluginInfo> valueSourceParserInfo;
+ protected List<PluginInfo> searchComponentInfo;
+ protected List<PluginInfo> firstSearcherListenerInfo;
+ protected PluginInfo deletionPolicyInfo;
+ protected List<PluginInfo> newSearcherListenerInfo;
+ protected PluginInfo directoryfactoryInfo;
public final int maxWarmingSearchers;
public final boolean unlockOnStartup;
@@ -347,34 +373,59 @@
}
public static class PluginInfo {
- final String startup, name, className, event;
+ final String startup, name, className;
final boolean isDefault;
final NamedList initArgs;
public PluginInfo(String startup, String name, String className,
- String event, boolean isdefault, NamedList initArgs) {
+ boolean isdefault, NamedList initArgs) {
this.startup = startup;
this.name = name;
this.className = className;
- this.event = event;
- isDefault = isdefault;
+ this.isDefault = isdefault;
this.initArgs = initArgs;
}
- public PluginInfo(Node node, String err, String... requiredFields) {
- List<String> l = requiredFields == null? Collections.EMPTY_LIST:
Arrays.asList(requiredFields);
- startup = getVal( node, "startup",l,err);
- name = getVal(node, "name", l,err);
- className = getVal(node, "class",l,err);
- event = getVal(node, "event",l,err);
- isDefault = Boolean.parseBoolean(getVal(node,"default",l,err));
+ public PluginInfo(Node node, String err, List<String> reqFields) {
+ startup = getVal( node, "startup",reqFields,err);
+ name = getVal(node, "name", reqFields,err);
+ className = getVal(node, "class",reqFields,err);
+ isDefault = Boolean.parseBoolean(getVal(node,"default",reqFields,err));
initArgs = DOMUtil.childNodesToNamedList(node);
}
- private String getVal(Node node, String name, List<String> required,
String err) {
- return DOMUtil.getAttr(node, name, required.contains(name) ? err : null);
+ private String getVal(Node node, String name, List<String> required, String
err) {
+ return DOMUtil.getAttr(node, name, required.contains(name) ? err : null);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("{");
+ if(name != null) sb.append("name = "+name +",");
+ if(className != null) sb.append("class = "+className +",");
+ if(isDefault) sb.append("default = "+isDefault +",");
+ if(initArgs.size() >0) sb.append("args = "+initArgs);
+ sb.append("}");
+ return sb.toString();
}
-
}
+
+ public List<PluginInfo> getReqHandlerInfo() { return reqHandlerInfo; }
+
+ public List<PluginInfo> getQueryParserInfo() { return queryParserInfo; }
+
+ public List<PluginInfo> getRespWriterInfo() { return respWriterInfo; }
+
+ public List<PluginInfo> getValueSourceParserInfo() { return
valueSourceParserInfo; }
+
+ public List<PluginInfo> getSearchComponentInfo() { return
searchComponentInfo; }
+
+ public List<PluginInfo> getFirstSearcherListenerInfo() { return
firstSearcherListenerInfo; }
+
+ public List<PluginInfo> getNewSearcherListenerInfo() { return
newSearcherListenerInfo; }
+
+ public PluginInfo getDirectoryfactoryInfo() { return directoryfactoryInfo; }
+
+ public PluginInfo getDeletionPolicyInfo() { return deletionPolicyInfo; }
}
Modified: lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java
URL:
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java?rev=782552&r1=782551&r2=782552&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java Mon Jun 8
07:55:57 2009
@@ -70,6 +70,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URL;
+import java.lang.reflect.Constructor;
/**
@@ -248,31 +249,27 @@
return infoRegistry;
}
- private void initDeletionPolicy() {
- String className = solrConfig.get("mainIndex/deletionPolicy/@class",
SolrDeletionPolicy.class.getName());
- IndexDeletionPolicy delPolicy = createInstance(className,
IndexDeletionPolicy.class, "Deletion Policy for SOLR");
-
- Node node = (Node) solrConfig.evaluate("mainIndex/deletionPolicy",
XPathConstants.NODE);
- if (node != null) {
- if (delPolicy instanceof NamedListInitializedPlugin)
- ((NamedListInitializedPlugin)
delPolicy).init(DOMUtil.childNodesToNamedList(node));
- }
- solrDelPolicy = new IndexDeletionPolicyWrapper(delPolicy);
- }
+ private void initDeletionPolicy() {
+ SolrConfig.PluginInfo info = solrConfig.getDeletionPolicyInfo();
+ IndexDeletionPolicy delPolicy = null;
+ if(info != null){
+ delPolicy =
createInstance(info.className,IndexDeletionPolicy.class,"Deletion Policy for
SOLR");
+ if (delPolicy instanceof NamedListInitializedPlugin) {
+ ((NamedListInitializedPlugin) delPolicy).init(info.initArgs);
+ }
+ } else {
+ delPolicy = new SolrDeletionPolicy();
+ }
+ solrDelPolicy = new IndexDeletionPolicyWrapper(delPolicy);
+ }
- public List<SolrEventListener> parseListener(String path) {
+ private List<SolrEventListener> parseListener(List<SolrConfig.PluginInfo>
path) {
List<SolrEventListener> lst = new ArrayList<SolrEventListener>();
- log.info( logid+"Searching for listeners: " +path);
- NodeList nodes = (NodeList)solrConfig.evaluate(path,
XPathConstants.NODESET);
- if (nodes!=null) {
- for (int i=0; i<nodes.getLength(); i++) {
- Node node = nodes.item(i);
- String className = DOMUtil.getAttr(node,"class");
- SolrEventListener listener = createEventListener(className);
- listener.init(DOMUtil.childNodesToNamedList(node));
- lst.add(listener);
- log.info( logid+"Added SolrEventListener: " + listener);
- }
+ for (SolrConfig.PluginInfo info : path) {
+ SolrEventListener listener = createEventListener(info.className);
+ listener.init(info.initArgs);
+ lst.add(listener);
+ log.info(logid + "Added SolrEventListener: " + listener);
}
return lst;
}
@@ -280,8 +277,8 @@
List<SolrEventListener> firstSearcherListeners;
List<SolrEventListener> newSearcherListeners;
private void parseListeners() {
- firstSearcherListeners =
parseListener("//listen...@event=\"firstSearcher\"]");
- newSearcherListeners = parseListener("//listen...@event=\"newSearcher\"]");
+ firstSearcherListeners =
parseListener(solrConfig.getFirstSearcherListenerInfo());
+ newSearcherListeners =
parseListener(solrConfig.getNewSearcherListenerInfo());
}
/**
@@ -330,21 +327,16 @@
return new SolrIndexSearcher(this, schema, name,
directoryFactory.open(getIndexDir()), readOnly, false);
}
- private void initDirectoryFactory() {
- String xpath = "directoryFactory";
- Node node = (Node) solrConfig.evaluate(xpath, XPathConstants.NODE);
- DirectoryFactory dirFactory;
- if (node != null) {
- Map<String, DirectoryFactory> registry = new HashMap<String,
DirectoryFactory>();
- NamedListPluginLoader<DirectoryFactory> indexReaderFactoryLoader = new
NamedListPluginLoader<DirectoryFactory>(
- "[solrconfig.xml] " + xpath, registry);
- dirFactory = indexReaderFactoryLoader.loadSingle(solrConfig
- .getResourceLoader(), node);
+ private void initDirectoryFactory() {
+ DirectoryFactory dirFactory;
+ SolrConfig.PluginInfo info = solrConfig.getDirectoryfactoryInfo();
+ if (info != null) {
+ dirFactory = (DirectoryFactory)
getResourceLoader().newInstance(info.className);
+ dirFactory.init(info.initArgs);
} else {
dirFactory = new StandardDirectoryFactory();
}
-
// And set it
directoryFactory = dirFactory;
}
@@ -402,17 +394,20 @@
private <T extends Object> T createInstance(String className, Class<T> cast,
String msg) {
Class clazz = null;
if (msg == null) msg = "SolrCore Object";
- try {
- try {
- clazz = solrConfig.getResourceLoader().findClass(className);
+ try {
+ clazz = getResourceLoader().findClass(className);
if (cast != null && !cast.isAssignableFrom(clazz))
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error
Instantiating "+msg+", "+className+ " is not a " +cast.getName());
-
- java.lang.reflect.Constructor cons = clazz.getConstructor(new
Class[]{SolrCore.class});
- return (T) cons.newInstance(new Object[]{this});
- } catch(NoSuchMethodException xnomethod) {
- return (T) clazz.newInstance();
- }
+ //most of the classes do not have constructors whiuch take in SolrCore.
It is recommended to obtain SolrCore by implementing SolrCoreAare.
+ // So invariably always it will cause a NoSuchMethodException. So
iterate though the list of available constructors
+ Constructor[] cons = clazz.getConstructors();
+ for (Constructor con : cons) {
+ Class[] types = con.getParameterTypes();
+ if(types.length == 1 && types[0] == SolrCore.class){
+ return (T)con.newInstance(this);
+ }
+ }
+ return (T) clazz.newInstance();//use the empty constructor
} catch (SolrException e) {
throw e;
} catch (Exception e) {
@@ -830,14 +825,14 @@
/**
* Register the default search components
*/
- private static Map<String, SearchComponent> loadSearchComponents( SolrConfig
config )
+ private Map<String, SearchComponent> loadSearchComponents( SolrConfig config
)
{
Map<String, SearchComponent> components = new HashMap<String,
SearchComponent>();
-
+
String xpath = "searchComponent";
NamedListPluginLoader<SearchComponent> loader = new
NamedListPluginLoader<SearchComponent>( xpath, components );
loader.load( config.getResourceLoader(), (NodeList)config.evaluate( xpath,
XPathConstants.NODESET ) );
-
+
final Map<String,Class<? extends SearchComponent>> standardcomponents
= new HashMap<String, Class<? extends SearchComponent>>();
standardcomponents.put( QueryComponent.COMPONENT_NAME,
QueryComponent.class );
@@ -1415,13 +1410,7 @@
/** 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.evaluate(xpath,
XPathConstants.NODESET);
-
- NamedListPluginLoader<QueryResponseWriter> loader =
- new NamedListPluginLoader<QueryResponseWriter>( "[solrconfig.xml]
"+xpath, responseWriters );
-
- defaultResponseWriter = loader.load( solrConfig.getResourceLoader(), nodes
);
+ defaultResponseWriter = initPlugins(solrConfig.getRespWriterInfo(),
responseWriters, QueryResponseWriter.class);
for (Map.Entry<String, QueryResponseWriter> entry :
DEFAULT_RESPONSE_WRITERS.entrySet()) {
if(responseWriters.get(entry.getKey()) == null)
responseWriters.put(entry.getKey(), entry.getValue());
}
@@ -1455,14 +1444,7 @@
/** Configure the query parsers. */
private void initQParsers() {
- String xpath = "queryParser";
- NodeList nodes = (NodeList) solrConfig.evaluate(xpath,
XPathConstants.NODESET);
-
- NamedListPluginLoader<QParserPlugin> loader =
- new NamedListPluginLoader<QParserPlugin>( "[solrconfig.xml] "+xpath,
qParserPlugins);
-
- loader.load( solrConfig.getResourceLoader(), nodes );
-
+
initPlugins(solrConfig.getQueryParserInfo(),qParserPlugins,QParserPlugin.class);
// default parsers
for (int i=0; i<QParserPlugin.standardPlugins.length; i+=2) {
try {
@@ -1489,14 +1471,7 @@
/** Configure the ValueSource (function) plugins */
private void initValueSourceParsers() {
- String xpath = "valueSourceParser";
- NodeList nodes = (NodeList) solrConfig.evaluate(xpath,
XPathConstants.NODESET);
-
- NamedListPluginLoader<ValueSourceParser> loader =
- new NamedListPluginLoader<ValueSourceParser>( "[solrconfig.xml] "+xpath,
valueSourceParsers);
-
- loader.load( solrConfig.getResourceLoader(), nodes );
-
+
initPlugins(solrConfig.getValueSourceParserInfo(),valueSourceParsers,ValueSourceParser.class);
// default value source parsers
for (Map.Entry<String, ValueSourceParser> entry :
ValueSourceParser.standardValueSourceParsers.entrySet()) {
try {
@@ -1511,7 +1486,23 @@
}
}
}
-
+
+ private <T> T initPlugins(List<SolrConfig.PluginInfo> pluginInfos ,
Map<String ,T> registry, Class<T> type){
+ T def = null;
+ for (SolrConfig.PluginInfo info : pluginInfos) {
+ T o = createInstance(info.className,type, type.getSimpleName());
+ if (o instanceof NamedListInitializedPlugin) {
+ ((NamedListInitializedPlugin) o).init(info.initArgs);
+ }
+ registry.put(info.name, o);
+ if(info.isDefault){
+ def = o;
+ }
+
+ }
+ return def;
+ }
+
public ValueSourceParser getValueSourceParser(String parserName) {
return valueSourceParsers.get(parserName);
}