SOLR-215 -- removing the core name and 'cores' registry stuff. this should be part of SOLR-350, not SolrCore

git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@573950 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Ryan McKinley 2007-09-09 05:59:56 +00:00
parent fb9d1c34bb
commit e3dacf01c7
7 changed files with 89 additions and 209 deletions

View File

@ -33,11 +33,6 @@ public class TestJettySolrRunner extends SolrExampleTestBase {
SolrServer server;
JettySolrRunner jetty;
@Override
public String getCoreName() {
return null;
}
@Override public void setUp() throws Exception
{

View File

@ -129,6 +129,9 @@ public class SolrConfig extends Config {
pingQueryParams = readPingQueryParams(this);
Config.log.info("Loaded SolrConfig: " + file);
// TODO -- at solr 2.0. this should go away
config = this;
}
/* The set of materialized parameters: */

View File

@ -19,7 +19,6 @@ package org.apache.solr.core;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -69,23 +68,24 @@ import org.w3c.dom.NodeList;
/**
* @version $Id$
*/
public final class SolrCore {
public static final String version="1.0";
public static Logger log = Logger.getLogger(SolrCore.class.getName());
private final String name;
private final IndexSchema schema;
private final String dataDir;
private final String index_path;
private final UpdateHandler updateHandler;
private static final long startTime = System.currentTimeMillis();
private final long startTime = System.currentTimeMillis();
private final RequestHandlers reqHandlers;
private final SolrHighlighter highlighter;
private final Map<String,UpdateRequestProcessorFactory> updateProcessors;
public long getStartTime() { return startTime; }
@Deprecated
private static SolrCore instance;
static int boolean_query_max_clause_count = Integer.MIN_VALUE;
// only change the BooleanQuery maxClauseCount once for ALL cores...
@ -147,7 +147,6 @@ public final class SolrCore {
newSearcherListeners = parseListener("//listener[@event=\"newSearcher\"]");
}
public String getName() { return name; }
public IndexSchema getSchema() { return schema; }
public String getDataDir() { return dataDir; }
public String getIndexDir() { return index_path; }
@ -198,7 +197,7 @@ public final class SolrCore {
*@return the desired instance
*@throws SolrException if the object could not be instantiated
*/
public <T extends Object> T createInstance(String className, Class<T> cast, String msg) {
private <T extends Object> T createInstance(String className, Class<T> cast, String msg) {
Class clazz = null;
if (msg == null) msg = "SolrCore Object";
try {
@ -232,146 +231,74 @@ public final class SolrCore {
}
// The registry of known cores
private static Map<String, SolrCore> cores = new HashMap<String, SolrCore>();
/** Alias for SolrCore.getSolrCore(null). */
/**
* @return the last core initalized. If you are using multiple cores,
* this is not a function to use.
*/
@Deprecated
public static SolrCore getSolrCore() {
return getSolrCore(null);
return instance;
}
/**
* Retrieves a core instance by name.
*@param name the core name
*@return the core instance or null if none exist with that name.
*/
public static SolrCore getSolrCore(String name) {
if (name != null && name.length() == 0)
name = null;
synchronized (cores) {
SolrCore core = cores.get(name);
if (core==null && name==null)
try {
core = new SolrCore(null, new SolrConfig(), null);
} catch(Exception xany) {
log.throwing("SolrCore", "getSolrCore", xany);
return null;
}
return core;
}
}
/**
* Returns an unmodifieable Map containing the registered cores
*/
public Map<String,SolrCore> getSolrCores() {
return Collections.unmodifiableMap( cores );
}
/** The array of known core names. */
public String[] getSolrCoreNames() {
synchronized(cores) {
String[] names = new String[cores.size()];
int count = 0;
java.util.Iterator<String> itnames = cores.keySet().iterator();
while(itnames.hasNext()) {
names[count++] = itnames.next();
}
return names;
}
}
public String toString() {
return name!=null? "core{" + name + "}" : super.toString();
}
/** The single-core mode compatibility constructor; the core is named 'null'. */
public SolrCore(String dataDir, SolrConfig config, IndexSchema schema) {
this(null, dataDir, config, schema);
}
/** Ensures that a name does not contain a '/' or a '\' to avoid any potential
* issues with file pathes.
*@param name the core name to check
*@return the name
*@throws SolrException if the name is not valid
*/
private static String checkName(String name) {
if (name != null) for(int i = 0, length = name.length(); i < length; ++i) {
char c = name.charAt(i);
if (c == '/' || c == '\\' || Character.isSpaceChar(c))
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Invalid core name '"+name+"'");
}
return name;
}
/**
* Creates a new core and register it in the list of cores.
* If a core with the same name already exists, it will be stopped and replaced by this one.
*@param name the unique name of the core (null is accepted)
*@param dataDir the index directory
*@param config a solr config instance
*@param schema a solr schema instance
*/
public SolrCore(String name, String dataDir, SolrConfig config, IndexSchema schema) {
this.name = checkName(name);
this.solrConfig = config;
// compatibility code with pre-solr215-patch in case some custom code relies on SolrConfig.config existence.
if (this.name == null) SolrConfig.config = config;
if (dataDir ==null)
dataDir = solrConfig.get("dataDir",solrConfig.getInstanceDir()+"data");
if (schema==null)
this.schema = new IndexSchema(config, "schema.xml");
else
this.schema = schema;
public SolrCore(String dataDir, SolrConfig config, IndexSchema schema) {
synchronized (SolrCore.class) {
// this is for backward compatibility (and also the reason
// the sync block is needed)
instance = this; // set singleton
this.dataDir = dataDir;
if (name == null)
this.index_path = dataDir + "/index";
else
this.index_path = dataDir + "/index-" + name;
log.info("Opening new SolrCore at " + solrConfig.getInstanceDir() + ", dataDir="+dataDir + ", indexPath=" + index_path);
booleanQueryMaxClauseCount();
this.maxWarmingSearchers = solrConfig.getInt("query/maxWarmingSearchers",Integer.MAX_VALUE);
parseListeners();
initIndex();
initWriters();
// Processors initialized before the handlers
updateProcessors = loadUpdateProcessors();
reqHandlers = new RequestHandlers(this);
reqHandlers.initHandlersFromConfig( solrConfig );
// TODO? could select the highlighter implementation
highlighter = new SolrHighlighter();
highlighter.initalize( solrConfig );
try {
// Open the searcher *before* the handler so we don't end up opening
// one in the middle.
getSearcher(false,false,null);
updateHandler = createUpdateHandler(
solrConfig.get("updateHandler/@class", DirectUpdateHandler.class.getName())
);
} catch (IOException e) {
throw new RuntimeException(e);
}
// register this core
synchronized(cores) {
SolrCore previous = cores.get(name);
if (previous != null) {
previous.close();
if (dataDir ==null) {
dataDir = config.get("dataDir",config.getInstanceDir()+"data");
}
log.info("Opening new SolrCore at " + config.getInstanceDir() + ", dataDir="+dataDir);
if (schema==null) {
schema = new IndexSchema(config, "schema.xml");
}
this.schema = schema;
this.dataDir = dataDir;
this.index_path = dataDir + "/" + "index";
this.solrConfig = config;
this.maxWarmingSearchers = config.getInt("query/maxWarmingSearchers",Integer.MAX_VALUE);
booleanQueryMaxClauseCount();
parseListeners();
initIndex();
initWriters();
// Processors initialized before the handlers
updateProcessors = loadUpdateProcessors();
reqHandlers = new RequestHandlers(this);
reqHandlers.initHandlersFromConfig( solrConfig );
// TODO? could select the highlighter implementation
highlighter = new SolrHighlighter();
highlighter.initalize( solrConfig );
try {
// Open the searcher *before* the handler so we don't end up opening
// one in the middle.
getSearcher(false,false,null);
updateHandler = createUpdateHandler(
solrConfig.get("updateHandler/@class", DirectUpdateHandler.class.getName())
);
}
catch (IOException e) {
throw new RuntimeException(e);
}
cores.put(name, this);
}
}
@ -422,21 +349,7 @@ public final class SolrCore {
}
public void close() {
close(true);
}
private void close(boolean remove) {
if (name == null)
log.info("CLOSING default SolrCore!");
else
log.info("CLOSING SolrCore "+ name);
if (remove) synchronized(cores) {
SolrCore core = cores.remove(name);
if (core == null) {
log.info("Core " + core + " already closed");
return;
}
}
log.info("CLOSING SolrCore!");
try {
closeSearcher();
} catch (Exception e) {
@ -454,18 +367,6 @@ public final class SolrCore {
}
}
/** Stops all cores. */
public static void shutdown() {
synchronized(cores) {
java.util.Iterator< java.util.Map.Entry<String,SolrCore> > it = cores.entrySet().iterator();
while(it.hasNext()) {
SolrCore core = it.next().getValue();
core.close(false);
}
cores.clear();
}
}
@Override
protected void finalize() { close(); }

View File

@ -63,14 +63,7 @@ public abstract class AbstractSolrTestCase extends TestCase {
* </p>
*/
protected TestHarness.LocalRequestFactory lrf;
/**
* Subclasses may define this method to return the name of the
* Solr core they wish to use.
*/
public String getCoreName() {
return this.getClass().getPackage().getName();
}
/**
* Subclasses must define this method to return the name of the
* schema.xml they wish to use.
@ -99,27 +92,17 @@ public abstract class AbstractSolrTestCase extends TestCase {
*
*/
public void setUp() throws Exception {
String coreName = getCoreName();
if (coreName != null) {
dataDir = new File(System.getProperty("java.io.tmpdir")
+ System.getProperty("file.separator")
+ System.currentTimeMillis());
} else {
dataDir = new File(System.getProperty("java.io.tmpdir")
+ System.getProperty("file.separator")
+ getClass().getName() + "-" + System.currentTimeMillis());
}
+ System.getProperty("file.separator")
+ getClass().getName() + "-" + System.currentTimeMillis());
dataDir.mkdirs();
solrConfig = h.createConfig(getSolrConfigFile());
h = new TestHarness(coreName,
dataDir.getAbsolutePath(),
solrConfig,
getSchemaFile());
solrConfig = h.createConfig(getSolrConfigFile());
h = new TestHarness( dataDir.getAbsolutePath(),
solrConfig,
getSchemaFile());
lrf = h.getRequestFactory
("standard",0,20,"version","2.2");
}
/**

View File

@ -84,17 +84,18 @@ public class TestHarness {
*
* @param dataDirectory path for index data, will not be cleaned up
*/
public TestHarness(String name, String dataDirectory) {
this(name, dataDirectory, "schema.xml");
public TestHarness( String dataDirectory) {
this( dataDirectory, "schema.xml");
}
/**
* Assumes "solrconfig.xml" is the config file to use.
*
* @param dataDirectory path for index data, will not be cleaned up
* @param schemaFile path of schema file
*/
public TestHarness(String name, String dataDirectory, String schemaFile) {
this(name, dataDirectory, "solrconfig.xml", schemaFile);
public TestHarness( String dataDirectory, String schemaFile) {
this( dataDirectory, "solrconfig.xml", schemaFile);
}
/**
* @param name the core name
@ -102,8 +103,8 @@ public class TestHarness {
* @param configFile solrconfig filename
* @param schemaFile schema filename
*/
public TestHarness(String name, String dataDirectory, String configFile, String schemaFile) {
this(name, dataDirectory, createConfig(configFile), schemaFile);
public TestHarness( String dataDirectory, String configFile, String schemaFile) {
this( dataDirectory, createConfig(configFile), schemaFile);
}
/**
* @param name the core name
@ -111,11 +112,10 @@ public class TestHarness {
* @param solrConfig solronfig instance
* @param schemaFile schema filename
*/
public TestHarness(String name,
String dataDirectory,
SolrConfig solrConfig,
String schemaFile) {
this(name, dataDirectory, solrConfig, new IndexSchema(solrConfig, schemaFile));
public TestHarness( String dataDirectory,
SolrConfig solrConfig,
String schemaFile) {
this( dataDirectory, solrConfig, new IndexSchema(solrConfig, schemaFile));
}
/**
* @param name the core name
@ -123,12 +123,11 @@ public class TestHarness {
* @param solrConfig solrconfig instance
* @param schema schema instance
*/
public TestHarness(String name,
String dataDirectory,
public TestHarness( String dataDirectory,
SolrConfig solrConfig,
IndexSchema indexSchema) {
try {
core = new SolrCore(name, dataDirectory, solrConfig, indexSchema);
core = new SolrCore( dataDirectory, solrConfig, indexSchema);
builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
updater = new XmlUpdateRequestHandler();

View File

@ -34,10 +34,9 @@ public class TestBadConfig extends AbstractSolrTestCase {
dataDir.mkdirs();
try {
solrConfig = new SolrConfig(getSolrConfigFile());
h = new TestHarness(getName() + "-" + System.currentTimeMillis(),
dataDir.getAbsolutePath(),
solrConfig,
getSchemaFile());
h = new TestHarness( dataDir.getAbsolutePath(),
solrConfig,
getSchemaFile());
fail("Exception should have been thrown");
} catch (Exception e) {
assertTrue(e.getMessage().contains("unset.sys.property"));

View File

@ -68,7 +68,7 @@ public class SolrDispatchFilter implements Filter
// Let this filter take care of /select?xxx format
this.handleSelect =
SolrConfig.config.getBool( "requestDispatcher/@handleSelect", false );
core.getSolrConfig().getBool( "requestDispatcher/@handleSelect", false );
}
catch( Throwable t ) {
// catch this so our filter still works
@ -78,7 +78,7 @@ public class SolrDispatchFilter implements Filter
}
// Optionally abort if we found a sever error
boolean abortOnConfigurationError = SolrConfig.config.getBool("abortOnConfigurationError",true);
boolean abortOnConfigurationError = core.getSolrConfig().getBool("abortOnConfigurationError",true);
if( abortOnConfigurationError && SolrConfig.severeErrors.size() > 0 ) {
StringWriter sw = new StringWriter();
PrintWriter out = new PrintWriter( sw );