source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/FedoraSearch.java.tmp@ 26198

Last change on this file since 26198 was 20294, checked in by kjdon, 15 years ago

changed System.err to logger.error/info

  • Property svn:keywords set to Author Date Id Revision
File size: 9.8 KB
Line 
1package org.greenstone.gsdl3.service;
2
3// Greenstone classes
4import org.greenstone.gsdl3.util.*;
5
6//Fedora Web Services classes
7import fedora.client.utility.AutoFinder;
8import fedora.client.APIAStubFactory;
9import fedora.client.Downloader;
10import fedora.server.access.FedoraAPIA;
11import fedora.server.types.gen.FieldSearchQuery;
12import fedora.server.types.gen.FieldSearchResult;
13import fedora.server.types.gen.ListSession;
14import fedora.server.types.gen.ObjectFields;
15import fedora.server.types.gen.Condition;
16import fedora.server.types.gen.ComparisonOperator;
17
18import javax.xml.transform.stream.StreamResult;
19import javax.xml.transform.stream.StreamSource;
20import javax.xml.transform.Templates;
21import javax.xml.transform.Transformer;
22import javax.xml.transform.TransformerFactory;
23
24// XML classes
25import org.w3c.dom.Element;
26import org.w3c.dom.Document;
27import org.w3c.dom.NodeList;
28
29//Java classes
30import java.util.ArrayList;
31import java.util.HashMap;
32import java.util.List;
33import java.util.Properties;
34import java.io.File;
35import java.io.InputStream;
36import java.io.BufferedReader;
37import java.io.InputStreamReader;
38import java.io.IOException;
39import java.net.HttpURLConnection;
40import java.net.URLConnection;
41import java.net.URL;
42import java.net.Authenticator;
43import java.net.MalformedURLException;
44import java.lang.Object;
45
46import org.apache.log4j.*;
47
48/**
49 *
50 *
51 */
52
53public class FedoraSearch
54 extends AbstractSearch {
55
56 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.FedoraSearch.class.getName());
57 // the services on offer
58 // these strings must match what is found in the properties file
59 protected static final String FIELD_PARAM = "fields";
60
61 //Parameters connect to Proxy Server
62 private String proxyUser = null;
63 private String proxyPassword = null;
64
65 private int maxResult, matchNum;
66
67 protected String fedora_server_url = null;
68
69 public FedoraSearch()
70 {
71 }
72
73 //Configure FedoraSearch Service
74 public boolean configure(Element info, Element extra_info)
75 {
76 Element server_elem = (Element)GSXML.getChildByTagName(info, "fedoraServer");
77 if (server_elem == null) {
78 logger.error("no fedoraServer element found");
79 return false;
80 }
81 fedora_server_url = server_elem.getAttribute("url");
82 logger.info("Fedora Server:" + fedora_server_url);
83
84 if (fedora_server_url.equals("")) {
85 logger.error("no url for the fedoraServer element");
86 return false;
87 }
88 Element tq_service = this.doc.createElement(GSXML.SERVICE_ELEM);
89 tq_service.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_QUERY);
90 tq_service.setAttribute(GSXML.NAME_ATT, TEXT_QUERY_SERVICE);
91 this.short_service_info.appendChild(tq_service);
92 //does_paging = true;
93
94 // add some format info to service map if there is any
95 String path = GSPath.appendLink(GSXML.SEARCH_ELEM, GSXML.FORMAT_ELEM);
96 Element format = (Element) GSXML.getNodeByPath(extra_info, path);
97 if (format != null) {
98 this.format_info_map.put(TEXT_QUERY_SERVICE, this.doc.importNode(format, true));
99 }
100 return true;
101 }
102
103 /** Process a text query - implemented by concrete subclasses */
104 protected Element processTextQuery(Element request) {
105 // Create a new (empty) result message
106 Element result = this.doc.createElement(GSXML.RESPONSE_ELEM);
107 result.setAttribute(GSXML.FROM_ATT, TEXT_QUERY_SERVICE);
108 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
109
110 Element doc_node_list = this.doc.createElement(GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER);
111 result.appendChild(doc_node_list);
112
113 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
114 if (param_list == null) {
115 logger.error("TextQuery request had no paramList.");
116 return result; // Return the empty result
117 }
118
119 // Process the request parameters
120 HashMap params = GSXML.extractParams(param_list, false);
121
122 // Make sure a query has been specified
123 String query = (String) params.get(QUERY_PARAM);
124 if (query == null || query.equals("")) {
125 return result; // Return the empty result
126 }
127 //Check Max number of Documents hit
128 String maxDocs = (String) params.get(MAXDOCS_PARAM);
129 String hits_per_page = (String) params.get(HITS_PER_PAGE_PARAM);
130
131 //Check the start_page number
132 String start_page = (String) params.get(START_PAGE_PARAM);
133
134 // tidy whitespace
135 //query = query.replaceAll("\\s+", "+");
136 matchNum = 0;
137 maxResult = 20;
138
139 try {
140 //Search Fedora Server
141 String host = "toetoe";
142 int port = 8200;
143 String user = "fedoraAdmin";
144 String pass = "fedoraAdmin";
145
146 AutoFinder finder=new AutoFinder(host, port, user, pass);
147
148 String[] fieldsArray = new String[] {"pid", "label", "fType", "bDef",
149 "bMech", "cModel", "state", "ownerId", "cDate", "mDate",
150 "dcmDate", "title", "creator", "subject", "description",
151 "publisher", "contributor", "date", "type", "format",
152 "identifier", "source", "language", "relation", "coverage",
153 "rights"};
154
155 String match_fields = join(fieldsArray, "|");
156
157 FieldSearchQuery query_fedora=fedoraSearch(query, match_fields);
158
159 FieldSearchResult result_fedora = finder.findObjects(fieldsArray, maxResult, query_fedora);
160
161 while (result_fedora != null) {
162 logger.info("Search Result:" + result_fedora.getResultList().length);
163 for (int i=0; i<result_fedora.getResultList().length; i++) {
164 ObjectFields o = result_fedora.getResultList()[i];
165 matchNum++;
166 String pid = o.getPid();
167 String fedora_url = fedora_server_url +"/fedora/get/" + pid;
168 String label = o.getLabel();
169 String[] creator = o.getCreator();
170 String[] subject = o.getSubject();
171 String[] publisher = o.getPublisher();
172 String[] contributor = o.getContributor();
173 String[] title = o.getTitle();
174 String[] description = o.getDescription();
175 String[] format = o.getFormat();
176 String[] identifier = o.getIdentifier();
177 String[] source = o.getSource();
178 String[] language = o.getLanguage();
179
180 Element doc_node = this.doc.createElement(GSXML.DOC_NODE_ELEM);
181 doc_node_list.appendChild(doc_node);
182
183 Element metadata_list = this.doc.createElement(GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
184 doc_node.appendChild(metadata_list);
185
186 if (fedora_url != null) {
187 GSXML.addMetadata(this.doc, metadata_list, "URL", fedora_url);
188 }
189 if (o.getDescription() != null) {
190 GSXML.addMetadata(this.doc, metadata_list, "Description", description[0]);
191 }
192 if (title[0] != null) {
193 GSXML.addMetadata(this.doc, metadata_list, "Title", title[0]);
194 }
195 }
196 ListSession sess=result_fedora.getListSession();
197 if (sess!=null) {
198 result_fedora = finder.resumeFindObjects(sess.getToken());
199 } else {
200 result_fedora = null;
201 }
202 }
203 } catch (Exception e) {
204 logger.error("ERROR: " + e.getClass().getName()
205 + ((e.getMessage()==null) ? "" : ": " + e.getMessage()));
206 }
207
208 Element metadata_list = this.doc.createElement(GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
209 result.appendChild(metadata_list);
210
211 // Add a metadata element specifying the number of matching documents
212 //logger.info("FedoraSearch Number of Documents:" + matchNum);
213 GSXML.addMetadata(this.doc, metadata_list, "numDocsMatched", ""+matchNum);
214
215 return result;
216 }
217
218 protected FieldSearchQuery fedoraSearch(String query_terms, String matchFields) {
219
220 FieldSearchQuery fedora_query=new FieldSearchQuery();
221 try {
222 // check if query contains any fields name (pid, label, fType....)
223 if (query_terms.matches("^("+ matchFields+").+")){
224 logger.info("Implementing Specific Query....");
225
226 List conditions=fedora.server.search.Condition.getConditions(query_terms);
227
228 Condition[] cond=new Condition[conditions.size()];
229 for (int i=0; i<conditions.size(); i++) {
230 fedora.server.search.Condition c = (fedora.server.search.Condition) conditions.get(i);
231 try {
232 String operator = transOperator(c.getOperator().getAbbreviation());
233 cond[i] = new Condition();
234 cond[i].setProperty(c.getProperty());
235 cond[i].setOperator(ComparisonOperator.fromValue(operator));
236 cond[i].setValue(c.getValue());
237 } catch (Exception e){
238 e.printStackTrace();
239 }
240 }
241 fedora_query.setConditions(cond);
242 } else {
243 logger.info("Implementing Simple Query...");
244 fedora_query.setTerms(query_terms);
245 }
246 } catch (Exception e){
247 e.printStackTrace();
248 }
249 return fedora_query;
250 }
251
252 protected void getIndexData(ArrayList index_ids, ArrayList index_names,String lang){
253 index_ids.add("kw");
254 index_ids.add("au");
255 index_ids.add("su");
256 index_ids.add("ti");
257 index_ids.add("de");
258 index_ids.add("fu");
259 index_names.add(getTextString("param."+FIELD_PARAM+".kw", lang));
260 index_names.add(getTextString("param."+FIELD_PARAM+".au", lang));
261 index_names.add(getTextString("param."+FIELD_PARAM+".su", lang));
262 index_names.add(getTextString("param."+FIELD_PARAM+".ti", lang));
263 index_names.add(getTextString("param."+FIELD_PARAM+".de", lang));
264 index_names.add(getTextString("param."+FIELD_PARAM+".fu", lang));
265 }
266
267 protected String getDocType (String node_id){
268 return node_id;
269 }
270 protected boolean hasChildren(String node_id){
271 return false;
272 }
273
274 protected boolean hasParent(String node_id){
275 return false;
276 }
277 private String transOperator(String operator){
278 String oper_char ="";
279 if (operator == "~") {
280 oper_char = "has";
281 } else if (operator == "=") {
282 oper_char = "eq";
283 } else if (operator == ">"){
284 oper_char = "gt";
285 } else if (operator == ">="){
286 oper_char = "ge";
287 } else if (operator == "<"){
288 oper_char = "lt";
289 } else if (operator == "<="){
290 oper_char = "le";
291 }
292 return oper_char;
293 }
294 protected String join( String[] array, String delim ) {
295 String j = "";
296 for ( int i=0; i<array.length; i++ ) {
297 if (i!=0) j += delim;
298 j += array[i];
299 }
300 return j;
301 }
302}
Note: See TracBrowser for help on using the repository browser.