Changeset 4358


Ignore:
Timestamp:
2003-05-27T15:24:55+12:00 (21 years ago)
Author:
jmt12
Message:

Bug fix to prevent accumulating metadata at file level accidently being overwritten by subsequently added file level metadata - John

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gli/src/org/greenstone/gatherer/msm/GDMDocument.java

    r4293 r4358  
    7474          this.base_document = base_document;
    7575     }
    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! */
    7777     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."));
    7979          try {
    8080                // Retrieve the document element.
     
    9292                          // Have we found a match. If so break out of for loop.
    9393                          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!");
    9595                                found = true;
    9696                          }
    9797                          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!");
    9999                                ///ystem.err.println("filename_pattern = '" + filename_pattern + "'");
    100100                                found = true;
     
    111111                // If we still haven't found an existing fileset, then its time to create one.
    112112                if(fileset_element == null) {
     113                     System.err.println("Creating a new fileset.");
    113114                     fileset_element = base_document.createElement(FILESET_ELEMENT);
    114115                     Element filename_element = base_document.createElement(FILENAME_ELEMENT);
     
    140141                Element metadata_element = base_document.createElement(METADATA_ELEMENT);
    141142                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)) {
    143160                     metadata_element.setAttribute(MODE_ATTRIBUTE, ACCUMULATE);
    144161                }
     
    334351          return ((doctype_name.equals("GreenstoneDirectoryMetadata") && root_name.equals("GreenstoneDirectoryMetadata")) || (doctype_name.equals("DirectoryMetadata") && root_name.equals("DirectoryMetadata")));
    335352     }
    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. */
    337354     public void removeMetadata(String filename, Metadata metadata) {
    338355          try {
     356                boolean found = false;
     357                boolean first_metadata_element_found = true;
     358                boolean make_next_metadata_element_overwrite = false;
    339359                // Retrieve the document element.
    340360                Element directorymetadata_element = base_document.getDocumentElement();
     
    353373                                     Element description_element = (Element) description_elements.item(k);
    354374                                     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++) {       
    356376                                          Element metadata_element = (Element) metadata_elements.item(l);
    357377                                          String element = metadata_element.getAttribute("name");
    358378                                          String value = MSMUtils.getValue(metadata_element);
    359379                                          // 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                                                }
    363399                                          }
    364400                                          value = null;
Note: See TracChangeset for help on using the changeset viewer.