source: trunk/gli/src/org/greenstone/gatherer/msm/GDMDocument.java@ 6045

Last change on this file since 6045 was 6029, checked in by jmt12, 21 years ago

Removed the hvalue attribute from metadata.xml files as it is now obsolete

  • Property svn:keywords set to Author Date Id Revision
File size: 25.6 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * Author: John Thompson, Greenstone Digital Library, University of Waikato
9 *
10 * Copyright (C) 1999 New Zealand Digital Library Project
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *########################################################################
26 */
27package org.greenstone.gatherer.msm;
28
29import java.io.*;
30import java.util.*;
31import org.greenstone.gatherer.Gatherer;
32import org.greenstone.gatherer.msm.GDMManager;
33import org.greenstone.gatherer.msm.MSMUtils;
34import org.greenstone.gatherer.util.Codec;
35import org.greenstone.gatherer.util.HashMap3D;
36import org.greenstone.gatherer.util.StaticStrings;
37import org.greenstone.gatherer.util.Utility;
38import org.greenstone.gatherer.valuetree.GValueModel;
39import org.greenstone.gatherer.valuetree.GValueNode;
40import org.w3c.dom.*;
41
42/** This class wraps around a DOM Document providing methods for accessing the data within. In this case the DOM represents a Greenstone Directory metadata file. It provides the necessary functionality to create a new metadata.xml file.
43 * @author John Thompson, Greenstone Digital Library, University of Waikato
44 * @version 2.3b
45 */
46public class GDMDocument {
47 /** Record if the document this object is based on is up to date. */
48 private boolean up_to_date = true;
49 /** The document this class sources its data from. */
50 private Document base_document;
51 static final private String ACCUMULATE = "accumulate";
52 /** The pattern to match when searching for directory level assignments. */
53 static final private String DIRECTORY_FILENAME = ".*";
54 static final private String DESCRIPTION_ELEMENT = "Description";
55 static final private String FILENAME_ELEMENT = "FileName";
56 static final private String FILESET_ELEMENT = "FileSet";
57 static final private String HVALUE_ATTRIBUTE = "hvalue";
58 static final private String MODE_ATTRIBUTE = "mode";
59 static final private String OVERWRITE = "overwrite";
60
61 /** Constructor which creates a brand new metadata.xml document. */
62 public GDMDocument() {
63 // Create new document. We do this by loading a copy of the template. */
64 this.base_document = Utility.parse(Utility.GREENSTONEDIRECTORYMETADATA_TEMPLATE, true);
65 }
66
67 /** Constructor which parses an existing metadata.xml document. */
68 public GDMDocument(File file) {
69 try {
70 this.base_document = Utility.parse(file.getAbsolutePath(), false);
71 }
72 catch (Exception error) {
73 // Poorly formed, or completely invalid metadata.xml file!
74 }
75 }
76
77 /** Constructor which wraps around an existing metadata.xml document. */
78 public GDMDocument(Document base_document) {
79 this.base_document = base_document;
80 }
81
82 /** Add this metadata to the named file. There is one tricky thing to consider. Whenever a metadata entry is added it is taken to be accumulating except if it is the first added, in which case it overwrites! Actually this gets worse, as we could have been told to append this metadata to a document which already inherits metadata. Thus we need a new argument to determine whether this add was triggered by an append or a replace. */
83 public void addMetadata(String filename, Metadata metadata, boolean force_accumulate) {
84 Gatherer.println("Add '" + metadata + "' to " + (filename != null ? filename : "directory."));
85 try {
86 // Retrieve the document element.
87 Element directorymetadata_element = base_document.getDocumentElement();
88 // Iterate through the filesets looking for one that matches the given filename.
89 Element fileset_element = null;
90 boolean found = false;
91 NodeList fileset_elements = directorymetadata_element.getElementsByTagName(FILESET_ELEMENT);
92 for(int i = 0; !found && i < fileset_elements.getLength(); i++) {
93 fileset_element = (Element) fileset_elements.item(i);
94 NodeList filename_elements = fileset_element.getElementsByTagName(FILENAME_ELEMENT);
95 for(int j = 0; !found && j < filename_elements.getLength(); j++) {
96 Element filename_element = (Element) filename_elements.item(j);
97 String filename_pattern = MSMUtils.getValue(filename_element);
98 // Have we found a match. If so break out of for loop.
99 if(filename != null && filename.matches(filename_pattern) && !filename_pattern.equals(DIRECTORY_FILENAME)) {
100 ///ystem.err.println("Adding to existing file fileset!");
101 found = true;
102 }
103 else if(filename == null && filename_pattern.equals(DIRECTORY_FILENAME)) {
104 ///ystem.err.println("Adding to existing folder fileset!");
105 ///ystem.err.println("filename_pattern = '" + filename_pattern + "'");
106 found = true;
107 }
108 // No match. On to the next one.
109 else {
110 fileset_element = null;
111 }
112 filename_pattern = null;
113 filename_element = null;
114 }
115 }
116 fileset_elements = null;
117 // If we still haven't found an existing fileset, then its time to create one.
118 if(fileset_element == null) {
119 ///ystem.err.println("Creating a new fileset.");
120 fileset_element = base_document.createElement(FILESET_ELEMENT);
121 Element filename_element = base_document.createElement(FILENAME_ELEMENT);
122 Element description_element = base_document.createElement(DESCRIPTION_ELEMENT);
123 fileset_element.appendChild(filename_element);
124 fileset_element.appendChild(description_element);
125 Text filename_text = null;
126 // If the filename is null then we add a directory metadata set as directorymetadata_element's first child
127 if(filename == null) {
128 filename_text = base_document.createTextNode(DIRECTORY_FILENAME);
129 if(directorymetadata_element.hasChildNodes()) {
130 directorymetadata_element.insertBefore(fileset_element, directorymetadata_element.getFirstChild());
131 }
132 else {
133 directorymetadata_element.appendChild(fileset_element);
134 }
135 }
136 // Otherwise we just append the new fileset to directorymetadata_element's children.
137 else {
138 filename_text = base_document.createTextNode(filename);
139 directorymetadata_element.appendChild(fileset_element);
140 }
141 filename_element.appendChild(filename_text);
142 filename_text = null;
143 description_element = null;
144 filename_element = null;
145 }
146 // Now, finally, we can add the metadata.
147 Element metadata_element = base_document.createElement(StaticStrings.METADATA_ELEMENT);
148 String name = metadata.getElement().getName();
149 if(name.startsWith(Utility.EXTRACTED_METADATA_NAMESPACE)) {
150 name = name.substring(Utility.EXTRACTED_METADATA_NAMESPACE.length() + 1);
151 }
152 metadata_element.setAttribute(StaticStrings.NAME_ATTRIBUTE, name);
153
154 // To determine if this metadata entry should overwrite or accumulate we check if there are other entries with the same element in this fileset.
155 boolean will_accumulate = false;
156 NodeList sibling_description_elements = fileset_element.getElementsByTagName(DESCRIPTION_ELEMENT);
157 for(int k = 0; !will_accumulate && k < sibling_description_elements.getLength(); k++) {
158 Element sibling_description_element = (Element) sibling_description_elements.item(k);
159 NodeList sibling_metadata_elements = sibling_description_element.getElementsByTagName(StaticStrings.METADATA_ELEMENT);
160 for(int l = 0; !will_accumulate && l < sibling_metadata_elements.getLength(); l++) {
161 Element sibling_metadata_element = (Element) sibling_metadata_elements.item(l);
162 // It appears that its possible that we can be asked to add the same metadata twice (especially after a copy action is cancelled then repeated). So we check if we have been asked to add exactly the same value twice.
163 if(sibling_metadata_element.getAttribute(StaticStrings.NAME_ATTRIBUTE).equals(metadata_element.getAttribute(StaticStrings.NAME_ATTRIBUTE))) {
164 // Check the values and return if they are the same.
165 if(metadata.getAbsoluteValue().equals(MSMUtils.getValue(sibling_metadata_element))) {
166 return;
167 }
168 will_accumulate = true;
169 }
170 sibling_metadata_element = null;
171 }
172 sibling_metadata_elements = null;
173 sibling_description_element = null;
174 }
175 sibling_description_elements = null;
176 if(will_accumulate || force_accumulate) { //mode.equals(ACCUMULATE)) {
177 metadata_element.setAttribute(MODE_ATTRIBUTE, ACCUMULATE);
178 }
179 // As we can't possibly store all the metadata in memory, nor can we ensure that the indexes written to file remain the same until the new time we look at this file, and to avoid having to open a rewrite every collection document whenever any value tree changes, I'm writing the value out as a full path string
180 GValueModel model = Gatherer.c_man.getCollection().msm.getValueTree(metadata.getElement());
181 String node_value = null;
182 if(model != null && model.isHierarchy()) {
183 node_value = Codec.transform(metadata.getValueNode().getFullPath(false), Codec.TEXT_TO_DOM);
184 }
185 else {
186 node_value = metadata.getAbsoluteValue();
187 }
188 ///ystem.err.println("Creating node in GDMDocument: '" + node_value + "'");
189 metadata_element.appendChild(base_document.createTextNode(node_value));
190 // Retrieve the first description element for this fileset (there should only be one, but I'll play it safe).
191 NodeList description_elements = fileset_element.getElementsByTagName("Description");
192 Element description_element = (Element) description_elements.item(0);
193 description_element.appendChild(metadata_element);
194 description_element = null;
195 metadata_element = null;
196 //mode = null;
197 fileset_element = null;
198 directorymetadata_element = null;
199 up_to_date = false;
200 }
201 catch (Exception error) {
202 Gatherer.printStackTrace(error);
203 }
204 }
205
206 public int countMetadata() {
207 int count = 0;
208 try {
209 // Retrieve the document element.
210 Element directorymetadata_element = base_document.getDocumentElement();
211 // Iterate through the filesets, checking the FileName child element against the target file's name using regular expression matching.
212 NodeList fileset_elements = directorymetadata_element.getElementsByTagName(FILESET_ELEMENT);
213 for(int i = 0; i < fileset_elements.getLength(); i++) {
214 Element fileset_element = (Element) fileset_elements.item(i);
215 NodeList description_elements = fileset_element.getElementsByTagName(DESCRIPTION_ELEMENT);
216 for(int k = 0; k < description_elements.getLength(); k++) {
217 Element description_element = (Element) description_elements.item(k);
218 NodeList metadata_elements = description_element.getElementsByTagName(StaticStrings.METADATA_ELEMENT);
219 count = count + metadata_elements.getLength();
220 metadata_elements = null;
221 description_element = null;
222 }
223 description_elements = null;
224 fileset_element = null;
225 }
226 fileset_elements = null;
227 directorymetadata_element = null;
228 }
229 catch (Exception error) {
230 Gatherer.printStackTrace(error);
231 }
232 return count;
233 }
234
235 /** Retrieve the document this class is wrapping. */
236 public Document getDocument() {
237 return base_document;
238 }
239 /** Get all of the metadata, including directory level, associated with this file. */
240 public ArrayList getMetadata(String filename, boolean remove, ArrayList metadatum_so_far, File file, boolean append_folder_level) {
241 return getMetadata(filename, remove, metadatum_so_far, file, append_folder_level, false);
242 }
243 /** Retrieve the metadata associated with the given filename. Keep track of what metadata should be overwritten and what should be accumulated. Also make note of the source file, and remove the metadata if required. Finally if purge is set retrieve every piece of metadata in this file. */
244 public ArrayList getMetadata(String filename, boolean remove, ArrayList metadatum_so_far, File file, boolean append_folder_level, boolean purge) {
245 Gatherer.println("Get metadata for " + filename);
246 ArrayList metadatum = null;
247 if(metadatum_so_far == null) {
248 metadatum = new ArrayList();
249 }
250 else {
251 metadatum = metadatum_so_far;
252 }
253 try {
254 // Retrieve the document element.
255 Element directorymetadata_element = base_document.getDocumentElement();
256 // Iterate through the filesets, checking the FileName child element against the target file's name using regular expression matching.
257 NodeList fileset_elements = directorymetadata_element.getElementsByTagName(FILESET_ELEMENT);
258 for(int i = 0; i < fileset_elements.getLength(); i++) {
259 Element fileset_element = (Element) fileset_elements.item(i);
260 NodeList filename_elements = fileset_element.getElementsByTagName(FILENAME_ELEMENT);
261 for(int j = 0; j < filename_elements.getLength(); j++) {
262 Element filename_element = (Element) filename_elements.item(j);
263 String filename_text = MSMUtils.getValue(filename_element);
264 if((filename != null && (filename.matches(filename_text) || (append_folder_level && filename.indexOf(File.separator) != -1 && filename_text.equals(filename.substring(0, filename.indexOf(File.separator)))))) || ((filename == null || append_folder_level) && filename_text.equals(DIRECTORY_FILENAME)) || purge) {
265 // If they match add all of the metadata found in the Description child element, remembering to abide by desired mode (accumulate vs. overwrite).
266 NodeList description_elements = fileset_element.getElementsByTagName(DESCRIPTION_ELEMENT);
267 for(int k = 0; k < description_elements.getLength(); k++) {
268 Element description_element = (Element) description_elements.item(k);
269 NodeList metadata_elements = description_element.getElementsByTagName(StaticStrings.METADATA_ELEMENT);
270 for(int l = 0; l < metadata_elements.getLength(); l++) {
271 Element metadata_element = (Element) metadata_elements.item(l);
272 String raw_element = metadata_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
273 //String language = metadata_element.getAttribute("language");
274 String mode = metadata_element.getAttribute(MODE_ATTRIBUTE);
275 String raw_value = MSMUtils.getValue(metadata_element);
276 // Raw value is in GREENSTONE form, convert to DOM
277 raw_value = Codec.transform(raw_value, Codec.GREENSTONE_TO_DOM);
278 // ***** LEGACY SUPPORT *****
279 // If this raw_value contains a '\' character, but no '\\', '[' or ']' characters, then replace the '\' with a '\\'
280 if(raw_value.indexOf(StaticStrings.ESCAPE_STR) != -1) {
281 Gatherer.println("Detected Legacy Path: " + raw_value);
282 raw_value = raw_value.replaceAll(StaticStrings.ESCAPE_PATTERN, StaticStrings.PIPE_STR);
283 Gatherer.println("Updated Path To: " + raw_value);
284 MSMUtils.setValue(metadata_element, raw_value);
285 }
286 // **************************
287 // Using the element string and value, retrieve a matching Metadata object from the cache
288 Metadata metadata = null;
289 // If this element has hierarchy values then we must ensure the raw value is a full path, not an index.
290 // Try to retrieve an already comstructed piece of metadata from file - but not if we are purging, as this will stuff up anything that is still using that metadata - such as the GTable
291 if(GDMManager.metadata_cache.contains(raw_element, raw_value) && !purge) {
292 ///ystem.err.println("HIT! Retrieve metadata from cache: " + raw_element + " -> " + raw_value + "\n");
293 metadata = (Metadata) GDMManager.metadata_cache.get(raw_element, raw_value);
294 }
295 else {
296 ElementWrapper element = Gatherer.c_man.getCollection().msm.getElement(raw_element);
297 if (element != null) {
298
299 GValueNode value = Metadata.getDefaultValueNode(element, raw_value);
300 ///ystem.err.println("Miss. Create new metadata: " + raw_element + " -> " + raw_value + "\n");
301 metadata = new Metadata(element, value);
302 if(!purge) {
303 GDMManager.metadata_cache.put(raw_element, raw_value, metadata);
304 }
305 ///ystem.err.println("Added metadata to cache: " + raw_element + " -> " + raw_value + "\n");
306 value = null;
307 element = null;
308 }
309 }
310 // check whether the metadata is null
311 if (metadata != null) {
312 // We determine whether this metadata is file or folder level
313 if(filename != null) {
314 ///ystem.err.println("Filename = " + filename);
315 ///ystem.err.println("filename_text = " + filename_text);
316 // If can only be file level if there is no folder path details in filename and if the filename matched the filename text node (it may have matched .* instead)!
317 if(filename.indexOf(File.separator) == -1 && filename.equals(filename_text)) {
318 metadata.setFileLevel(true);
319 ///ystem.err.println("File level!!!");
320 }
321 else {
322 metadata.setFileLevel(false);
323 ///ystem.err.println("Inherited!!!");
324 }
325 }
326 else {
327 ///ystem.err.println("Filename is null therefore this is file level metadata.");
328 metadata.setFileLevel(true);
329 }
330 metadata.setFile(file);
331
332 // If mode is overwrite, then remove any previous values for this metadata element.
333 if(mode.equals("accumulate")) {
334 metadata.setAccumulate(true);
335 }
336 else {
337 metadata.setAccumulate(false);
338 ///ystem.err.println("Metadata overwrites: " + metadata);
339 for(int m = metadatum.size() - 1; m >= 0; m--) {
340 Metadata old_metadata = (Metadata) metadatum.get(m);
341 if(old_metadata.getElement().equals(metadata.getElement())) {
342 metadatum.remove(m);
343 ///ystem.err.println("Removing overridden metadata: " + old_metadata);
344 }
345 old_metadata = null;
346 }
347 }
348 mode = null;
349
350 // Add the completed metadata and clean up
351 ///ystem.err.println("Adding metadata: " + metadata);
352 metadatum.add(metadata);
353
354 // Having found our metadata check if the value from the xml matches the one from the gvaluenode. If not update it. This happens whenever hierarchy information is involved (indexes rapidly become obsolete).
355 // If remove was set, remove it. We can only remove pure file level metadata, or folder level iff we were asked for folder level.
356 if(remove && ((filename != null && filename.matches(filename_text) && !filename_text.equals(DIRECTORY_FILENAME)) || (filename == null && filename_text.equals(DIRECTORY_FILENAME)))) {
357 ///ystem.err.println("Removing " + metadata + " from " + file);
358 description_element.removeChild(metadata_element);
359 // Remove the description element if empty.
360 if(!description_element.hasChildNodes()) {
361 fileset_element.removeChild(description_element);
362 }
363 }
364 else {
365 //String current_value = metadata.getAbsoluteValue();
366 String current_value = Codec.transform(metadata.getValueNode().getFullPath(false), Codec.TEXT_TO_DOM);
367 ///ystem.err.println("Checking the current hfile: " + current_value);
368 ///ystem.err.println("Against whats in the hfile: " + current_value);
369 if(!raw_value.equals(current_value)) {
370 // Remove old text
371 while(metadata_element.hasChildNodes()) {
372 metadata_element.removeChild(metadata_element.getFirstChild());
373 }
374 // Add new.
375 metadata_element.appendChild(base_document.createTextNode(current_value));
376 }
377 }
378 }
379 metadata = null;
380 raw_value = null;
381 raw_element = null;
382 metadata_element = null;
383 }
384 metadata_elements = null;
385 description_element = null;
386 }
387 description_elements = null;
388 }
389 filename_text = null;
390 filename_element = null;
391 }
392 // If the file set no longer has any description entries, remove it entirely
393 NodeList description_elements = fileset_element.getElementsByTagName(DESCRIPTION_ELEMENT);
394 if(description_elements.getLength() == 0) {
395 directorymetadata_element.removeChild(fileset_element);
396 }
397 description_elements = null;
398 filename_elements = null;
399 fileset_element = null;
400 }
401 fileset_elements = null;
402 directorymetadata_element = null;
403 }
404 catch (Exception error) {
405 Gatherer.self.printStackTrace(error);
406 }
407 ///ystem.err.println("Found " + metadatum.size() + " pieces of metadata.");
408 return metadatum;
409 }
410
411 /** Determine if this document has been saved recently, and thus xml file version is up to date. */
412 public boolean isUpToDate() {
413 return false;
414 }
415
416 /** Determine is this is a valid Greenstone Directory Metadata file. It may of course just be some xml file with the name metadata.xml. */
417 public boolean isValid() {
418 // Just determine if the doctype is GreenstoneDirectoryMetadata and root node is called DirectoryMetadata.
419 String doctype_name = base_document.getDoctype().getName();
420 String root_name = base_document.getDocumentElement().getTagName();
421 return ((doctype_name.equals("GreenstoneDirectoryMetadata") && root_name.equals("GreenstoneDirectoryMetadata")) || (doctype_name.equals("DirectoryMetadata") && root_name.equals("DirectoryMetadata")));
422 }
423 /** Remove the given directory level metadata from this document. All directory level metadata is available under the FileSet with filename '.*'. There is at least one nasty case to consider, where the first overwriting metadata entry, of several with the same element, is removed. In this case the next entry must become overwrite to ensure proper inheritance. */
424 public void removeMetadata(String filename, Metadata metadata) {
425 try {
426 boolean found = false;
427 boolean first_metadata_element_found = true;
428 boolean make_next_metadata_element_overwrite = false;
429 boolean remove_fileset = false;
430 // Retrieve the document element.
431 Element directorymetadata_element = base_document.getDocumentElement();
432 // Iterate through the filesets looking for the directory level one.
433 NodeList fileset_elements = directorymetadata_element.getElementsByTagName(FILESET_ELEMENT);
434 for(int i = 0; !found && i < fileset_elements.getLength(); i++) {
435 Element fileset_element = (Element) fileset_elements.item(i);
436 NodeList filename_elements = fileset_element.getElementsByTagName(FILENAME_ELEMENT);
437 for(int j = 0; !found && j < filename_elements.getLength(); j++) {
438 Element filename_element = (Element) filename_elements.item(j);
439 String filename_text = MSMUtils.getValue(filename_element);
440 if((filename != null && filename.matches(filename_text) && !filename.equals(DIRECTORY_FILENAME)) || (filename == null && filename_text.equals(DIRECTORY_FILENAME))) {
441 // Retrieve the Metadata Element for this fileset, and iterate through them looking for the one which we are to remove.
442 NodeList description_elements = fileset_element.getElementsByTagName("Description");
443 for(int k = 0; !found && k < description_elements.getLength(); k++) {
444 Element description_element = (Element) description_elements.item(k);
445 NodeList metadata_elements = description_element.getElementsByTagName(StaticStrings.METADATA_ELEMENT);
446 for(int l = 0; (!found || !make_next_metadata_element_overwrite) && l < metadata_elements.getLength(); l++) {
447 Element metadata_element = (Element) metadata_elements.item(l);
448 String element = metadata_element.getAttribute("name");
449 String value = MSMUtils.getValue(metadata_element);
450 // See if this is the metadata we wish to remove
451 if(element.equals(metadata.getElement().getName())) {
452 if(value.equals(metadata.getAbsoluteValue())) {
453 // Remove it
454 ///ystem.err.println("Remove " + element + "-" + value);
455 description_element.removeChild(metadata_element);
456 found = true;
457 // If this was the first metadata with this element found, and it was set to overwrite, then we have to ensure that the next metadata with this element found (if any) is changed to be overwrite now.
458 if(first_metadata_element_found && !metadata.accumulates()) {
459 ///ystem.err.println("First of this element found!");
460 make_next_metadata_element_overwrite = true;
461 }
462 }
463 // If this was the first metadata we've found with the element of the one to be removed set first found to false.
464 else if(first_metadata_element_found) {
465 ///ystem.err.println("Found a matching element: " + element + "=" + value);
466 first_metadata_element_found = false;
467 }
468 // Otherwise we should make this metadata overwrite as requested.
469 else if(make_next_metadata_element_overwrite) {
470 ///ystem.err.println("Changing to overwrite: " + element + "=" + value);
471 metadata_element.setAttribute(MODE_ATTRIBUTE, "");
472 }
473 }
474 value = null;
475 element = null;
476 metadata_element = null;
477 }
478 metadata_elements = description_element.getElementsByTagName(StaticStrings.METADATA_ELEMENT);
479 // If we found it, removed it, and now the description tag has no children, mark the fileset for removal
480 if(metadata_elements.getLength() == 0) {
481 remove_fileset = true;
482 }
483 metadata_elements = null;
484 description_element = null;
485 }
486 description_elements = null;
487 }
488 filename_text = null;
489 filename_element = null;
490 }
491 filename_elements = null;
492 if(found && remove_fileset) {
493 directorymetadata_element.removeChild(fileset_element);
494 }
495 fileset_element = null;
496 }
497 fileset_elements = null;
498 directorymetadata_element = null;
499 up_to_date = false;
500 }
501 catch (Exception error) {
502 Gatherer.printStackTrace(error);
503 }
504 }
505
506 /** Change the up to date flag. */
507 public void setUpToDate(boolean up_to_date) {
508 this.up_to_date = up_to_date;
509 }
510}
Note: See TracBrowser for help on using the repository browser.