source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/CrossCollectionSearch.java@ 32655

Last change on this file since 32655 was 32655, checked in by kjdon, 5 years ago

add collection attribute to snippet elements. group names come in like group.grp1.grp2 - remove group. prefix, and convert . to / to match up with internal group paths.

  • Property svn:keywords set to Author Date Id Revision
File size: 14.9 KB
Line 
1
2 else
3 {
4 if (last_node == null)
5 {
6 last_node = (Element) GSXML.getChildByTagName(doc_node_list, GSXML.DOC_NODE_ELEM);
7 }
8 last_node = GSXML.insertIntoOrderedList(doc_node_list, GSXML.DOC_NODE_ELEM, last_node, this_node, "rank", true);
9 }
10
11 }
12 NodeList hl_snippet_list = ((Element) responses.item(k)).getElementsByTagName(GSXML.HL_SNIPPET_ELEM);
13 if (hl_snippet_list != null) {
14 for (int hls = 0; hls < hl_snippet_list.getLength(); hls++) {
15 Element this_hls = (Element) hl_snippet_list.item(hls);
16 this_hls.setAttribute("collection", coll_name);
17 result_snippet_list.appendChild(result_doc.importNode(this_hls, true));
18 }
19 }
20
21 }
22 // just send back num docs returned. Too hard to work out number of matches etc as each index type
23 // does it differently
24 Element metadata_list = result_doc.createElement(GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
25 result.appendChild(metadata_list);
26 GSXML.addMetadata(metadata_list, "numDocsReturned", "" + num_docs);
27 return result;
28 }
29
30 // protected Element processAdvTextQuery(Element request)
31 // {
32
33 // }
34
35
36
37 protected boolean initCollectionList(String lang)
38 {
39 UserContext userContext = new UserContext();
40 userContext.setLanguage(lang);
41 userContext.setUserID("");
42
43 // first, get the message router info
44 Document msg_doc = XMLConverter.newDOM();
45 Element coll_list_message = msg_doc.createElement(GSXML.MESSAGE_ELEM);
46 Element coll_list_request = GSXML.createBasicRequest(msg_doc, GSXML.REQUEST_TYPE_DESCRIBE, "", userContext); // uid
47 coll_list_message.appendChild(coll_list_request);
48 //logger.debug("coll list request = " + this.converter.getPrettyString(coll_list_request));
49 Element coll_list_response = (Element) this.router.process(coll_list_message);
50 if (coll_list_response == null)
51 {
52 logger.error("couldn't query the message router!");
53 return false;
54 }
55 //logger.debug("coll list response = " + this.converter.getPrettyString(coll_list_response));
56 // second, get some info from each collection. we want the coll name
57 // and whether its got a text query service
58
59 NodeList colls = coll_list_response.getElementsByTagName(GSXML.COLLECTION_ELEM);
60 // we can send the same request to multiple collections at once by using a comma separated list
61 Element metadata_message = msg_doc.createElement(GSXML.MESSAGE_ELEM);
62 StringBuffer colls_sb = new StringBuffer();
63 for (int i = 0; i < colls.getLength(); i++)
64 {
65 Element c = (Element) colls.item(i);
66 String name = c.getAttribute(GSXML.NAME_ATT);
67 if (i != 0)
68 {
69 colls_sb.append(",");
70 }
71 colls_sb.append(name);
72 //Element metadata_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, name, userContext);
73 //metadata_message.appendChild(metadata_request);
74 }
75
76 Element metadata_request = GSXML.createBasicRequest(msg_doc, GSXML.REQUEST_TYPE_DESCRIBE, colls_sb.toString(), userContext);
77 metadata_message.appendChild(metadata_request);
78 //logger.debug("metadata request = " + this.converter.getPrettyString(metadata_message));
79 Element metadata_response = (Element) this.router.process(metadata_message);
80 //logger.debug("metadata response = " + this.converter.getPrettyString(metadata_response));
81 NodeList coll_responses = metadata_response.getElementsByTagName(GSXML.RESPONSE_ELEM);
82 ArrayList<String> valid_colls = new ArrayList<String>();
83 ArrayList<String> valid_coll_names = new ArrayList<String>();
84 for (int i = 0; i < coll_responses.getLength(); i++)
85 {
86 Element response = (Element) coll_responses.item(i);
87 Element coll = (Element) GSXML.getChildByTagName(response, GSXML.COLLECTION_ELEM);
88 Element service_list = (Element) GSXML.getChildByTagName(coll, GSXML.SERVICE_ELEM + GSXML.LIST_MODIFIER);
89 if (service_list == null)
90 continue;
91 Element query_service = GSXML.getNamedElement(service_list, GSXML.SERVICE_ELEM, GSXML.NAME_ATT, TEXT_QUERY_SERVICE); // should be AbstractTextSearch.TEXT_QUERY_SERVICE
92 if (query_service == null)
93 continue;
94 // use the name of the response in case we are talking to a remote collection, not the name of the collection.
95 String coll_id = response.getAttribute(GSXML.FROM_ATT);
96 String coll_name = getDisplayText(coll, GSXML.DISPLAY_TEXT_NAME, lang, "en");
97 valid_colls.add(coll_id);
98 valid_coll_names.add(coll_name);
99 }
100
101 this.coll_names_map = new HashMap<String, String[]>();
102
103 // ids no all has the list without 'all' option.
104 this.coll_ids_list_no_all = new String[1];
105 this.coll_ids_list_no_all = valid_colls.toArray(coll_ids_list_no_all);
106
107 valid_colls.add(0, "all");
108 valid_coll_names.add(0, getTextString("param." + COLLECTION_PARAM + ".all", lang));
109
110 this.coll_ids_list = new String[1];
111 this.coll_ids_list = valid_colls.toArray(coll_ids_list);
112
113 String[] coll_names_list = new String[1];
114 coll_names_list = valid_coll_names.toArray(coll_names_list);
115 this.coll_names_map.put(lang, coll_names_list);
116 return true;
117 }
118
119 protected void addCollectionNames(String lang)
120 {
121
122 UserContext userContext = new UserContext();
123 userContext.setLanguage(lang);
124 userContext.setUserID("");
125
126 ArrayList<String> coll_names = new ArrayList<String>();
127 coll_names.add(getTextString("param." + COLLECTION_PARAM + ".all", lang));
128
129 // need to request MR for collection descriptions
130 Document msg_doc = XMLConverter.newDOM();
131 Element metadata_message = msg_doc.createElement(GSXML.MESSAGE_ELEM);
132
133 // get a comma separated list of coll ids to send to MR
134 // the first item is the place holder for 'all'
135 StringBuffer colls_sb = new StringBuffer();
136 for (int i = 1; i < coll_ids_list.length; i++)
137 {
138 if (i != 1)
139 {
140 colls_sb.append(",");
141 }
142 colls_sb.append(coll_ids_list[i]);
143 }
144 Element metadata_request = GSXML.createBasicRequest(msg_doc, GSXML.REQUEST_TYPE_DESCRIBE, colls_sb.toString(), userContext);
145 // param_list to request just displayTextList
146 Element param_list = msg_doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
147 Element param = GSXML.createParameter(msg_doc, GSXML.SUBSET_PARAM, GSXML.DISPLAY_TEXT_ELEM + GSXML.LIST_MODIFIER);
148 param_list.appendChild(param);
149 metadata_request.appendChild(param_list);
150 metadata_message.appendChild(metadata_request);
151 //logger.debug("coll names metadata request = " + this.converter.getPrettyString(metadata_message));
152 Element metadata_response = (Element) this.router.process(metadata_message);
153 //logger.debug("coll names metadata response = " + this.converter.getPrettyString(metadata_response));
154 NodeList coll_responses = metadata_response.getElementsByTagName(GSXML.RESPONSE_ELEM);
155 for (int i = 0; i < coll_responses.getLength(); i++)
156 {
157 Element response = (Element) coll_responses.item(i);
158 Element coll = (Element) GSXML.getChildByTagName(response, GSXML.COLLECTION_ELEM);
159 String coll_name = getDisplayText(coll, GSXML.DISPLAY_TEXT_NAME, lang, "en");
160 coll_names.add(coll_name);
161 }
162
163 String[] coll_names_list = new String[1];
164 coll_names_list = coll_names.toArray(coll_names_list);
165 this.coll_names_map.put(lang, coll_names_list);
166
167 }
168
169 protected Element processDocumentMetadataRetrieve(Element request)
170 {
171 // Create a new (empty) result message
172 Document result_doc = XMLConverter.newDOM();
173 Element result = result_doc.createElement(GSXML.RESPONSE_ELEM);
174 result.setAttribute(GSXML.FROM_ATT, DOCUMENT_METADATA_RETRIEVE_SERVICE);
175 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
176
177 UserContext userContext = new UserContext(request);
178 // Get the parameters of the request
179 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
180 if (param_list == null)
181 {
182 logger.error("DocumentMetadataRetrieve request had no paramList.");
183 return result; // Return the empty result
184 }
185
186 NodeList query_doc_list = request.getElementsByTagName(GSXML.DOC_NODE_ELEM);
187 if (query_doc_list.getLength() == 0)
188 {
189 logger.error("DocumentMetadataRetrieve request had no documentNodes.");
190 return result; // Return the empty result
191 }
192
193 // the resulting doc node list
194 Element result_node_list = result_doc.createElement(GSXML.DOC_NODE_ELEM + GSXML.LIST_MODIFIER);
195 result.appendChild(result_node_list);
196
197
198 // organise the nodes into collection lists
199 HashMap<String, Node> coll_map = new HashMap<String, Node>();
200
201 for (int i = 0; i < query_doc_list.getLength(); i++)
202 {
203 Element doc_node = (Element) query_doc_list.item(i);
204 String coll_name = doc_node.getAttribute("collection");
205 Element coll_items = (Element) coll_map.get(coll_name);
206 if (coll_items == null)
207 {
208 coll_items = result_doc.createElement(GSXML.DOC_NODE_ELEM + GSXML.LIST_MODIFIER);
209 coll_map.put(coll_name, coll_items);
210 }
211 coll_items.appendChild(result_doc.importNode(doc_node, true));
212 }
213
214 // create teh individual requests
215 Document msg_doc = XMLConverter.newDOM();
216 Element meta_request_message = msg_doc.createElement(GSXML.MESSAGE_ELEM);
217
218 Set mapping_set = coll_map.entrySet();
219 Iterator iter = mapping_set.iterator();
220
221 while (iter.hasNext())
222 {
223 Map.Entry e = (Map.Entry) iter.next();
224 String cname = (String) e.getKey();
225 Element doc_nodes = (Element) e.getValue();
226 Element meta_request = GSXML.createBasicRequest(msg_doc, GSXML.REQUEST_TYPE_PROCESS, GSPath.appendLink(cname, DOCUMENT_METADATA_RETRIEVE_SERVICE), userContext);
227 meta_request.appendChild(msg_doc.importNode(doc_nodes, true));
228 meta_request.appendChild(msg_doc.importNode(param_list, true));
229 meta_request_message.appendChild(meta_request);
230
231 }
232
233 Node meta_result_node = this.router.process(meta_request_message);
234 Element meta_result = GSXML.nodeToElement(meta_result_node);
235
236 // now need to put the doc nodes back in the right order
237 // go through the original list again. keep an element pointer to
238 // the next element in each collections list
239 NodeList meta_responses = meta_result.getElementsByTagName(GSXML.RESPONSE_ELEM);
240 for (int i = 0; i < meta_responses.getLength(); i++)
241 {
242 String collname = GSPath.removeLastLink(((Element) meta_responses.item(i)).getAttribute(GSXML.FROM_ATT));
243 Element first_elem = (Element) GSXML.getNodeByPath(meta_responses.item(i), "documentNodeList/documentNode");
244 coll_map.put(collname, first_elem);
245 }
246
247 for (int i = 0; i < query_doc_list.getLength(); i++)
248 {
249 Element doc_node = (Element) query_doc_list.item(i);
250 Element new_node = (Element) result_doc.importNode(doc_node, false);
251 result_node_list.appendChild(new_node);
252 String coll_name = doc_node.getAttribute("collection");
253
254 Element meta_elem = (Element) coll_map.get(coll_name);
255 GSXML.mergeMetadataLists(new_node, meta_elem);
256 coll_map.put(coll_name, meta_elem.getNextSibling());
257 }
258 return result;
259 }
260
261 private String[] mergeGroups(UserContext userContext, Element paramList, String[] collArray){
262 Document doc = XMLConverter.newDOM();
263 boolean allSelected = false;
264 Element groupParamList = extractGroupParams(paramList, collArray, doc);
265 Element collParam = GSXML.getNamedElement(paramList, GSXML.PARAM_ELEM, GSXML.NAME_ATT, COLLECTION_PARAM);
266 if (collParam != null) {
267 String collValue = GSXML.getValue(collParam);
268 if (collValue != null) {
269 allSelected = collValue.matches(".*\\ball\\b.*");
270 }
271 }
272 //Group param not empty and coll param null or not 'all'
273 if ( allSelected || !groupParamList.hasChildNodes())
274 {
275 return collArray;
276 }
277 //GroupInfo service to get uniq collections
278 String uniqCollServiceName = "UniqueCollections";
279 Element infoResponse = getMRInfo(userContext);
280 Element serviceList = (Element) GSXML.getChildByTagName(infoResponse, GSXML.SERVICE_ELEM + GSXML.LIST_MODIFIER);
281 if (serviceList == null) {
282 logger.error("Service list is null!");
283 return collArray;
284 }
285 Element groupInfoService = GSXML.getNamedElement(serviceList, GSXML.SERVICE_ELEM, GSXML.NAME_ATT, uniqCollServiceName);
286 if (groupInfoService == null){
287 logger.error("UniqueCollections service unavailable; Check your groupConfig.xml");
288 return collArray;
289 }
290 Element groupQueryMessage = doc.createElement(GSXML.MESSAGE_ELEM);
291 Element groupQueryRequest = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_PROCESS, uniqCollServiceName, userContext);
292 groupQueryMessage.appendChild(groupQueryRequest);
293 groupQueryRequest.appendChild(groupParamList);
294 if (collParam != null){
295 groupParamList.appendChild(doc.importNode(GSXML.getNamedElement(paramList, GSXML.PARAM_ELEM, GSXML.NAME_ATT, GSXML.COLLECTION_ELEM), true));
296 }
297 Element groupQueryResult = (Element) this.router.process(groupQueryMessage);
298 Element groupQueryResponse = (Element) GSXML.getChildByTagName(groupQueryResult, GSXML.RESPONSE_ELEM);
299 Element collList = (Element) GSXML.getChildByTagName(groupQueryResponse, GSXML.COLLECTION_ELEM + GSXML.LIST_MODIFIER);
300 NodeList collections = GSXML.getChildrenByTagName(collList, GSXML.COLLECTION_ELEM);
301 collArray = new String[collections.getLength()];
302 for (int i = 0; i < collections.getLength(); i++){
303 String collName = ((Element) collections.item(i)).getAttribute(GSXML.NAME_ATT);
304 collArray[i] = collName;
305 }
306 return collArray;
307
308 }
309
310 private Element extractGroupParams(Element paramList, String[] collArray, Document doc) {
311 Element groupParamList = doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
312 Element groupParam = null;
313 Element groupNode = GSXML.getNamedElement(paramList, GSXML.PARAM_ELEM, GSXML.NAME_ATT, GROUP_PARAM);
314 if (groupNode != null){
315 groupParam = (Element) doc.importNode(groupNode, true);
316 groupParamList.appendChild(groupParam);
317 } else {
318 groupParam = doc.createElement(GSXML.PARAM_ELEM);
319 groupParam.setAttribute(GSXML.NAME_ATT, GSXML.GROUP_ELEM);
320 groupParamList.appendChild(groupParam);
321 }
322 String prefix = GSXML.GROUP_ELEM + ".";
323 for (int i = 0; i < collArray.length; i++) {
324 String collectionParam = collArray[i];
325 if (collectionParam.startsWith(prefix)){
326 String value = groupParam.getAttribute(GSXML.VALUE_ATT);
327 String group = collectionParam.substring(prefix.length() - 1 );
328 group=group.replace('.', '/'); // we use . instead of / in args
329 value += "," + group;
330 groupParam.setAttribute(GSXML.VALUE_ATT, value);
331 }
332 }
333 return groupParamList;
334 }
335
336 private Element getMRInfo(UserContext userContext){
337 Document doc = XMLConverter.newDOM();
338 Element infoMessage = doc.createElement(GSXML.MESSAGE_ELEM);
339 Element infoRequest = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_DESCRIBE, "", userContext);
340 Element paramList = doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
341 infoRequest.appendChild(paramList);
342 GSXML.addParameterToList(paramList, GSXML.SUBSET_PARAM, GSXML.SERVICE_ELEM + GSXML.LIST_MODIFIER);
343 infoMessage.appendChild(infoRequest);
344 Element responseMessage = (Element) this.router.process(infoMessage);
345 if (responseMessage == null)
346 {
347 logger.error("couldn't query the message router!");
348 return null;
349 }
350 Element infoResponse = (Element) GSXML.getChildByTagName(responseMessage, GSXML.RESPONSE_ELEM);
351 if (infoResponse == null)
352 {
353 logger.error("response from message router is null!");
354 return null;
355 }
356
357 return infoResponse;
358
359 }
360
361}
Note: See TracBrowser for help on using the repository browser.