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

Last change on this file since 24393 was 24393, checked in by sjm84, 13 years ago

Adding in the server-side code for the Document Maker as well as several other enhancements

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