Author: ivol37 at gmail.com
Date: Mon Jan 31 12:06:11 2011
New Revision: 724

Log:


Added:
   
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/bean/SolrSearchResultBean.java
Modified:
   
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/bean/SolrIndexBean.java
   
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/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/impl/SolrDispatchFilter.java
   
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrRestServiceImpl.java

Modified: 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/bean/SolrIndexBean.java
==============================================================================
--- 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/bean/SolrIndexBean.java
        (original)
+++ 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/bean/SolrIndexBean.java
        Mon Jan 31 12:06:11 2011
@@ -31,13 +31,13 @@
     private String m_coreName;
 
     @XmlElement(name = "size")
-    private int m_size;
+    private long m_size;
 
     // Providing a default constructor is required when using JAXB
     public SolrIndexBean() {
     }
 
-    public SolrIndexBean(String id, String coreName, int size) {
+    public SolrIndexBean(String id, String coreName, long size) {
         m_id = id;
         m_coreName = coreName;
         m_size = size;
@@ -59,11 +59,11 @@
         m_coreName = coreName;
     }
 
-    public int getSize() {
+    public long getSize() {
         return m_size;
     }
 
-    public void setSize(int size) {
+    public void setSize(long size) {
         m_size = size;
     }
 }

Added: 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/bean/SolrSearchResultBean.java
==============================================================================
--- (empty file)
+++ 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/bean/SolrSearchResultBean.java
 Mon Jan 31 12:06:11 2011
@@ -0,0 +1,30 @@
+package org.amdatu.searchandindex.solr.bean;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+ at SuppressWarnings("restriction")
+ at XmlRootElement(name = "result")
+ at XmlAccessorType(XmlAccessType.FIELD)
+public class SolrSearchResultBean {
+    @XmlElement(name = "size")
+    private int m_size;
+
+    // Providing a default constructor is required when using JAXB
+    public SolrSearchResultBean() {
+    }
+
+    public SolrSearchResultBean(int size) {
+        m_size = size;
+    }
+
+    public int getSize() {
+        return m_size;
+    }
+
+    public void setSize(int size) {
+        m_size = size;
+    }
+}

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:06:11 2011
@@ -20,20 +20,37 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.PrintWriter;
 import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
 
+import javax.servlet.Filter;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+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;
+import org.amdatu.searchandindex.solr.osgi.Activator;
+import org.apache.felix.dm.DependencyManager;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServer;
 import org.apache.solr.client.solrj.SolrServerException;
 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;
@@ -41,8 +58,19 @@
 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.framework.Constants;
 import org.osgi.service.log.LogService;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
 @SuppressWarnings("restriction")
@@ -50,6 +78,7 @@
     // Service dependencies injected by the dependency manager
     private volatile LogService m_logService;
     private volatile SolrConfiguration m_solrConfig;
+    private volatile DependencyManager m_depManager;
 
     // Private members
     private CoreContainer m_coreContainer;
@@ -59,6 +88,22 @@
         m_solrConfig = solrConfig;
     }
 
+    public void init() {
+        Dictionary<String, Object> properties = new Hashtable<String, 
Object>();
+        properties.put("pattern", ".*");
+        properties.put(Constants.SERVICE_RANKING, 0);
+        properties.put("contextId", Activator.RESOURCE_ID);
+        SolrDispatchFilter filter = new SolrDispatchFilter(m_coreContainer);
+        m_depManager.add(m_depManager.createComponent()
+            .setInterface(Filter.class.getName(), properties)
+            .setImplementation(filter)
+        );
+    }
+
+    public void start() throws IOException, ParserConfigurationException, 
SAXException {
+        loadCores();
+    }
+
     public void createIndex(Tenant tenant, String index) {
         createIndex(tenant, index, null);
     }
@@ -124,11 +169,18 @@
         return queryCore(coreName, query);
     }
 
