Changeset 5154


Ignore:
Timestamp:
2003-08-18T13:56:31+12:00 (21 years ago)
Author:
jmt12
Message:

Fix 203B009

Location:
trunk/gli/src/org/greenstone/gatherer/msm
Files:
4 edited

Legend:

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

    r4837 r5154  
    3535 *########################################################################
    3636 */
    37 
    38  
    39 
    40 
    41 
    42 
    43 /* GPL_HEADER */
    4437package org.greenstone.gatherer.msm;
    4538/**************************************************************************************
     
    5245import java.util.TreeSet;
    5346import org.greenstone.gatherer.msm.MSMUtils;
     47import org.greenstone.gatherer.util.StaticStrings;
    5448import org.greenstone.gatherer.util.Utility;
    5549import org.w3c.dom.Element;
     
    185179    return Utility.formatHTMLWidth(MSMUtils.getDescription(element), 60);
    186180    }
     181
     182    public boolean hasValueTree() {
     183    return element.getAttribute(StaticStrings.VALUE_TREE_ATTRIBUTE).equalsIgnoreCase(StaticStrings.TRUE_STR);
     184    }
     185
    187186    /** Increment the number of occurances of this metadata element.
    188       * @see org.greenstone.gatherer.msm.MSMUtils
    189       */
     187     * @see org.greenstone.gatherer.msm.MSMUtils
     188     */
    190189    public void inc() {
    191190    MSMUtils.setOccurance(element, 1);
    192191    }
    193 
     192   
    194193    public boolean isHierarchy() {
    195     return element.getAttribute("hierarchy").equalsIgnoreCase("true");
     194    return element.getAttribute(StaticStrings.HIERARCHY_ATTRIBUTE).equalsIgnoreCase(StaticStrings.TRUE_STR);
    196195    }
    197196
  • trunk/gli/src/org/greenstone/gatherer/msm/MSMUtils.java

    r5085 r5154  
    66 * University of Waikato, New Zealand.
    77 *
    8  * <BR><BR>
    9  *
    108 * Author: John Thompson, Greenstone Digital Library, University of Waikato
    119 *
    12  * <BR><BR>
    13  *
    1410 * Copyright (C) 1999 New Zealand Digital Library Project
    15  *
    16  * <BR><BR>
    1711 *
    1812 * This program is free software; you can redistribute it and/or modify
     
    2115 * (at your option) any later version.
    2216 *
    23  * <BR><BR>
    24  *
    2517 * This program is distributed in the hope that it will be useful,
    2618 * but WITHOUT ANY WARRANTY; without even the implied warranty of
    2719 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    2820 * GNU General Public License for more details.
    29  *
    30  * <BR><BR>
    3121 *
    3222 * You should have received a copy of the GNU General Public License
     
    3525 *########################################################################
    3626 */
    37 
    38  
    39 
    40 
    41 
    42 
    43 /* GPL_HEADER */
    4427package org.greenstone.gatherer.msm;
    4528/**************************************************************************************
     
    4932 * Written:        /  /01
    5033 * Revised:      16/08/02 Improved
     34 *               06/08/03 Bug fixes
    5135 * @author John Thompson, Greenstone Digital Libraries
    5236 * @version 2.3
     
    5943import org.greenstone.gatherer.msm.MetadataSet;
    6044import org.greenstone.gatherer.util.ArrayTools;
     45import org.greenstone.gatherer.util.StaticStrings;
    6146import org.greenstone.gatherer.util.Utility;
    6247import org.greenstone.gatherer.valuetree.GValueModel;
     
    7964    /** The character used to separate name space from metadata element. */
    8065    static public final char NS_SEP= '.';
     66    /** The character used to separate subfields from metadata element. */
     67    static public final String SF_SEP= "#";
    8168    /** Method to add one node as a child of another, after migrating into the target document.
    8269     * @param parent The <strong>Node</strong> we are inserting into.
     
    392379        comment = getValue(comment_node);
    393380    }
     381    if(!definition.endsWith(StaticStrings.SPACE_CHARACTER) && !comment.startsWith(StaticStrings.SPACE_CHARACTER)) {
     382        comment = StaticStrings.SPACE_CHARACTER + comment;
     383    }
    394384    String description = definition + comment;
    395385    return Utility.stripNL(description.trim());
     
    417407     */
    418408    static final public String getFullIdentifier(Node element, String namespace) {
     409    StringBuffer identifier_buffer = new StringBuffer();
    419410    if(element == null) {
    420411        return "Error";
    421412    }
    422     // Get namespace for given element.
    423     Element root = (Element)element.getParentNode();
     413    // First get the root node.
     414    Document document = element.getOwnerDocument();
     415    Element root = document.getDocumentElement();
     416    document = null;
     417    // Retrieve this elements identifier
     418    identifier_buffer.append(getIdentifier(element));
     419    // Now we check if element has a parent node, other than root. If so we begin building up the full identifier
     420    Element parent_element = (Element) element.getParentNode();
     421    while(parent_element != null && parent_element != root) {
     422        identifier_buffer.insert(0, SF_SEP);
     423        identifier_buffer.insert(0, getIdentifier(parent_element));
     424        parent_element = (Element)parent_element.getParentNode();
     425    }
     426    parent_element = null;
     427    // Finally insert the namespace and we are all done.
    424428    if(root != null) {
    425         String identifier = root.getAttribute("namespace");
    426                 // Get name and return it.
    427         if(identifier.equals("")) {
    428         identifier = Utility.EXTRACTED_METADATA_NAMESPACE;
    429         }
    430         return identifier + NS_SEP + getIdentifier(element);
     429        namespace = root.getAttribute("namespace");
    431430    }
    432     if (namespace.equals("")) {
    433         return getIdentifier(element); // No namespace anymore
    434     }
    435     return namespace + NS_SEP + getIdentifier(element);
     431    root = null;
     432    // If no root, or no namespace found, assume its extracted (at least then they can't edit it)
     433    if(namespace == null || namespace.equals("")) {
     434        namespace = Utility.EXTRACTED_METADATA_NAMESPACE;
     435    }
     436    identifier_buffer.insert(0, NS_SEP);
     437    identifier_buffer.insert(0, namespace);
     438    namespace = null;
     439    return identifier_buffer.toString();
    436440    } // static public String getFullIdentier(Node element)
    437441
     
    450454     * @return A <strong>String</strong> representing this given elements fully namespace qualified name.
    451455     */
    452     static final public String getFullName(Element element, String def_namespace) {
     456    static final public String getFullName(Element element, String namespace) {
     457    StringBuffer name_buffer = new StringBuffer();
    453458    if(element == null) {
    454         return null;
    455     }
    456     // Get namespace for given element.
    457     Element root = (Element)element.getParentNode();
    458     String namespace = "";
    459     if (root==null) {
    460         namespace = def_namespace;
    461     }  else {
    462         namespace = root.getAttribute("namespace") ;
    463     }
    464     String identifier = namespace + NS_SEP + element.getAttribute("name");
    465     // Get name and return it.
    466     if(identifier.startsWith(".")) {
    467         identifier = identifier.substring(1);
    468     }
    469     return identifier;
     459        return "Error";
     460    }
     461    // First get the root node.
     462    Document document = element.getOwnerDocument();
     463    Element root = document.getDocumentElement();
     464    document = null;
     465    // Retrieve this elements name
     466    name_buffer.append(element.getAttribute("name"));
     467    // Now we check if element has a parent node, other than root. If so we begin building up the full name
     468    Element parent_element = (Element) element.getParentNode();
     469    while(parent_element != null && parent_element != root) {
     470        name_buffer.insert(0, SF_SEP);
     471        name_buffer.insert(0, parent_element.getAttribute("name"));
     472        parent_element = (Element)parent_element.getParentNode();
     473    }
     474    parent_element = null;
     475    // Finally insert the namespace and we are all done.
     476    if(root != null) {
     477        namespace = root.getAttribute("namespace");
     478    }
     479    root = null;
     480    // If no root, or no namespace found, assume its extracted (at least then they can't edit it)
     481    if(namespace == null || namespace.equals("")) {
     482        namespace = Utility.EXTRACTED_METADATA_NAMESPACE;
     483    }
     484    name_buffer.insert(0, NS_SEP);
     485    name_buffer.insert(0, namespace);
     486    namespace = null;
     487    return name_buffer.toString();
    470488    } // static public String getFullName(Element element)
    471489
  • trunk/gli/src/org/greenstone/gatherer/msm/MetadataSet.java

    r4837 r5154  
    398398    return null;
    399399    }
     400
     401    public Element getElement(Element parent_element, String name) {
     402    Gatherer.println("Get element named " + name + " from " + parent_element.getAttribute("name"));
     403    NodeList elements = parent_element.getElementsByTagName("Element");
     404    for(int i = 0; i < elements.getLength(); i++) {
     405        Element element = (Element) elements.item(i);
     406        if(element.getAttribute("name").equals(name) && element.getParentNode() == parent_element) {
     407        elements = null;
     408        return element;
     409        }
     410    }
     411    elements = null;
     412    return null;
     413    }
    400414    /** Method to acquire a list of all the elements in this metadata set.
    401415     * @return A <strong>NodeList</strong> containing all of this sets elements.
  • trunk/gli/src/org/greenstone/gatherer/msm/MetadataSetManager.java

    r5039 r5154  
    4040import javax.swing.*;
    4141import javax.swing.filechooser.*;
     42import org.greenstone.gatherer.Configuration;
    4243import org.greenstone.gatherer.Gatherer;
    4344import org.greenstone.gatherer.cdm.CommandTokenizer;
     
    306307    for(int i = elements.size(); i != 0; i--) {
    307308        ElementWrapper element = (ElementWrapper) elements.get(i - 1);
    308         if(element.getOccurances() == 0 && element.getNamespace().length() > 0 ) { //&& !element.toString().equals("Source")) {
     309        if(element.getOccurances() == 0 && element.getNamespace().length() > 0 && !element.getNamespace().equals(Utility.EXTRACTED_METADATA_NAMESPACE)) {
    309310        elements.remove(element);
    310311        }
     
    324325    return getElements(false);
    325326    }
     327
     328    public Vector getElements(boolean all) {
     329    return getElements(all, false);
     330    }
     331
    326332    /** Used to get all the elements in this manager.
    327333     * @param all <i>true</i> if all elements, including hidden, should be returned.
    328334     * @return A Vector of ElementWrappers.
    329335     */
    330     public Vector getElements(boolean all) {
     336    public Vector getElements(boolean all, boolean force_extracted) {
    331337    Vector all_elements = new Vector();
    332338    for(Enumeration keys = mds_hashtable.keys(); keys.hasMoreElements(); ) {
    333339        MetadataSet mds = (MetadataSet)mds_hashtable.get(keys.nextElement());
    334         if(all || !mds.getNamespace().equals(HIDDEN)) {
     340        if((!mds.getNamespace().equals(Utility.EXTRACTED_METADATA_NAMESPACE) && !mds.getNamespace().equals(HIDDEN))
     341           || (mds.getNamespace().equals(Utility.EXTRACTED_METADATA_NAMESPACE) && (Gatherer.config.get("general.view_extracted_metadata", Configuration.COLLECTION_SPECIFIC) || force_extracted))
     342           || (mds.getNamespace().equals(Utility.EXTRACTED_METADATA_NAMESPACE) && mds.getNamespace().equals(HIDDEN) && all)) {
    335343        NodeList set_elements = mds.getElements();
    336         ///ystem.err.println("The set " + mds + " has " + set_elements.getLength() + " elements.");
     344        System.err.println("The set " + mds + " has " + set_elements.getLength() + " elements.");
    337345        for(int i = 0; i < set_elements.getLength(); i++) {
    338             ElementWrapper element = new ElementWrapper((Element)set_elements.item(i));
    339             // if(!element.toString().equals("Source")) {
    340             all_elements.add(element);
    341             // }
     346            Element raw_element = (Element)set_elements.item(i);
     347            ElementWrapper element = new ElementWrapper(raw_element);
     348            // For now we do not add subfield elements and their parents, just the subfields.
     349            NodeList child_elements = raw_element.getElementsByTagName("Element");
     350            if(child_elements.getLength() == 0) {
     351            all_elements.add(element);
     352            }
    342353        }
    343354        }
     
    376387     */
    377388    public ElementWrapper getElement(String name) {
     389    return getElement(name, false);
     390    }
     391
     392    public ElementWrapper getElement(String name, boolean perfect) {
    378393    ///ystem.err.println("Retrieve element " + name);
    379394    if(name == null) {
    380                 ///ystem.err.println("No name!");
     395        ///ystem.err.println("No name!");
    381396        return null;
    382397    }
     
    386401    // First we seperate off what set it is in, where we have '<set><namespace_separator><element>'.
    387402    if(name.indexOf(MSMUtils.NS_SEP) != -1) {
    388         if(name.startsWith(Utility.EXTRACTED_METADATA_NAMESPACE)) {
    389         // Retrieve the correct set if possible.
    390         set = (MetadataSet)mds_hashtable.get("");
    391         // Now retrieve the element name.
    392         element = name.substring(name.indexOf(MSMUtils.NS_SEP) + 1);
    393         }
    394         else {
    395         String namespace = name.substring(0, name.indexOf(MSMUtils.NS_SEP));
    396         // Retrieve the correct set if possible.
    397         set = (MetadataSet)mds_hashtable.get(namespace);
    398         namespace = null;
    399         // Now retrieve the element name.
    400         element = name.substring(name.indexOf(MSMUtils.NS_SEP) + 1);
    401         }
    402     }
    403     else {
    404         // No namespace so assume ns = "".
    405         set = (MetadataSet)mds_hashtable.get("");
     403        String namespace = name.substring(0, name.indexOf(MSMUtils.NS_SEP));
     404        // Retrieve the correct set if possible.
     405        set = (MetadataSet)mds_hashtable.get(namespace);
     406        namespace = null;
     407        // Now retrieve the element name.
     408        element = name.substring(name.indexOf(MSMUtils.NS_SEP) + 1);
     409    }
     410    // If we are looking for a perfect match, we can assume that no namespace means extracted metadata
     411    else if(!perfect) {
     412        // No namespace so assume that its extracted metadata.
     413        set = (MetadataSet)mds_hashtable.get(Utility.EXTRACTED_METADATA_NAMESPACE);
    406414        element = name;
    407415    }
    408416    if(set != null) {
    409         ///ystem.err.print("Trying to match element " + element +"?");
    410         Element temp = set.getElement(element);
    411         if(temp != null) {
    412         ///ystem.err.println("Found!");
    413         result = new ElementWrapper(temp);
    414         }
    415         else {
    416         ///ystem.err.println("Not found.");
    417         }
    418         element = null;
    419         temp = null;
    420     }
    421     else {
    422                 ///ystem.err.println("No such set");
    423     }
    424     set = null;
    425     if(result == null) {
    426                 ///ystem.err.println("Shouldn't return null unless this is greenstone archive parsing.");
    427     }
     417        // Now we have a set we are ready to locate the requested element. Break the remaining element name down by the subfield separator, attempting to retrieve the element indicated by each step.
     418        if(element.indexOf(MSMUtils.SF_SEP) != -1) {
     419        StringTokenizer tokenizer = new StringTokenizer(element, MSMUtils.SF_SEP);
     420        // Has to be at least two tokens
     421        if(tokenizer.countTokens() >= 2) {
     422            Element current_element = set.getElement(tokenizer.nextToken());
     423            while(current_element != null && tokenizer.hasMoreTokens()) {
     424            current_element = set.getElement(current_element, tokenizer.nextToken());
     425            }
     426            if(current_element != null) {
     427            result = new ElementWrapper(current_element);
     428            current_element = null;
     429            }
     430        }
     431        tokenizer = null;
     432        }
     433        // No subfields - much easier.
     434        if(result == null) {
     435        ///ystem.err.print("Trying to match element " + element +"?");
     436        Element temp = set.getElement(element);
     437        if(temp != null) {
     438            result = new ElementWrapper(temp);
     439        }
     440        temp = null;
     441        }
     442        set = null;
     443    }
     444    element = null;
    428445    return result;
    429446    }
     
    465482        return (MetadataSet) mds_hashtable.get(name);
    466483    }
    467     else if(name.equals(Utility.EXTRACTED_METADATA_NAMESPACE)) {
    468         return (MetadataSet) mds_hashtable.get("");
    469     }
    470     else {
    471         ///ystem.err.println("Couldn't find metadata set.");
    472         if(name.equals(HIDDEN)) {
    473         return createHidden();
    474         }
     484    else if(name.equals(HIDDEN)) {
     485        return createHidden();
    475486    }
    476487    return null;
     
    483494    return getSets(true);
    484495    }
     496
    485497    public Vector getSets(boolean include_greenstone) {
    486498    Vector result = new Vector();
    487499    for(Enumeration keys = mds_hashtable.keys(); keys.hasMoreElements(); ) {
    488500        MetadataSet set = (MetadataSet)mds_hashtable.get(keys.nextElement());
    489         if(!set.getNamespace().equals(HIDDEN) && (include_greenstone || !set.getNamespace().equals(""))) {
     501        if(!set.getNamespace().equals(HIDDEN) && (include_greenstone || !set.getNamespace().equals(Utility.EXTRACTED_METADATA_NAMESPACE))) {
    490502        result.add(set);
    491503        }
     
    493505    return result;
    494506    }
     507
    495508    /** Find the total number of elements loaded.
    496509     * @return The element count as an int.
     
    939952        MetadataSet set = (MetadataSet) mds_hashtable.get(namespace);
    940953        try {
    941         File mds_file = null;
    942         if(!namespace.equals("")) {
    943             mds_file = new File(file, set.getNamespace() + ".mds");
    944         }
    945         else {
    946             mds_file = new File(file, Utility.METADATA_EXTRACTED);
    947         }
     954        File mds_file = new File(file, set.getNamespace() + ".mds");
    948955        Utility.export(set.getDocument(), mds_file);
    949956        set.setFile(mds_file);
    950957        // Now for each element attempt to save its value tree.
    951958        NodeList elements = set.getElements();
    952         for(int i = elements.getLength() - 1;   !namespace.equals("") && i >= 0; i--) {
     959        for(int i = elements.getLength() - 1; i >= 0; i--) {
    953960            ElementWrapper value_element = new ElementWrapper((Element)elements.item(i));
    954             GValueModel value_tree = set.getValueTree(value_element);
    955             if(value_tree != null) {
    956             File value_file = new File(file, value_element.getName() + ".mdv");
    957             ///ystem.err.println("Saving value file: " + value_file.toString());
    958             Utility.export(value_tree.getDocument(), value_file);
    959             // If this is a hierarchy element, write hierarchy file.
    960             if(value_element.getNamespace().equals(MetadataSetManager.HIDDEN) || value_tree.isHierarchy()) {
    961                 MetadataXML.write(value_tree, this, Gatherer.c_man.getCollectionEtc());
     961            if(value_element.hasValueTree()) {
     962            GValueModel value_tree = set.getValueTree(value_element);
     963            if(value_tree != null) {
     964                File value_file = new File(file, value_element.getName() + ".mdv");
     965                ///ystem.err.println("Saving value file: " + value_file.toString());
     966                Utility.export(value_tree.getDocument(), value_file);
     967                // If this is a hierarchy element, write hierarchy file.
     968                if(value_element.getNamespace().equals(MetadataSetManager.HIDDEN) || value_tree.isHierarchy()) {
     969                MetadataXML.write(value_element, value_tree, this, Gatherer.c_man.getCollectionEtc());
     970                }
    962971            }
    963             }
    964             else {
    965             ///ystem.err.println("No value tree for " + value_element.toString());
    966972            }
    967973        }
Note: See TracChangeset for help on using the changeset viewer.