- Timestamp:
- 2003-03-05T14:00:32+13:00 (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gsdl3/src/java/org/greenstone/gsdl3/service/GS2MGRetrieve.java
r3754 r3799 19 19 package org.greenstone.gsdl3.service; 20 20 21 // greenstone classes 21 22 // Greenstone classes 22 23 import org.greenstone.mg.*; 23 import org.greenstone.gdbm.*;24 24 import org.greenstone.gsdl3.util.*; 25 25 26 // xml classes 27 import org.w3c.dom.CDATASection; 28 import org.w3c.dom.Document; 29 import org.w3c.dom.Element; 30 import org.w3c.dom.Node; 31 import org.w3c.dom.NodeList; 32 import org.w3c.dom.Text; 26 // XML classes 27 import org.w3c.dom.Element; 33 28 34 // general Java classes29 // General Java classes 35 30 import java.io.File; 36 import java.util.HashMap; 31 37 32 38 33 /** … … 43 38 44 39 public class GS2MGRetrieve 45 extends ServiceRack{40 extends GS2Retrieve { 46 41 47 // the services on offer 48 // these strings must match what is found in the properties file 49 private static final String DOCUMENT_RETRIEVE_SERVICE = "DocumentRetrieve"; 50 private static final String METADATA_RETRIEVE_SERVICE = "MetadataRetrieve"; 51 52 // params used 42 // Parameters used 53 43 private static final String INDEX_PARAM = "index"; 54 44 55 // elements used in the config file that are specific to this class45 // Elements used in the config file that are specific to this class 56 46 private static final String DEFAULT_INDEX_ELEM = "defaultIndex"; 57 47 58 48 private MGWrapper mg_src_ = null; 59 private GDBMWrapper gdbm_src_ = null; 60 49 61 50 private String default_index_ = null; 62 51 63 52 64 53 /** constructor */ 65 public GS2MGRetrieve() { 54 public GS2MGRetrieve() 55 { 56 System.out.println("Constructing GS2MGRetrieve..."); 66 57 mg_src_ = new MGWrapper(); 67 gdbm_src_ = new GDBMWrapper();68 58 } 59 69 60 70 61 /** configure this service */ 71 62 public boolean configure(Element info) 72 63 { 73 System.out.println("configuring GS2MGRetrieve"); 64 // Do specific configuration 65 System.out.println("Configuring GS2MGRetrieve..."); 74 66 75 // get the default index out of <defaultIndex> (buildConfig.xml)67 // Get the default index out of <defaultIndex> (buildConfig.xml) 76 68 Element def = (Element) GSXML.getChildByTagName(info, DEFAULT_INDEX_ELEM); 77 69 if (def != null) { … … 84 76 System.out.println("Default index: " + default_index_); 85 77 86 Element e = null; 87 // these entries should reflect the build config file - some services may not be available depending on how the colleciton was built. 88 // set up short_service_info_ - for now just has name and type 89 e = doc_.createElement(GSXML.SERVICE_ELEM); 90 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE); 91 e.setAttribute(GSXML.NAME_ATT, DOCUMENT_RETRIEVE_SERVICE); 92 short_service_info_.appendChild(e); 93 94 e = doc_.createElement(GSXML.SERVICE_ELEM); 95 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE); 96 e.setAttribute(GSXML.NAME_ATT, METADATA_RETRIEVE_SERVICE); 97 short_service_info_.appendChild(e); 98 99 // set up service_info_map_ - for now, just has the same elements as above 100 // should have full details about each service incl params lists etc. 101 e = doc_.createElement(GSXML.SERVICE_ELEM); 102 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE); 103 e.setAttribute(GSXML.NAME_ATT, DOCUMENT_RETRIEVE_SERVICE); 104 service_info_map_.put(DOCUMENT_RETRIEVE_SERVICE, e); 105 106 e = doc_.createElement(GSXML.SERVICE_ELEM); 107 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE); 108 e.setAttribute(GSXML.NAME_ATT, METADATA_RETRIEVE_SERVICE); 109 service_info_map_.put(METADATA_RETRIEVE_SERVICE, e); 110 111 // Open GDBM database for querying 112 String gdbm_db_file = GSFile.GDBMDatabaseFile(site_home_, cluster_name_); 113 if (gdbm_src_.openDatabase(gdbm_db_file, GDBMWrapper.READER)) { 114 return true; 115 } 116 else { 117 System.err.println("Error: Could not open gdbm database!"); 118 return false; 119 } 120 } 121 122 /** creates a display element containing all the text strings needed to display the service page, in the language specified 123 * these retrieval services dont get displayed to the users - they are only used internally by the actions. so this returns an empty display element*/ 124 protected Element createServiceDisplay(String service, String lang) 125 { 126 return doc_.createElement(GSXML.DISPLAY_ELEM); 78 // Do generic configuration 79 return super.configure(info); 127 80 } 128 81 129 82 130 /** retrievea document */131 protected Element processDocument Retrieve(Element request)83 /** Retrieve the structure of a document */ 84 protected Element processDocumentStructureRetrieve(Element request) 132 85 { 133 // an empty result 86 return super.processDocumentStructureRetrieve(request); 87 } 88 89 90 /** Retrieve metadata associated with a document */ 91 protected Element processDocumentMetadataRetrieve(Element request) 92 { 93 return super.processDocumentMetadataRetrieve(request); 94 } 95 96 97 /** Retrieve the content of a document */ 98 protected Element processDocumentContentRetrieve(Element request) 99 { 100 // Create a new (empty) result message 134 101 Element result = doc_.createElement(GSXML.RESPONSE_ELEM); 135 String from = GSPath.appendLink(cluster_name_, DOCUMENT_ RETRIEVE_SERVICE);102 String from = GSPath.appendLink(cluster_name_, DOCUMENT_CONTENT_RETRIEVE_SERVICE); 136 103 result.setAttribute(GSXML.FROM_ATT, from); 137 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_ QUERY);138 Element result_ doc= doc_.createElement(GSXML.CONTENT_ELEM);139 result.appendChild(result_ doc);104 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS); 105 Element result_content = doc_.createElement(GSXML.CONTENT_ELEM); 106 result.appendChild(result_content); 140 107 141 // get param list and content 142 Element param_elem = null; 143 Element content_elem = null; 144 Node n = request.getFirstChild(); 145 while (n != null) { 146 String node_name = n.getNodeName(); 147 if (node_name.equals(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER)) { 148 param_elem = (Element) n; 149 } else if (node_name.equals(GSXML.CONTENT_ELEM)) { 150 content_elem = (Element) n; 151 } 152 n = n.getNextSibling(); 108 // Get the parameters of the request 109 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 110 if (param_list == null) { 111 System.err.println("GS2Retrieve, DocumentContentRetrieve Error: missing paramList.\n"); 112 return result; // Return the empty result 153 113 } 154 114 155 if (param_elem==null || content_elem==null) { 156 System.err.println("GS2MGRetrieve: malformed request sent to DocumentRetrieve service"); 157 return result; // empty result 115 String index = default_index_; 116 117 // Process the request parameters 118 Element param = (Element) param_list.getFirstChild(); 119 while (param != null) { 120 if (!param.getNodeName().equals(GSXML.PARAM_ELEM)) { 121 System.err.println("Warning: Non-param in paramList (ignored)."); 122 } 123 else { 124 // 125 if (param.getAttribute(GSXML.NAME_ATT) == INDEX_PARAM) { 126 index = GSXML.getValue(param); 127 System.out.println("Index: " + index); 128 } 129 } 130 131 param = (Element) param.getNextSibling(); 158 132 } 159 160 HashMap params = GSXML.extractParams(param_elem);161 133 162 // get docs from mg 163 String index = (String) params.get(INDEX_PARAM); 164 if (index == null) { // if it is not present, use the default index 165 index = default_index_; 134 // Get the request content 135 Element content = (Element) GSXML.getChildByTagName(request, GSXML.CONTENT_ELEM); 136 if (content == null) { 137 System.err.println("Error: DocumentContentRetrieve request had no content.\n"); 138 return result; 166 139 } 167 System.out.println("Index: " + index);168 140 169 String basedir = GSFile.collectionBaseDir(site_home_, cluster_name_) + File.separatorChar; // Needed by MG 141 Element doc_list = doc_.createElement(GSXML.DOCUMENT_ELEM+GSXML.LIST_MODIFIER); 142 result_content.appendChild(doc_list); 143 144 // The location of the MG index and text files 145 String basedir = GSFile.collectionBaseDir(site_home_, cluster_name_) 146 + File.separatorChar; // Needed by MG 170 147 String textdir = GSFile.collectionTextPath(cluster_name_); 171 148 String indexpath = GSFile.collectionIndexPath(cluster_name_, index); … … 176 153 mg_src_.setIndex(indexpath); 177 154 178 // get the text for each doc in the list 179 String[] ids = GSXML.getDocumentNameList(content_elem); 180 for (int j=0; j<ids.length; j++) { 181 long real_num = gdbm_src_.oid2Docnum(ids[j]); 182 String document = mg_src_.getDocument(basedir, textdir, real_num); 183 System.out.println("(MGRetrieve) Document: " + document); 184 // for now, stick it in a text node - eventually should be parsed as xml?? 185 // something funny with the doc - 186 Element new_doc = GSXML.createDocumentElement(doc_, ids[j]); 187 GSXML.addDocText(doc_, new_doc, document); 155 // Get the documents 156 String[] doc_ids = GSXML.getDocumentNameList(content); 157 for (int i = 0; i < doc_ids.length; i++) { 158 String doc_id = doc_ids[i]; 159 System.out.println("Retrieving content of " + doc_id + "..."); 188 160 189 result_doc.appendChild(new_doc); 161 long doc_num = gdbm_src_.oid2Docnum(doc_id); 162 String doc_content = mg_src_.getDocument(basedir, textdir, doc_num); 163 164 // For now, stick it in a text node - eventually should be parsed as xml?? 165 Element doc = GSXML.createDocumentElement(doc_, doc_id); 166 GSXML.addDocText(doc_, doc, doc_content); 167 doc_list.appendChild(doc); 190 168 } 191 return result;192 }193 169 194 195 /** retrieve metadata */196 protected Element processMetadataRetrieve(Element request)197 {198 Element result = doc_.createElement(GSXML.RESPONSE_ELEM);199 String from = GSPath.appendLink(cluster_name_, METADATA_RETRIEVE_SERVICE);200 result.setAttribute(GSXML.FROM_ATT, from);201 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_QUERY);202 203 Element result_content = doc_.createElement(GSXML.CONTENT_ELEM);204 result.appendChild(result_content);205 Element document_list = doc_.createElement(GSXML.DOCUMENT_ELEM+GSXML.LIST_MODIFIER);206 result_content.appendChild(document_list);207 208 // get the metadata209 Element content = (Element) request.getElementsByTagName(GSXML.CONTENT_ELEM).item(0);210 if (content == null) {211 // error: query had no content!! - should make an error message212 return result;213 }214 String[] metas = GSXML.getMetaNameList(content);215 String[] ids = GSXML.getDocumentNameList(content);216 for (int j = 0; j < ids.length; j++) { // for each document217 Element doc = GSXML.createDocumentElement(doc_, ids[j]);218 Element list = GSXML.addMetaList(doc_, doc);219 DBInfo info = gdbm_src_.getInfo(ids[j]);220 for (int m = 0; m < metas.length; m++) {221 String value = info.getInfo(metas[m]);222 GSXML.addMetadata(doc_, list, metas[m], value);223 }224 document_list.appendChild(doc);225 }226 170 return result; 227 171 }
Note:
See TracChangeset
for help on using the changeset viewer.