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