Changeset 3894
- Timestamp:
- 2003-03-18T15:00:58+12:00 (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gsdl3/src/java/org/greenstone/gsdl3/action/BrowseAction.java
r3868 r3894 5 5 // XML classes 6 6 import org.w3c.dom.Node; 7 import org.w3c.dom.NodeList; 7 8 import org.w3c.dom.Document; 8 9 import org.w3c.dom.Element; … … 51 52 Document style_doc = converter_.getDOM(new File(stylesheet)); 52 53 54 // the first part of the data for the page is the cgi-params 55 Element cgi_request = (Element)doc_.importNode(request, true); 56 page.appendChild(cgi_request); 57 53 58 // extract the params from the cgi-request, and check that we have a coll specified 54 59 Element cgi_paramList = (Element)GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); … … 62 67 63 68 } 64 65 // get the service info from the MR - this will probably need to be cached somehow later on. 66 67 Element mr_info_message = doc_.createElement(GSXML.MESSAGE_ELEM); 68 Element mr_info_request = doc_.createElement(GSXML.REQUEST_ELEM); 69 mr_info_message.appendChild(mr_info_request); 70 mr_info_request.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_DESCRIBE); 71 mr_info_request.setAttribute(GSXML.LANG_ATT, request.getAttribute(GSXML.LANG_ATT)); 72 73 String to = collection; 74 to = GSPath.appendLink(to, service_name); 75 mr_info_request.setAttribute(GSXML.TO_ATT, to); 76 77 Element mr_info_response = (Element) mr_.process(mr_info_message); 78 79 String path = GSXML.RESPONSE_ELEM; 80 path = GSPath.appendLink(path, GSXML.SERVICE_ELEM); 81 82 Element description = (Element)doc_.importNode(GSXML.getNodeByPath(mr_info_response, path), true); 83 84 // the first part of the data for the page is the cgi-params 85 Element cgi_request = (Element)doc_.importNode(request, true); 86 page.appendChild(cgi_request); 87 69 70 String lang = request.getAttribute(GSXML.LANG_ATT); 71 String to = GSPath.appendLink(collection, service_name); 72 73 // the second part of the page is the service description 74 // for now get this again from the service. 75 // this will probably need to be cached somehow later on. 76 77 Element info_message = createDescribeRequest(to, lang, null); 78 Element info_response = (Element) mr_.process(info_message); 79 String path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.SERVICE_ELEM); 80 Element description = (Element)doc_.importNode(GSXML.getNodeByPath(info_response, path), true); 88 81 page.appendChild(description); 89 90 // if there is a cl field in the cgi params, get the classifier info 91 String node = (String)params.get(CLASSIFIER_ARG); 92 93 if (node!=null && !node.equals("")) { 94 95 // get the info for the selected node 96 Element mr_query_message = doc_.createElement(GSXML.MESSAGE_ELEM); 97 Element mr_query_request = doc_.createElement(GSXML.REQUEST_ELEM); 98 mr_query_message.appendChild(mr_query_request); 99 100 mr_query_request.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_QUERY); 101 mr_query_request.setAttribute(GSXML.TO_ATT, to); 102 mr_query_request.setAttribute(GSXML.LANG_ATT, request.getAttribute(GSXML.LANG_ATT)); 103 104 105 // paramList - empty for now 106 Element paramList = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 107 mr_query_request.appendChild(paramList); 108 109 Element document_list = doc_.createElement(GSXML.CLASS_NODE_ELEM+GSXML.LIST_MODIFIER); 110 Element document = doc_.createElement(GSXML.CLASS_NODE_ELEM); 111 document.setAttribute(GSXML.CLASS_NODE_ID_ATT, node); 112 document_list.appendChild(document); 113 mr_query_request.appendChild(document_list); 114 115 Element mr_query_response = (Element)mr_.process(mr_query_message); 116 117 Element response = (Element)GSXML.getChildByTagName(mr_query_response, GSXML.RESPONSE_ELEM); 118 Node new_style = GSXML.getChildByTagName(response, GSXML.STYLESHEET_ELEM); 119 if (new_style !=null) { 120 GSXSLT.mergeStylesheets(style_doc, (Element)new_style); 121 response.removeChild(new_style); 122 } 123 // add the response to the page data 124 page.appendChild(doc_.importNode(response, true)); 125 126 } 127 82 83 84 // Element info_message = doc_.createElement(GSXML.MESSAGE_ELEM); 85 // Element info_request = doc_.createElement(GSXML.REQUEST_ELEM); 86 // info_message.appendChild(info_request); 87 // info_request.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_DESCRIBE); 88 // info_request.setAttribute(GSXML.LANG_ATT, request.getAttribute(GSXML.LANG_ATT)); 89 90 // String to = collection; 91 // to = GSPath.appendLink(to, service_name); 92 // info_request.setAttribute(GSXML.TO_ATT, to); 93 94 95 // the main response for the page is in a response element 96 Element response = doc_.createElement(GSXML.RESPONSE_ELEM); 97 page.appendChild(response); 98 99 // get the node that the user has clicked on 100 String classifier_node = (String)params.get(CLASSIFIER_ARG); 101 102 // if the node is not defined, return the page that we have so far 103 if (classifier_node ==null || classifier_node.equals("")) { 104 GSXSLT.absoluteIncludePaths(style_doc, config_); 105 return (Element)transformer_.transform(style_doc, page); 106 } 107 108 109 // create a classifier elem to return in the page 110 Element page_classifier = doc_.createElement(GSXML.CLASSIFIER_ELEM); 111 response.appendChild(page_classifier); 112 113 // the id of the classifier is the top id of the selected node 114 String top_id = OID.getTop(classifier_node); 115 page_classifier.setAttribute(GSXML.NAME_ATT, top_id); 116 117 // get the browse structure for the selected node 118 Element classify_message = doc_.createElement(GSXML.MESSAGE_ELEM); 119 Element classify_request = doc_.createElement(GSXML.REQUEST_ELEM); 120 classify_message.appendChild(classify_request); 121 122 classify_request.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS); 123 classify_request.setAttribute(GSXML.TO_ATT, to); 124 classify_request.setAttribute(GSXML.LANG_ATT, lang); 125 126 127 //Create a parameter list to specify the required structure information 128 // for now, always get ancestors and children 129 Element param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 130 classify_request.appendChild(param_list); 131 Element param = doc_.createElement(GSXML.PARAM_ELEM); 132 param_list.appendChild(param); 133 param.setAttribute(GSXML.NAME_ATT, "structure"); 134 param.setAttribute(GSXML.VALUE_ATT, "ancestors"); 135 param = doc_.createElement(GSXML.PARAM_ELEM); 136 param_list.appendChild(param); 137 param.setAttribute(GSXML.NAME_ATT, "structure"); 138 param.setAttribute(GSXML.VALUE_ATT, "children"); 139 140 // put the classifier node into a classifier node list 141 Element classifier_list = doc_.createElement(GSXML.CLASS_NODE_ELEM+GSXML.LIST_MODIFIER); 142 Element classifier = doc_.createElement(GSXML.CLASS_NODE_ELEM); 143 classifier.setAttribute(GSXML.NODE_ID_ATT, classifier_node); 144 classifier_list.appendChild(classifier); 145 classify_request.appendChild(classifier_list); 146 147 // process the request 148 Element classify_response = (Element)mr_.process(classify_message); 149 // get the structure element 150 path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.CLASS_NODE_ELEM+GSXML.LIST_MODIFIER); 151 path = GSPath.appendLink(path, GSXML.CLASS_NODE_ELEM); 152 path = GSPath.appendLink(path, GSXML.DOC_NODE_STRUCTURE_ELEM); 153 // assume that we always get back the top level CL1 node - want to throw this away 154 path = GSPath.appendLink(path, GSXML.CLASS_NODE_ELEM); 155 Element cl_structure = (Element)GSXML.getNodeByPath(classify_response, 156 path); 157 if (cl_structure ==null) { 158 System.out.println("BrowseAction: classifier structure request returned no structure"); 159 160 // return the page so far 161 GSXSLT.absoluteIncludePaths(style_doc, config_); 162 return (Element)transformer_.transform(style_doc, page); 163 } 164 165 // add the classifier nodes from the structure request into teh page_classifier 166 NodeList cl_nodes = cl_structure.getChildNodes(); 167 for (int i=0; i<cl_nodes.getLength(); i++) { 168 Node n = cl_nodes.item(i); 169 if (n.getNodeType() == Node.TEXT_NODE) { 170 // ignore 171 continue; 172 } 173 page_classifier.appendChild(doc_.importNode(n, true)); 174 } 175 176 // get the metadata for each classifier node, 177 // then for each document node 178 Element metadata_message = doc_.createElement(GSXML.MESSAGE_ELEM); 179 180 boolean did_classifier = false; 181 boolean did_documents = false; 182 183 // Create a parameter list to specify the required metadata information 184 // for now get Title 185 Element meta_param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 186 Element meta_param = doc_.createElement(GSXML.PARAM_ELEM); 187 meta_param_list.appendChild(meta_param); 188 meta_param.setAttribute(GSXML.NAME_ATT, "metadata"); 189 meta_param.setAttribute(GSXML.VALUE_ATT, "Title"); 190 191 // if there are classifier nodes (I think there always will be) 192 // create a metadata request for the classifier, and add it to 193 // the the message 194 cl_nodes = page_classifier.getElementsByTagName(GSXML.CLASS_NODE_ELEM); 195 196 if (cl_nodes.getLength() > 0) { 197 did_classifier = true; 198 Element cl_meta_request = doc_.createElement(GSXML.REQUEST_ELEM); 199 metadata_message.appendChild(cl_meta_request); 200 cl_meta_request.setAttribute(GSXML.TO_ATT, to+"MetadataRetrieve"); 201 cl_meta_request.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS); 202 cl_meta_request.setAttribute(GSXML.LANG_ATT, lang); 203 204 cl_meta_request.appendChild(meta_param_list); 205 206 Element new_cl_nodes_list = doc_.createElement(GSXML.CLASS_NODE_ELEM+GSXML.LIST_MODIFIER); 207 cl_meta_request.appendChild(new_cl_nodes_list); 208 209 for (int c=0; c<cl_nodes.getLength(); c++) { 210 211 Element cl = doc_.createElement(GSXML.CLASS_NODE_ELEM); 212 cl.setAttribute(GSXML.NODE_ID_ATT, ((Element)cl_nodes.item(c)).getAttribute(GSXML.NODE_ID_ATT)); 213 new_cl_nodes_list.appendChild(cl); 214 } 215 } 216 217 // if there are document nodes in the classification (happens 218 // sometimes), create a second request for document metadata and 219 // append to the message 220 NodeList doc_nodes = page_classifier.getElementsByTagName(GSXML.DOC_NODE_ELEM); 221 if (doc_nodes.getLength() > 0) { 222 did_documents = true; 223 Element doc_meta_request = doc_.createElement(GSXML.REQUEST_ELEM); 224 metadata_message.appendChild(doc_meta_request); 225 doc_meta_request.setAttribute(GSXML.TO_ATT, GSPath.appendLink(collection, "DocumentMetadataRetrieve")); 226 doc_meta_request.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS); 227 doc_meta_request.setAttribute(GSXML.LANG_ATT, lang); 228 229 // for now, use the same metadata list - this will probably change once we look at format statements 230 doc_meta_request.appendChild(meta_param_list.cloneNode(true)); 231 232 Element doc_list = doc_.createElement(GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER); 233 doc_meta_request.appendChild(doc_list); 234 235 for (int c=0; c<doc_nodes.getLength(); c++) { 236 237 Element d = doc_.createElement(GSXML.DOC_NODE_ELEM); 238 d.setAttribute(GSXML.NODE_ID_ATT, ((Element)doc_nodes.item(c)).getAttribute(GSXML.NODE_ID_ATT)); 239 doc_list.appendChild(d); 240 } 241 242 } 243 244 // process the metadata requests 245 Element metadata_response = (Element)mr_.process(metadata_message); 246 if (did_classifier) { 247 // the classifier one will be the first response 248 // add the metadata lists for each node back into the 249 // page_classifier nodes 250 path = GSPath.appendLink(GSXML.RESPONSE_ELEM, 251 GSXML.CLASS_NODE_ELEM+GSXML.LIST_MODIFIER); 252 NodeList meta_response_cls = GSXML.getNodeByPath(metadata_response, path).getChildNodes(); 253 for (int i = 0; i < cl_nodes.getLength(); i++) { 254 GSXML.mergeMetadataLists(cl_nodes.item(i), meta_response_cls.item(i)); 255 } 256 } 257 if (did_documents) { 258 NodeList meta_response_docs = null; 259 if (!did_classifier) { 260 // its the first response 261 path = GSPath.appendLink(GSXML.RESPONSE_ELEM, 262 GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER); 263 meta_response_docs = GSXML.getNodeByPath(metadata_response, path).getChildNodes(); 264 } else { // its the second response 265 meta_response_docs = GSXML.getChildByTagName(metadata_response.getElementsByTagName(GSXML.RESPONSE_ELEM).item(1), GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER).getChildNodes(); 266 } 267 268 for (int i = 0; i < doc_nodes.getLength(); i++) { 269 GSXML.mergeMetadataLists(doc_nodes.item(i), meta_response_docs.item(i)); 270 } 271 } 272 273 274 //Node new_style = GSXML.getChildByTagName(response, GSXML.STYLESHEET_ELEM); 275 //if (new_style !=null) { 276 // GSXSLT.mergeStylesheets(style_doc, (Element)new_style); 277 // response.removeChild(new_style); 278 //} 279 // add the response to the page data 280 //page.appendChild(doc_.importNode(response, true)); 281 282 283 // transform the page 128 284 GSXSLT.absoluteIncludePaths(style_doc, config_); 129 130 //System.out.println("page="); 285 //System.out.println("browse page="); 131 286 //System.out.println(converter_.getString(page)); 132 287 return (Element)transformer_.transform(style_doc, page);
Note:
See TracChangeset
for help on using the changeset viewer.