diff software/mpdl-services/mpiwg-mpdl-cms-web/src/de/mpg/mpiwg/berlin/mpdl/servlets/cms/QueryDocuments.java @ 23:e845310098ba

diverse Korrekturen
author Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de>
date Tue, 27 Nov 2012 12:35:19 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/software/mpdl-services/mpiwg-mpdl-cms-web/src/de/mpg/mpiwg/berlin/mpdl/servlets/cms/QueryDocuments.java	Tue Nov 27 12:35:19 2012 +0100
@@ -0,0 +1,333 @@
+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();
+  }
+
+}