Mercurial > hg > fulltextSearchServer
view src/de/mpiwg/dwinter/fulltextSearchServer/ShowContentOfDocument.java @ 1:83e9a828e794
Version mit integrierter Suche ?ber XML-Volltexte
author | dwinter |
---|---|
date | Wed, 26 Jan 2011 14:41:34 +0100 |
parents | db87c1b7eb6d |
children | eef69274ef15 |
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.Request; import org.restlet.Response; import org.restlet.data.Form; import org.restlet.data.MediaType; import org.restlet.data.Reference; 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.search.xmlsearchadapter.XMLSearchServerAdapter; 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 html; if (restPath.equals("")){ html = showContent(ticket,lang,textId); if (html==null){ setStatus(Status.SUCCESS_ACCEPTED); //still waiting return new StringRepresentation("<dev>waiting</dev>",MediaType.TEXT_HTML); } html = XMLTools.transformToHTML(html,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/showContentOfDocumentToHTML.xsl"); } else { html = processRestPath(ticket,lang,textId,restPath); if (html==null){ setStatus(Status.SUCCESS_ACCEPTED); //still waiting return new StringRepresentation("<dev>waiting</dev>",MediaType.TEXT_HTML); } //txt=xml; } StringRepresentation representation = new StringRepresentation(html, 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 XMLTools.transformToHTML(xml,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/processRestPathOfDocumentToHTML.xsl"); } /** * Rueckgabe der Treffer gemaess dem Darstellungsmode z.Z. wird nur digilib und generic unterstuetzt. * 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); // teste format des Restes wenn noch "/" dann Aufruf einer Seite direkt if (mode.equals("digilib")){ String txt=handleDigilib(textId, pageFileName, ret, points, m); return XMLTools.transformToHTML(txt,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/processRestPathOfDocumentToHTML.xsl"); } else if (mode.equals("generic")){ if (m.find()){ // xmlfile ist fuer digilib ok, dann digilib String txt = handleDigilib(textId, pageFileName, ret, points, m); return XMLTools.transformToHTML(txt,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/processRestPathOfDocumentToHTML.xsl"); } else { //assume xml-treffer liste String txt = handleXMLFullText(textId, pageFileName,ret, ticket, lang); return XMLTools.transformToHTML(txt,"/de/mpiwg/dwinter/fulltextSearchServer/xsl/processRestPathOfDocumentToHTML.xsl"); } } else if (mode.equals("showXMLhits")){ //String txt="<html><head>"+ //"<base href=\""+XMLSearchServerAdapter.XMLServerBase+"\" />"+ //"</head><body>"; String txt= TicketWriter.getFileContent(ticket,lang,textId,pageFileName); return txt; //+"</body></html>"; } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } protected String handleXMLFullText(String textId, String pageFileName, String ret, String ticket, String lang) { try { String[] morphquerySplitted=TicketWriter.getQueryString(lang,ticket).split(":"); //string has normally the format field:query String morphQuery= morphquerySplitted[morphquerySplitted.length-1]; String queryString = XMLSearchServerAdapter.XMLDocSearchBase + "document=" + textId.replace(":","/"); //queryString += "&queryType=fulltext&query=" + morphQuery; queryString += "&mode=text&query-type=fulltext&query=" + morphQuery; ret+=String.format("<hitsOnPage xlink:href=\"%s\">%s</hitsOnPage>",queryString,textId); ret+="</xml>"; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ret; } protected String handleDigilib(String textId, String pageFileName, String ret, ArrayList<Double[]> points, Matcher m) { 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; } }