Mercurial > hg > fulltextSearchServer
view src/de/mpiwg/dwinter/fulltextSearchServer/ShowContentOfDocument.java @ 0:db87c1b7eb6d
initial
author | dwinter |
---|---|
date | Wed, 03 Nov 2010 12:18:46 +0100 |
parents | |
children | 83e9a828e794 |
line wrap: on
line source
package de.mpiwg.dwinter.fulltextSearchServer; import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.util.ArrayList; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.apache.log4j.Logger; import org.restlet.data.Form; import org.restlet.data.MediaType; import org.restlet.data.Status; import org.restlet.representation.Representation; import org.restlet.representation.StringRepresentation; import org.restlet.resource.Get; import org.restlet.resource.Options; import org.restlet.resource.ServerResource; import org.w3c.dom.Document; import org.xml.sax.SAXException; import de.mpiwg.dwinter.fulltext.ticket.TicketWriter; import de.mpiwg.dwinter.fulltextSearchServer.Utils.DigilibTools; import de.mpiwg.dwinter.fulltextSearchServer.Utils.XMLTools; /** * Klasse gibt jenach Aufruf entweder eine XML/HTML Datei mit den Seiten zurueck auf denen sich fuer das entsprechende * Dokument und Ticket Treffer befinden, bzw. wenn die entsprechende Seite im Pfad mit angegeben wird die Treffer auf dieser Seite * @author dwinter * */ public class ShowContentOfDocument extends ServerResource { private Logger logger = Logger.getRootLogger(); /** * Erlaubt cross scripting bei Aufruf aus Javascript * @param entity */ @Options public void doOptions(Representation entity) { Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); if (responseHeaders == null) { responseHeaders = new Form(); getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); } responseHeaders.add("Access-Control-Allow-Origin", "*"); responseHeaders.add("Access-Control-Allow-Methods", "POST,OPTIONS,GET"); responseHeaders.add("Access-Control-Allow-Headers", "Content-Type"); responseHeaders.add("Access-Control-Allow-Credentials", "false"); responseHeaders.add("Access-Control-Max-Age", "60"); } /** * Erzeugt eine XML-Reprasentation der Fundstellen uebergeben werdne im Pfad als REST-Aufruf die Ticketnummer, die Sprache und die Textid * d.h. /TICKET/LANG/TEXTID oder /TICKET/LANG/TEXTID/FILENAME_DER_SEITE oder /TICKET/LANG/TEXTID/FILENAME_DER_SEITE/digilib * @return */ //@Get("xml") public Representation getXML( ) { // response header fuer cross-site.scripting Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); if (responseHeaders == null) { responseHeaders = new Form(); getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); } responseHeaders.add("Access-Control-Allow-Origin", "*"); logger.debug("getXML"); String ticket = (String) getRequest().getAttributes().get("ticket") ; String lang = (String) getRequest().getAttributes().get("lang") ; String textId = (String) getRequest().getAttributes().get("textId") ; String restPath = getRequest().getResourceRef().getRemainingPart(); logger.debug("ticket:"+ticket); logger.debug("lang:"+lang); logger.debug("textId:"+textId); logger.debug("restpath:"+restPath); String xml; if (restPath.equals("")){ xml = showContent(ticket,lang,textId); } else { xml = processRestPath(ticket,lang,textId,restPath); } if (xml==null){ setStatus(Status.SUCCESS_ACCEPTED); //still waiting return new StringRepresentation("<info>waiting</info>",MediaType.TEXT_XML); } StringRepresentation representation = new StringRepresentation(xml, MediaType.TEXT_XML) ; return representation; } /** * Analog zu getXML Rueckgabe erfolgt jedoch als html * @return */ @Get("html") public Representation getHTML( ) { // response header fuer cross-site.scripting Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); if (responseHeaders == null) { responseHeaders = new Form(); getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); } responseHeaders.add("Access-Control-Allow-Origin", "*"); logger.debug("getHTML"); String ticket = (String) getRequest().getAttributes().get("ticket") ; String lang = (String) getRequest().getAttributes().get("lang") ; String textId = (String) getRequest().getAttributes().get("textId") ; String restPath = getRequest().getResourceRef().getRemainingPart(); logger.debug("ticket:"+ticket); logger.debug("lang:"+lang); logger.debug("textId:"+textId); logger.debug("restpath:"+restPath); String xml; String txt; if (restPath.equals("")){ xml = showContent(ticket,lang,textId); if (xml==null){ setStatus(Status.SUCCESS_ACCEPTED); //still waiting return new StringRepresentation("<dev>waiting</dev>",MediaType.TEXT_HTML); } txt = XMLTools.transformToHTML(xml,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/showContentOfDocumentToHTML.xsl"); } else { xml = processRestPath(ticket,lang,textId,restPath); if (xml==null){ setStatus(Status.SUCCESS_ACCEPTED); //still waiting return new StringRepresentation("<dev>waiting</dev>",MediaType.TEXT_HTML); } txt = XMLTools.transformToHTML(xml,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/processRestPathOfDocumentToHTML.xsl"); //txt=xml; } StringRepresentation representation = new StringRepresentation(txt, MediaType.TEXT_HTML) ; return representation; } /** * Gibt ein XML File mit allen Seiten zuruech auf denen sich Treffer befinden. * @param ticket Ticketnummer * @param lang Sprache * @param textId id des Textes. * @return das XML oder null wenn die Datei bisher nicht existiert. */ private String showContent(String ticket, String lang, String textId) { StringRepresentation representation = null; String xml; xml = TicketWriter.getPagesWithHits(ticket,lang,textId); return xml; } /** * Gibt die Treffer auf einer Seite zurueck als xml File, die Seite selbst wird im restPath uebergeben. * Ausserdem kann der restPath noch einen zusaetzliches Element enthalten das die Form der Darstellung bestimmt. * @param ticket * @param lang * @param textId * @param restPath * @return */ private String processRestPath(String ticket, String lang, String textId, String restPath) { // teste ob noch ein parameter am pfad ist. String[] splitted = restPath.split("/"); logger.debug(splitted.length); // an der seite haengt noch ein Darstellungmodus an z.Z. nur FILENAME_DER_SEITE/digilib if (splitted.length>2){ return processRestPathWithMode(ticket, lang, textId, splitted[1],splitted[2]); } logger.debug("processRest"); StringRepresentation representation = null; String xml; try { xml = TicketWriter.getHitsOnPage(ticket,lang,textId,restPath); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); xml=null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); xml=null; } return xml; } /** * Rueckgabe der Treffer gemaess dem Darstellungsmode z.Z. wird nur digilib unterstuetzt, bzw. egal welcher * Mode angegeben wird es wird immer das gleiche gemacht, naemlich ein Link auf Digilib ausgegeben. * Der Pfad ist in DIGIVIEWBASICSTRING festgelegt. * @param ticket * @param lang * @param textId * @param pageFileName * @param mode * @return */ private String processRestPathWithMode(String ticket, String lang, String textId, String pageFileName, String mode) { logger.debug("processRestWithMode"); String ret="<xml xmlns:xlink=\"http://www.w3.org/1999/xlink\">"; ret+="<pageFileName>"+pageFileName+"</pageFileName>"; ArrayList<Double[]> points = new ArrayList<Double[]>(); try { String xml = TicketWriter.getHitsOnPage(ticket,lang,textId,pageFileName); Pattern linePattern = Pattern.compile("<line>(.*?)</line>",Pattern.MULTILINE); Matcher m = linePattern.matcher(xml); while(m.find()){ Double[] point = DigilibTools.calculatePoint(m.group(1)); points.add(point); } String url = String.format(DigilibTools.DIGIVIEWBASICSTRING, DigilibTools.generateImagePath(textId,pageFileName),DigilibTools.generateMarksFromPoints(points)); ret+=String.format("<hitsOnPage xlink:href=\"%s\">%s</hitsOnPage>",url,textId); ret+="</xml>"; return ret; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }