0
|
1 package de.mpiwg.dwinter.fulltextSearchServer;
|
|
2
|
|
3 import java.io.ByteArrayInputStream;
|
|
4 import java.io.FileNotFoundException;
|
|
5 import java.io.IOException;
|
|
6 import java.io.InputStream;
|
|
7 import java.io.StringWriter;
|
|
8 import java.util.ArrayList;
|
|
9 import java.util.Locale;
|
|
10 import java.util.regex.Matcher;
|
|
11 import java.util.regex.Pattern;
|
|
12
|
|
13 import javax.xml.parsers.DocumentBuilder;
|
|
14 import javax.xml.parsers.DocumentBuilderFactory;
|
|
15 import javax.xml.parsers.ParserConfigurationException;
|
|
16 import javax.xml.transform.OutputKeys;
|
|
17 import javax.xml.transform.Transformer;
|
|
18 import javax.xml.transform.TransformerConfigurationException;
|
|
19 import javax.xml.transform.TransformerException;
|
|
20 import javax.xml.transform.TransformerFactory;
|
|
21 import javax.xml.transform.TransformerFactoryConfigurationError;
|
|
22 import javax.xml.transform.dom.DOMSource;
|
|
23 import javax.xml.transform.stream.StreamResult;
|
|
24 import javax.xml.transform.stream.StreamSource;
|
|
25
|
|
26 import org.apache.log4j.Logger;
|
1
|
27 import org.restlet.Request;
|
|
28 import org.restlet.Response;
|
0
|
29 import org.restlet.data.Form;
|
|
30 import org.restlet.data.MediaType;
|
1
|
31 import org.restlet.data.Reference;
|
0
|
32 import org.restlet.data.Status;
|
|
33 import org.restlet.representation.Representation;
|
|
34 import org.restlet.representation.StringRepresentation;
|
|
35 import org.restlet.resource.Get;
|
|
36 import org.restlet.resource.Options;
|
|
37 import org.restlet.resource.ServerResource;
|
|
38 import org.w3c.dom.Document;
|
|
39 import org.xml.sax.SAXException;
|
|
40
|
1
|
41 import de.mpiwg.dwinter.fulltext.search.xmlsearchadapter.XMLSearchServerAdapter;
|
0
|
42 import de.mpiwg.dwinter.fulltext.ticket.TicketWriter;
|
|
43 import de.mpiwg.dwinter.fulltextSearchServer.Utils.DigilibTools;
|
|
44 import de.mpiwg.dwinter.fulltextSearchServer.Utils.XMLTools;
|
|
45
|
|
46 /**
|
|
47 * Klasse gibt jenach Aufruf entweder eine XML/HTML Datei mit den Seiten zurueck auf denen sich fuer das entsprechende
|
|
48 * Dokument und Ticket Treffer befinden, bzw. wenn die entsprechende Seite im Pfad mit angegeben wird die Treffer auf dieser Seite
|
|
49 * @author dwinter
|
|
50 *
|
|
51 */
|
|
52 public class ShowContentOfDocument extends ServerResource {
|
|
53
|
|
54
|
|
55 private Logger logger = Logger.getRootLogger();
|
|
56
|
|
57 /**
|
|
58 * Erlaubt cross scripting bei Aufruf aus Javascript
|
|
59 * @param entity
|
|
60 */
|
|
61 @Options
|
|
62 public void doOptions(Representation entity) {
|
|
63 Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers");
|
|
64 if (responseHeaders == null) {
|
|
65 responseHeaders = new Form();
|
|
66 getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders);
|
|
67 }
|
|
68 responseHeaders.add("Access-Control-Allow-Origin", "*");
|
|
69 responseHeaders.add("Access-Control-Allow-Methods", "POST,OPTIONS,GET");
|
|
70 responseHeaders.add("Access-Control-Allow-Headers", "Content-Type");
|
|
71 responseHeaders.add("Access-Control-Allow-Credentials", "false");
|
|
72 responseHeaders.add("Access-Control-Max-Age", "60");
|
|
73 }
|
|
74
|
|
75 /**
|
|
76 * Erzeugt eine XML-Reprasentation der Fundstellen uebergeben werdne im Pfad als REST-Aufruf die Ticketnummer, die Sprache und die Textid
|
|
77 * d.h. /TICKET/LANG/TEXTID oder /TICKET/LANG/TEXTID/FILENAME_DER_SEITE oder /TICKET/LANG/TEXTID/FILENAME_DER_SEITE/digilib
|
|
78 * @return
|
|
79 */
|
|
80 //@Get("xml")
|
|
81 public Representation getXML( ) {
|
|
82
|
|
83 // response header fuer cross-site.scripting
|
|
84 Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers");
|
|
85 if (responseHeaders == null) {
|
|
86 responseHeaders = new Form();
|
|
87 getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders);
|
|
88 }
|
|
89 responseHeaders.add("Access-Control-Allow-Origin", "*");
|
|
90
|
|
91
|
|
92 logger.debug("getXML");
|
|
93 String ticket = (String) getRequest().getAttributes().get("ticket") ;
|
|
94 String lang = (String) getRequest().getAttributes().get("lang") ;
|
|
95 String textId = (String) getRequest().getAttributes().get("textId") ;
|
|
96 String restPath = getRequest().getResourceRef().getRemainingPart();
|
|
97 logger.debug("ticket:"+ticket);
|
|
98 logger.debug("lang:"+lang);
|
|
99 logger.debug("textId:"+textId);
|
|
100 logger.debug("restpath:"+restPath);
|
|
101 String xml;
|
|
102 if (restPath.equals("")){
|
|
103 xml = showContent(ticket,lang,textId);
|
|
104
|
|
105 } else {
|
|
106 xml = processRestPath(ticket,lang,textId,restPath);
|
|
107
|
|
108 }
|
|
109
|
|
110
|
|
111 if (xml==null){
|
|
112 setStatus(Status.SUCCESS_ACCEPTED);
|
|
113 //still waiting
|
|
114 return new StringRepresentation("<info>waiting</info>",MediaType.TEXT_XML);
|
|
115 }
|
|
116
|
|
117 StringRepresentation representation = new StringRepresentation(xml,
|
|
118 MediaType.TEXT_XML) ;
|
|
119
|
|
120 return representation;
|
|
121 }
|
|
122
|
|
123 /**
|
|
124 * Analog zu getXML Rueckgabe erfolgt jedoch als html
|
|
125 * @return
|
|
126 */
|
|
127 @Get("html")
|
|
128 public Representation getHTML( ) {
|
|
129
|
|
130 // response header fuer cross-site.scripting
|
|
131 Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers");
|
|
132 if (responseHeaders == null) {
|
|
133 responseHeaders = new Form();
|
|
134 getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders);
|
|
135 }
|
|
136 responseHeaders.add("Access-Control-Allow-Origin", "*");
|
|
137
|
|
138
|
|
139 logger.debug("getHTML");
|
|
140 String ticket = (String) getRequest().getAttributes().get("ticket") ;
|
|
141 String lang = (String) getRequest().getAttributes().get("lang") ;
|
|
142 String textId = (String) getRequest().getAttributes().get("textId") ;
|
|
143 String restPath = getRequest().getResourceRef().getRemainingPart();
|
|
144 logger.debug("ticket:"+ticket);
|
|
145 logger.debug("lang:"+lang);
|
|
146 logger.debug("textId:"+textId);
|
|
147 logger.debug("restpath:"+restPath);
|
1
|
148 String html;
|
|
149
|
0
|
150 if (restPath.equals("")){
|
1
|
151 html = showContent(ticket,lang,textId);
|
|
152 if (html==null){
|
0
|
153 setStatus(Status.SUCCESS_ACCEPTED);
|
|
154 //still waiting
|
|
155 return new StringRepresentation("<dev>waiting</dev>",MediaType.TEXT_HTML);
|
|
156 }
|
1
|
157 html = XMLTools.transformToHTML(html,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/showContentOfDocumentToHTML.xsl");
|
0
|
158 } else {
|
1
|
159 html = processRestPath(ticket,lang,textId,restPath);
|
|
160 if (html==null){
|
0
|
161 setStatus(Status.SUCCESS_ACCEPTED);
|
|
162 //still waiting
|
|
163 return new StringRepresentation("<dev>waiting</dev>",MediaType.TEXT_HTML);
|
|
164 }
|
1
|
165
|
0
|
166 //txt=xml;
|
|
167 }
|
|
168
|
1
|
169 StringRepresentation representation = new StringRepresentation(html,
|
0
|
170 MediaType.TEXT_HTML) ;
|
|
171 return representation;
|
|
172
|
|
173 }
|
|
174
|
|
175
|
|
176
|
|
177 /**
|
|
178 * Gibt ein XML File mit allen Seiten zuruech auf denen sich Treffer befinden.
|
|
179 * @param ticket Ticketnummer
|
|
180 * @param lang Sprache
|
|
181 * @param textId id des Textes.
|
|
182 * @return das XML oder null wenn die Datei bisher nicht existiert.
|
|
183 */
|
|
184 private String showContent(String ticket, String lang, String textId) {
|
|
185 StringRepresentation representation = null;
|
|
186 String xml;
|
|
187
|
|
188 xml = TicketWriter.getPagesWithHits(ticket,lang,textId);
|
|
189
|
|
190 return xml;
|
|
191 }
|
|
192
|
|
193
|
|
194 /**
|
|
195 * Gibt die Treffer auf einer Seite zurueck als xml File, die Seite selbst wird im restPath uebergeben.
|
|
196 * Ausserdem kann der restPath noch einen zusaetzliches Element enthalten das die Form der Darstellung bestimmt.
|
|
197 * @param ticket
|
|
198 * @param lang
|
|
199 * @param textId
|
|
200 * @param restPath
|
|
201 * @return
|
|
202 */
|
|
203 private String processRestPath(String ticket, String lang, String textId,
|
|
204 String restPath) {
|
|
205
|
|
206 // teste ob noch ein parameter am pfad ist.
|
|
207 String[] splitted = restPath.split("/");
|
|
208 logger.debug(splitted.length);
|
|
209 // an der seite haengt noch ein Darstellungmodus an z.Z. nur FILENAME_DER_SEITE/digilib
|
|
210 if (splitted.length>2){
|
|
211 return processRestPathWithMode(ticket, lang, textId,
|
|
212 splitted[1],splitted[2]);
|
|
213 }
|
|
214
|
|
215 logger.debug("processRest");
|
|
216 StringRepresentation representation = null;
|
|
217 String xml;
|
|
218
|
|
219 try {
|
|
220 xml = TicketWriter.getHitsOnPage(ticket,lang,textId,restPath);
|
|
221 } catch (FileNotFoundException e) {
|
|
222 // TODO Auto-generated catch block
|
|
223 e.printStackTrace();
|
|
224 xml=null;
|
|
225 } catch (IOException e) {
|
|
226 // TODO Auto-generated catch block
|
|
227 e.printStackTrace();
|
|
228 xml=null;
|
|
229 }
|
|
230
|
1
|
231 return XMLTools.transformToHTML(xml,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/processRestPathOfDocumentToHTML.xsl");
|
0
|
232
|
|
233 }
|
|
234
|
|
235 /**
|
1
|
236 * Rueckgabe der Treffer gemaess dem Darstellungsmode z.Z. wird nur digilib und generic unterstuetzt.
|
0
|
237 * Der Pfad ist in DIGIVIEWBASICSTRING festgelegt.
|
|
238 * @param ticket
|
|
239 * @param lang
|
|
240 * @param textId
|
|
241 * @param pageFileName
|
|
242 * @param mode
|
|
243 * @return
|
|
244 */
|
|
245 private String processRestPathWithMode(String ticket, String lang,
|
|
246 String textId, String pageFileName, String mode) {
|
|
247
|
|
248 logger.debug("processRestWithMode");
|
|
249 String ret="<xml xmlns:xlink=\"http://www.w3.org/1999/xlink\">";
|
|
250 ret+="<pageFileName>"+pageFileName+"</pageFileName>";
|
|
251 ArrayList<Double[]> points = new ArrayList<Double[]>();
|
1
|
252
|
0
|
253
|
|
254 try {
|
|
255 String xml = TicketWriter.getHitsOnPage(ticket,lang,textId,pageFileName);
|
1
|
256
|
0
|
257 Pattern linePattern = Pattern.compile("<line>(.*?)</line>",Pattern.MULTILINE);
|
|
258 Matcher m = linePattern.matcher(xml);
|
|
259
|
1
|
260 // teste format des Restes wenn noch "/" dann Aufruf einer Seite direkt
|
0
|
261
|
|
262
|
1
|
263 if (mode.equals("digilib")){
|
0
|
264
|
1
|
265 String txt=handleDigilib(textId, pageFileName, ret, points, m);
|
|
266 return XMLTools.transformToHTML(txt,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/processRestPathOfDocumentToHTML.xsl");
|
|
267 }
|
|
268 else if (mode.equals("generic")){
|
|
269 if (m.find()){ // xmlfile ist fuer digilib ok, dann digilib
|
|
270 String txt = handleDigilib(textId, pageFileName, ret, points, m);
|
|
271 return XMLTools.transformToHTML(txt,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/processRestPathOfDocumentToHTML.xsl");
|
|
272 } else {
|
|
273 //assume xml-treffer liste
|
|
274
|
|
275
|
|
276 String txt = handleXMLFullText(textId, pageFileName,ret, ticket, lang);
|
|
277 return XMLTools.transformToHTML(txt,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/processRestPathOfDocumentToHTML.xsl");
|
|
278 }
|
|
279
|
0
|
280
|
1
|
281 } else if (mode.equals("showXMLhits")){
|
|
282 //String txt="<html><head>"+
|
|
283 //"<base href=\""+XMLSearchServerAdapter.XMLServerBase+"\" />"+
|
|
284 //"</head><body>";
|
|
285 String txt= TicketWriter.getFileContent(ticket,lang,textId,pageFileName);
|
|
286 return txt; //+"</body></html>";
|
|
287 }
|
0
|
288
|
|
289
|
|
290 } catch (FileNotFoundException e) {
|
|
291 // TODO Auto-generated catch block
|
|
292 e.printStackTrace();
|
|
293 } catch (IOException e) {
|
|
294 // TODO Auto-generated catch block
|
|
295 e.printStackTrace();
|
|
296 }
|
|
297
|
|
298 return null;
|
|
299 }
|
|
300
|
|
301
|
|
302
|
|
303
|
1
|
304 protected String handleXMLFullText(String textId, String pageFileName, String ret, String ticket,
|
|
305 String lang) {
|
|
306
|
|
307 try {
|
|
308 String[] morphquerySplitted=TicketWriter.getQueryString(lang,ticket).split(":");
|
|
309 //string has normally the format field:query
|
|
310 String morphQuery= morphquerySplitted[morphquerySplitted.length-1];
|
|
311
|
|
312 String queryString = XMLSearchServerAdapter.XMLDocSearchBase + "document=" + textId.replace(":","/");
|
|
313 //queryString += "&queryType=fulltext&query=" + morphQuery;
|
|
314 queryString += "&mode=text&query-type=fulltext&query=" + morphQuery;
|
|
315
|
|
316 ret+=String.format("<hitsOnPage xlink:href=\"%s\">%s</hitsOnPage>",queryString,textId);
|
|
317 ret+="</xml>";
|
|
318 } catch (FileNotFoundException e) {
|
|
319 // TODO Auto-generated catch block
|
|
320 e.printStackTrace();
|
|
321 } catch (IOException e) {
|
|
322 // TODO Auto-generated catch block
|
|
323 e.printStackTrace();
|
|
324 }
|
|
325 return ret;
|
|
326 }
|
|
327
|
|
328 protected String handleDigilib(String textId, String pageFileName, String ret,
|
|
329 ArrayList<Double[]> points, Matcher m) {
|
|
330 while(m.find()){
|
|
331 Double[] point = DigilibTools.calculatePoint(m.group(1));
|
|
332 points.add(point);
|
|
333 }
|
|
334
|
|
335 String url = String.format(DigilibTools.DIGIVIEWBASICSTRING, DigilibTools.generateImagePath(textId,pageFileName),DigilibTools.generateMarksFromPoints(points));
|
|
336
|
|
337
|
|
338 ret+=String.format("<hitsOnPage xlink:href=\"%s\">%s</hitsOnPage>",url,textId);
|
|
339 ret+="</xml>";
|
|
340
|
|
341
|
|
342 return ret;
|
|
343 }
|
|
344
|
|
345
|
|
346
|
|
347
|
0
|
348
|
|
349
|
|
350
|
|
351
|
|
352
|
|
353 }
|
|
354
|