annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1aac45997235 first ingest
dwinter
parents:
diff changeset
1 package de.mpiwg.itgroup.escidoc.MPIWGServices.Restlet.services.search;
1aac45997235 first ingest
dwinter
parents:
diff changeset
2
1aac45997235 first ingest
dwinter
parents:
diff changeset
3
1aac45997235 first ingest
dwinter
parents:
diff changeset
4
1aac45997235 first ingest
dwinter
parents:
diff changeset
5 import java.io.IOException;
1aac45997235 first ingest
dwinter
parents:
diff changeset
6 import java.io.InputStream;
1aac45997235 first ingest
dwinter
parents:
diff changeset
7 import java.io.OutputStream;
1aac45997235 first ingest
dwinter
parents:
diff changeset
8 import java.io.UnsupportedEncodingException;
1aac45997235 first ingest
dwinter
parents:
diff changeset
9 import java.net.URLEncoder;
1aac45997235 first ingest
dwinter
parents:
diff changeset
10 import java.util.Properties;
1aac45997235 first ingest
dwinter
parents:
diff changeset
11
1aac45997235 first ingest
dwinter
parents:
diff changeset
12 import javax.xml.transform.Transformer;
1aac45997235 first ingest
dwinter
parents:
diff changeset
13 import javax.xml.transform.TransformerConfigurationException;
1aac45997235 first ingest
dwinter
parents:
diff changeset
14 import javax.xml.transform.TransformerException;
1aac45997235 first ingest
dwinter
parents:
diff changeset
15 import javax.xml.transform.TransformerFactory;
1aac45997235 first ingest
dwinter
parents:
diff changeset
16 import javax.xml.transform.TransformerFactoryConfigurationError;
1aac45997235 first ingest
dwinter
parents:
diff changeset
17 import javax.xml.transform.stream.StreamSource;
1aac45997235 first ingest
dwinter
parents:
diff changeset
18
1aac45997235 first ingest
dwinter
parents:
diff changeset
19 import org.apache.http.HttpEntity;
1aac45997235 first ingest
dwinter
parents:
diff changeset
20 import org.apache.http.HttpResponse;
1aac45997235 first ingest
dwinter
parents:
diff changeset
21 import org.apache.log4j.Logger;
1aac45997235 first ingest
dwinter
parents:
diff changeset
22 import org.jdom.Document;
1aac45997235 first ingest
dwinter
parents:
diff changeset
23 import org.jdom.JDOMException;
1aac45997235 first ingest
dwinter
parents:
diff changeset
24 import org.jdom.input.SAXBuilder;
1aac45997235 first ingest
dwinter
parents:
diff changeset
25 import org.jdom.output.XMLOutputter;
1aac45997235 first ingest
dwinter
parents:
diff changeset
26 import org.jdom.transform.JDOMResult;
1aac45997235 first ingest
dwinter
parents:
diff changeset
27 import org.jdom.transform.JDOMSource;
1aac45997235 first ingest
dwinter
parents:
diff changeset
28 import org.jdom.transform.XSLTransformer;
1aac45997235 first ingest
dwinter
parents:
diff changeset
29 import org.restlet.data.Form;
1aac45997235 first ingest
dwinter
parents:
diff changeset
30 import org.restlet.data.MediaType;
1aac45997235 first ingest
dwinter
parents:
diff changeset
31 import org.restlet.data.Status;
1aac45997235 first ingest
dwinter
parents:
diff changeset
32 import org.restlet.representation.InputRepresentation;
1aac45997235 first ingest
dwinter
parents:
diff changeset
33 import org.restlet.representation.Representation;
1aac45997235 first ingest
dwinter
parents:
diff changeset
34 import org.restlet.representation.StreamRepresentation;
1aac45997235 first ingest
dwinter
parents:
diff changeset
35 import org.restlet.representation.StringRepresentation;
1aac45997235 first ingest
dwinter
parents:
diff changeset
36 import org.restlet.resource.Get;
1aac45997235 first ingest
dwinter
parents:
diff changeset
37 import org.restlet.resource.Options;
1aac45997235 first ingest
dwinter
parents:
diff changeset
38 import org.restlet.resource.Post;
1aac45997235 first ingest
dwinter
parents:
diff changeset
39 import org.restlet.resource.ServerResource;
1aac45997235 first ingest
dwinter
parents:
diff changeset
40 import org.w3c.dom.Entity;
1aac45997235 first ingest
dwinter
parents:
diff changeset
41
1aac45997235 first ingest
dwinter
parents:
diff changeset
42 import de.mpiwg.itgroup.eSciDoc.Tools.EScidocBasicHandler;
1aac45997235 first ingest
dwinter
parents:
diff changeset
43
1aac45997235 first ingest
dwinter
parents:
diff changeset
44 public class SimpleSearch extends ServerResource{
1aac45997235 first ingest
dwinter
parents:
diff changeset
45
4
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
46
0
1aac45997235 first ingest
dwinter
parents:
diff changeset
47 private String eScidocServer;
1aac45997235 first ingest
dwinter
parents:
diff changeset
48 private String eScidocPort;
1aac45997235 first ingest
dwinter
parents:
diff changeset
49 private Logger logger= Logger.getRootLogger();
1aac45997235 first ingest
dwinter
parents:
diff changeset
50 private String eScidocUser;
1aac45997235 first ingest
dwinter
parents:
diff changeset
51 private String eScidocUserPW;
4
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
52
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
53 private String SEARCH_CMM="escidoc:131281"; //TODO: make this configurable, also a list of CMM should be possible
0
1aac45997235 first ingest
dwinter
parents:
diff changeset
54
1aac45997235 first ingest
dwinter
parents:
diff changeset
55 public SimpleSearch() throws IOException{
1aac45997235 first ingest
dwinter
parents:
diff changeset
56 InputStream is = getClass().getResourceAsStream("/de/mpiwg/itgroup/escidoc/MPIWGServices/Restlet/config/eScidocServer.config");
1aac45997235 first ingest
dwinter
parents:
diff changeset
57 Properties prop = new Properties();
1aac45997235 first ingest
dwinter
parents:
diff changeset
58 prop.load(is);
1aac45997235 first ingest
dwinter
parents:
diff changeset
59 eScidocServer= (String)prop.get("eScidocServer");
1aac45997235 first ingest
dwinter
parents:
diff changeset
60 eScidocPort=(String)prop.get("eScidocPort");
1aac45997235 first ingest
dwinter
parents:
diff changeset
61 eScidocUser=(String)prop.get("eScidocUser");
1aac45997235 first ingest
dwinter
parents:
diff changeset
62 eScidocUserPW=(String)prop.get("eScidocUserPW");
1aac45997235 first ingest
dwinter
parents:
diff changeset
63 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
64 @Options
1aac45997235 first ingest
dwinter
parents:
diff changeset
65 public void doOptions(Representation entity) {
1aac45997235 first ingest
dwinter
parents:
diff changeset
66 Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers");
1aac45997235 first ingest
dwinter
parents:
diff changeset
67 if (responseHeaders == null) {
1aac45997235 first ingest
dwinter
parents:
diff changeset
68 responseHeaders = new Form();
1aac45997235 first ingest
dwinter
parents:
diff changeset
69 getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders);
1aac45997235 first ingest
dwinter
parents:
diff changeset
70 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
71 responseHeaders.add("Access-Control-Allow-Origin", "*");
1aac45997235 first ingest
dwinter
parents:
diff changeset
72 responseHeaders.add("Access-Control-Allow-Methods", "POST,OPTIONS,GET");
1aac45997235 first ingest
dwinter
parents:
diff changeset
73 responseHeaders.add("Access-Control-Allow-Headers", "Content-Type");
1aac45997235 first ingest
dwinter
parents:
diff changeset
74 responseHeaders.add("Access-Control-Allow-Credentials", "false");
1aac45997235 first ingest
dwinter
parents:
diff changeset
75 responseHeaders.add("Access-Control-Max-Age", "60");
1aac45997235 first ingest
dwinter
parents:
diff changeset
76 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
77
1aac45997235 first ingest
dwinter
parents:
diff changeset
78
1aac45997235 first ingest
dwinter
parents:
diff changeset
79 @Get("html")
1aac45997235 first ingest
dwinter
parents:
diff changeset
80 public Representation getHtml(){
1aac45997235 first ingest
dwinter
parents:
diff changeset
81
1aac45997235 first ingest
dwinter
parents:
diff changeset
82 // response header fuer cross-site.scripting
1aac45997235 first ingest
dwinter
parents:
diff changeset
83 Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers");
1aac45997235 first ingest
dwinter
parents:
diff changeset
84 if (responseHeaders == null) {
1aac45997235 first ingest
dwinter
parents:
diff changeset
85 responseHeaders = new Form();
1aac45997235 first ingest
dwinter
parents:
diff changeset
86 getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders);
1aac45997235 first ingest
dwinter
parents:
diff changeset
87 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
88 responseHeaders.add("Access-Control-Allow-Origin", "*");
1aac45997235 first ingest
dwinter
parents:
diff changeset
89
1aac45997235 first ingest
dwinter
parents:
diff changeset
90 Form form = getRequest().getResourceRef().getQueryAsForm();
1aac45997235 first ingest
dwinter
parents:
diff changeset
91
1aac45997235 first ingest
dwinter
parents:
diff changeset
92 Representation returnRepr = doSearch(form);
1aac45997235 first ingest
dwinter
parents:
diff changeset
93 if (returnRepr==null){
1aac45997235 first ingest
dwinter
parents:
diff changeset
94 InputStream in = getClass().getResourceAsStream("/de/mpiwg/itgroup/escidoc/MPIWGServices/Restlet/staticPages/search.html");
1aac45997235 first ingest
dwinter
parents:
diff changeset
95
1aac45997235 first ingest
dwinter
parents:
diff changeset
96 return new InputRepresentation(in, MediaType.TEXT_HTML);
1aac45997235 first ingest
dwinter
parents:
diff changeset
97 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
98 else
1aac45997235 first ingest
dwinter
parents:
diff changeset
99 return returnRepr;
1aac45997235 first ingest
dwinter
parents:
diff changeset
100
1aac45997235 first ingest
dwinter
parents:
diff changeset
101 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
102
1aac45997235 first ingest
dwinter
parents:
diff changeset
103
1aac45997235 first ingest
dwinter
parents:
diff changeset
104 /**
1aac45997235 first ingest
dwinter
parents:
diff changeset
105 * Bearbeite das Suchformular, gibt null zurueck, wenn das formular leer ist.
1aac45997235 first ingest
dwinter
parents:
diff changeset
106 * @param searchForm
1aac45997235 first ingest
dwinter
parents:
diff changeset
107 * @return
1aac45997235 first ingest
dwinter
parents:
diff changeset
108 */
1aac45997235 first ingest
dwinter
parents:
diff changeset
109 public Representation doSearch(Form searchForm){
1aac45997235 first ingest
dwinter
parents:
diff changeset
110
1aac45997235 first ingest
dwinter
parents:
diff changeset
111
1aac45997235 first ingest
dwinter
parents:
diff changeset
112 String searchAll=searchForm.getValues("allMetadata");
1aac45997235 first ingest
dwinter
parents:
diff changeset
113 String searchTitle=searchForm.getValues("title");
1aac45997235 first ingest
dwinter
parents:
diff changeset
114 String searchAuthor=searchForm.getValues("author");
1aac45997235 first ingest
dwinter
parents:
diff changeset
115
1aac45997235 first ingest
dwinter
parents:
diff changeset
116 String queryString ="";
1aac45997235 first ingest
dwinter
parents:
diff changeset
117 Boolean isSearch=false;
1aac45997235 first ingest
dwinter
parents:
diff changeset
118 if (searchAll!=null && !searchAll.equals("")){
4
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
119 queryString="metadata="+searchAll;
0
1aac45997235 first ingest
dwinter
parents:
diff changeset
120 isSearch=true;
1aac45997235 first ingest
dwinter
parents:
diff changeset
121 } else if (searchTitle!=null && !searchTitle.equals("")){
4
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
122 queryString="any-title="+searchTitle;
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
123 queryString+=" or meta.archimedes.title="+searchTitle;
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
124 queryString+=" or meta.bib.title="+searchTitle;
0
1aac45997235 first ingest
dwinter
parents:
diff changeset
125 isSearch=true;
1aac45997235 first ingest
dwinter
parents:
diff changeset
126 } else if (searchAuthor!=null && !searchAuthor.equals("")){
4
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
127 queryString="dc-md.creator="+searchAuthor;
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
128 queryString+=" or meta.archimedes.author="+searchAuthor;
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
129 queryString+=" or meta.bib.author="+searchAuthor;
0
1aac45997235 first ingest
dwinter
parents:
diff changeset
130 isSearch=true;
1aac45997235 first ingest
dwinter
parents:
diff changeset
131 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
132 if (!isSearch) return null;
1aac45997235 first ingest
dwinter
parents:
diff changeset
133
1aac45997235 first ingest
dwinter
parents:
diff changeset
134 String query;
1aac45997235 first ingest
dwinter
parents:
diff changeset
135 try {
4
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
136 query = "/srw/search/escidoc_all?maximumRecords=1000&query="+URLEncoder.encode("content-model.objid="+SEARCH_CMM+" and "+ queryString,"utf-8");
0
1aac45997235 first ingest
dwinter
parents:
diff changeset
137 } catch (UnsupportedEncodingException e) {
1aac45997235 first ingest
dwinter
parents:
diff changeset
138 logger.error("do Search, cannot encode:"+queryString);
1aac45997235 first ingest
dwinter
parents:
diff changeset
139 setStatus(Status.SERVER_ERROR_INTERNAL);
1aac45997235 first ingest
dwinter
parents:
diff changeset
140 return new StringRepresentation("<error>error</error>");
1aac45997235 first ingest
dwinter
parents:
diff changeset
141 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
142
1aac45997235 first ingest
dwinter
parents:
diff changeset
143 EScidocBasicHandler handler = new EScidocBasicHandler(eScidocServer, Integer.valueOf(eScidocPort),eScidocUser,eScidocUserPW);
1aac45997235 first ingest
dwinter
parents:
diff changeset
144
1aac45997235 first ingest
dwinter
parents:
diff changeset
145 HttpResponse result;
1aac45997235 first ingest
dwinter
parents:
diff changeset
146 try {
1aac45997235 first ingest
dwinter
parents:
diff changeset
147 result = handler.eScidocGet(query);
1aac45997235 first ingest
dwinter
parents:
diff changeset
148 } catch (IOException e) {
1aac45997235 first ingest
dwinter
parents:
diff changeset
149 logger.error("do Search, cannot encode:"+queryString);
1aac45997235 first ingest
dwinter
parents:
diff changeset
150 setStatus(Status.SERVER_ERROR_INTERNAL);
1aac45997235 first ingest
dwinter
parents:
diff changeset
151 return new StringRepresentation("<error>error</error>");
1aac45997235 first ingest
dwinter
parents:
diff changeset
152 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
153
1aac45997235 first ingest
dwinter
parents:
diff changeset
154 if (result.getStatusLine().getStatusCode()!=200){
1aac45997235 first ingest
dwinter
parents:
diff changeset
155 setStatus(Status.SERVER_ERROR_INTERNAL);
1aac45997235 first ingest
dwinter
parents:
diff changeset
156 logger.error("do Search, got Error:"+queryString);
1aac45997235 first ingest
dwinter
parents:
diff changeset
157
1aac45997235 first ingest
dwinter
parents:
diff changeset
158 HttpEntity ent = result.getEntity();
1aac45997235 first ingest
dwinter
parents:
diff changeset
159 if (ent!=null){
1aac45997235 first ingest
dwinter
parents:
diff changeset
160 InputStream in;
1aac45997235 first ingest
dwinter
parents:
diff changeset
161 try {
1aac45997235 first ingest
dwinter
parents:
diff changeset
162 in = ent.getContent();
1aac45997235 first ingest
dwinter
parents:
diff changeset
163 } catch (Exception e) {
1aac45997235 first ingest
dwinter
parents:
diff changeset
164 return new StringRepresentation("<error>error</error>");
1aac45997235 first ingest
dwinter
parents:
diff changeset
165 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
166
1aac45997235 first ingest
dwinter
parents:
diff changeset
167 return new InputRepresentation(in);
1aac45997235 first ingest
dwinter
parents:
diff changeset
168 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
169 else {
1aac45997235 first ingest
dwinter
parents:
diff changeset
170 return new StringRepresentation("<error>error</error>");
1aac45997235 first ingest
dwinter
parents:
diff changeset
171 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
172 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
173
1aac45997235 first ingest
dwinter
parents:
diff changeset
174 InputStream in;
1aac45997235 first ingest
dwinter
parents:
diff changeset
175 try {
1aac45997235 first ingest
dwinter
parents:
diff changeset
176 in = result.getEntity().getContent();
1aac45997235 first ingest
dwinter
parents:
diff changeset
177
1aac45997235 first ingest
dwinter
parents:
diff changeset
178 Document doc = new SAXBuilder().build(in);
1aac45997235 first ingest
dwinter
parents:
diff changeset
179 InputStream xslt= getClass().getResourceAsStream("/de/mpiwg/itgroup/escidoc/MPIWGServices/Restlet/staticPages/searchResult.xsl");
1aac45997235 first ingest
dwinter
parents:
diff changeset
180 //Document styleDoc = new SAXBuilder().build(xslt);
1aac45997235 first ingest
dwinter
parents:
diff changeset
181
1aac45997235 first ingest
dwinter
parents:
diff changeset
182 Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(xslt));
1aac45997235 first ingest
dwinter
parents:
diff changeset
183 JDOMSource inxml = new JDOMSource(doc);
1aac45997235 first ingest
dwinter
parents:
diff changeset
184 JDOMResult out = new JDOMResult();
1aac45997235 first ingest
dwinter
parents:
diff changeset
185 transformer.transform(inxml, out);
1aac45997235 first ingest
dwinter
parents:
diff changeset
186 //logger.debug(printXML(doc));
1aac45997235 first ingest
dwinter
parents:
diff changeset
187
1aac45997235 first ingest
dwinter
parents:
diff changeset
188 Document docresult = out.getDocument();
4
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
189
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
190
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
191
0
1aac45997235 first ingest
dwinter
parents:
diff changeset
192 return new StringRepresentation(printXML(docresult),MediaType.TEXT_HTML);
1aac45997235 first ingest
dwinter
parents:
diff changeset
193
4
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
194
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
195
938e45fabd7c version f?r escidoc produktionsversion
dwinter
parents: 2
diff changeset
196
0
1aac45997235 first ingest
dwinter
parents:
diff changeset
197 } catch (Exception e) {
1aac45997235 first ingest
dwinter
parents:
diff changeset
198 logger.trace(e);
1aac45997235 first ingest
dwinter
parents:
diff changeset
199 return new StringRepresentation("<error>error</error>");
1aac45997235 first ingest
dwinter
parents:
diff changeset
200 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
201
1aac45997235 first ingest
dwinter
parents:
diff changeset
202
1aac45997235 first ingest
dwinter
parents:
diff changeset
203
1aac45997235 first ingest
dwinter
parents:
diff changeset
204
1aac45997235 first ingest
dwinter
parents:
diff changeset
205 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
206
1aac45997235 first ingest
dwinter
parents:
diff changeset
207 public String printXML(Document dom) throws IOException{
1aac45997235 first ingest
dwinter
parents:
diff changeset
208 XMLOutputter out = new XMLOutputter();
1aac45997235 first ingest
dwinter
parents:
diff changeset
209
1aac45997235 first ingest
dwinter
parents:
diff changeset
210 String string = out.outputString(dom);
1aac45997235 first ingest
dwinter
parents:
diff changeset
211 return string;
1aac45997235 first ingest
dwinter
parents:
diff changeset
212
1aac45997235 first ingest
dwinter
parents:
diff changeset
213 }
1aac45997235 first ingest
dwinter
parents:
diff changeset
214 }