view src/de/mpiwg/dwinter/fulltextSearchServer/ShowResultOfTicket.java @ 0:db87c1b7eb6d

initial
author dwinter
date Wed, 03 Nov 2010 12:18:46 +0100
parents
children
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.StringBufferInputStream;
import java.io.StringWriter;

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.dom.DOMResult;
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.jdom.JDOMException;
import org.restlet.data.Form;
import org.restlet.data.MediaType;
import org.restlet.data.Parameter;
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.w3c.dom.DocumentFragment;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import de.mpiwg.dwinter.fulltext.ticket.TicketWriter;
import de.mpiwg.dwinter.fulltextIndexer.harvester.MyResolver;

public class ShowResultOfTicket extends ServerResource {

	Logger logger = Logger.getRootLogger();
	//need options for crossdomain scripting
	@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");
	}
	
	@Get("html")
	public Representation getHTML( ) throws NumberFormatException, JDOMException {
		logger.debug("show result of ticker: get HTML");
		
		// 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", "*");
		
		
		String ticket = (String) getRequest().getAttributes().get("ticket") ;
		String lang = (String) getRequest().getAttributes().get("lang") ;  
		
		Form form =  getRequest().getResourceRef().getQueryAsForm();
		String from="";
		Integer intFrom=0;
		Integer intTo=Integer.MAX_VALUE;
		
		String to="";
		Boolean restricted= false;
		
		for (Parameter parameter : form) {
		  String name =parameter.getName();
		  if (name.equals("from")){
			  from = parameter.getValue();
			  try{
				  intFrom=Integer.valueOf(from);
				  restricted=true;
			  } catch (NumberFormatException nf) {
				  // nothing to do
			  }
			 
		  }
		  else if (name.equals("to"))
		  {
		  to = parameter.getValue();
		  try{
			  intTo=Integer.valueOf(to);
			  restricted=true;
		  } catch (NumberFormatException nf) {
			  // nothing to do
		  }
		  }
		}
		  
	        StringRepresentation representation = null; 
	        String xml = "";
			try {
				if (restricted){
					xml = TicketWriter.getResultXML(ticket, lang,intFrom,intTo);
				} else {
				xml = TicketWriter.getResultXML(ticket,lang);
			}
				
				if (xml == null)
			        {
			          setStatus(Status.SUCCESS_ACCEPTED) ;
			          logger.debug("show result of ticket:Waiting");
			          return new StringRepresentation("<info>waiting</info>",MediaType.TEXT_XML);
			       }
				
			} catch (FileNotFoundException e) {
				e.printStackTrace();
				logger.debug("show result of ticker: file not found xml");
				setStatus(Status.SERVER_ERROR_INTERNAL) ;
		        return null;
			} catch (IOException e) {
				logger.debug("show result of ticker: IO error xml");
				e.printStackTrace();
				setStatus(Status.SERVER_ERROR_INTERNAL) ;
		          return null;
			}
	       
			
			
			// String txt = IOUtils.toString(new FileInputStream(file));
			// get rid of the entities
			TransformerFactory tf = TransformerFactory.newInstance();
			
			InputStream res = getClass().getResourceAsStream("/de/mpiwg/dwinter/fulltextSearchServer/xsl/ticketResultToHTML.xsl");
		
			Transformer t;
			try {
				t = tf.newTransformer(new StreamSource(res));
			} catch (TransformerConfigurationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
		

			
			//OutputStream output = new ByteArrayOutputStream();
			
			//BufferedWriter sw = new BufferedWriter(new OutputStreamWriter(output, "utf-8"));

			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			dbf.setNamespaceAware(true);
			dbf.setValidating(false);
			DocumentBuilder db;
			try {
				db = dbf.newDocumentBuilder();
			} catch (ParserConfigurationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
			//db.setEntityResolver(new MyResolver());
			
			Document doc;
			try {
				//stream = new StringInputStream(xml,"utf-8");
				
				ByteArrayInputStream stream = new ByteArrayInputStream(xml.getBytes("utf-8"));
				doc = db.parse(stream);
				
			
			} catch (SAXException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
			
			StringWriter sw = new StringWriter();
			StreamResult sr = new StreamResult(sw);
			
			//org.w3c.dom.Document tgtDoc = db.newDocument(); 
			//DocumentFragment fragment = tgtDoc.createDocumentFragment(); 
			//DOMResult tgtDom = new DOMResult( fragment ); 
			
		
			t.setOutputProperty(OutputKeys.ENCODING, "utf-8");
			try {
				t.transform(new DOMSource(doc), sr);
			} catch (TransformerException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
			String txt = sw.toString();
			
			
	       
	          representation = new StringRepresentation(txt, 
	     	            MediaType.TEXT_HTML) ;
	          return representation;
	    
		}
	//@Get("xml")
	public Representation getXML( ) {
		logger.debug("show result of ticker: get xml");
		
		// 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", "*");
		
		
		String ticket = (String) getRequest().getAttributes().get("ticket") ;
		String lang = (String) getRequest().getAttributes().get("lang") ;  
	        StringRepresentation representation = null; 
	        String xml;
			try {
				xml = TicketWriter.getResultXML(ticket,lang);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
				logger.debug("show result of ticker: file not found xml");
				setStatus(Status.SERVER_ERROR_INTERNAL) ;
		        return null;
			} catch (IOException e) {
				logger.debug("show result of ticker: IO error xml");
				e.printStackTrace();
				setStatus(Status.SERVER_ERROR_INTERNAL) ;
		          return null;
			}
	       
	        if (xml != null) {
	          representation = new StringRepresentation(xml, 
	     	            MediaType.TEXT_XML) ;
	          return representation;
	       } else {
	          setStatus(Status.SUCCESS_ACCEPTED) ;
	          logger.debug("show result of ticket:Waiting");
	          return new StringRepresentation("<info>waiting</info>",MediaType.TEXT_XML);
	       }
		}
	

}