source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/ArchiveIO.java@ 38154

Last change on this file since 38154 was 37177, checked in by davidb, 17 months ago

Introduction of new optional parameter docVersion. If null (or equal to the empty string), then code works as before. Designed to work with the file-level document-version history mechanism, if non-empty, then this value is used to change where doc.xml on the file system is read from

  • Property svn:executable set to *
File size: 13.5 KB
Line 
1/*
2 * ArchiveIO.java
3 * Used to retrieve information about collection archives
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.DBHelper;
24import org.greenstone.gsdl3.util.DBInfo;
25import org.greenstone.gsdl3.util.GSDocumentModel;
26import org.greenstone.gsdl3.util.GSParams;
27import org.greenstone.gsdl3.util.GSPath;
28import org.greenstone.gsdl3.util.GSXML;
29import org.greenstone.gsdl3.util.SimpleCollectionDatabase;
30import org.greenstone.gsdl3.util.UserContext;
31import org.greenstone.gsdl3.util.XMLConverter;
32
33import org.w3c.dom.Document;
34import org.w3c.dom.Element;
35import org.w3c.dom.NodeList;
36
37import org.apache.log4j.*;
38
39import java.io.File;
40import java.io.Serializable;
41import java.util.ArrayList;
42import java.util.HashMap;
43import java.util.Vector;
44
45public class ArchiveIO extends ServiceRack
46{
47 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.ArchiveIO.class.getName());
48 GSDocumentModel _GSDM = null;
49
50 /********************************************************************
51 * The list of services the Archive retrieval service rack supports *
52 *******************************************************************/
53 protected static final String ARCHIVE_GET_DOCUMENT_FILE_PATH = "ArchiveGetDocumentFilePath";
54 protected static final String ARCHIVE_GET_ASSOCIATED_IMPORT_FILES = "ArchiveGetAssociatedImportFiles";
55 protected static final String ARCHIVE_GET_SOURCE_FILE_OID = "ArchiveGetSourceFileOID";
56 protected static final String ARCHIVE_CHECK_DOCUMENT_OR_SECTION_EXISTS = "ArchiveCheckDocumentOrSectionExists";
57 protected static final String ARCHIVE_WRITE_ENTRY_TO_DATABASE = "ArchiveWriteEntryToDatabase";
58 protected static final String ARCHIVE_REMOVE_ENTRY_FROM_DATABASE = "ArchiveRemoveEntryFromDatabase";
59 /*******************************************************************/
60
61 String[] _services = { ARCHIVE_GET_DOCUMENT_FILE_PATH, ARCHIVE_GET_ASSOCIATED_IMPORT_FILES, ARCHIVE_GET_SOURCE_FILE_OID, ARCHIVE_CHECK_DOCUMENT_OR_SECTION_EXISTS, ARCHIVE_WRITE_ENTRY_TO_DATABASE, ARCHIVE_REMOVE_ENTRY_FROM_DATABASE };
62
63 /** configure this service */
64 public boolean configure(Element info, Element extra_info)
65 {
66 if (!super.configure(info, extra_info))
67 {
68 return false;
69 }
70
71 logger.info("Configuring DocXMLUtil...");
72 this.config_info = info;
73
74 for (int i = 0; i < _services.length; i++)
75 {
76 Element service = this.desc_doc.createElement(GSXML.SERVICE_ELEM);
77 service.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE);
78 service.setAttribute(GSXML.NAME_ATT, _services[i]);
79 this.short_service_info.appendChild(service);
80 }
81
82 _GSDM = new GSDocumentModel(this.site_home, this.router);
83
84 return true;
85 }
86
87 protected Element getServiceDescription(Document doc, String service_id, String lang, String subset)
88 {
89 for (int i = 0; i < _services.length; i++)
90 {
91 if (service_id.equals(_services[i]))
92 {
93 Element service_elem = doc.createElement(GSXML.SERVICE_ELEM);
94 service_elem.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_RETRIEVE);
95 service_elem.setAttribute(GSXML.NAME_ATT, _services[i]);
96 return service_elem;
97 }
98 }
99
100 return null;
101 }
102
103 /************
104 * Services *
105 ***********/
106
107 protected Element processArchiveGetDocumentFilePath(Element request)
108 {
109 // Create a new (empty) result message
110 Document result_doc = XMLConverter.newDOM();
111 Element result = result_doc.createElement(GSXML.RESPONSE_ELEM);
112 result.setAttribute(GSXML.FROM_ATT, ARCHIVE_GET_DOCUMENT_FILE_PATH);
113 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
114
115 UserContext userContext = new UserContext(request);
116
117 // Get the parameters of the request
118 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
119 if (param_list == null)
120 {
121 GSXML.addError(result, ARCHIVE_GET_DOCUMENT_FILE_PATH + ": Missing " + GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER, GSXML.ERROR_TYPE_SYNTAX);
122 return result;
123 }
124 HashMap<String, Serializable> params = GSXML.extractParams(param_list, false);
125
126 String oid = (String) params.get(GSXML.NODE_ID_ATT);
127 String optDocVersion = (String) params.get(GSXML.DOC_VERSION_ATT);
128 String collection = (String) params.get(GSXML.COLLECTION_ATT);
129
130 String filePath = _GSDM.archiveGetDocumentFilePath(oid, optDocVersion, collection, userContext);
131
132 Element metadataList = result_doc.createElement(GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
133 metadataList.appendChild(GSXML.createMetadataElement(result_doc, "docfilepath", filePath)); //TODO: Replace "docfilepath" with a constant
134 result.appendChild(metadataList);
135
136 return result;
137 }
138
139 protected Element processArchiveGetSourceFileOID(Element request)
140 {
141 //Create a new (empty) result message
142 Document result_doc = XMLConverter.newDOM();
143 Element result = result_doc.createElement(GSXML.RESPONSE_ELEM);
144 result.setAttribute(GSXML.FROM_ATT, ARCHIVE_GET_SOURCE_FILE_OID);
145 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
146
147 UserContext userContext = new UserContext(request);
148
149 // Get the parameters of the request
150 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
151 if (param_list == null)
152 {
153 GSXML.addError(result, ARCHIVE_GET_SOURCE_FILE_OID + ": Missing " + GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER, GSXML.ERROR_TYPE_SYNTAX);
154 return result;
155 }
156 HashMap<String, Serializable> params = GSXML.extractParams(param_list, false);
157
158 String srcFile = (String) params.get("sourcefile"); //TODO: Replace with a constant
159 String collection = (String) params.get(GSXML.COLLECTION_ATT);
160
161 String oid = _GSDM.archiveGetSourceFileOID(srcFile, collection, userContext);
162 if(_GSDM.checkError(result, ARCHIVE_GET_SOURCE_FILE_OID))
163 {
164 return result;
165 }
166
167 Element metadataList = result_doc.createElement(GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
168 metadataList.appendChild(GSXML.createMetadataElement(result_doc, GSXML.NODE_ID_ATT, oid));
169 result.appendChild(metadataList);
170
171 return result;
172 }
173
174 protected Element processArchiveCheckDocumentOrSectionExists(Element request)
175 {
176 //Create a new (empty) result message
177 Document result_doc = XMLConverter.newDOM();
178 Element result = result_doc.createElement(GSXML.RESPONSE_ELEM);
179 result.setAttribute(GSXML.FROM_ATT, ARCHIVE_CHECK_DOCUMENT_OR_SECTION_EXISTS);
180 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
181
182 UserContext userContext = new UserContext(request);
183
184 // Get the parameters of the request
185 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
186 if (param_list == null)
187 {
188 GSXML.addError(result, ARCHIVE_CHECK_DOCUMENT_OR_SECTION_EXISTS + ": Missing " + GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER, GSXML.ERROR_TYPE_SYNTAX);
189 return result;
190 }
191 HashMap<String, Serializable> params = GSXML.extractParams(param_list, false);
192
193 String oid = (String) params.get(GSXML.NODE_ID_ATT);
194 String optDocVersion = (String) params.get(GSXML.DOC_VERSION_ATT);
195 String collection = (String) params.get(GSXML.COLLECTION_ATT);
196
197 boolean exists = _GSDM.archiveCheckDocumentOrSectionExists(oid, optDocVersion, collection, userContext);
198 if(_GSDM.checkError(result, ARCHIVE_CHECK_DOCUMENT_OR_SECTION_EXISTS))
199 {
200 return result;
201 }
202
203 result.setAttribute("check", exists ? "true" : "false");
204
205 return result;
206 }
207
208 protected Element processArchiveWriteEntryToDatabase(Element request)
209 {
210 //Create a new (empty) result message
211 Document result_doc = XMLConverter.newDOM();
212 Element result = result_doc.createElement(GSXML.RESPONSE_ELEM);
213 result.setAttribute(GSXML.FROM_ATT, ARCHIVE_WRITE_ENTRY_TO_DATABASE);
214 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
215
216
217 UserContext userContext = new UserContext(request);
218
219 // Get the parameters of the request
220 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
221 if (param_list == null)
222 {
223 GSXML.addError(result, ARCHIVE_WRITE_ENTRY_TO_DATABASE + ": Missing " + GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER, GSXML.ERROR_TYPE_SYNTAX);
224 return result;
225 }
226
227 HashMap<String, ArrayList<String>> info = new HashMap<String, ArrayList<String>>();
228 String collection = null;
229 String oid = null;
230 //String optDocVersion = null;
231
232 NodeList params = param_list.getElementsByTagName(GSXML.PARAM_ELEM);
233 for (int i = 0; i < params.getLength(); i++)
234 {
235 Element currentParam = (Element) params.item(i);
236 String type = currentParam.getAttribute(GSXML.TYPE_ATT);
237 String name = currentParam.getAttribute(GSXML.NAME_ATT);
238 String value = currentParam.getAttribute(GSXML.VALUE_ATT);
239 if (type != null && type.equals("entry"))
240 {
241 if(info.get(name) != null)
242 {
243 info.get(name).add(value);
244 }
245 else
246 {
247 ArrayList<String> values = new ArrayList<String>();
248 values.add(value);
249 info.put(name, values);
250 }
251 }
252 else
253 {
254 if (name.equals(GSXML.COLLECTION_ATT))
255 {
256 collection = value;
257 }
258 else if (name.equals(GSXML.NODE_ID_ATT))
259 {
260 oid = value;
261 }
262 /*else if (name.equals(GSXML.DOC_VERSION_ATT))
263 {
264 optDocVersion = value;
265 }*/
266 }
267 }
268
269 _GSDM.archiveWriteEntryToDatabase(oid, collection, info, userContext);
270 _GSDM.checkError(result, ARCHIVE_WRITE_ENTRY_TO_DATABASE);
271
272 return result;
273 }
274
275 protected Element processArchiveRemoveEntryFromDatabase(Element request)
276 {
277 //Create a new (empty) result message
278 Document result_doc = XMLConverter.newDOM();
279 Element result = result_doc.createElement(GSXML.RESPONSE_ELEM);
280 result.setAttribute(GSXML.FROM_ATT, ARCHIVE_REMOVE_ENTRY_FROM_DATABASE);
281 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
282
283 UserContext userContext = new UserContext(request);
284
285 // Get the parameters of the request
286 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
287 if (param_list == null)
288 {
289 GSXML.addError(result, ARCHIVE_REMOVE_ENTRY_FROM_DATABASE + ": Missing " + GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER, GSXML.ERROR_TYPE_SYNTAX);
290 return result;
291 }
292
293 String collection = null;
294 String oid = null;
295 // String optDocVersion = null;
296
297 NodeList params = param_list.getElementsByTagName(GSXML.PARAM_ELEM);
298 for (int i = 0; i < params.getLength(); i++)
299 {
300 Element currentParam = (Element) params.item(i);
301 String name = currentParam.getAttribute(GSXML.NAME_ATT);
302 String value = currentParam.getAttribute(GSXML.VALUE_ATT);
303
304 if (name.equals(GSXML.COLLECTION_ATT))
305 {
306 collection = value;
307 }
308 else if (name.equals(GSXML.NODE_ID_ATT))
309 {
310 oid = value;
311 }
312 /*else if (name.equals(GSXML.DOC_VERSION_ATT))
313 {
314 optDocVersion = value;
315 }*/
316 }
317
318 _GSDM.archiveRemoveEntryFromDatabase(oid, collection, userContext);
319 _GSDM.checkError(result, ARCHIVE_REMOVE_ENTRY_FROM_DATABASE);
320
321 return result;
322 }
323
324 protected Element processArchiveGetAssociatedImportFiles(Element request)
325 {
326 //Create a new (empty) result message
327 Document result_doc = XMLConverter.newDOM();
328 Element result = result_doc.createElement(GSXML.RESPONSE_ELEM);
329 result.setAttribute(GSXML.FROM_ATT, ARCHIVE_GET_ASSOCIATED_IMPORT_FILES);
330 result.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_PROCESS);
331
332 UserContext userContext = new UserContext(request);
333
334 // Get the parameters of the request
335 Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER);
336 if (param_list == null)
337 {
338 GSXML.addError(result, ARCHIVE_GET_ASSOCIATED_IMPORT_FILES + ": Missing " + GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER, GSXML.ERROR_TYPE_SYNTAX);
339 return result;
340 }
341 HashMap<String, Serializable> params = GSXML.extractParams(param_list, false);
342
343 String oid = (String) params.get(GSXML.NODE_ID_ATT);
344 //String optDocVersion = (String) params.get(GSXML.DOC_VERSION_ATT);
345 String collection = (String) params.get(GSXML.COLLECTION_ATT);
346
347 ArrayList<String> assocFiles = _GSDM.archiveGetAssociatedImportFiles(oid, collection, userContext);
348 if(_GSDM.checkError(result, ARCHIVE_GET_ASSOCIATED_IMPORT_FILES))
349 {
350 return result;
351 }
352
353 Element metadataList = result_doc.createElement(GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER);
354 metadataList.appendChild(GSXML.createMetadataElement(result_doc, "srcfile", assocFiles.get(0)));
355
356 for (int i = 1; i < assocFiles.size(); i++)
357 {
358 metadataList.appendChild(GSXML.createMetadataElement(result_doc, "assocfile", assocFiles.get(i)));
359 }
360
361 result.appendChild(metadataList);
362
363 return result;
364 }
365}
Note: See TracBrowser for help on using the repository browser.