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;
}




				
	 


		
}