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

Reply via email to