Mercurial > hg > mpdl-group
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 } |