Mercurial > hg > fulltextSearchServer
comparison src/de/mpiwg/dwinter/fulltextSearchServer/ShowContentOfDocument.java @ 0:db87c1b7eb6d
initial
author | dwinter |
---|---|
date | Wed, 03 Nov 2010 12:18:46 +0100 |
parents | |
children | 83e9a828e794 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:db87c1b7eb6d |
---|---|
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; | |
27 import org.restlet.data.Form; | |
28 import org.restlet.data.MediaType; | |
29 import org.restlet.data.Status; | |
30 import org.restlet.representation.Representation; | |
31 import org.restlet.representation.StringRepresentation; | |
32 import org.restlet.resource.Get; | |
33 import org.restlet.resource.Options; | |
34 import org.restlet.resource.ServerResource; | |
35 import org.w3c.dom.Document; | |
36 import org.xml.sax.SAXException; | |
37 | |
38 import de.mpiwg.dwinter.fulltext.ticket.TicketWriter; | |
39 import de.mpiwg.dwinter.fulltextSearchServer.Utils.DigilibTools; | |
40 import de.mpiwg.dwinter.fulltextSearchServer.Utils.XMLTools; | |
41 | |
42 /** | |
43 * Klasse gibt jenach Aufruf entweder eine XML/HTML Datei mit den Seiten zurueck auf denen sich fuer das entsprechende | |
44 * Dokument und Ticket Treffer befinden, bzw. wenn die entsprechende Seite im Pfad mit angegeben wird die Treffer auf dieser Seite | |
45 * @author dwinter | |
46 * | |
47 */ | |
48 public class ShowContentOfDocument extends ServerResource { | |
49 | |
50 | |
51 private Logger logger = Logger.getRootLogger(); | |
52 | |
53 /** | |
54 * Erlaubt cross scripting bei Aufruf aus Javascript | |
55 * @param entity | |
56 */ | |
57 @Options | |
58 public void doOptions(Representation entity) { | |
59 Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); | |
60 if (responseHeaders == null) { | |
61 responseHeaders = new Form(); | |
62 getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); | |
63 } | |
64 responseHeaders.add("Access-Control-Allow-Origin", "*"); | |
65 responseHeaders.add("Access-Control-Allow-Methods", "POST,OPTIONS,GET"); | |
66 responseHeaders.add("Access-Control-Allow-Headers", "Content-Type"); | |
67 responseHeaders.add("Access-Control-Allow-Credentials", "false"); | |
68 responseHeaders.add("Access-Control-Max-Age", "60"); | |
69 } | |
70 | |
71 /** | |
72 * Erzeugt eine XML-Reprasentation der Fundstellen uebergeben werdne im Pfad als REST-Aufruf die Ticketnummer, die Sprache und die Textid | |
73 * d.h. /TICKET/LANG/TEXTID oder /TICKET/LANG/TEXTID/FILENAME_DER_SEITE oder /TICKET/LANG/TEXTID/FILENAME_DER_SEITE/digilib | |
74 * @return | |
75 */ | |
76 //@Get("xml") | |
77 public Representation getXML( ) { | |
78 | |
79 // response header fuer cross-site.scripting | |
80 Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); | |
81 if (responseHeaders == null) { | |
82 responseHeaders = new Form(); | |
83 getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); | |
84 } | |
85 responseHeaders.add("Access-Control-Allow-Origin", "*"); | |
86 | |
87 | |
88 logger.debug("getXML"); | |
89 String ticket = (String) getRequest().getAttributes().get("ticket") ; | |
90 String lang = (String) getRequest().getAttributes().get("lang") ; | |
91 String textId = (String) getRequest().getAttributes().get("textId") ; | |
92 String restPath = getRequest().getResourceRef().getRemainingPart(); | |
93 logger.debug("ticket:"+ticket); | |
94 logger.debug("lang:"+lang); | |
95 logger.debug("textId:"+textId); | |
96 logger.debug("restpath:"+restPath); | |
97 String xml; | |
98 if (restPath.equals("")){ | |
99 xml = showContent(ticket,lang,textId); | |
100 | |
101 } else { | |
102 xml = processRestPath(ticket,lang,textId,restPath); | |
103 | |
104 } | |
105 | |
106 | |
107 if (xml==null){ | |
108 setStatus(Status.SUCCESS_ACCEPTED); | |
109 //still waiting | |
110 return new StringRepresentation("<info>waiting</info>",MediaType.TEXT_XML); | |
111 } | |
112 | |
113 StringRepresentation representation = new StringRepresentation(xml, | |
114 MediaType.TEXT_XML) ; | |
115 | |
116 return representation; | |
117 } | |
118 | |
119 /** | |
120 * Analog zu getXML Rueckgabe erfolgt jedoch als html | |
121 * @return | |
122 */ | |
123 @Get("html") | |
124 public Representation getHTML( ) { | |
125 | |
126 // response header fuer cross-site.scripting | |
127 Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); | |
128 if (responseHeaders == null) { | |
129 responseHeaders = new Form(); | |
130 getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); | |
131 } | |
132 responseHeaders.add("Access-Control-Allow-Origin", "*"); | |
133 | |
134 | |
135 logger.debug("getHTML"); | |
136 String ticket = (String) getRequest().getAttributes().get("ticket") ; | |
137 String lang = (String) getRequest().getAttributes().get("lang") ; | |
138 String textId = (String) getRequest().getAttributes().get("textId") ; | |
139 String restPath = getRequest().getResourceRef().getRemainingPart(); | |
140 logger.debug("ticket:"+ticket); | |
141 logger.debug("lang:"+lang); | |
142 logger.debug("textId:"+textId); | |
143 logger.debug("restpath:"+restPath); | |
144 String xml; | |
145 String txt; | |
146 if (restPath.equals("")){ | |
147 xml = showContent(ticket,lang,textId); | |
148 if (xml==null){ | |
149 setStatus(Status.SUCCESS_ACCEPTED); | |
150 //still waiting | |
151 return new StringRepresentation("<dev>waiting</dev>",MediaType.TEXT_HTML); | |
152 } | |
153 txt = XMLTools.transformToHTML(xml,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/showContentOfDocumentToHTML.xsl"); | |
154 } else { | |
155 xml = processRestPath(ticket,lang,textId,restPath); | |
156 if (xml==null){ | |
157 setStatus(Status.SUCCESS_ACCEPTED); | |
158 //still waiting | |
159 return new StringRepresentation("<dev>waiting</dev>",MediaType.TEXT_HTML); | |
160 } | |
161 txt = XMLTools.transformToHTML(xml,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/processRestPathOfDocumentToHTML.xsl"); | |
162 //txt=xml; | |
163 } | |
164 | |
165 StringRepresentation representation = new StringRepresentation(txt, | |
166 MediaType.TEXT_HTML) ; | |
167 return representation; | |
168 | |
169 } | |
170 | |
171 | |
172 | |
173 /** | |
174 * Gibt ein XML File mit allen Seiten zuruech auf denen sich Treffer befinden. | |
175 * @param ticket Ticketnummer | |
176 * @param lang Sprache | |
177 * @param textId id des Textes. | |
178 * @return das XML oder null wenn die Datei bisher nicht existiert. | |
179 */ | |
180 private String showContent(String ticket, String lang, String textId) { | |
181 StringRepresentation representation = null; | |
182 String xml; | |
183 | |
184 xml = TicketWriter.getPagesWithHits(ticket,lang,textId); | |
185 | |
186 return xml; | |
187 } | |
188 | |
189 | |
190 /** | |
191 * Gibt die Treffer auf einer Seite zurueck als xml File, die Seite selbst wird im restPath uebergeben. | |
192 * Ausserdem kann der restPath noch einen zusaetzliches Element enthalten das die Form der Darstellung bestimmt. | |
193 * @param ticket | |
194 * @param lang | |
195 * @param textId | |
196 * @param restPath | |
197 * @return | |
198 */ | |
199 private String processRestPath(String ticket, String lang, String textId, | |
200 String restPath) { | |
201 | |
202 // teste ob noch ein parameter am pfad ist. | |
203 String[] splitted = restPath.split("/"); | |
204 logger.debug(splitted.length); | |
205 // an der seite haengt noch ein Darstellungmodus an z.Z. nur FILENAME_DER_SEITE/digilib | |
206 if (splitted.length>2){ | |
207 return processRestPathWithMode(ticket, lang, textId, | |
208 splitted[1],splitted[2]); | |
209 } | |
210 | |
211 logger.debug("processRest"); | |
212 StringRepresentation representation = null; | |
213 String xml; | |
214 | |
215 try { | |
216 xml = TicketWriter.getHitsOnPage(ticket,lang,textId,restPath); | |
217 } catch (FileNotFoundException e) { | |
218 // TODO Auto-generated catch block | |
219 e.printStackTrace(); | |
220 xml=null; | |
221 } catch (IOException e) { | |
222 // TODO Auto-generated catch block | |
223 e.printStackTrace(); | |
224 xml=null; | |
225 } | |
226 | |
227 return xml; | |
228 | |
229 } | |
230 | |
231 /** | |
232 * Rueckgabe der Treffer gemaess dem Darstellungsmode z.Z. wird nur digilib unterstuetzt, bzw. egal welcher | |
233 * Mode angegeben wird es wird immer das gleiche gemacht, naemlich ein Link auf Digilib ausgegeben. | |
234 * Der Pfad ist in DIGIVIEWBASICSTRING festgelegt. | |
235 * @param ticket | |
236 * @param lang | |
237 * @param textId | |
238 * @param pageFileName | |
239 * @param mode | |
240 * @return | |
241 */ | |
242 private String processRestPathWithMode(String ticket, String lang, | |
243 String textId, String pageFileName, String mode) { | |
244 | |
245 logger.debug("processRestWithMode"); | |
246 String ret="<xml xmlns:xlink=\"http://www.w3.org/1999/xlink\">"; | |
247 ret+="<pageFileName>"+pageFileName+"</pageFileName>"; | |
248 ArrayList<Double[]> points = new ArrayList<Double[]>(); | |
249 | |
250 | |
251 try { | |
252 String xml = TicketWriter.getHitsOnPage(ticket,lang,textId,pageFileName); | |
253 Pattern linePattern = Pattern.compile("<line>(.*?)</line>",Pattern.MULTILINE); | |
254 Matcher m = linePattern.matcher(xml); | |
255 | |
256 while(m.find()){ | |
257 Double[] point = DigilibTools.calculatePoint(m.group(1)); | |
258 points.add(point); | |
259 } | |
260 | |
261 String url = String.format(DigilibTools.DIGIVIEWBASICSTRING, DigilibTools.generateImagePath(textId,pageFileName),DigilibTools.generateMarksFromPoints(points)); | |
262 | |
263 | |
264 ret+=String.format("<hitsOnPage xlink:href=\"%s\">%s</hitsOnPage>",url,textId); | |
265 ret+="</xml>"; | |
266 | |
267 | |
268 return ret; | |
269 | |
270 | |
271 } catch (FileNotFoundException e) { | |
272 // TODO Auto-generated catch block | |
273 e.printStackTrace(); | |
274 } catch (IOException e) { | |
275 // TODO Auto-generated catch block | |
276 e.printStackTrace(); | |
277 } | |
278 | |
279 return null; | |
280 } | |
281 | |
282 | |
283 | |
284 | |
285 | |
286 | |
287 | |
288 | |
289 | |
290 } | |
291 |