+    public void queryIndex(Tenant tenant, String index, HttpServletRequest 
request, HttpServletResponse response) throws SolrServerException, IOException, 
ServletException {
+        doQuery(request, response);
+    }
+
+    protected final Map<SolrConfig, SolrRequestParsers> parsers = new 
WeakHashMap<SolrConfig, SolrRequestParsers>();
+
     public QueryResponse queryCore(String coreName, String query) throws 
SolrServerException {
-        SolrServer server = new EmbeddedSolrServer(m_coreContainer, coreName);
+        EmbeddedSolrServer server = new EmbeddedSolrServer(m_coreContainer, 
coreName);
         SolrQuery solrQuery = new SolrQuery();
         solrQuery.setQuery(query);
-        return server.query(solrQuery);
+        QueryResponse response = server.query(solrQuery);
+        return response;
     }
 
     public String getSchema(Tenant tenant, String index) throws IOException {
@@ -158,6 +210,76 @@
         }
     }
 
+    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();
@@ -169,20 +291,11 @@
             // Prepare the configuration files of this new core
             m_solrConfig.prepareCore(tenantId, indexName, is);
 
-            // Now create the new core
-            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 solr = m_solrConfig.getSolr();
-            File workDir = m_solrConfig.getWorkDirectory();
+            // Now load the new core
+            loadCore(tenantId, indexName, classLoader);
 
-            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);
+            // Persist cores
+            File solr = m_solrConfig.getSolr();
             m_coreContainer.persistFile(solr);
         } finally {
             // Restore classloader
@@ -203,4 +316,95 @@
         return coreName.substring(corePrefix.length());
     }
 
+
+
+
+
+
+
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void doQuery(ServletRequest request, ServletResponse response) 
throws IOException,
+    ServletException {
+        if (request instanceof HttpServletRequest && request.getParameter("q") 
!= null && !request.getParameter("q").isEmpty()) {
+            HttpServletRequest req = (HttpServletRequest) request;
+            HttpServletResponse resp = (HttpServletResponse) response;
+            SolrRequestHandler handler = null;
+            SolrQueryRequest solrReq = null;
+
+            try {
+                // put the core container in request attribute
+                req.setAttribute("org.apache.solr.CoreContainer", 
m_coreContainer);
+                SolrCore core = m_coreContainer.getCore("nu_articles");
+                final SolrConfig config = core.getSolrConfig();
+
+                // get or create/cache the parser for the core
+                SolrRequestParsers parser = null;
+                parser = parsers.get(config);
+                if (parser == null) {
+                    parser = new SolrRequestParsers(config);
+                    parsers.put(config, parser);
+                }
+
+                handler = core.getRequestHandler("standard");
+                String path = "articles";
+
+                solrReq = parser.parse(core, path, req);
+
+                final Method reqMethod = Method.getMethod(req.getMethod());
+                HttpCacheHeaderUtil.setCacheControlHeader(config, resp, 
reqMethod);
+                // unless we have been explicitly told not to, do cache 
validation
+                // if we fail cache validation, execute the query
+                if (config.getHttpCachingConfig().isNever304()
+                                || 
!HttpCacheHeaderUtil.doCacheHeaderValidation(solrReq, req, reqMethod, resp)) {
+                    SolrQueryResponse solrRsp = new SolrQueryResponse();
+
+                    execute(req, handler, solrReq, solrRsp);
+                    HttpCacheHeaderUtil.checkHttpCachingVeto(solrRsp, resp, 
reqMethod);
+
+                    QueryResponseWriter responseWriter = 
core.getQueryResponseWriter(solrReq);
+                    writeResponse(solrRsp, response, responseWriter, solrReq, 
reqMethod);
+                }
+                return;
+                //  log.debug("no handler or core retrieved for " + path + ", 
follow through...");
+            } catch (Throwable ex) {
+                //sendError((HttpServletResponse) response, ex);
+                return;
+            } finally {
+                if (solrReq != null) {
+                    solrReq.close();
+                }
+
+            }
+        }
+    }
+
+    private void writeResponse(SolrQueryResponse solrRsp, ServletResponse 
response, QueryResponseWriter responseWriter,
+        SolrQueryRequest solrReq, Method reqMethod) throws IOException {
+        if (solrRsp.getException() != null) {
+            throw new IOException("error nog fixen hier");
+        } else {
+            // Now write it out
+            response.setContentType(responseWriter.getContentType(solrReq, 
solrRsp));
+            if (Method.HEAD != reqMethod) {
+                if (responseWriter instanceof BinaryQueryResponseWriter) {
+                    BinaryQueryResponseWriter binWriter = 
(BinaryQueryResponseWriter) responseWriter;
+                    binWriter.write(response.getOutputStream(), solrReq, 
solrRsp);
+                } else {
+                    PrintWriter out = response.getWriter();
+                    responseWriter.write(out, solrReq, solrRsp);
+
+                }
+            }
+            // else http HEAD request, nothing to write out, waited this long 
just to get ContentType
+        }
+    }
+
+    protected void execute(HttpServletRequest req, SolrRequestHandler handler, 
SolrQueryRequest sreq,
+        SolrQueryResponse rsp) {
+        sreq.getCore().execute(handler, sreq, rsp);
+    }
 }

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:06:11 2011
@@ -100,6 +100,8 @@
         } else {
             // Solr uses this system property to find its storage location, so 
set it.
             System.setProperty("solr.solr.home", 
solrFile.getParentFile().getAbsolutePath());
+
+
         }
     }
 

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:06:11 2011
@@ -70,9 +70,9 @@
 
             // Create the core initializer
             boolean abortOnConfigurationError = true;
