source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/ArchiveRetrieve.java@ 29318

Last change on this file since 29318 was 28966, checked in by kjdon, 10 years ago

Lots of changes. Mainly to do with removing this.doc from everywhere. Document is not thread safe. Now we tend to create a new Document everytime we are starting a new page/message etc. in service this.desc_doc is available as teh document to create service info stuff. But it should only be used for this and not for other messages. newDOM is now static for XMLConverter. method param changes for some GSXML methods.

  • Property svn:executable set to *
File size: 12.4 KB
Line 
1/*
2* ArchiveRetrieve.java
3* a base class for retrieval services
4
5* Copyright (C) 2005 New Zealand Digital Library, http://www.nzdl.org
6*
7* This program is free software; you can redistribute it and/or modify
8* it under the terms of the GNU General Public License as published by
9* the Free Software Foundation; either version 2 of the License, or
10* (at your option) any later version.
11*
12* This program is distributed in the hope that it will be useful,
13* but WITHOUT ANY WARRANTY; without even the implied warranty of
14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15* GNU General Public License for more details.
16*
17* You should have received a copy of the GNU General Public License
18* along with this program; if not, write to the Free Software
19* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20*/
21package org.greenstone.gsdl3.service;
22
23import org.greenstone.gsdl3.util.DBInfo;
24import org.greenstone.gsdl3.util.GSPath;
25import org.greenstone.gsdl3.util.GSXML;
26import org.greenstone.gsdl3.util.SimpleCollectionDatabase;
27import org.greenstone.gsdl3.util.UserContext;
28import org.greenstone.gsdl3.util.XMLConverter;
29
30import org.w3c.dom.Document;
31import org.w3c.dom.Element;
32
33import org.apache.log4j.*;
34
35import java.io.File;
36import java.io.Serializable;
37import java.util.HashMap;
38import java.util.Vector;
39
40public class ArchiveRetrieve extends ServiceRack
41{
42 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.ArchiveRetrieve.class.getName());
43
44 protected static final String DOCUMENT_FILE_PATH_RETRIEVE_SERVICE = "DocumentFilePathRetrieve";
45 protected static final String ASSOCIATED_IMPORT_FILES_RETRIEVE_SERVICE = "AssociatedImportFilesRetrieve";
46 protected static final String SOURCE_FILE_OID_RETRIEVE = "SourceFileOIDRetrieve";
47
48 protected SimpleCollectionDatabase coll_db = null;
49
50 /** configure this service */
51 public boolean configure(Element info, Element extra_info)
52 {
53 if (!super.configure(info, extra_info))
54 {
55 return false;
56 }
57
58 logger.info("Configuring ArchiveRetrieve...");
59 this.config_info = info;
60
61 Element documentFilePathRetrieveService = this.desc_doc.createElement(GSXML.SERVICE_ELEM);
62 documentFilePathRetrieveService.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE);
63 documentFilePathRetrieveService.setAttribute(GSXML.NAME_ATT, DOCUMENT_FILE_PATH_RETRIEVE_SERVICE);
64 this.short_service_info.appendChild(documentFilePathRetrieveService);
65
66 Element associatedImportFilesRetrieveService = this.desc_doc.createElement(GSXML.SERVICE_ELEM);
67 associatedImportFilesRetrieveService.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE);
68 associatedImportFilesRetrieveService.setAttribute(GSXML.NAME_ATT, ASSOCIATED_IMPORT_FILES_RETRIEVE_SERVICE);
69 this.short_service_info.appendChild(associatedImportFilesRetrieveService);
70
71 Element sourceFileDocIDRetrieveService = this.desc_doc.createElement(GSXML.SERVICE_ELEM);
72 sourceFileDocIDRetrieveService.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE);
73 sourceFileDocIDRetrieveService.setAttribute(GSXML.NAME_ATT, SOURCE_FILE_OID_RETRIEVE);
74 this.short_service_info.appendChild(sourceFileDocIDRetrieveService);
75
76 return true;
77 }
78
79 protected Element getServiceDescription(Document doc, String service_id, String lang, String subset)
80 {
81 if (service_id.equals(DOCUMENT_FILE_PATH_RETRIEVE_SERVICE))
82 {
83 Element service_elem = doc.createElement(GSXML.SERVICE_ELEM);
84 service_elem.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE);
85 service_elem.setAttribute(GSXML.NAME_ATT, DOCUMENT_FILE_PATH_RETRIEVE_SERVICE);
86 return service_elem;
87 }
88 else if (service_id.equals(ASSOCIATED_IMPORT_FILES_RETRIEVE_SERVICE))
89 {
90 Element service_elem = doc.createElement(GSXML.SERVICE_ELEM);
91 service_elem.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE);
92 service_elem.setAttribute(GSXML.NAME_ATT, ASSOCIATED_IMPORT_FILES_RETRIEVE_SERVICE);
93 return service_elem;
94 }
95 else if (service_id.equals(SOURCE_FILE_OID_RETRIEVE))
96 {
97 Element service_elem = doc.createElement(GSXML.SERVICE_ELEM);
98 service_elem.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE);
99 service_elem.setAttribute(GSXML.NAME_ATT, SOURCE_FILE_OID_RETRIEVE);
100 return service_elem;
101 }
102 return null;
103 }
104
105 protected Element processDocumentFilePathRetrieve(Element request)
106 {
107 // Create a new (empty) result message
108 Document result_doc = XMLConverter.newDOM();
109 Element result = result_doc.createElement(GSXML.RESPONSE_ELEM);
110 result.setAttribute(GSXML.FROM_ATT, DOCUMENT_FILE_PATH_RETRIEVE_SERVICE);
111 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
112
113 UserContext userContext = new UserContext(request);
114
115 // Get the parameters of the request
116 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
117 if (param_list == null) {
118 GSXML.addError(result, "DocumentFilePathRetrieve: missing "+ GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER, GSXML.ERROR_TYPE_SYNTAX);
119 return result;
120 }
121 HashMap<String, Serializable> params = GSXML.extractParams(param_list, false);
122
123 String oid = (String) params.get("oid");
124 String collection = (String) params.get("c");
125
126 String assocFilePath = getAssocFilePathFromDocID(oid, collection, userContext);
127
128 String docFilePath = this.site_home + File.separatorChar +
129 "collect" + File.separatorChar +
130 collection + File.separatorChar +
131 "archives" + File.separatorChar +
132 assocFilePath + File.separatorChar +
133 "doc.xml";
134
135 Element metadataList = result_doc.createElement(GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
136 metadataList.appendChild(GSXML.createMetadataElement(result_doc, "docfilepath", docFilePath));
137 result.appendChild(metadataList);
138
139 return result;
140 }
141
142 protected Element processSourceFileOIDRetrieveService(Element request)
143 {
144 //Create a new (empty) result message
145 Document result_doc = XMLConverter.newDOM();
146 Element result = result_doc.createElement(GSXML.RESPONSE_ELEM);
147 result.setAttribute(GSXML.FROM_ATT, SOURCE_FILE_OID_RETRIEVE);
148 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
149
150 UserContext userContext = new UserContext(request);
151
152 // Get the parameters of the request
153 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
154 if (param_list == null)
155 {
156 GSXML.addError(result, "DocumentFilePathRetrieve: missing "+ GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER, GSXML.ERROR_TYPE_SYNTAX);
157 return result;
158 }
159 HashMap<String, Serializable> params = GSXML.extractParams(param_list, false);
160
161 String srcFile = (String) params.get("srcfile");
162 String collection = (String) params.get("c");
163
164 //Find out what kind of database we have
165 String databaseType = getDatabaseTypeFromCollection(collection, userContext);
166 if (databaseType == null || databaseType.equals(""))
167 {
168 databaseType = "gdbm"; // the default
169 }
170
171 String dbExt = null;
172 if (databaseType.equalsIgnoreCase("jdbm"))
173 {
174 dbExt = ".jdb";
175 }
176 else
177 {
178 dbExt = ".gdb"; // assume gdbm
179 }
180
181 coll_db = new SimpleCollectionDatabase(databaseType);
182 if (!coll_db.databaseOK())
183 {
184 logger.error("Couldn't create the collection database of type "+databaseType);
185 return null;
186 }
187
188 coll_db.openDatabase
189 (
190 this.site_home + File.separatorChar +
191 "collect" + File.separatorChar +
192 collection + File.separatorChar +
193 "archives" + File.separatorChar +
194 "archiveinf-src" + dbExt,
195 SimpleCollectionDatabase.READ
196 );
197
198 DBInfo info = coll_db.getInfo(srcFile);
199
200 if (info == null)
201 {
202 return result;
203 }
204
205 String oid = info.getInfo("oid");
206
207 Element metadataList = result_doc.createElement(GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
208 metadataList.appendChild(GSXML.createMetadataElement(result_doc, "oid", oid));
209 result.appendChild(metadataList);
210
211 return result;
212 }
213
214 protected Element processAssociatedImportFilesRetrieve(Element request)
215 {
216 //Create a new (empty) result message
217 Document result_doc = XMLConverter.newDOM();
218 Element result = result_doc.createElement(GSXML.RESPONSE_ELEM);
219 result.setAttribute(GSXML.FROM_ATT, ASSOCIATED_IMPORT_FILES_RETRIEVE_SERVICE);
220 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
221
222 UserContext userContext = new UserContext(request);
223
224 // Get the parameters of the request
225 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
226 if (param_list == null)
227 {
228 GSXML.addError(result, "AssociatedImportFilesRetrieve: missing "+ GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER, GSXML.ERROR_TYPE_SYNTAX);
229 return result;
230 }
231 HashMap<String, Serializable> params = GSXML.extractParams(param_list, false);
232
233 String oid = (String) params.get("oid");
234 String collection = (String) params.get("c");
235
236 String databaseType = getDatabaseTypeFromCollection(collection, userContext);
237 if (databaseType == null || databaseType.equals(""))
238 {
239 databaseType = "gdbm"; // the default
240 }
241
242 String dbExt = null;
243 if (databaseType.equalsIgnoreCase("jdbm"))
244 {
245 dbExt = ".jdb";
246 }
247 else
248 {
249 dbExt = ".gdb"; // assume gdbm
250 }
251
252 coll_db = new SimpleCollectionDatabase(databaseType);
253 if (!coll_db.databaseOK())
254 {
255 logger.error("Couldn't create the collection database of type "+databaseType);
256 return null;
257 }
258
259 coll_db.openDatabase
260 (
261 this.site_home + File.separatorChar +
262 "collect" + File.separatorChar +
263 collection + File.separatorChar +
264 "archives" + File.separatorChar +
265 "archiveinf-doc" + dbExt,
266 SimpleCollectionDatabase.READ
267 );
268
269 DBInfo info = coll_db.getInfo(oid);
270
271 if (info == null)
272 {
273 return result;
274 }
275
276 String srcFile = info.getInfo("src-file");
277 Vector<String> data = info.getMultiInfo("assoc-file");
278
279 Element metadataList = result_doc.createElement(GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
280 metadataList.appendChild(GSXML.createMetadataElement(result_doc, "srcfile", srcFile));
281
282 for (int i = 0; i < data.size(); i++)
283 {
284 metadataList.appendChild(GSXML.createMetadataElement(result_doc, "assocfile", data.get(i)));
285 }
286
287 result.appendChild(metadataList);
288
289 return result;
290 }
291
292
293 public String getAssocFilePathFromDocID(String oid, String collection, UserContext userContext)
294 {
295 Document doc = XMLConverter.newDOM();
296 Element mr_query_message = doc.createElement(GSXML.MESSAGE_ELEM);
297 Element mr_query_request = GSXML.createBasicRequest (doc, GSXML.REQUEST_TYPE_PAGE, collection + "/DocumentMetadataRetrieve", userContext);
298 mr_query_message.appendChild(mr_query_request);
299
300 Element paramList = doc.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
301 paramList.appendChild(GSXML.createMetadataElement(doc, "metadata", "assocfilepath"));
302
303 mr_query_request.appendChild(paramList);
304
305 Element docListElem = doc.createElement(GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER);
306 Element docElem = doc.createElement(GSXML.DOC_NODE_ELEM);
307 docElem.setAttribute(GSXML.NODE_ID_ATT, oid);
308 docListElem.appendChild(docElem);
309 mr_query_request.appendChild(docListElem);
310
311 Element response = (Element) this.router.process(mr_query_message);
312
313 String path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER);
314 path = GSPath.appendLink(path, GSXML.DOC_NODE_ELEM);
315 path = GSPath.appendLink(path, GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER);
316 Element metadataListElem = (Element) GSXML.getNodeByPath(response, path);
317 Element metadataElem = (Element) metadataListElem.getFirstChild();
318
319 return metadataElem.getFirstChild().getNodeValue();
320 }
321
322 public String getDatabaseTypeFromCollection(String collection, UserContext userContext)
323 {
324 //Find out what kind of database we have
325 Document doc = XMLConverter.newDOM();
326 Element dbTypeMessage = doc.createElement(GSXML.MESSAGE_ELEM);
327 Element dbTypeRequest = GSXML.createBasicRequest(doc, GSXML.REQUEST_TYPE_DESCRIBE, collection, userContext);
328 dbTypeMessage.appendChild(dbTypeRequest);
329 Element dbTypeResponse = (Element)this.router.process(dbTypeMessage);
330
331 String path = GSPath.appendLink(GSXML.RESPONSE_ELEM, GSXML.COLLECTION_ELEM);
332 Element collectionElem = (Element) GSXML.getNodeByPath(dbTypeResponse, path);
333
334 if (collectionElem != null)
335 {
336 return collectionElem.getAttribute(GSXML.DB_TYPE_ATT);
337 }
338 return null;
339 }
340}
Note: See TracBrowser for help on using the repository browser.