- Timestamp:
- 2005-05-04T15:37:29+12:00 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ant-install-branch/gsdl3/src/java/org/greenstone/gsdl3/action/QueryAction.java
r9794 r9807 60 60 String to = GSPath.appendLink(collection, service_name); 61 61 62 // part of the response is the service description 63 // for now get this again from the service. 64 // this will probably need to be cached somehow later on. 65 Element mr_info_message = this.doc.createElement(GSXML.MESSAGE_ELEM); 66 Element mr_info_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, to, lang, uid); 67 mr_info_message.appendChild(mr_info_request); 68 62 if (request_type.indexOf("d")!=-1) { 63 // we have been asked for the service description 64 Element mr_info_message = this.doc.createElement(GSXML.MESSAGE_ELEM); 65 Element mr_info_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, to, lang, uid); 66 mr_info_message.appendChild(mr_info_request); 67 68 // process the message 69 Element mr_info_response = (Element) this.mr.process(mr_info_message); 70 // the response 71 Element service_response = (Element)GSXML.getChildByTagName(mr_info_response, GSXML.RESPONSE_ELEM); 72 73 Element service_description = (Element)this.doc.importNode(GSXML.getChildByTagName(service_response, GSXML.SERVICE_ELEM), true); 74 page_response.appendChild(service_description); 75 } 76 77 if (request_type.indexOf("r") == -1) { 78 // just a display request, no actual processing to do 79 return page_response; 80 } 81 82 // check that we have some service params 83 HashMap service_params = (HashMap)params.get("s1"); 84 if (service_params == null) { // no query 85 return page_response; 86 } 87 88 // create the query request 89 Element mr_query_message = this.doc.createElement(GSXML.MESSAGE_ELEM); 90 Element mr_query_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, to, lang, uid); 91 mr_query_message.appendChild(mr_query_request); 92 93 Element query_param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER); 94 GSXML.addParametersToList(this.doc, query_param_list, service_params); 95 mr_query_request.appendChild(query_param_list); 96 69 97 // also get the format stuff now if there is some 70 98 Element format_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_FORMAT, to, lang, uid); 71 mr_info_message.appendChild(format_request); 72 73 // process the messages 74 Element mr_info_response = (Element) this.mr.process(mr_info_message); 75 76 // the two responses 77 NodeList responses = mr_info_response.getElementsByTagName(GSXML.RESPONSE_ELEM); 78 Element service_response = (Element)responses.item(0); 79 Element format_response = (Element)responses.item(1); 80 81 Element service_description = (Element)this.doc.importNode(GSXML.getChildByTagName(service_response, GSXML.SERVICE_ELEM), true); 82 page_response.appendChild(service_description); 83 84 if (request_type.equals("d")) {// just a display request 85 return page_response; 86 } 87 99 mr_query_message.appendChild(format_request); 100 101 // do the query 102 Element mr_query_response = (Element)this.mr.process(mr_query_message); 103 104 // check for errors 105 if (processErrorElements(mr_query_response, page_response)) { 106 return page_response; 107 } 108 109 NodeList responses = mr_query_response.getElementsByTagName(GSXML.RESPONSE_ELEM); 110 Element query_response = (Element) responses.item(0); 111 Element format_response = (Element) responses.item(1); 112 113 Element query_result_metadata_list = (Element) GSXML.getChildByTagName(query_response, GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER); 114 if (query_result_metadata_list == null) { 115 System.err.println("QueryAction: Warning: No query result metadata.\n"); 116 } else { // add it into the page response 117 page_response.appendChild(this.doc.importNode(query_result_metadata_list, true)); 118 } 119 120 Element query_term_info_list = (Element) GSXML.getChildByTagName(query_response, GSXML.TERM_ELEM+GSXML.LIST_MODIFIER); 121 if (query_term_info_list == null) { 122 System.err.println("QueryAction: Warning: No query term information.\n"); 123 } else { // add it into the page response 124 page_response.appendChild(this.doc.importNode(query_term_info_list, true)); 125 } 126 127 // check that there are some documents - for now check the list, but later should use a numdocs metadata elem 128 Element document_list = (Element)GSXML.getChildByTagName(query_response, GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER); 129 // documentList not present if no docs found 130 if (document_list == null) { 131 return page_response; 132 } 133 134 // now we check to see if there is metadata already - some search services return predefined metadata. if there is some, don't do a metadata request 135 NodeList doc_metadata = document_list.getElementsByTagName(GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER); 136 if (doc_metadata.getLength()>0) { 137 System.err.println("have already found metadata!"); 138 // append the doc list to the result 139 page_response.appendChild(this.doc.importNode(document_list, true)); 140 return page_response; 141 } 142 143 // get the metadata elements needed from the format statement if any 88 144 HashSet metadata_names = new HashSet(); 89 145 metadata_names.add("Title"); … … 98 154 extractMetadataNames(format_elem, metadata_names); 99 155 } 100 101 // do the query102 Element mr_query_message = this.doc.createElement(GSXML.MESSAGE_ELEM);103 Element mr_query_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, to, lang, uid);104 mr_query_message.appendChild(mr_query_request);105 106 // paramList107 HashMap service_params = (HashMap)params.get("s1");108 if (service_params == null) { // no query109 return page_response;110 }111 Element query_param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);112 GSXML.addParametersToList(this.doc, query_param_list, service_params);113 ///ystem.out.println("service params are "+this.converter.getString(query_param_list));114 mr_query_request.appendChild(query_param_list);115 116 // do the query117 Element mr_query_response = (Element)this.mr.process(mr_query_message);118 119 //. check for errors120 String path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.ERROR_ELEM);121 Element error_elem = (Element) GSXML.getNodeByPath(mr_query_response, path);122 if (error_elem != null) {123 // should we continue?? perhaps have a kind of error - information vs fatal??124 System.err.println("found an error elem");125 page_response.appendChild(this.doc.importNode(error_elem, true));126 return page_response;127 }128 path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);129 Element query_result_metadata_list = (Element) GSXML.getNodeByPath(mr_query_response, path);130 if (query_result_metadata_list == null) {131 System.err.println("QueryAction: Warning: No query result metadata.\n");132 } else { // add it into the page response133 page_response.appendChild(this.doc.importNode(query_result_metadata_list, true));134 }135 136 path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.TERM_ELEM+GSXML.LIST_MODIFIER);137 Element query_term_info_list = (Element) GSXML.getNodeByPath(mr_query_response, path);138 if (query_term_info_list == null) {139 System.err.println("QueryAction: Warning: No query term information.\n");140 } else { // add it into the page response141 page_response.appendChild(this.doc.importNode(query_term_info_list, true));142 }143 144 // check that there are some documents - for now check the list, but later should use a numdocs metadata elem145 path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER);146 147 Element document_list = (Element)GSXML.getNodeByPath(mr_query_response,148 path);149 // documentList not present if no docs found150 if (document_list == null) {151 return page_response;152 }153 156 154 157 // paging of the results is done here - we filter the list to remove unwanted entries before retrieving metadata 155 Element filtered_doc_list = filterDocList(params, service_description, document_list); 156 157 // now we check to see if there is metadata already - some search services return predefined metadata. if there is some, don't do a metadata request 158 NodeList doc_metadata = document_list.getElementsByTagName(GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER); 159 if (doc_metadata.getLength()>0) { 160 System.err.println("have already found metadata!"); 161 // append the doc list to the result 162 page_response.appendChild(this.doc.importNode(document_list, true)); 163 return page_response; 164 } 158 Element filtered_doc_list = filterDocList(params, service_params, document_list); 159 165 160 // do the metadata request on the filtered list 166 161 Element mr_metadata_message = this.doc.createElement(GSXML.MESSAGE_ELEM); … … 176 171 mr_metadata_request.appendChild(dm_param_list); 177 172 178 179 173 // add in the doc node list too 180 174 mr_metadata_request.appendChild(filtered_doc_list); 181 175 182 176 Element mr_metadata_response = (Element) this.mr.process(mr_metadata_message); 183 184 path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER); 185 Element query_result_document_list = (Element) GSXML.getNodeByPath(mr_metadata_response, path); 186 177 // check for errors 178 processErrorElements(mr_metadata_response, page_response); 179 180 Element metadata_response = (Element) GSXML.getChildByTagName(mr_metadata_response, GSXML.RESPONSE_ELEM); 181 182 Element query_result_document_list = (Element) GSXML.getChildByTagName(metadata_response, GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER); 183 187 184 if (query_result_document_list != null) { 188 185 page_response.appendChild(this.doc.importNode(query_result_document_list, true)); 189 186 } 190 187 191 188 ///ystem.out.println("Query page:\n" + this.converter.getPrettyString(page_response)); 192 189 return page_response; … … 194 191 195 192 /** this filters out some of the doc results for result paging */ 196 protected Element filterDocList(HashMap params, Element service_description, Element orig_doc_list) { 197 198 // check in the service descripiton to see if hitsPerpage is a param 199 Element service_p_list = (Element)GSXML.getChildByTagName(service_description, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 200 Element hits_param = GSXML.getNamedElement(service_p_list, GSXML.PARAM_ELEM, GSXML.NAME_ATT, "hitsPerPage"); 201 202 boolean service_paging = false; 203 if (hits_param != null) { 204 service_paging = true; 205 } 206 if (service_paging) { 207 // the service is doing the paging, so we want to display all of teh returned docs 193 protected Element filterDocList(HashMap params, HashMap service_params, Element orig_doc_list) { 194 195 // check the hits_per_page param - is it a service param?? 196 String hits_pp = (String) service_params.get("hitsPerPage"); 197 if (hits_pp != null) { 198 // the service is doing the paging, so we want to display all of the returned docs 208 199 return (Element)this.doc.importNode(orig_doc_list, true); 209 200 } 210 201 211 Stringhits_pp = (String)params.get("hitsPerPage");202 hits_pp = (String)params.get("hitsPerPage"); 212 203 int hits = 20; 213 204 if (hits_pp != null && !hits_pp.equals("")) {
Note:
See TracChangeset
for help on using the changeset viewer.