Author: ivol37 at gmail.com
Date: Mon Jan 31 12:41:15 2011
New Revision: 727
Log:
Added:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonService.java
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApiImpl.java
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrConfiguration.java
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrConfigurationImpl.java
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonServiceImpl.java
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/rest/SolrRestServiceImpl.java
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApiImpl.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApiImpl.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrApiImpl.java
Mon Jan 31 12:41:15 2011
@@ -17,7 +17,6 @@
package org.amdatu.searchandindex.solr.impl;
import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
@@ -33,7 +32,6 @@
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLStreamException;
-import javax.xml.xpath.XPathConstants;
import org.amdatu.core.tenant.Tenant;
import org.amdatu.searchandindex.solr.SolrApi;
@@ -44,28 +42,18 @@
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.util.DOMUtil;
-import org.apache.solr.common.util.StrUtils;
-import org.apache.solr.core.Config;
import org.apache.solr.core.CoreContainer;
-import org.apache.solr.core.CoreDescriptor;
-import org.apache.solr.core.NakamuraSolrConfig;
-import org.apache.solr.core.NakamuraSolrResourceLoader;
import org.apache.solr.core.SolrConfig;
import org.apache.solr.core.SolrCore;
-import org.apache.solr.core.SolrResourceLoader;
import org.apache.solr.request.BinaryQueryResponseWriter;
import org.apache.solr.request.QueryResponseWriter;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrQueryResponse;
import org.apache.solr.request.SolrRequestHandler;
-import org.apache.solr.schema.IndexSchema;
import org.apache.solr.servlet.SolrRequestParsers;
import org.apache.solr.servlet.cache.HttpCacheHeaderUtil;
import org.apache.solr.servlet.cache.Method;
import org.osgi.service.log.LogService;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
@SuppressWarnings("restriction")
@@ -76,14 +64,12 @@
// Private members
private CoreContainer m_coreContainer;
+ private SolrDaemonService m_daemon;
- public SolrApiImpl(CoreContainer coreContainer, SolrConfiguration
solrConfig) {
+ public SolrApiImpl(SolrDaemonService daemon, CoreContainer coreContainer,
SolrConfiguration solrConfig) {
m_coreContainer = coreContainer;
m_solrConfig = solrConfig;
- }
-
- public void start() throws IOException, ParserConfigurationException,
SAXException {
- loadCores();
+ m_daemon = daemon;
}
public void createIndex(Tenant tenant, String index) {
@@ -192,76 +178,6 @@
}
}
- private void loadCores() throws IOException, ParserConfigurationException,
SAXException {
- // Save the current context classloader
- final ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
- try {
- // Classloader switcheroo
- final ClassLoader classLoader = this.getClass().getClassLoader();
- Thread.currentThread().setContextClassLoader(classLoader);
-
- SolrResourceLoader loader = new
SolrResourceLoader(m_solrConfig.getWorkDirectory().getAbsolutePath());
- FileInputStream cfgis = null;
- try {
- cfgis = new FileInputStream(m_solrConfig.getSolr());
- Config cfg = new Config(loader, null, cfgis, null);
- NodeList nodes = (NodeList)cfg.evaluate("solr/cores/core",
XPathConstants.NODESET);
- for (int i=0; i<nodes.getLength(); i++) {
- Node node = nodes.item(i);
- String names = DOMUtil.getAttr(node, "name", null);
- List<String> aliases = StrUtils.splitSmart(names,',');
- String name = aliases.get(0);
- CoreDescriptor coreDescriptor = new
CoreDescriptor(m_coreContainer, name, DOMUtil.getAttr(node, "instanceDir",
null));
-
- // Get the directory [tenantId]/[indexName]
- String tenantCoreSubDir =
getTenantCoreSubDir(coreDescriptor);
- String tenantId = tenantCoreSubDir.split("/")[0];
- String indexName = tenantCoreSubDir.split("/")[1];
- loadCore(tenantId, indexName, classLoader);
- }
- } finally {
- if (cfgis != null) {
- cfgis.close();
- }
- }
- } finally {
- // Restore classloader
- Thread.currentThread().setContextClassLoader(contextClassLoader);
- }
- }
-
- /**
- * Returns the subdirectory [tenantid]/[indexName] from a core descriptor.
- * @param coreDescriptor
- */
- private String getTenantCoreSubDir(CoreDescriptor coreDescriptor) {
- String tenantCoreDir =
coreDescriptor.getInstanceDir().replace(m_solrConfig.getWorkDirectory().getAbsolutePath(),
"");
- if (tenantCoreDir.startsWith(File.separator)) {
- tenantCoreDir = tenantCoreDir.substring(1);
- }
- if (tenantCoreDir.endsWith(File.separator)) {
- tenantCoreDir = tenantCoreDir.substring(0,
tenantCoreDir.length()-1);
- }
- tenantCoreDir = tenantCoreDir.replace("\\", "/");
- return tenantCoreDir;
- }
-
- private void loadCore(String tenantId, String indexName, ClassLoader
classLoader) throws ParserConfigurationException, IOException, SAXException {
- String coreName = getCoreName(tenantId, indexName);
- File coreDir = m_solrConfig.getCoreDirectory(tenantId, indexName);
- File solrConfig = m_solrConfig.getCoreSolrConfig(tenantId, indexName);
- File schema = m_solrConfig.getCoreSchema(tenantId, indexName);
-
- File workDir = m_solrConfig.getWorkDirectory();
-
- SolrResourceLoader loader = new
NakamuraSolrResourceLoader(workDir.getAbsolutePath(), classLoader);
- SolrConfig config = new NakamuraSolrConfig(loader, "solrconfig.xml",
new FileInputStream(solrConfig));
- IndexSchema indexSchema = new IndexSchema(config, null, new
FileInputStream(schema));
- CoreDescriptor desc = new CoreDescriptor(m_coreContainer, coreName,
coreDir.getAbsolutePath());
- SolrCore nakamuraCore = new SolrCore(coreName,
coreDir.getAbsolutePath(), config, indexSchema, desc);
- m_coreContainer.register(coreName, nakamuraCore, false);
- }
-
private void createCore(String tenantId, String indexName, InputStream is)
throws IOException, ParserConfigurationException, SAXException {
// Save the current context classloader
final ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
@@ -274,7 +190,7 @@
m_solrConfig.prepareCore(tenantId, indexName, is);
// Now load the new core
- loadCore(tenantId, indexName, classLoader);
+ m_daemon.startCore(tenantId, indexName, classLoader);
// Persist cores
File solr = m_solrConfig.getSolr();
@@ -285,27 +201,19 @@
}
}
- public String getCoreName(Tenant tenant, String index) {
- return tenant.getId() + "_" + index;
- }
-
public String getCoreName(String tenantId, String index) {
return tenantId + "_" + index;
}
+ public String getCoreName(Tenant tenant, String index) {
+ return tenant.getId() + "_" + index;
+ }
+
public String getIndexName(Tenant tenant, String coreName) {
String corePrefix = tenant.getId() + "_";
return coreName.substring(corePrefix.length());
}
-
-
-
-
-
-
-
-
/**
* {@inheritDoc}
*/
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrConfiguration.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrConfiguration.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrConfiguration.java
Mon Jan 31 12:41:15 2011
@@ -69,4 +69,6 @@
void prepareCore(String tenantId, String indexName, InputStream schema)
throws IOException;
void deleteCore(String tenantId, String indexName);
+
+ String getCoreName(String tenantId, String index);
}
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrConfigurationImpl.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrConfigurationImpl.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrConfigurationImpl.java
Mon Jan 31 12:41:15 2011
@@ -214,4 +214,8 @@
}
}
+
+ public String getCoreName(String tenantId, String index) {
+ return tenantId + "_" + index;
+ }
}
Added:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonService.java
==============================================================================
--- (empty file)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonService.java
Mon Jan 31 12:41:15 2011
@@ -0,0 +1,11 @@
+package org.amdatu.searchandindex.solr.impl;
+
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.xml.sax.SAXException;
+
+public interface SolrDaemonService {
+ void startCore(String tenantId, String indexName, ClassLoader classLoader)
throws ParserConfigurationException, IOException, SAXException;
+}
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonServiceImpl.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonServiceImpl.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDaemonServiceImpl.java
Mon Jan 31 12:41:15 2011
@@ -16,7 +16,13 @@
*/
package org.amdatu.searchandindex.solr.impl;
+import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
+import java.util.List;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPathConstants;
import org.amdatu.core.config.templates.ConfigTemplateManager;
import org.amdatu.core.tenant.TenantManagementService;
@@ -27,13 +33,26 @@
import org.amdatu.web.httpcontext.ResourceProvider;
import org.apache.felix.dm.DependencyManager;
import org.apache.felix.dm.ServiceDependency;
+import org.apache.solr.common.util.DOMUtil;
+import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.core.Config;
import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.CoreDescriptor;
+import org.apache.solr.core.NakamuraSolrConfig;
+import org.apache.solr.core.NakamuraSolrResourceLoader;
+import org.apache.solr.core.SolrConfig;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.core.SolrResourceLoader;
+import org.apache.solr.schema.IndexSchema;
import org.osgi.service.log.LogService;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
/**
* Implementation of the {@link SolrService} interface.
*/
-public class SolrDaemonServiceImpl {
+public class SolrDaemonServiceImpl implements SolrDaemonService {
// Services injected by the Felix dependency manager
private volatile LogService m_logService;
private volatile DependencyManager m_dependencyManager;
@@ -55,15 +74,24 @@
// Register the Solr dispatch filter
registerRestAPI(solrApi);
+
+ m_logService.log(LogService.LOG_INFO, "Solr daemon started");
+ }
+
+ public void stop() {
+ stopCores();
+
+ m_logService.log(LogService.LOG_INFO, "Solr daemon stopped");
}
private void startSolrDaemon() throws Exception {
m_coreContainer = new CoreContainer();
+ startCores();
}
// Register the Solr API
private SolrApiImpl registerSolrApi() {
- SolrApiImpl solrApiService = new SolrApiImpl(m_coreContainer,
m_solrConfig);
+ SolrApiImpl solrApiService = new SolrApiImpl(this, m_coreContainer,
m_solrConfig);
m_dependencyManager.add(m_dependencyManager.createComponent()
.setImplementation(solrApiService)
.setInterface(SolrApi.class.getName(), null)
@@ -86,4 +114,77 @@
private ServiceDependency createServiceDependency(Class<?> clazz) {
return
m_dependencyManager.createServiceDependency().setService(clazz).setRequired(true);
}
+
+ private void startCores() throws IOException,
ParserConfigurationException, SAXException {
+ // Save the current context classloader
+ final ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
+ try {
+ // Classloader switcheroo
+ final ClassLoader classLoader = this.getClass().getClassLoader();
+ Thread.currentThread().setContextClassLoader(classLoader);
+
+ SolrResourceLoader loader = new
SolrResourceLoader(m_solrConfig.getWorkDirectory().getAbsolutePath());
+ FileInputStream cfgis = null;
+ try {
+ cfgis = new FileInputStream(m_solrConfig.getSolr());
+ Config cfg = new Config(loader, null, cfgis, null);
+ NodeList nodes = (NodeList)cfg.evaluate("solr/cores/core",
XPathConstants.NODESET);
+ for (int i=0; i<nodes.getLength(); i++) {
+ Node node = nodes.item(i);
+ String names = DOMUtil.getAttr(node, "name", null);
+ List<String> aliases = StrUtils.splitSmart(names,',');
+ String name = aliases.get(0);
+ CoreDescriptor coreDescriptor = new
CoreDescriptor(m_coreContainer, name, DOMUtil.getAttr(node, "instanceDir",
null));
+
+ // Get the directory [tenantId]/[indexName]
+ String tenantCoreSubDir =
getTenantCoreSubDir(coreDescriptor);
+ String tenantId = tenantCoreSubDir.split("/")[0];
+ String indexName = tenantCoreSubDir.split("/")[1];
+ startCore(tenantId, indexName, classLoader);
+ }
+ } finally {
+ if (cfgis != null) {
+ cfgis.close();
+ }
+ }
+ } finally {
+ // Restore classloader
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ }
+ }
+
+ public void startCore(String tenantId, String indexName, ClassLoader
classLoader) throws ParserConfigurationException, IOException, SAXException {
+ String coreName = m_solrConfig.getCoreName(tenantId, indexName);
+ m_logService.log(LogService.LOG_INFO, "Starting Solr core '" +
coreName + "'");
+ File coreDir = m_solrConfig.getCoreDirectory(tenantId, indexName);
+ File solrConfig = m_solrConfig.getCoreSolrConfig(tenantId, indexName);
+ File schema = m_solrConfig.getCoreSchema(tenantId, indexName);
+ File workDir = m_solrConfig.getWorkDirectory();
+
+ SolrResourceLoader loader = new
NakamuraSolrResourceLoader(workDir.getAbsolutePath(), classLoader);
+ SolrConfig config = new NakamuraSolrConfig(loader, "solrconfig.xml",
new FileInputStream(solrConfig));
+ IndexSchema indexSchema = new IndexSchema(config, null, new
FileInputStream(schema));
+ CoreDescriptor desc = new CoreDescriptor(m_coreContainer, coreName,
coreDir.getAbsolutePath());
+ SolrCore nakamuraCore = new SolrCore(coreName,
coreDir.getAbsolutePath(), config, indexSchema, desc);
+ m_coreContainer.register(coreName, nakamuraCore, false);
+ m_logService.log(LogService.LOG_INFO, "Solr core '" + coreName + "'
started successfully");
+ }
+
+ private void stopCores() {
+ for (SolrCore core : m_coreContainer.getCores()) {
+ core.close();
+ }
+ }
+
+ private String getTenantCoreSubDir(CoreDescriptor coreDescriptor) {
+ String tenantCoreDir =
coreDescriptor.getInstanceDir().replace(m_solrConfig.getWorkDirectory().getAbsolutePath(),
"");
+ if (tenantCoreDir.startsWith(File.separator)) {
+ tenantCoreDir = tenantCoreDir.substring(1);
+ }
+ if (tenantCoreDir.endsWith(File.separator)) {
+ tenantCoreDir = tenantCoreDir.substring(0,
tenantCoreDir.length()-1);
+ }
+ tenantCoreDir = tenantCoreDir.replace("\\", "/");
+ return tenantCoreDir;
+ }
}
Modified:
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/rest/SolrRestServiceImpl.java
==============================================================================
---
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/rest/SolrRestServiceImpl.java
(original)
+++
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/rest/SolrRestServiceImpl.java
Mon Jan 31 12:41:15 2011
@@ -267,7 +267,7 @@
}
/**
- * Returns a list of all available incdices for this tenant.
+ * Returns a list of all available indices for this tenant.
* GET /rest/index/[indexname]/schema
*/
@PUT