Mercurial > hg > mpdl-group
view software/mpdl-services-new/mpiwg-mpdl-cms-web/src/de/mpg/mpiwg/berlin/mpdl/servlets/cms/QueryDocuments.java @ 25:e9fe3186670c default tip
letzter Stand eingecheckt
author | Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de> |
---|---|
date | Tue, 21 May 2013 10:19:32 +0200 |
parents | |
children |
line wrap: on
line source
package de.mpg.mpiwg.berlin.mpdl.servlets.cms; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Date; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.lucene.document.Fieldable; import org.apache.lucene.search.Query; import de.mpg.mpiwg.berlin.mpdl.cms.document.Document; import de.mpg.mpiwg.berlin.mpdl.cms.document.DocumentHandler; import de.mpg.mpiwg.berlin.mpdl.cms.document.Hits; import de.mpg.mpiwg.berlin.mpdl.cms.lucene.IndexHandler; public class QueryDocuments extends HttpServlet { private static final long serialVersionUID = 1L; public QueryDocuments() { super(); } public void init(ServletConfig config) throws ServletException { super.init(config); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); String query = request.getParameter("query"); String sortBy = request.getParameter("sortBy"); String[] sortFields = null; if (sortBy != null && ! sortBy.trim().isEmpty()) sortFields = sortBy.split(" "); String language = request.getParameter("language"); // optional: is also detected by translator service if (language != null && language.equals("none")) language = null; String translate = request.getParameter("translate"); String pageStr = request.getParameter("page"); if (pageStr == null) pageStr = "1"; int page = Integer.parseInt(pageStr); String pageSizeStr = request.getParameter("pageSize"); if (pageSizeStr == null) pageSizeStr = "10"; int pageSize = Integer.parseInt(pageSizeStr); int from = (page * pageSize) - pageSize; // e.g. 0 int to = page * pageSize - 1; // e.g. 9 String outputFormat = request.getParameter("outputFormat"); if (outputFormat == null) outputFormat = "html"; if (outputFormat.equals("xml")) response.setContentType("text/xml"); else if (outputFormat.equals("html")) response.setContentType("text/html"); else response.setContentType("text/xml"); PrintWriter out = response.getWriter(); if (query == null) { out.print("no query specified: please set parameter \"query\""); out.close(); return; } try { Date begin = new Date(); IndexHandler indexHandler = IndexHandler.getInstance(); boolean translateBool = false; if (translate != null && translate.equals("true")) translateBool = true; boolean withHitHighlights = false; if (query.contains("tokenOrig:") || query.contains("tokenMorph:") || query.contains("tokenReg:") || query.contains("tokenNorm:")) withHitHighlights = true; Hits hits = indexHandler.queryDocuments(query, sortFields, language, from, to, withHitHighlights, translateBool); ArrayList<Document> docs = null; if (hits != null) docs = hits.getHits(); int hitsSize = -1; int docsSize = -1; if (hits != null) hitsSize = hits.getSize(); if (docs != null) docsSize = docs.size(); Date end = new Date(); long elapsedTime = end.getTime() - begin.getTime(); if (outputFormat.equals("xml")) { out.print("<result>"); out.print("<query>"); out.print("<queryText>" + query + "</queryText>"); out.print("<resultPage>" + page + "</resultPage>"); out.print("<resultPageSize>" + pageSize + "</resultPageSize>"); out.print("</query>"); out.print("<hitsSize>" + hitsSize + "</hitsSize>"); out.print("<hits>"); for (int i=0; i<docsSize; i++) { Document doc = docs.get(i); out.print("<doc>"); String docId = doc.getFieldable("docId").stringValue(); out.print("<docId>" + docId + "</docId>"); Fieldable docCollectionNamesField = doc.getFieldable("collectionNames"); if (docCollectionNamesField != null) { String docCollectionNames = docCollectionNamesField.stringValue(); out.print("<collectionName>" + docCollectionNames + "</collectionName>"); } ArrayList<String> hitFragments = doc.getHitFragments(); if (hitFragments != null) { out.print("<hitFragments>"); for (int j=0; j<hitFragments.size(); j++) { String hitFragment = hitFragments.get(j); out.print("<hitFragment>" + hitFragment + "</hitFragment>"); } out.print("</hitFragments>"); } out.print("</doc>"); } out.print("</hits>"); out.print("<executionTime>" + elapsedTime + "</executionTime>"); out.print("</result>"); } else if (outputFormat.equals("html")) { StringBuilder htmlStrBuilder = new StringBuilder(); String baseUrl = getBaseUrl(request); String cssUrl = baseUrl + "/css/page.css"; htmlStrBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"); htmlStrBuilder.append("<html>"); htmlStrBuilder.append("<head>"); htmlStrBuilder.append("<title>Query: " + query + "</title>"); htmlStrBuilder.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + cssUrl + "\"/>"); htmlStrBuilder.append("</head>"); htmlStrBuilder.append("<body>"); htmlStrBuilder.append("<table align=\"right\" valign=\"top\">"); htmlStrBuilder.append("<td>[<i>This is a MPIWG CMS technology service</i>] <a href=\"/mpiwg-mpdl-cms-web/index.html\"><img src=\"/mpiwg-mpdl-cms-web/images/info.png\" valign=\"bottom\" width=\"15\" height=\"15\" border=\"0\" alt=\"MPIWG CMS service\"/></a></td>"); htmlStrBuilder.append("</table>"); htmlStrBuilder.append("<p/>"); String luceneQueryStr = query; Query luceneQuery = hits.getQuery(); if (query != null) luceneQueryStr = luceneQuery.toString(); String sortByStr = sortBy; if (sortBy == null) sortByStr = ""; htmlStrBuilder.append("<h4>Query: " + luceneQueryStr + ", sorted by: " + sortByStr + "</h4>"); htmlStrBuilder.append("<form action=\"QueryDocuments\" method=\"get\">"); htmlStrBuilder.append("<input type=\"hidden\" name=\"query\" value=\"" + query + "\"/>"); if (translate != null) htmlStrBuilder.append("<input type=\"hidden\" name=\"translate\" value=\"" + translate + "\"/>"); if (language != null) htmlStrBuilder.append("<input type=\"hidden\" name=\"language\" value=\"" + language + "\"/>"); htmlStrBuilder.append("<input type=\"hidden\" name=\"page\" id=\"pageId\" value=\"" + page + "\"/>"); htmlStrBuilder.append("<input type=\"hidden\" name=\"sortBy\" id=\"sortById\" value=\"" + sortByStr + "\"/>"); htmlStrBuilder.append("<input type=\"submit\" id=\"submitId\" style=\"position: absolute; left: -9999px\"/>"); htmlStrBuilder.append("<table>"); htmlStrBuilder.append("<colgroup>"); htmlStrBuilder.append("<col width=\"3%\"/>"); htmlStrBuilder.append("<col width=\"7%\"/>"); htmlStrBuilder.append("<col width=\"3%\"/>"); htmlStrBuilder.append("<col width=\"12%\"/>"); htmlStrBuilder.append("<col width=\"70%\"/>"); htmlStrBuilder.append("</colgroup>"); htmlStrBuilder.append("<tr>"); int countPages = hitsSize / 10 + 1; if (hitsSize % 10 == 0) // modulo operator: e.g. 280 % 10 is 0 countPages = hitsSize / 10; int pageLeft = page - 1; if (page == 1) pageLeft = 1; int pageRight = page + 1; if (page == countPages) pageRight = countPages; htmlStrBuilder.append("<td align=\"left\" valign=\"top\"><button onclick=\"document.getElementById('pageId').value=" + pageLeft + "\" style=\"background:none;border:none;\"><img src=\"../images/left.gif\"/></button></td>"); htmlStrBuilder.append("<td align=\"middle\" valign=\"top\" nowrap=\"true\">" + page + " / " + countPages + "</td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\"><button onclick=\"document.getElementById('pageId').value=" + pageRight + "\" style=\"background:none;border:none;\"><img src=\"../images/right.gif\"/></button></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\" nowrap=\"true\">Page: <input type=\"text\" size=\"3\" value=\"" + page + "\" id=\"pageTextId\" onkeydown=\"if (event.keyCode == 13) {document.getElementById('pageId').value=document.getElementById('pageTextId').value; document.getElementById('submitId').click();}\"/></td>"); int fromDisplay = from + 1; int toDisplay = to + 1; if (hitsSize < to) toDisplay = hitsSize; htmlStrBuilder.append("<td align=\"right\" valign=\"top\">" + fromDisplay + " - " + toDisplay + " of " + hitsSize + " documents" + "</td>"); htmlStrBuilder.append("</tr>"); htmlStrBuilder.append("</table>"); htmlStrBuilder.append("<p/>"); htmlStrBuilder.append("<table width=\"100%\" align=\"right\" border=\"2\" rules=\"groups\">"); htmlStrBuilder.append("<colgroup>"); htmlStrBuilder.append("<col width=\"3%\"/>"); htmlStrBuilder.append("<col width=\"15%\"/>"); htmlStrBuilder.append("<col width=\"45%\"/>"); htmlStrBuilder.append("<col width=\"10%\"/>"); htmlStrBuilder.append("<col width=\"5%\"/>"); htmlStrBuilder.append("<col width=\"10%\"/>"); htmlStrBuilder.append("<col width=\"6%\"/>"); htmlStrBuilder.append("<col width=\"5%\"/>"); htmlStrBuilder.append("<col width=\"4%\"/>"); htmlStrBuilder.append("</colgroup>"); htmlStrBuilder.append("<thead>"); htmlStrBuilder.append("<tr>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\" style=\"font-weight:bold;\">" + "No" + "</td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + "<button onclick=\"document.getElementById('sortById').value='author'\" style=\"padding:0px;font-weight:bold;font-size:14px;background:none;border:none;\">" + "Author" + "</button></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + "<button onclick=\"document.getElementById('sortById').value='title'\" style=\"padding:0px;font-weight:bold;font-size:14px;background:none;border:none;\">" + "Title" + "</button></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + "<button onclick=\"document.getElementById('sortById').value='publisher'\" style=\"padding:0px;font-weight:bold;font-size:14px;background:none;border:none;\">" + "Place" + "</button></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + "<button onclick=\"document.getElementById('sortById').value='date'\" style=\"padding:0px;font-weight:bold;font-size:14px;background:none;border:none;\">" + "Year" + "</button></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + "<button onclick=\"document.getElementById('sortById').value='docId'\" style=\"padding:0px;font-weight:bold;font-size:14px;background:none;border:none;\">" + "Id" + "</button></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + "<button onclick=\"document.getElementById('sortById').value='lastModified'\" style=\"padding:0px;font-weight:bold;font-size:14px;background:none;border:none;\">" + "Last modified" + "</button></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + "<button onclick=\"document.getElementById('sortById').value='language'\" style=\"padding:0px;font-weight:bold;font-size:14px;background:none;border:none;\">" + "Language" + "</button></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + "<button onclick=\"document.getElementById('sortById').value='schemaName'\" style=\"padding:0px;font-weight:bold;font-size:14px;background:none;border:none;\">" + "Schema" + "</button></td>"); htmlStrBuilder.append("</tr>"); htmlStrBuilder.append("</thead>"); htmlStrBuilder.append("<tbody>"); for (int i=0; i<docsSize; i++) { Document doc = docs.get(i); htmlStrBuilder.append("<tr valign=\"top\">"); int num = (page - 1) * pageSize + i + 1; htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + num + ". " + "</td>"); Fieldable authorField = doc.getFieldable("author"); String author = ""; if (authorField != null) author = authorField.stringValue(); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + author + "</td>"); Fieldable titleField = doc.getFieldable("title"); String title = ""; if (titleField != null) title = titleField.stringValue(); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + title + "</td>"); Fieldable publisherField = doc.getFieldable("publisher"); String publisher = ""; if (publisherField != null) publisher = publisherField.stringValue(); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + publisher + "</td>"); Fieldable yearField = doc.getFieldable("date"); String year = ""; if (yearField != null) year = yearField.stringValue(); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + year + "</td>"); String docId = doc.getFieldable("docId").stringValue(); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + docId + "</td>"); Fieldable lastModifiedField = doc.getFieldable("lastModified"); String lastModified = ""; if (lastModifiedField != null) lastModified = lastModifiedField.stringValue(); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + lastModified + "</td>"); Fieldable languageField = doc.getFieldable("language"); String lang = ""; if (languageField != null) lang = languageField.stringValue(); htmlStrBuilder.append("<td align=\"left\" valign=\"top\" style=\"padding-left:5px\">" + lang + "</td>"); Fieldable schemaNameField = doc.getFieldable("schemaName"); String schemaName = ""; if (schemaNameField != null) schemaName = schemaNameField.stringValue(); htmlStrBuilder.append("<td align=\"left\" valign=\"top\">" + schemaName + "</td>"); htmlStrBuilder.append("</tr>"); // Link row htmlStrBuilder.append("<tr valign=\"top\">"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\"></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\" colspan=\"8\">"); Fieldable echoIdField = doc.getFieldable("echoId"); String echoId = null; if (echoIdField != null) echoId = echoIdField.stringValue(); String urlDocuView = "http://echo.mpiwg-berlin.mpg.de/ECHOdocuView?url=" + echoId; if (echoId == null) urlDocuView = "http://echo.mpiwg-berlin.mpg.de/"; htmlStrBuilder.append("<img src=\"/mpiwg-mpdl-cms-web/images/book.png\" width=\"15\" height=\"15\" border=\"0\"/>" + " <a href=\"" + urlDocuView + "\">Full view</a>"); htmlStrBuilder.append(", " + "<a href=\"/mpiwg-mpdl-cms-web/query/GetPage?docId=" + docId + "\">Lite view</a>"); htmlStrBuilder.append("</td>"); htmlStrBuilder.append("</tr>"); htmlStrBuilder.append("<tr valign=\"top\">"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\"></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\" colspan=\"8\">"); htmlStrBuilder.append("<img src=\"/mpiwg-mpdl-cms-web/images/download.png\" width=\"15\" height=\"15\" border=\"0\"/>" + " Download: <a href=\"/mpiwg-mpdl-cms-web/doc/GetDocument?id=" + docId + "\">XML</a>"); DocumentHandler docHandler = new DocumentHandler(); String destFileNamePdf = docHandler.getFullFileName(docId, "pdf"); String destFileNameHtml = docHandler.getFullFileName(docId, "html"); int lastDot = docId.lastIndexOf("."); String docIdWithoutExtension = docId.substring(0, lastDot); File destFilePdf = new File(destFileNamePdf); File destFileHtml = new File(destFileNameHtml); if (destFilePdf.exists()) htmlStrBuilder.append(", " + "<a href=\"/mpiwg-mpdl-cms-web/doc/GetDocument?id=" + docIdWithoutExtension + ".pdf" + "\">PDF</a>"); if (destFileHtml.exists()) htmlStrBuilder.append(", " + "<a href=\"/mpiwg-mpdl-cms-web/doc/GetDocument?id=" + docIdWithoutExtension + ".html" + "\">HTML</a>"); htmlStrBuilder.append("</td>"); htmlStrBuilder.append("</tr>"); // hit fragments row ArrayList<String> hitFragments = doc.getHitFragments(); if (hitFragments != null) { StringBuilder hitFragmentsStrBuilder = new StringBuilder(); hitFragmentsStrBuilder.append("<b>Hit summary: </b>"); hitFragmentsStrBuilder.append("(...) "); for (int j=0; j<hitFragments.size(); j++) { String hitFragment = hitFragments.get(j); hitFragmentsStrBuilder.append(hitFragment + " (...) "); } htmlStrBuilder.append("<tr valign=\"top\">"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\"></td>"); htmlStrBuilder.append("<td align=\"left\" valign=\"top\" colspan=\"8\">" + hitFragmentsStrBuilder.toString() + "</td>"); htmlStrBuilder.append("</tr>"); } } htmlStrBuilder.append("</tbody>"); htmlStrBuilder.append("</table>"); htmlStrBuilder.append("</form>"); htmlStrBuilder.append("<p/>"); htmlStrBuilder.append("Elapsed time: " + elapsedTime + " ms"); htmlStrBuilder.append("</body>"); htmlStrBuilder.append("</html>"); out.print(htmlStrBuilder.toString()); } out.close(); } catch (Exception e) { throw new ServletException(e); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } private String getBaseUrl(HttpServletRequest request) { return getServerUrl(request) + request.getContextPath(); } private String getServerUrl(HttpServletRequest request) { if ( ( request.getServerPort() == 80 ) || ( request.getServerPort() == 443 ) ) return request.getScheme() + "://" + request.getServerName(); else return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort(); } }