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);