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