package zh.solr.se.indexer.solrproxy; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; import org.apache.solr.core.CoreContainer; import org.apache.solr.core.SolrCore; import zh.solr.se.indexer.util.ConfigFactory; import zh.solr.se.indexer.util.ConfigProperties; /** * Factory class to fetch a LocalSolrServer This was created because I had * issues when running via hadoop in that using the environment settings to set * the home and config were causing an issue and I didn't have time to * investigate further. * */ public class LocalListingSolrServerFactory { private static LocalListingSolrServerFactory instance = new LocalListingSolrServerFactory(); private CoreContainer coreContainer; private final Map<String, LocalSolrServer> serverMap = new HashMap<String, LocalSolrServer>(); public static LocalListingSolrServerFactory getInstance() { return instance; } private LocalListingSolrServerFactory() { final Logger logger = Logger.getLogger("org.apache"); logger.setLevel(Level.ALL); // set the Solr home final ConfigProperties config = ConfigFactory.getInstance().getConfigProperties(ConfigFactory.SOLR_CONFIG_PATH); final String solrHome = config.getProperty(ConfigProperties.CONFIG_NAME_SOLR_HOME, "/var/solr/solr"); System.setProperty("solr.solr.home", solrHome); // a workaround to keep the data import handlers happy since they use a relative path final String configFile = "/var/solr/solr/core-local/conf/data-config.xml"; System.setProperty("data.import.config", configFile); // initialize the core container final CoreContainer.Initializer initializer = new CoreContainer.Initializer(); try { coreContainer = initializer.initialize(); } catch (final Exception e) { e.printStackTrace(); throw new NullPointerException("Could not initialize Solr cores." + "Solr config might not been installed correctly. Error: " + e.getMessage()); } } synchronized public LocalSolrServer getLocalSolrServer(String coreName) { // check for null core name, in case single core if (coreName == null) { coreName = ""; } // check if the server instance already exists LocalSolrServer localServer = serverMap.get(coreName); if (localServer == null) { localServer = createLocalSolrServer(coreName); if (localServer != null) { serverMap.put(coreName, localServer); } } return localServer; } private LocalSolrServer createLocalSolrServer(final String coreName) { final SolrCore solrCore = coreContainer.getCore(coreName); final EmbeddedSolrServer solrServer = new EmbeddedSolrServer(coreContainer, coreName); return new LocalSolrServer(solrServer, solrCore); } }