Mercurial > hg > eSciDocMPIWGServicesRestlet
view src/de/mpiwg/itgroup/escidoc/MPIWGServices/Restlet/services/search/SimpleSearch.java @ 4:938e45fabd7c default tip
version f?r escidoc produktionsversion
author | dwinter |
---|---|
date | Wed, 25 Jul 2012 12:36:25 +0200 |
parents | ffeb8be0bded |
children |
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; private String SEARCH_CMM="escidoc:131281"; //TODO: make this configurable, also a list of CMM should be possible 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="metadata="+searchAll; isSearch=true; } else if (searchTitle!=null && !searchTitle.equals("")){ queryString="any-title="+searchTitle; queryString+=" or meta.archimedes.title="+searchTitle; queryString+=" or meta.bib.title="+searchTitle; isSearch=true; } else if (searchAuthor!=null && !searchAuthor.equals("")){ queryString="dc-md.creator="+searchAuthor; queryString+=" or meta.archimedes.author="+searchAuthor; queryString+=" or meta.bib.author="+searchAuthor; isSearch=true; } if (!isSearch) return null; String query; try { query = "/srw/search/escidoc_all?maximumRecords=1000&query="+URLEncoder.encode("content-model.objid="+SEARCH_CMM+" and "+ 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; } }