Changeset 4358
- Timestamp:
- 2003-05-27T15:24:55+12:00 (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gli/src/org/greenstone/gatherer/msm/GDMDocument.java
r4293 r4358 74 74 this.base_document = base_document; 75 75 } 76 /** Add this metadata to the named file. */76 /** 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! */ 77 77 public void addMetadata(String filename, Metadata metadata) { 78 ///ystem.err.println("Add '" + metadata + "' to " + (filename != null ? filename : "directory."));78 System.err.println("Add '" + metadata + "' to " + (filename != null ? filename : "directory.")); 79 79 try { 80 80 // Retrieve the document element. … … 92 92 // Have we found a match. If so break out of for loop. 93 93 if(filename != null && filename.matches(filename_pattern) && !filename_pattern.equals(DIRECTORY_FILENAME)) { 94 ///ystem.err.println("Adding to file!");94 System.err.println("Adding to existing file fileset!"); 95 95 found = true; 96 96 } 97 97 else if(filename == null && filename_pattern.equals(DIRECTORY_FILENAME)) { 98 ///ystem.err.println("Adding to folder!");98 System.err.println("Adding to existing folder fileset!"); 99 99 ///ystem.err.println("filename_pattern = '" + filename_pattern + "'"); 100 100 found = true; … … 111 111 // If we still haven't found an existing fileset, then its time to create one. 112 112 if(fileset_element == null) { 113 System.err.println("Creating a new fileset."); 113 114 fileset_element = base_document.createElement(FILESET_ELEMENT); 114 115 Element filename_element = base_document.createElement(FILENAME_ELEMENT); … … 140 141 Element metadata_element = base_document.createElement(METADATA_ELEMENT); 141 142 metadata_element.setAttribute(NAME_ATTRIBUTE, metadata.getElement().getName()); 142 if(metadata.accumulates()) { //mode.equals(ACCUMULATE)) { 143 144 // To determine if this metadata entry should overwrite or accumulate we check if there are other entries with the same element in this fileset. 145 boolean will_accumulate = false; 146 NodeList sibling_description_elements = fileset_element.getElementsByTagName(DESCRIPTION_ELEMENT); 147 for(int k = 0; !will_accumulate && k < sibling_description_elements.getLength(); k++) { 148 Element sibling_description_element = (Element) sibling_description_elements.item(k); 149 NodeList sibling_metadata_elements = sibling_description_element.getElementsByTagName(METADATA_ELEMENT); 150 for(int l = 0; !will_accumulate && l < sibling_metadata_elements.getLength(); l++) { 151 Element sibling_metadata_element = (Element) sibling_metadata_elements.item(l); 152 will_accumulate = sibling_metadata_element.getAttribute(NAME_ATTRIBUTE).equals(metadata_element.getAttribute(NAME_ATTRIBUTE)); 153 sibling_metadata_element = null; 154 } 155 sibling_metadata_elements = null; 156 sibling_description_element = null; 157 } 158 sibling_description_elements = null; 159 if(will_accumulate) { //mode.equals(ACCUMULATE)) { 143 160 metadata_element.setAttribute(MODE_ATTRIBUTE, ACCUMULATE); 144 161 } … … 334 351 return ((doctype_name.equals("GreenstoneDirectoryMetadata") && root_name.equals("GreenstoneDirectoryMetadata")) || (doctype_name.equals("DirectoryMetadata") && root_name.equals("DirectoryMetadata"))); 335 352 } 336 /** Remove the given directory level metadata from this document. All directory level metadata is available under the FileSet with filename '.*' */353 /** 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. */ 337 354 public void removeMetadata(String filename, Metadata metadata) { 338 355 try { 356 boolean found = false; 357 boolean first_metadata_element_found = true; 358 boolean make_next_metadata_element_overwrite = false; 339 359 // Retrieve the document element. 340 360 Element directorymetadata_element = base_document.getDocumentElement(); … … 353 373 Element description_element = (Element) description_elements.item(k); 354 374 NodeList metadata_elements = description_element.getElementsByTagName("Metadata"); 355 for(int l = 0; l < metadata_elements.getLength(); l++) {375 for(int l = 0; !found && !make_next_metadata_element_overwrite && l < metadata_elements.getLength(); l++) { 356 376 Element metadata_element = (Element) metadata_elements.item(l); 357 377 String element = metadata_element.getAttribute("name"); 358 378 String value = MSMUtils.getValue(metadata_element); 359 379 // See if this is the metadata we wish to remove 360 if(element.equals(metadata.getElement().getName()) && value.equals(metadata.getAbsoluteValue())) { 361 // Remove it 362 description_element.removeChild(metadata_element); 380 if(element.equals(metadata.getElement().getName())) { 381 if(value.equals(metadata.getAbsoluteValue())) { 382 // Remove it 383 System.err.println("Remove " + element + "-" + value); 384 description_element.removeChild(metadata_element); 385 found = true; 386 // 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. 387 if(first_metadata_element_found && !metadata.accumulates()) { 388 make_next_metadata_element_overwrite = true; 389 } 390 } 391 // If this was the first metadata we've found with the element of the one to be removed set first found to false. 392 else if(first_metadata_element_found) { 393 first_metadata_element_found = false; 394 } 395 // Otherwise we should make this metadata overwrite as requested. 396 else if(make_next_metadata_element_overwrite) { 397 metadata_element.setAttribute(MODE_ATTRIBUTE, ""); 398 } 363 399 } 364 400 value = null;
Note:
See TracChangeset
for help on using the changeset viewer.