-            CoreContainer.Initializer init = new CoreContainer.Initializer();
-            m_coreContainer = init.initialize();
-            abortOnConfigurationError = init.isAbortOnConfigurationError();
+            //CoreContainer.Initializer init = new CoreContainer.Initializer();
+            m_coreContainer = new CoreContainer(); //init.initialize();
+            /* abortOnConfigurationError = init.isAbortOnConfigurationError();
 
             // Optionally abort if we found a sever error
             if (abortOnConfigurationError && SolrConfig.severeErrors.size() > 
0) {
@@ -86,7 +86,7 @@
                     
sb.append("-------------------------------------------------------------\n");
                     sb.append(t.toString());
                 }
-            }
+            }*/
         } catch (Exception e) {
             SolrConfig.severeErrors.add(e);
             SolrCore.log(e);

Modified: 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDispatchFilter.java
==============================================================================
--- 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDispatchFilter.java
   (original)
+++ 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrDispatchFilter.java
   Mon Jan 31 12:06:11 2011
@@ -18,7 +18,6 @@
 
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.WeakHashMap;
@@ -32,10 +31,6 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.params.CommonParams;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.SolrCore;
@@ -47,30 +42,27 @@
 import org.apache.solr.servlet.SolrRequestParsers;
 import org.apache.solr.servlet.cache.HttpCacheHeaderUtil;
 import org.apache.solr.servlet.cache.Method;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * This filter looks at the incoming URL maps them to handlers defined in 
solrconfig.xml
  * @since solr 1.2
  */
 public class SolrDispatchFilter implements Filter {
-    final Logger log = LoggerFactory.getLogger(SolrDispatchFilter.class);
+    //final Logger log = LoggerFactory.getLogger(SolrDispatchFilter.class);
 
-    protected CoreContainer cores;
     protected String pathPrefix; // strip this from the beginning of a path
     protected String myHomeDir; //
     protected String abortErrorMessage = null;
     protected String solrConfigFilename = null;
     protected final Map<SolrConfig, SolrRequestParsers> parsers = new 
WeakHashMap<SolrConfig, SolrRequestParsers>();
     private final Map<String, String> myTenantMap = new HashMap<String, 
String>();
+    private CoreContainer m_coreContainer;
 
-    public SolrDispatchFilter(String path, String homedir) {
-        this.pathPrefix = path;
-        this.myHomeDir = homedir;
-        /*if (tenantMap != null) {
-            myTenantMap.putAll(tenantMap);
-        }*/
+    public SolrDispatchFilter(CoreContainer coreContainer) {
+        m_coreContainer = coreContainer;
+    }
+
+    public void init() {
     }
 
     public void init(FilterConfig filterConfig) throws ServletException {
@@ -80,14 +72,7 @@
      * {@inheritDoc}
      */
     public void destroy() {
-        if (cores != null) {
-            try {
-                cores.shutdown();
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            cores = null;
-        }
+
     }
 
     /**
@@ -95,160 +80,55 @@
      */
     public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain) throws IOException,
     ServletException {
-
-        if (abortErrorMessage != null) {
-            ((HttpServletResponse) response).sendError(500, abortErrorMessage);
-            return;
-        }
-
-        if (request instanceof HttpServletRequest) {
+        if (request instanceof HttpServletRequest && request.getParameter("q") 
!= null && !request.getParameter("q").isEmpty()) {
             HttpServletRequest req = (HttpServletRequest) request;
             HttpServletResponse resp = (HttpServletResponse) response;
             SolrRequestHandler handler = null;
             SolrQueryRequest solrReq = null;
-            SolrCore core = null;
-            String corename = "";
+
             try {
                 // put the core container in request attribute
-                req.setAttribute("org.apache.solr.CoreContainer", cores);
-                String path = req.getServletPath();
-                if (req.getPathInfo() != null) {
-                    // this lets you handle /update/commit when /update is a 
servlet
-                    path += req.getPathInfo();
-                }
-                if (pathPrefix != null && path.startsWith(pathPrefix)) {
-                    path = path.substring(pathPrefix.length());
-                }
-                // check for management path
-                String alternate = cores.getManagementPath();
-                if (alternate != null && path.startsWith(alternate)) {
-                    path = path.substring(0, alternate.length());
-                }
-                // unused feature ?
-                int idx = path.indexOf(':');
-                if (idx > 0) {
-                    // save the portion after the ':' for a 'handler' path 
parameter
-                    path = path.substring(0, idx);
-                }
+                req.setAttribute("org.apache.solr.CoreContainer", 
m_coreContainer);
+                SolrCore core = m_coreContainer.getCore("nu_articles");
+                final SolrConfig config = core.getSolrConfig();
+
+                // get or create/cache the parser for the core
+                SolrRequestParsers parser = null;
+                parser = parsers.get(config);
+                if (parser == null) {
+                    parser = new SolrRequestParsers(config);
+                    parsers.put(config, parser);
+                }
+
+                handler = core.getRequestHandler("standard");
+                String path = "articles";
+
+                solrReq = parser.parse(core, path, req);
+
+                final Method reqMethod = Method.getMethod(req.getMethod());
+                HttpCacheHeaderUtil.setCacheControlHeader(config, resp, 
reqMethod);
+                // unless we have been explicitly told not to, do cache 
validation
+                // if we fail cache validation, execute the query
+                if (config.getHttpCachingConfig().isNever304()
+                                || 
!HttpCacheHeaderUtil.doCacheHeaderValidation(solrReq, req, reqMethod, resp)) {
+                    SolrQueryResponse solrRsp = new SolrQueryResponse();
 
-                // Check for the core admin page
-                if (path.equals(cores.getAdminPath())) {
-                    handler = cores.getMultiCoreHandler();
-                    // solrReq = adminRequestParser.parse(null, path, req);
-                    // handleAdminRequest(req, response, handler, solrReq);
-                    return;
-                } else {
-                    // otherwise, we should find a core from the path
-                    idx = path.indexOf("/", 1);
-                    if (idx > 1) {
-                        // try to get the corename as a request parameter first
-                        corename = path.substring(1, idx);
-                        if ("profile".equals(corename)) {
-                            // FIXME: hardcoded
-                            String prefix = 
myTenantMap.get(request.getServerName());
-                            if (prefix == null) {
-                                prefix = "Keyspace3";
-                            }
-                            corename = prefix + "_" + corename;
-                        }
-                        core = cores.getCore(corename);
-                        if (core != null) {
-                            path = path.substring(idx);
-                        }
-                    }
-                    if (core == null) {
-                        corename = "";
-                        core = cores.getCore("");
-                    }
-                }
+                    execute(req, handler, solrReq, solrRsp);
+                    HttpCacheHeaderUtil.checkHttpCachingVeto(solrRsp, resp, 
reqMethod);
 
-                // With a valid core...
-                if (core != null) {
-                    final SolrConfig config = core.getSolrConfig();
-                    // get or create/cache the parser for the core
-                    SolrRequestParsers parser = null;
-                    parser = parsers.get(config);
-                    if (parser == null) {
-                        parser = new SolrRequestParsers(config);
-                        parsers.put(config, parser);
-                    }
-
-                    // Determine the handler from the url path if not set
-                    // (we might already have selected the cores handler)
-                    if (handler == null && path.length() > 1) { // don't match 
"" or "/" as valid path
-                        handler = core.getRequestHandler(path);
-                        // no handler yet but allowed to handle select; let's 
check
-                        if (handler == null && parser.isHandleSelect()) {
-                            if ("/select".equals(path) || 
"/select/".equals(path)) {
-                                solrReq = parser.parse(core, path, req);
-                                String qt = 
solrReq.getParams().get(CommonParams.QT);
-                                handler = core.getRequestHandler(qt);
-                                if (handler == null) {
-                                    throw new 
SolrException(SolrException.ErrorCode.BAD_REQUEST, "unknown handler: "
-                                        + qt);
-                                }
-                            }
-                        }
-                    }
-
-                    // With a valid handler and a valid core...
-                    if (handler != null) {
-                        // if not a /select, create the request
-                        if (solrReq == null) {
-                            solrReq = parser.parse(core, path, req);
-                        }
-
-                        final Method reqMethod = 
Method.getMethod(req.getMethod());
-                        HttpCacheHeaderUtil.setCacheControlHeader(config, 
resp, reqMethod);
-                        // unless we have been explicitly told not to, do 
cache validation
-                        // if we fail cache validation, execute the query
-                        if (config.getHttpCachingConfig().isNever304()
-                                        || 
!HttpCacheHeaderUtil.doCacheHeaderValidation(solrReq, req, reqMethod, resp)) {
-                            SolrQueryResponse solrRsp = new 
SolrQueryResponse();
-                            /*
-                             * even for HEAD requests, we need to execute the 
handler to ensure we don't get an error
-                             * (and to make sure the correct 
QueryResponseWriter is selected and we get the correct
-                             * Content-Type)
-                             */
-                            this.execute(req, handler, solrReq, solrRsp);
-                            HttpCacheHeaderUtil.checkHttpCachingVeto(solrRsp, 
resp, reqMethod);
-                            // add info to http headers
-                            // TODO: See SOLR-232 and SOLR-267.
-                            /*
-                             * try { NamedList solrRspHeader = 
solrRsp.getResponseHeader(); for (int i=0;
-                             * i<solrRspHeader.size(); i++) { 
((javax.servlet.http.HttpServletResponse)
-                             * response).addHeader(("Solr-" + 
solrRspHeader.getName(i)),
-                             * String.valueOf(solrRspHeader.getVal(i))); } } 
catch (ClassCastException cce) {
-                             * log.log(Level.WARNING, "exception adding 
response header log information", cce); }
-                             */
-                            QueryResponseWriter responseWriter = 
core.getQueryResponseWriter(solrReq);
-                            writeResponse(solrRsp, response, responseWriter, 
solrReq, reqMethod);
-                        }
-                        return; // we are done with a valid handler
-                    }
-                    // otherwise (we have a core), let's ensure the core is in 
the SolrCore request attribute so
-                    // a servlet/jsp can retrieve it
-                    else {
-                        req.setAttribute("org.apache.solr.SolrCore", core);
-                        // Modify the request so each core gets its own /admin
-                        if (path.startsWith("/admin")) {
-                            req.getRequestDispatcher(pathPrefix == null ? path 
: pathPrefix + path).forward(request,
-                                response);
-                            return;
-                        }
-                    }
+                    QueryResponseWriter responseWriter = 
core.getQueryResponseWriter(solrReq);
+                    writeResponse(solrRsp, response, responseWriter, solrReq, 
reqMethod);
                 }
-                log.debug("no handler or core retrieved for " + path + ", 
follow through...");
+                return;
+                //  log.debug("no handler or core retrieved for " + path + ", 
follow through...");
             } catch (Throwable ex) {
-                sendError((HttpServletResponse) response, ex);
+                //sendError((HttpServletResponse) response, ex);
                 return;
             } finally {
                 if (solrReq != null) {
                     solrReq.close();
                 }
-                if (core != null) {
-                    core.close();
-                }
+
             }
         }
 
@@ -256,35 +136,10 @@
         chain.doFilter(request, response);
     }
 
-    private void handleAdminRequest(HttpServletRequest req, ServletResponse 
response, SolrRequestHandler handler,
-        SolrQueryRequest solrReq) throws IOException {
-        SolrQueryResponse solrResp = new SolrQueryResponse();
-        final NamedList<Object> responseHeader = new 
SimpleOrderedMap<Object>();
-        solrResp.add("responseHeader", responseHeader);
-        NamedList toLog = solrResp.getToLog();
-        toLog.add("webapp", req.getContextPath());
-        toLog.add("path", solrReq.getContext().get("path"));
-        toLog.add("params", "{" + solrReq.getParamString() + "}");
-        handler.handleRequest(solrReq, solrResp);
-        SolrCore.setResponseHeaderValues(handler, solrReq, solrResp);
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < toLog.size(); i++) {
-            String name = toLog.getName(i);
-            Object val = toLog.getVal(i);
-            sb.append(name).append("=").append(val).append(" ");
-        }
-        QueryResponseWriter respWriter =
-            
SolrCore.DEFAULT_RESPONSE_WRITERS.get(solrReq.getParams().get(CommonParams.WT));
-        if (respWriter == null) {
-            respWriter = SolrCore.DEFAULT_RESPONSE_WRITERS.get("standard");
-        }
-        writeResponse(solrResp, response, respWriter, solrReq, 
Method.getMethod(req.getMethod()));
-    }
-
     private void writeResponse(SolrQueryResponse solrRsp, ServletResponse 
response, QueryResponseWriter responseWriter,
         SolrQueryRequest solrReq, Method reqMethod) throws IOException {
         if (solrRsp.getException() != null) {
-            sendError((HttpServletResponse) response, solrRsp.getException());
+            throw new IOException("error nog fixen hier");
         } else {
             // Now write it out
             response.setContentType(responseWriter.getContentType(solrReq, 
solrRsp));
@@ -304,52 +159,6 @@
 
     protected void execute(HttpServletRequest req, SolrRequestHandler handler, 
SolrQueryRequest sreq,
         SolrQueryResponse rsp) {
-        // a custom filter could add more stuff to the request before passing 
it on.
-        // for example: sreq.getContext().put( "HttpServletRequest", req );
-        // used for logging query stats in SolrCore.execute()
-        sreq.getContext().put("webapp", req.getContextPath());
         sreq.getCore().execute(handler, sreq, rsp);
     }
-
-    protected void sendError(HttpServletResponse res, Throwable ex) throws 
IOException {
-        int code = 500;
-        String trace = "";
-        if (ex instanceof SolrException) {
-            code = ((SolrException) ex).code();
-        }
-
-        // For any regular code, don't include the stack trace
-        if (code == 500 || code < 100) {
-            StringWriter sw = new StringWriter();
-            ex.printStackTrace(new PrintWriter(sw));
-            trace = "\n\n" + sw.toString();
-
-            SolrException.logOnce(log, null, ex);
-
-            // non standard codes have undefined results with various servers
-            if (code < 100) {
-                log.warn("invalid return code: " + code);
-                code = 500;
-            }
-        }
-        res.sendError(code, ex.getMessage() + trace);
-    }
-
-    // ---------------------------------------------------------------------
-    // ---------------------------------------------------------------------
-
-    /**
-     * Set the prefix for all paths. This is useful if you want to apply the 
filter to something other then /*, perhaps
-     * because you are merging this filter into a larger web application. For 
example, if web.xml specifies:
-     * <filter-mapping> <filter-name>SolrRequestFilter</filter-name> 
<url-pattern>/xxx/*</url-pattern> </filter-mapping>
-     * Make sure to set the PathPrefix to "/xxx" either with this function or 
in web.xml. <init-param>
-     * <param-name>path-prefix</param-name> <param-value>/xxx</param-value> 
</init-param>
-     */
-    public void setPathPrefix(String pathPrefix) {
-        this.pathPrefix = pathPrefix;
-    }
-
-    public String getPathPrefix() {
-        return pathPrefix;
-    }
 }

Modified: 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrRestServiceImpl.java
==============================================================================
--- 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrRestServiceImpl.java
  (original)
+++ 
sandbox/ivol/amdatu-searchandindex/solr/src/main/java/org/amdatu/searchandindex/solr/impl/SolrRestServiceImpl.java
  Mon Jan 31 12:06:11 2011
@@ -16,13 +16,16 @@
  */
 package org.amdatu.searchandindex.solr.impl;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.GET;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
@@ -34,6 +37,7 @@
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
 
 import org.amdatu.core.tenant.Tenant;
 import org.amdatu.core.tenant.TenantException;
@@ -164,7 +168,7 @@
     @Path("{indexname}")
     @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
     public Response queryIndex(@PathParam("indexname") final String indexname, 
@QueryParam("q") final String q,
-        @Context final HttpServletRequest request) {
+        @Context final HttpServletRequest request, @Context final 
HttpServletResponse response) {
         Tenant tenant = null;
         if (indexname == null || indexname.isEmpty()) {
             // No indexname passed which is required, return 400 (BAD_REQUEST)
@@ -175,16 +179,18 @@
             tenant = resolveTenant(request);
             if 
(!m_solrApi.getCores(tenant).contains(m_solrApi.getCoreName(tenant, 
indexname))) {
                 // Index does not exist, return a 404 (NOT_FOUND)
-                return 
Response.noContent().cacheControl(m_cacheControl).build();
+                return 
Response.status(Status.NOT_FOUND).cacheControl(m_cacheControl).build();
             }
             String query = q;
             if (query == null || query.isEmpty()) {
                 query = "*:*";
             }
-            QueryResponse response = m_solrApi.queryIndex(tenant, indexname, 
query);
+            /* QueryResponse response = m_solrApi.queryIndex(tenant, 
indexname, query);
             int size = response.getResults().size();
-            SolrIndexBean indexBean = new 
SolrIndexBean(m_solrApi.getCoreName(tenant, indexname), indexname, size);
-            return Response.ok(indexBean).cacheControl(m_cacheControl).build();
+            SolrSearchResultBean resultbean = new SolrSearchResultBean(size);
+            return 
Response.ok(resultbean).cacheControl(m_cacheControl).build();*/
+            m_solrApi.queryIndex(tenant, indexname, request, response);
+            return Response.ok().build();
         }
         catch (TenantException e) {
             m_logService.log(LogService.LOG_ERROR, "Could not retrieve index 
'" + indexname + "' for tenant '" + tenant + "'", e);
@@ -194,6 +200,15 @@
             m_logService.log(LogService.LOG_ERROR, "Could not retrieve index 
'" + indexname + "' for tenant '" + tenant + "'", e);
             throw new WebApplicationException(e);
         }
+        catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        catch (ServletException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return Response.ok().build();
     }
 
     /**
@@ -213,7 +228,7 @@
             Collection<String> cores = m_solrApi.getCores(tenant);
             for (String core : cores) {
                 QueryResponse response = m_solrApi.queryCore(core, "*:*");
-                int size = response.getResults().size();
+                long size = response.getResults().getNumFound();
                 indexBeans.add(new SolrIndexBean(core, 
m_solrApi.getIndexName(tenant, core), size));
             }
             tenantBean.setIndices(indexBeans);

Reply via email to