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

Last change on this file since 24993 was 24993, checked in by sjm84, 12 years ago

Adding UserContext to replace the use of lang and uid

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