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 += "&amp;mode=text&amp;query-type=fulltext&amp;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;
}




				
	 


		
}