comparison 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
comparison
equal deleted inserted replaced
22:6a45a982c333 23:e845310098ba
1 package de.mpg.mpiwg.berlin.mpdl.servlets.cms;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.net.URL;
6 import java.util.ArrayList;
7
8 import javax.servlet.ServletConfig;
9 import javax.servlet.ServletContext;
10 import javax.servlet.ServletException;
11 import javax.servlet.http.HttpServlet;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14
15 import de.mpg.mpiwg.berlin.mpdl.cms.document.DocumentHandler;
16 import de.mpg.mpiwg.berlin.mpdl.util.StringUtils;
17 import de.mpg.mpiwg.berlin.mpdl.xml.xquery.Hit;
18 import de.mpg.mpiwg.berlin.mpdl.xml.xquery.Hits;
19 import de.mpg.mpiwg.berlin.mpdl.cms.document.MetadataRecord;
20 import de.mpg.mpiwg.berlin.mpdl.cms.lucene.IndexHandler;
21 import de.mpg.mpiwg.berlin.mpdl.cms.transform.PageTransformer;
22 import de.mpg.mpiwg.berlin.mpdl.exception.ApplicationException;
23 import de.mpg.mpiwg.berlin.mpdl.xml.xquery.XQueryEvaluator;
24
25 public class XQueryDocument extends HttpServlet {
26 private static final long serialVersionUID = 1L;
27 private XQueryEvaluator xQueryEvaluator = null;
28 private PageTransformer pageTransformer = null;
29
30 public XQueryDocument() {
31 super();
32 }
33
34 public void init(ServletConfig config) throws ServletException {
35 super.init(config);
36 ServletContext context = getServletContext();
37 xQueryEvaluator = (XQueryEvaluator) context.getAttribute("xQueryEvaluator");
38 pageTransformer = (PageTransformer) context.getAttribute("pageTransformer");
39 }
40
41 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
42 doGet(request, response);
43 }
44
45 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
46 request.setCharacterEncoding("utf-8");
47 response.setCharacterEncoding("utf-8");
48 String docId = request.getParameter("docId");
49 String query = request.getParameter("query");
50 String pageStr = request.getParameter("page");
51 if (pageStr == null)
52 pageStr = "1";
53 int page = Integer.parseInt(pageStr);
54 String pageSizeStr = request.getParameter("pageSize");
55 if (pageSizeStr == null)
56 pageSizeStr = "10";
57 int pageSize = Integer.parseInt(pageSizeStr);
58 int from = (page * pageSize) - pageSize; // e.g. 0
59 int to = page * pageSize - 1; // e.g. 9
60 String outputFormat = request.getParameter("outputFormat");
61 if (outputFormat == null)
62 outputFormat = "xml";
63 try {
64 DocumentHandler docHandler = new DocumentHandler();
65 String docFileName = docHandler.getDocFullFileName(docId);
66 URL docFileUrl = new URL("file:" + docFileName);
67 Hits hits = null;
68 String errorStr = null;
69 try {
70 hits = xQueryEvaluator.evaluate(docFileUrl, query, from, to);
71 } catch (ApplicationException e) {
72 errorStr = e.getLocalizedMessage();
73 }
74 IndexHandler indexHandler = IndexHandler.getInstance();
75 MetadataRecord docMetadataRecord = indexHandler.getDocMetadata(docId);
76 if (outputFormat.equals("xml"))
77 response.setContentType("text/xml");
78 else if (outputFormat.equals("html"))
79 response.setContentType("text/html");
80 else
81 response.setContentType("text/xml");
82 PrintWriter out = response.getWriter();
83 String resultStr = "";
84 if (errorStr == null) {
85 if (outputFormat.equals("xml"))
86 resultStr = createXmlString(docMetadataRecord, query, page, pageSize, hits);
87 else if (outputFormat.equals("html"))
88 resultStr = createHtmlString(docMetadataRecord, query, page, pageSize, hits, request);
89 } else {
90 resultStr = "Saxon XQuery error: " + errorStr;
91 }
92 out.print(resultStr);
93 out.close();
94 } catch (ApplicationException e) {
95 throw new ServletException(e);
96 }
97 }
98
99 private String createXmlString(MetadataRecord docMetadataRecord, String query, int page, int pageSize, Hits hits) throws ApplicationException {
100 String docId = docMetadataRecord.getDocId();
101 ArrayList<Hit> hitsArray = null;
102 if (hits != null)
103 hitsArray = hits.getHits();
104 int hitsSize = -1;
105 int hitsArraySize = -1;
106 if (hits != null)
107 hitsSize = hits.getSize();
108 if (hitsArray != null)
109 hitsArraySize = hitsArray.size();
110 StringBuilder xmlStrBuilder = new StringBuilder();
111 xmlStrBuilder.append("<document>");
112 xmlStrBuilder.append("<id>" + docId + "</id>");
113 xmlStrBuilder.append("<query>");
114 String queryXml = StringUtils.deresolveXmlEntities(query);
115 xmlStrBuilder.append("<queryText>" + queryXml + "</queryText>");
116 xmlStrBuilder.append("<resultPage>" + page + "</resultPage>");
117 xmlStrBuilder.append("<resultPageSize>" + pageSize + "</resultPageSize>");
118 xmlStrBuilder.append("</query>");
119 xmlStrBuilder.append("<hitsSize>" + hitsSize + "</hitsSize>");
120 xmlStrBuilder.append("<hits>");
121 for (int i=0; i<hitsArraySize; i++) {
122 int num = (page - 1) * pageSize + i + 1;
123 xmlStrBuilder.append("<hit n=\"" + num + "\">");
124 Hit hit = hitsArray.get(i);
125 String name = hit.getName();
126 String typeStr = "ELEMENT";
127 int type = hit.getType();
128 if (type == Hit.TYPE_ATTRIBUTE)
129 typeStr = "ATTRIBUTE";
130 else if (type == Hit.TYPE_ATOMIC_VALUE)
131 typeStr = "ATOMIV_VALUE";
132 int docPage = hit.getPage();
133 int hitPagePosition = hit.getHitPagePosition();
134 String xmlContent = hit.getContent();
135 if (name != null)
136 xmlStrBuilder.append("<name>" + name + "</name>");
137 xmlStrBuilder.append("<type>" + typeStr + "</type>");
138 if (docPage != -1) {
139 xmlStrBuilder.append("<page>" + docPage + "</page>");
140 xmlStrBuilder.append("<posInPage>" + hitPagePosition + "</posInPage>");
141 }
142 xmlStrBuilder.append("<content>" + xmlContent + "</content>");
143 xmlStrBuilder.append("</hit>");
144 }
145 xmlStrBuilder.append("</hits>");
146 xmlStrBuilder.append("</document>");
147 return xmlStrBuilder.toString();
148 }
149
150 private String createHtmlString(MetadataRecord docMetadataRecord, String query, int page, int pageSize, Hits hits, HttpServletRequest request) throws ApplicationException {
151 String docId = docMetadataRecord.getDocId();
152 ArrayList<Hit> hitsArray = null;
153 if (hits != null)
154 hitsArray = hits.getHits();
155 int hitsArraySize = -1;
156 if (hitsArray != null)
157 hitsArraySize = hitsArray.size();
158 int hitsSize = hits.getSize();
159 StringBuilder xmlStrBuilder = new StringBuilder();
160 xmlStrBuilder.append("<html>");
161 xmlStrBuilder.append("<head>");
162 xmlStrBuilder.append("<title>Document: \"" + query + "\"</title>");
163 String baseUrl = getBaseUrl(request);
164 String cssUrl = baseUrl + "/css/page.css";
165 xmlStrBuilder.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + cssUrl + "\"/>");
166 xmlStrBuilder.append("</head>");
167 xmlStrBuilder.append("<body>");
168 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>");
169 xmlStrBuilder.append("<span class=\"query\">XQuery: " + query + "</span>");
170 xmlStrBuilder.append("<span class=\"result\">");
171 xmlStrBuilder.append("<span class=\"resultPage\">" + page + "</span>");
172 xmlStrBuilder.append("<span class=\"resultPageSize\">" + pageSize + "</span>");
173 xmlStrBuilder.append("<span class=\"hitsSize\">" + hitsSize + "</span>");
174 xmlStrBuilder.append("</span>");
175 xmlStrBuilder.append("<table>");
176 if (hitsSize == 1 && hitsArray.get(0).getType() == Hit.TYPE_ATOMIC_VALUE) {
177 Hit hit = hitsArray.get(0);
178 String xmlContent = hit.getContent();
179 xmlContent = StringUtils.deresolveXmlEntities(xmlContent);
180 xmlStrBuilder.append(xmlContent);
181 } else {
182 for (int i=0; i<hitsArraySize; i++) {
183 xmlStrBuilder.append("<tr class=\"hit\">");
184 Hit hit = hitsArray.get(i);
185 int docPage = hit.getPage();
186 String hitName = hit.getName();
187 int hitType = hit.getType();
188 int hitPagePosition = hit.getHitPagePosition();
189 String getPageLink = baseUrl + "/query/GetPage?docId=" + docId + "&page=" + docPage + "&outputFormat=" + "xmlDisplay" + "&highlightElem=" + hitName + "&highlightElemPos=" + hitPagePosition;
190 String hitPres = hitName + "[" + hitPagePosition + "]";
191 if (hitType == Hit.TYPE_ATTRIBUTE) {
192 hitPres = "@" + hitName;
193 getPageLink = baseUrl + "/query/GetPage?docId=" + docId + "&page=" + docPage;
194 }
195 String posStr = "Page " + docPage + ", " + hitPres + ":";
196 int num = (page - 1) * pageSize + i + 1;
197 xmlStrBuilder.append("<td class=\"hitNum\">" + num + ". " + "</td>");
198 xmlStrBuilder.append("<td class=\"hitLink\">");
199 if (docPage != -1) {
200 xmlStrBuilder.append("<a href=\"" + getPageLink + "\">" + posStr + "</a>");
201 }
202 xmlStrBuilder.append("</td>");
203 String xmlContent = hit.getContent();
204 String htmlContent = pageTransformer.transform(xmlContent, docMetadataRecord, -1, "xmlDisplay"); // TODO performance: do not transform each single hit but transform then all in one step
205 xmlStrBuilder.append("<td class=\"hitContent\">");
206 xmlStrBuilder.append(htmlContent);
207 xmlStrBuilder.append("</td>");
208 xmlStrBuilder.append("</tr>");
209 }
210 }
211 xmlStrBuilder.append("</table>");
212 xmlStrBuilder.append("</body>");
213 xmlStrBuilder.append("</html>");
214 return xmlStrBuilder.toString();
215 }
216
217 private String getBaseUrl(HttpServletRequest request) {
218 return getServerUrl(request) + request.getContextPath();
219 }
220
221 private String getServerUrl(HttpServletRequest request) {
222 if ( ( request.getServerPort() == 80 ) || ( request.getServerPort() == 443 ) )
223 return request.getScheme() + "://" + request.getServerName();
224 else
225 return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
226 }
227
228 }