diff software/mpdl-services/mpiwg-mpdl-cms-web/src/de/mpg/mpiwg/berlin/mpdl/servlets/cms/XQueryDocument.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/XQueryDocument.java	Tue Nov 27 12:35:19 2012 +0100
@@ -0,0 +1,228 @@
+package de.mpg.mpiwg.berlin.mpdl.servlets.cms;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.util.ArrayList;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import de.mpg.mpiwg.berlin.mpdl.cms.document.DocumentHandler;
+import de.mpg.mpiwg.berlin.mpdl.util.StringUtils;
+import de.mpg.mpiwg.berlin.mpdl.xml.xquery.Hit;
+import de.mpg.mpiwg.berlin.mpdl.xml.xquery.Hits;
+import de.mpg.mpiwg.berlin.mpdl.cms.document.MetadataRecord;
+import de.mpg.mpiwg.berlin.mpdl.cms.lucene.IndexHandler;
+import de.mpg.mpiwg.berlin.mpdl.cms.transform.PageTransformer;
+import de.mpg.mpiwg.berlin.mpdl.exception.ApplicationException;
+import de.mpg.mpiwg.berlin.mpdl.xml.xquery.XQueryEvaluator;
+
+public class XQueryDocument extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+  private XQueryEvaluator xQueryEvaluator = null;
+  private PageTransformer pageTransformer = null;
+  
+  public XQueryDocument() {
+    super();
+  }
+
+  public void init(ServletConfig config) throws ServletException  {
+    super.init(config);
+    ServletContext context = getServletContext();
+    xQueryEvaluator = (XQueryEvaluator) context.getAttribute("xQueryEvaluator");
+    pageTransformer = (PageTransformer) context.getAttribute("pageTransformer");
+  }
+
+  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+    doGet(request, response);
+  }  
+
+  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+    request.setCharacterEncoding("utf-8");
+    response.setCharacterEncoding("utf-8");
+    String docId = request.getParameter("docId");
+    String query = request.getParameter("query");
+    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 = "xml";
+    try {
+      DocumentHandler docHandler = new DocumentHandler();
+      String docFileName = docHandler.getDocFullFileName(docId);
+      URL docFileUrl = new URL("file:" + docFileName);
+      Hits hits = null;
+      String errorStr = null;
+      try {
+        hits = xQueryEvaluator.evaluate(docFileUrl, query, from, to);
+      } catch (ApplicationException e) {
+        errorStr = e.getLocalizedMessage();
+      }
+      IndexHandler indexHandler = IndexHandler.getInstance();
+      MetadataRecord docMetadataRecord = indexHandler.getDocMetadata(docId);
+      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();
+      String resultStr = "";
+      if (errorStr == null) {
+        if (outputFormat.equals("xml"))
+          resultStr = createXmlString(docMetadataRecord, query, page, pageSize, hits);
+        else if (outputFormat.equals("html"))
+          resultStr = createHtmlString(docMetadataRecord, query, page, pageSize, hits, request);
+      } else {
+        resultStr = "Saxon XQuery error: " + errorStr;
+      }
+      out.print(resultStr);
+      out.close();
+    } catch (ApplicationException e) {
+      throw new ServletException(e);
+    }
+  }
+
+  private String createXmlString(MetadataRecord docMetadataRecord, String query, int page, int pageSize, Hits hits) throws ApplicationException {
+    String docId = docMetadataRecord.getDocId();
+    ArrayList<Hit> hitsArray = null;
+    if (hits != null)
+      hitsArray = hits.getHits();
+    int hitsSize = -1;
+    int hitsArraySize = -1;
+    if (hits != null)
+      hitsSize = hits.getSize();
+    if (hitsArray != null)
+      hitsArraySize = hitsArray.size();
+    StringBuilder xmlStrBuilder = new StringBuilder();
+    xmlStrBuilder.append("<document>");
+    xmlStrBuilder.append("<id>" + docId + "</id>");
+    xmlStrBuilder.append("<query>");
+    String queryXml = StringUtils.deresolveXmlEntities(query);
+    xmlStrBuilder.append("<queryText>" + queryXml + "</queryText>");
+    xmlStrBuilder.append("<resultPage>" + page + "</resultPage>");
+    xmlStrBuilder.append("<resultPageSize>" + pageSize + "</resultPageSize>");
+    xmlStrBuilder.append("</query>");
+    xmlStrBuilder.append("<hitsSize>" + hitsSize + "</hitsSize>");
+    xmlStrBuilder.append("<hits>");
+    for (int i=0; i<hitsArraySize; i++) {
+      int num = (page - 1) * pageSize + i + 1;
+      xmlStrBuilder.append("<hit n=\"" + num + "\">");
+      Hit hit = hitsArray.get(i);
+      String name = hit.getName();
+      String typeStr = "ELEMENT";
+      int type = hit.getType();
+      if (type == Hit.TYPE_ATTRIBUTE)
+        typeStr = "ATTRIBUTE";
+      else if (type == Hit.TYPE_ATOMIC_VALUE)
+        typeStr = "ATOMIV_VALUE";
+      int docPage = hit.getPage();
+      int hitPagePosition = hit.getHitPagePosition();
+      String xmlContent = hit.getContent();
+      if (name != null)
+        xmlStrBuilder.append("<name>" + name + "</name>");
+      xmlStrBuilder.append("<type>" + typeStr + "</type>");
+      if (docPage != -1) {
+        xmlStrBuilder.append("<page>" + docPage + "</page>");
+        xmlStrBuilder.append("<posInPage>" + hitPagePosition + "</posInPage>");
+      }
+      xmlStrBuilder.append("<content>" + xmlContent + "</content>");
+      xmlStrBuilder.append("</hit>");
+    }
+    xmlStrBuilder.append("</hits>");
+    xmlStrBuilder.append("</document>");
+    return xmlStrBuilder.toString();   
+  }
+  
+  private String createHtmlString(MetadataRecord docMetadataRecord, String query, int page, int pageSize, Hits hits, HttpServletRequest request) throws ApplicationException {
+    String docId = docMetadataRecord.getDocId();
+    ArrayList<Hit> hitsArray = null;
+    if (hits != null)
+      hitsArray = hits.getHits();
+    int hitsArraySize = -1;
+    if (hitsArray != null)
+      hitsArraySize = hitsArray.size();
+    int hitsSize = hits.getSize();
+    StringBuilder xmlStrBuilder = new StringBuilder();
+    xmlStrBuilder.append("<html>");
+    xmlStrBuilder.append("<head>");
+    xmlStrBuilder.append("<title>Document: \"" + query + "\"</title>");
+    String baseUrl = getBaseUrl(request);
+    String cssUrl = baseUrl + "/css/page.css";
+    xmlStrBuilder.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + cssUrl + "\"/>");
+    xmlStrBuilder.append("</head>");
+    xmlStrBuilder.append("<body>");
+    xmlStrBuilder.append("<span class=\"about\">[<span class=\"it\">This is a MPIWG CMS technology service</span>] <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></span>");
+    xmlStrBuilder.append("<span class=\"query\">XQuery: " + query + "</span>");
+    xmlStrBuilder.append("<span class=\"result\">");
+    xmlStrBuilder.append("<span class=\"resultPage\">" + page + "</span>");
+    xmlStrBuilder.append("<span class=\"resultPageSize\">" + pageSize + "</span>");
+    xmlStrBuilder.append("<span class=\"hitsSize\">" + hitsSize + "</span>");
+    xmlStrBuilder.append("</span>");
+    xmlStrBuilder.append("<table>");
+    if (hitsSize == 1 && hitsArray.get(0).getType() == Hit.TYPE_ATOMIC_VALUE) {
+      Hit hit = hitsArray.get(0);
+      String xmlContent = hit.getContent();
+      xmlContent = StringUtils.deresolveXmlEntities(xmlContent);
+      xmlStrBuilder.append(xmlContent);
+    } else {
+      for (int i=0; i<hitsArraySize; i++) {
+        xmlStrBuilder.append("<tr class=\"hit\">");
+        Hit hit = hitsArray.get(i);
+        int docPage = hit.getPage();
+        String hitName = hit.getName();
+        int hitType = hit.getType();
+        int hitPagePosition = hit.getHitPagePosition();
+        String getPageLink = baseUrl + "/query/GetPage?docId=" + docId + "&page=" + docPage + "&outputFormat=" + "xmlDisplay" + "&highlightElem=" + hitName + "&highlightElemPos=" + hitPagePosition;
+        String hitPres = hitName + "[" + hitPagePosition + "]";
+        if (hitType == Hit.TYPE_ATTRIBUTE) {
+          hitPres = "@" + hitName;
+          getPageLink = baseUrl + "/query/GetPage?docId=" + docId + "&page=" + docPage;
+        }
+        String posStr = "Page " + docPage + ", " + hitPres + ":";
+        int num = (page - 1) * pageSize + i + 1;
+        xmlStrBuilder.append("<td class=\"hitNum\">" + num + ". " + "</td>");
+        xmlStrBuilder.append("<td class=\"hitLink\">");
+        if (docPage != -1) {
+          xmlStrBuilder.append("<a href=\"" + getPageLink + "\">" + posStr + "</a>");
+        }
+        xmlStrBuilder.append("</td>");
+        String xmlContent = hit.getContent();
+        String htmlContent = pageTransformer.transform(xmlContent, docMetadataRecord, -1, "xmlDisplay");  // TODO performance: do not transform each single hit but transform then all in one step
+        xmlStrBuilder.append("<td class=\"hitContent\">");
+        xmlStrBuilder.append(htmlContent);
+        xmlStrBuilder.append("</td>");
+        xmlStrBuilder.append("</tr>");
+      }
+    }
+    xmlStrBuilder.append("</table>");
+    xmlStrBuilder.append("</body>");
+    xmlStrBuilder.append("</html>");
+    return xmlStrBuilder.toString();   
+  }
+
+  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();
+  }
+
+}