From de1f02420bb6b7b7de4fac14b965d0b258d06ff4 Mon Sep 17 00:00:00 2001 From: reger Date: Mon, 4 Nov 2013 21:11:12 +0100 Subject: [PATCH] implement HtmlResponseWriter to solrServlet (and rss / opensearch responswriter) as in yacy select servlet. - set contenttype of HTLM/GrepHTML-Reponsewriter to "text/html" - set a contenttype to GSAsearchServlet --- .../yacy/cora/federate/solr/SolrServlet.java | 71 +++++++++---------- .../GrepHTMLResponseWriter.java | 4 +- .../responsewriter/HTMLResponseWriter.java | 35 +++++---- source/net/yacy/http/GSAsearchServlet.java | 4 +- 4 files changed, 60 insertions(+), 54 deletions(-) diff --git a/source/net/yacy/cora/federate/solr/SolrServlet.java b/source/net/yacy/cora/federate/solr/SolrServlet.java index 1a5647d1b..19ae0a45e 100644 --- a/source/net/yacy/cora/federate/solr/SolrServlet.java +++ b/source/net/yacy/cora/federate/solr/SolrServlet.java @@ -27,7 +27,7 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.net.URL; -import java.util.Iterator; +import java.util.HashMap; import java.util.Map; import javax.servlet.Filter; @@ -39,22 +39,24 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - import net.yacy.cora.document.encoding.UTF8; + import net.yacy.cora.federate.solr.connector.EmbeddedSolrConnector; +import net.yacy.cora.federate.solr.responsewriter.EnhancedXMLResponseWriter; +import net.yacy.cora.federate.solr.responsewriter.GrepHTMLResponseWriter; +import net.yacy.cora.federate.solr.responsewriter.HTMLResponseWriter; +import net.yacy.cora.federate.solr.responsewriter.OpensearchResponseWriter; +import net.yacy.cora.federate.solr.responsewriter.YJsonResponseWriter; import net.yacy.search.schema.CollectionSchema; import org.apache.solr.common.SolrException; +import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.MultiMapSolrParams; import org.apache.solr.core.SolrCore; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.SolrRequestInfo; import org.apache.solr.response.QueryResponseWriter; import org.apache.solr.response.SolrQueryResponse; -import org.apache.solr.response.XMLResponseWriter; -import org.apache.solr.search.DocIterator; -import org.apache.solr.search.DocList; -import org.apache.solr.search.SolrIndexSearcher; import org.apache.solr.servlet.SolrRequestParsers; import org.apache.solr.servlet.cache.HttpCacheHeaderUtil; import org.apache.solr.servlet.cache.Method; @@ -63,10 +65,10 @@ import org.apache.solr.util.FastWriter; public class SolrServlet implements Filter { - private static final QueryResponseWriter responseWriter = new XMLResponseWriter(); private static EmbeddedSolrConnector connector; - - public SolrServlet() { + private final Map RESPONSE_WRITER = new HashMap(); + + public SolrServlet() { } public static void initCore(EmbeddedSolrConnector c) { @@ -75,6 +77,19 @@ public class SolrServlet implements Filter { @Override public void init(FilterConfig config) throws ServletException { + + OpensearchResponseWriter opensearchResponseWriter = new OpensearchResponseWriter(); + + // xml and xslt reponseWriter included in SorlCore.DEFAULT_RESPONSE_WRITERS + // DEFAULT_RESPONSE_WRITERS is allways checke, here only additional response writers + RESPONSE_WRITER.put("exml", new EnhancedXMLResponseWriter()); + RESPONSE_WRITER.put("html", new HTMLResponseWriter()); + RESPONSE_WRITER.put("grephtml", new GrepHTMLResponseWriter()); + RESPONSE_WRITER.put("rss", opensearchResponseWriter); //try http://localhost:8090/solr/select?wt=rss&q=olympia&hl=true&hl.fl=text_t,h1,h2 + RESPONSE_WRITER.put("opensearch", opensearchResponseWriter); //try http://localhost:8090/solr/select?wt=rss&q=olympia&hl=true&hl.fl=text_t,h1,h2 + RESPONSE_WRITER.put("yjson", new YJsonResponseWriter()); //try http://localhost:8090/solr/select?wt=json&q=olympia&hl=true&hl.fl=text_t,h1,h2 + // GSA response implemented in separate servlet + // RESPONSE_WRITER.put("gsa", new GSAResponseWriter()); } @Override @@ -129,6 +144,15 @@ public class SolrServlet implements Filter { queryStr = queryStr + "&df=" + CollectionSchema.text_t.getSolrFieldName(); } MultiMapSolrParams mmsp = SolrRequestParsers.parseQueryString(queryStr); + String wt = mmsp.get(CommonParams.WT, "xml"); // maybe use /solr/select?q=*:*&start=0&rows=10&wt=exml + QueryResponseWriter responseWriter = RESPONSE_WRITER.get(wt); + if (responseWriter == null) { + responseWriter = SolrCore.DEFAULT_RESPONSE_WRITERS.get(wt); + if (responseWriter == null) { + hresponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"Solr responsewriter not found for " + wt); + return; + } + } req = connector.request(mmsp); SolrQueryResponse rsp = connector.query(req); @@ -152,36 +176,11 @@ public class SolrServlet implements Filter { } // write response body - Writer out = new FastWriter(new OutputStreamWriter(response.getOutputStream(), UTF8.charset)); - - //debug - @SuppressWarnings("unchecked") - Iterator> ie = rsp.getValues().iterator(); - Map.Entry e; - while (ie.hasNext()) { - e = ie.next(); - System.out.println("Field: " + e.getKey() + ", value: " + e.getValue().getClass().getName()); - //Field: responseHeader, value: org.apache.solr.common.util.SimpleOrderedMap - //Field: response, value: org.apache.solr.search.DocSlice - if (e.getValue() instanceof DocList) { - DocList ids = (DocList) e.getValue(); - SolrIndexSearcher searcher = req.getSearcher(); - DocIterator iterator = ids.iterator(); - int sz = ids.size(); - for (int i = 0; i < sz; i++) { - int id = iterator.nextDoc(); - searcher.doc(id); - } - } - } - + Writer out = new FastWriter(new OutputStreamWriter(response.getOutputStream(),UTF8.charset)); responseWriter.write(out, req, rsp); out.flush(); - return; - } catch (final Throwable ex) { sendError(hresponse, ex); - return; } finally { if (req != null) { req.close(); @@ -221,7 +220,7 @@ public class SolrServlet implements Filter { private static final long serialVersionUID=-4497069674942245148L; @Override public void service(HttpServletRequest req, HttpServletResponse res) throws IOException { - res.sendError(404, "Can not find: " + req.getRequestURI()); + res.sendError(HttpServletResponse.SC_NOT_FOUND, "Can not find: " + req.getRequestURI()); } } diff --git a/source/net/yacy/cora/federate/solr/responsewriter/GrepHTMLResponseWriter.java b/source/net/yacy/cora/federate/solr/responsewriter/GrepHTMLResponseWriter.java index 2c83ff81f..fb9c0740d 100644 --- a/source/net/yacy/cora/federate/solr/responsewriter/GrepHTMLResponseWriter.java +++ b/source/net/yacy/cora/federate/solr/responsewriter/GrepHTMLResponseWriter.java @@ -68,7 +68,7 @@ public class GrepHTMLResponseWriter implements QueryResponseWriter { @Override public String getContentType(final SolrQueryRequest request, final SolrQueryResponse response) { - return CONTENT_TYPE_XML_UTF8; + return "text/html"; } @Override @@ -116,7 +116,7 @@ public class GrepHTMLResponseWriter implements QueryResponseWriter { String h1 = "Document Grep for query \"" + query + "\" and grep phrase \"" + grep + "\""; writer.write("" + h1 + "\n\n

" + h1 + "

\n"); writer.write("
\"API\"\n"); - writer.write("This search result can also be retrieved as XML. Click the API icon to see an example call to the search rss API.\n"); + writer.write("This search result can also be retrieved as XML. Click the API icon to see an example call to the search rss API.
\n"); for (int i = 0; i < sz; i++) { int id = iterator.nextDoc(); Document doc = searcher.doc(id, DEFAULT_FIELD_LIST); diff --git a/source/net/yacy/cora/federate/solr/responsewriter/HTMLResponseWriter.java b/source/net/yacy/cora/federate/solr/responsewriter/HTMLResponseWriter.java index b3d83c7df..19125afda 100644 --- a/source/net/yacy/cora/federate/solr/responsewriter/HTMLResponseWriter.java +++ b/source/net/yacy/cora/federate/solr/responsewriter/HTMLResponseWriter.java @@ -60,7 +60,7 @@ public class HTMLResponseWriter implements QueryResponseWriter { @Override public String getContentType(final SolrQueryRequest request, final SolrQueryResponse response) { - return CONTENT_TYPE_XML_UTF8; + return "text/html"; } @Override @@ -91,35 +91,40 @@ public class HTMLResponseWriter implements QueryResponseWriter { String xmlquery = dqp.matcher("/solr/select?" + SolrParams.toSolrParams(paramsList).toString()).replaceAll("%22"); writer.write("
\"API\"\n"); writer.write("This search result can also be retrieved as XML. Click the API icon to see this page as XML.
\n"); - + DocList response = ((ResultContext) values.get("response")).docs; final int sz = response.size(); if (sz > 0) { SolrIndexSearcher searcher = request.getSearcher(); DocIterator iterator = response.iterator(); IndexSchema schema = request.getSchema(); + + int id = iterator.nextDoc(); + Document doc = searcher.doc(id, DEFAULT_FIELD_LIST); + LinkedHashMap tdoc = translateDoc(schema, doc); + String title = tdoc.get(CollectionSchema.title.getSolrFieldName()); if (sz == 1) { - int id = iterator.nextDoc(); - Document doc = searcher.doc(id, DEFAULT_FIELD_LIST); - LinkedHashMap tdoc = translateDoc(schema, doc); - String title = tdoc.get(CollectionSchema.title.getSolrFieldName()); writer.write("" + title + "\n\n"); - writeDoc(writer, tdoc, title); } else { writer.write("Document List\n\n"); - for (int i = 0; i < sz; i++) { - int id = iterator.nextDoc(); - Document doc = searcher.doc(id, DEFAULT_FIELD_LIST); - LinkedHashMap tdoc = translateDoc(schema, doc); - String title = tdoc.get(CollectionSchema.title.getSolrFieldName()); - writeDoc(writer, tdoc, title); - } + } + writer.write("
\"API\"\n"); + writer.write("This search result can also be retrieved as XML. Click the API icon to see this page as XML.
\n"); + + writeDoc(writer, tdoc, title); + + while (iterator.hasNext()) { + id = iterator.nextDoc(); + doc = searcher.doc(id, DEFAULT_FIELD_LIST); + tdoc = translateDoc(schema, doc); + title = tdoc.get(CollectionSchema.title.getSolrFieldName()); + writeDoc(writer, tdoc, title); } } else { writer.write("No Document Found\n\n"); } - + writer.write("\n"); } diff --git a/source/net/yacy/http/GSAsearchServlet.java b/source/net/yacy/http/GSAsearchServlet.java index 4b88e948a..c108ef043 100644 --- a/source/net/yacy/http/GSAsearchServlet.java +++ b/source/net/yacy/http/GSAsearchServlet.java @@ -23,7 +23,6 @@ import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; -import java.security.Principal; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -50,6 +49,7 @@ import org.apache.solr.common.SolrException; import org.apache.solr.common.params.CommonParams; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.SolrRequestInfo; +import org.apache.solr.response.QueryResponseWriter; import org.apache.solr.response.ResultContext; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.util.FastWriter; @@ -73,6 +73,8 @@ public class GSAsearchServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType(QueryResponseWriter.CONTENT_TYPE_XML_UTF8); + response.setStatus(HttpServletResponse.SC_OK); respond(request, new serverObjects(), Switchboard.getSwitchboard(), response.getOutputStream()); }