view src/de/mpiwg/itgroup/escidoc/MPIWGServices/Restlet/services/search/SimpleSearch.java @ 2:ffeb8be0bded

minor bugs / logging lib added
author dwinter
date Mon, 13 Dec 2010 11:13:02 +0100
parents 1aac45997235
children 938e45fabd7c
line wrap: on
line source

package de.mpiwg.itgroup.escidoc.MPIWGServices.Restlet.services.search;



import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Properties;

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.stream.StreamSource;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import org.jdom.transform.JDOMResult;
import org.jdom.transform.JDOMSource;
import org.jdom.transform.XSLTransformer;
import org.restlet.data.Form;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
import org.restlet.representation.InputRepresentation;
import org.restlet.representation.Representation;
import org.restlet.representation.StreamRepresentation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.Get;
import org.restlet.resource.Options;
import org.restlet.resource.Post;
import org.restlet.resource.ServerResource;
import org.w3c.dom.Entity;

import de.mpiwg.itgroup.eSciDoc.Tools.EScidocBasicHandler;

public class SimpleSearch extends ServerResource{
	
	private String eScidocServer;
	private String eScidocPort;
	private Logger logger= Logger.getRootLogger();
	private String eScidocUser;
	private String eScidocUserPW;

	public SimpleSearch() throws IOException{
		InputStream is = getClass().getResourceAsStream("/de/mpiwg/itgroup/escidoc/MPIWGServices/Restlet/config/eScidocServer.config");
		Properties prop = new Properties();
		prop.load(is);
		eScidocServer= (String)prop.get("eScidocServer");
		eScidocPort=(String)prop.get("eScidocPort");
		eScidocUser=(String)prop.get("eScidocUser");
		eScidocUserPW=(String)prop.get("eScidocUserPW");
	}
	@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(){

		// 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", "*");
		
		Form form =  getRequest().getResourceRef().getQueryAsForm();
		
		Representation returnRepr = doSearch(form);
		if (returnRepr==null){
			InputStream in = getClass().getResourceAsStream("/de/mpiwg/itgroup/escidoc/MPIWGServices/Restlet/staticPages/search.html");
		
			return new InputRepresentation(in, MediaType.TEXT_HTML); 
		}
		else
			return returnRepr;
			
	}
	
	
	/**
	 * Bearbeite das Suchformular, gibt null zurueck, wenn das formular leer ist.
	 * @param searchForm
	 * @return
	 */
	public Representation doSearch(Form searchForm){		
		
		
		String searchAll=searchForm.getValues("allMetadata");
		String searchTitle=searchForm.getValues("title");
		String searchAuthor=searchForm.getValues("author");
		
		String queryString ="";
		Boolean isSearch=false;
		if (searchAll!=null && !searchAll.equals("")){
			queryString="escidoc.metadata="+searchAll;
			isSearch=true;
		} else if (searchTitle!=null && !searchTitle.equals("")){
			queryString="escidoc.any-title="+searchTitle;
			isSearch=true;
		} else if (searchAuthor!=null && !searchAuthor.equals("")){
			queryString="escidoc.creator="+searchAuthor;
			isSearch=true;
		} 
		if (!isSearch) return null;
		
		String query;
		try {
			query = "/srw/search/escidoc_all?maximumRecords=1000&query="+URLEncoder.encode(queryString,"utf-8");
		} catch (UnsupportedEncodingException e) {
			logger.error("do Search, cannot encode:"+queryString);
			setStatus(Status.SERVER_ERROR_INTERNAL);
			return new StringRepresentation("<error>error</error>");
		}
		
		EScidocBasicHandler handler = new EScidocBasicHandler(eScidocServer, Integer.valueOf(eScidocPort),eScidocUser,eScidocUserPW);
		
		HttpResponse result;
		try {
			result = handler.eScidocGet(query);
		} catch (IOException e) {
			logger.error("do Search, cannot encode:"+queryString);
			setStatus(Status.SERVER_ERROR_INTERNAL);
			return new StringRepresentation("<error>error</error>");
		}
		
		if (result.getStatusLine().getStatusCode()!=200){
			setStatus(Status.SERVER_ERROR_INTERNAL);
			logger.error("do Search, got Error:"+queryString);
			
			HttpEntity ent = result.getEntity();
			if (ent!=null){
				InputStream in;
				try {
					in = ent.getContent();
				} catch (Exception e) {
					return new StringRepresentation("<error>error</error>");
				}
				
				return new InputRepresentation(in);
			}
			else {
				return new StringRepresentation("<error>error</error>");
			}
		}
		
		InputStream in;
		try {
			in = result.getEntity().getContent();
		
		Document doc = new SAXBuilder().build(in);
		InputStream xslt= getClass().getResourceAsStream("/de/mpiwg/itgroup/escidoc/MPIWGServices/Restlet/staticPages/searchResult.xsl");
		//Document styleDoc =  new SAXBuilder().build(xslt);
		
		 Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(xslt));
		 JDOMSource inxml = new JDOMSource(doc);
		 JDOMResult out = new JDOMResult();
		 transformer.transform(inxml, out);
		 //logger.debug(printXML(doc));
		
		 Document docresult = out.getDocument();
		 return new StringRepresentation(printXML(docresult),MediaType.TEXT_HTML);
		 
		} catch (Exception e) {
			logger.trace(e);
			return new StringRepresentation("<error>error</error>");
		}
		
		
		
		
	}
	
	public String printXML(Document dom) throws IOException{
	 	XMLOutputter out = new XMLOutputter();
	 	
	 	String string = out.outputString(dom);
	 	return string;
       
}
}