[8164] | 1 | /**
|
---|
| 2 | *############################################################################
|
---|
| 3 | * A component of the Greenstone Librarian Interface, part of the Greenstone
|
---|
| 4 | * digital library suite from the New Zealand Digital Library Project at the
|
---|
| 5 | * University of Waikato, New Zealand.
|
---|
| 6 | *
|
---|
| 7 | * Author: Michael Dewsnip, NZDL Project, University of Waikato, NZ
|
---|
| 8 | *
|
---|
| 9 | * Copyright (C) 2004 New Zealand Digital Library Project
|
---|
| 10 | *
|
---|
| 11 | * This program is free software; you can redistribute it and/or modify
|
---|
| 12 | * it under the terms of the GNU General Public License as published by
|
---|
| 13 | * the Free Software Foundation; either version 2 of the License, or
|
---|
| 14 | * (at your option) any later version.
|
---|
| 15 | *
|
---|
| 16 | * This program is distributed in the hope that it will be useful,
|
---|
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 19 | * GNU General Public License for more details.
|
---|
| 20 | *
|
---|
| 21 | * You should have received a copy of the GNU General Public License
|
---|
| 22 | * along with this program; if not, write to the Free Software
|
---|
| 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
---|
| 24 | *############################################################################
|
---|
| 25 | */
|
---|
| 26 |
|
---|
[7822] | 27 | package org.greenstone.gatherer.metadata;
|
---|
| 28 |
|
---|
| 29 |
|
---|
[8123] | 30 | import java.io.File;
|
---|
[8231] | 31 | import org.greenstone.gatherer.Configuration;
|
---|
[8023] | 32 | import org.greenstone.gatherer.util.XMLTools;
|
---|
[10971] | 33 | import org.greenstone.gatherer.util.StaticStrings;
|
---|
[8023] | 34 | import org.w3c.dom.*;
|
---|
| 35 |
|
---|
| 36 |
|
---|
[7822] | 37 | /** This class represents one Metadata element */
|
---|
| 38 | public class MetadataElement
|
---|
| 39 | {
|
---|
[9551] | 40 | // Language-independent metadata element name, with namespace (eg. dc.Subject)
|
---|
[7978] | 41 | private String metadata_element_name_full = null;
|
---|
[8023] | 42 | private Element metadata_element_element = null;
|
---|
[7978] | 43 | private MetadataValueTreeModel metadata_value_tree_model = null;
|
---|
[10971] | 44 | /* this is true if the metadata element comes with a pre defined set of values */
|
---|
| 45 | private boolean predefined_values = false;
|
---|
| 46 | /* This restricts the user to only the predefined values */
|
---|
| 47 | private boolean restricted_values = false;
|
---|
[7822] | 48 |
|
---|
[8023] | 49 | public MetadataElement(String metadata_element_name_full, Element metadata_element_element)
|
---|
[7978] | 50 | {
|
---|
| 51 | this.metadata_element_name_full = metadata_element_name_full;
|
---|
[8023] | 52 | this.metadata_element_element = metadata_element_element;
|
---|
[7978] | 53 | this.metadata_value_tree_model = new MetadataValueTreeModel(this);
|
---|
[10971] | 54 | if (metadata_element_element.getAttribute(StaticStrings.PREDEFINED_METADATA_ATTRIBUTE).equals("true")) {
|
---|
| 55 | predefined_values = true;
|
---|
| 56 | loadOptionList();
|
---|
| 57 | if (metadata_element_element.getAttribute(StaticStrings.RESTRICTED_METADATA_ATTRIBUTE).equals("true")) {
|
---|
| 58 | // cant have restricted values if no predefined values
|
---|
| 59 | restricted_values = true;
|
---|
| 60 | }
|
---|
| 61 | }
|
---|
[7978] | 62 | }
|
---|
[10971] | 63 |
|
---|
| 64 | // do this better
|
---|
| 65 | protected boolean loadOptionList() {
|
---|
| 66 | NodeList values = metadata_element_element.getElementsByTagName("Value");
|
---|
| 67 | for (int i=0; i<values.getLength(); i++) {
|
---|
| 68 | String val = XMLTools.getValue(values.item(i));
|
---|
| 69 | addMetadataValue(val);
|
---|
| 70 | }
|
---|
| 71 | return true;
|
---|
| 72 | }
|
---|
[7978] | 73 | public MetadataValueTreeNode addMetadataValue(String metadata_value)
|
---|
| 74 | {
|
---|
| 75 | return metadata_value_tree_model.addMetadataValue(metadata_value);
|
---|
| 76 | }
|
---|
[7822] | 77 |
|
---|
| 78 |
|
---|
[8023] | 79 | public String getAttribute(String attribute_name, String language_code)
|
---|
[7978] | 80 | {
|
---|
[8023] | 81 | // Some extracted metadata elements may not be in ex.mds, and so have no attributes
|
---|
[8122] | 82 | if (metadata_element_element == null) {
|
---|
| 83 | return null;
|
---|
| 84 | }
|
---|
[8023] | 85 |
|
---|
| 86 | Element parent_element = metadata_element_element;
|
---|
| 87 | boolean language_matches = false;
|
---|
| 88 |
|
---|
| 89 | NodeList language_elements_nodelist = metadata_element_element.getElementsByTagName("Language");
|
---|
| 90 | for (int i = 0; i < language_elements_nodelist.getLength(); i++) {
|
---|
| 91 | Element current_language_element = (Element) language_elements_nodelist.item(i);
|
---|
| 92 | String current_language_element_code = current_language_element.getAttribute("code");
|
---|
| 93 | if (current_language_element_code.equals(language_code)) {
|
---|
| 94 | // Found language; use it for the next step
|
---|
| 95 | parent_element = current_language_element;
|
---|
| 96 | language_matches = true;
|
---|
| 97 | break;
|
---|
| 98 | }
|
---|
| 99 | }
|
---|
| 100 |
|
---|
| 101 | NodeList attribute_elements_nodelist = parent_element.getElementsByTagName("Attribute");
|
---|
| 102 | for (int i = 0; i < attribute_elements_nodelist.getLength(); i++) {
|
---|
| 103 | Element current_attribute_element = (Element) attribute_elements_nodelist.item(i);
|
---|
| 104 | String current_attribute_element_name = current_attribute_element.getAttribute("name");
|
---|
| 105 | if (!current_attribute_element_name.equals(attribute_name)) {
|
---|
| 106 | // Move on to the next Attribute element if the name doesn't match
|
---|
| 107 | continue;
|
---|
| 108 | }
|
---|
| 109 |
|
---|
| 110 | // Check if the language matches
|
---|
| 111 | String current_attribute_element_language = current_attribute_element.getAttribute("language");
|
---|
| 112 | if (language_matches || current_attribute_element_language.equals(language_code)) {
|
---|
| 113 | // Found attribute; returns its value
|
---|
| 114 | return XMLTools.getElementTextValue(current_attribute_element);
|
---|
| 115 | }
|
---|
| 116 | }
|
---|
| 117 |
|
---|
| 118 | return null;
|
---|
[7978] | 119 | }
|
---|
[7822] | 120 |
|
---|
| 121 |
|
---|
[9551] | 122 | /** Returns language-dependent metadata element name, with namespace (eg. dc.Subject and Keywords) */
|
---|
[8131] | 123 | public String getDisplayName()
|
---|
| 124 | {
|
---|
[8231] | 125 | String metadata_element_display_name = MetadataTools.getMetadataElementAttribute(this, "identifier", Configuration.getLanguage(), "en");
|
---|
[8996] | 126 |
|
---|
[9015] | 127 | // Root case (no subelements)
|
---|
| 128 | if (metadata_element_name_full.indexOf(MetadataTools.SUBELEMENT_SEPARATOR) == -1) {
|
---|
| 129 | if (metadata_element_display_name != null) {
|
---|
| 130 | return getNamespace() + "." + metadata_element_display_name;
|
---|
| 131 | }
|
---|
| 132 |
|
---|
| 133 | return metadata_element_name_full;
|
---|
| 134 | }
|
---|
| 135 |
|
---|
| 136 | // Recursive case (hierarchical metadata elements)
|
---|
| 137 | else {
|
---|
[8996] | 138 | String parent_metadata_element_name_full = metadata_element_name_full.substring(0, metadata_element_name_full.lastIndexOf(MetadataTools.SUBELEMENT_SEPARATOR));
|
---|
| 139 | MetadataElement parent_metadata_element = MetadataTools.getMetadataElementWithName(parent_metadata_element_name_full);
|
---|
| 140 |
|
---|
[9015] | 141 | String parent_metadata_element_display_name = parent_metadata_element_name_full;
|
---|
| 142 | if (parent_metadata_element != null) {
|
---|
| 143 | parent_metadata_element_display_name = parent_metadata_element.getDisplayName();
|
---|
| 144 | }
|
---|
| 145 |
|
---|
| 146 | if (metadata_element_display_name != null) {
|
---|
| 147 | return parent_metadata_element_display_name + MetadataTools.SUBELEMENT_SEPARATOR + metadata_element_display_name;
|
---|
| 148 | }
|
---|
| 149 |
|
---|
[9023] | 150 | return parent_metadata_element_display_name + metadata_element_name_full.substring(parent_metadata_element_name_full.length());
|
---|
[8131] | 151 | }
|
---|
| 152 | }
|
---|
| 153 |
|
---|
| 154 |
|
---|
[7978] | 155 | public MetadataValueTreeModel getMetadataValueTreeModel()
|
---|
| 156 | {
|
---|
| 157 | return metadata_value_tree_model;
|
---|
| 158 | }
|
---|
[7822] | 159 |
|
---|
| 160 |
|
---|
[7978] | 161 | public MetadataValueTreeNode getMetadataValueTreeNode(String metadata_value)
|
---|
| 162 | {
|
---|
| 163 | return metadata_value_tree_model.getMetadataValueTreeNode(metadata_value);
|
---|
| 164 | }
|
---|
[7822] | 165 |
|
---|
| 166 |
|
---|
[9551] | 167 | /** Returns language-independent metadata element name, with namespace (eg. dc.Subject) */
|
---|
[7978] | 168 | public String getFullName()
|
---|
| 169 | {
|
---|
| 170 | return metadata_element_name_full;
|
---|
| 171 | }
|
---|
[7822] | 172 |
|
---|
| 173 |
|
---|
[7978] | 174 | public String getNamespace()
|
---|
| 175 | {
|
---|
| 176 | return MetadataTools.getMetadataSetNamespace(metadata_element_name_full);
|
---|
| 177 | }
|
---|
[7822] | 178 |
|
---|
| 179 |
|
---|
[9551] | 180 | /** Returns language-independent metadata element name, *without* namespace (eg. Subject) */
|
---|
[7978] | 181 | public String getName()
|
---|
| 182 | {
|
---|
| 183 | return MetadataTools.getMetadataElementName(metadata_element_name_full);
|
---|
| 184 | }
|
---|
[7822] | 185 |
|
---|
| 186 |
|
---|
[9211] | 187 | public boolean isExtractedMetadataElement()
|
---|
[7978] | 188 | {
|
---|
| 189 | return getNamespace().equals(MetadataSetManager.EXTRACTED_METADATA_NAMESPACE);
|
---|
| 190 | }
|
---|
[7822] | 191 |
|
---|
[10971] | 192 | public boolean isPredefined() {
|
---|
| 193 | return predefined_values;
|
---|
| 194 | }
|
---|
[7822] | 195 |
|
---|
[10971] | 196 | public boolean isRestricted() {
|
---|
| 197 | return restricted_values;
|
---|
| 198 | }
|
---|
| 199 |
|
---|
[9211] | 200 | public boolean isSubelement()
|
---|
| 201 | {
|
---|
| 202 | return (metadata_element_name_full.indexOf(MetadataTools.SUBELEMENT_SEPARATOR) != -1);
|
---|
| 203 | }
|
---|
| 204 |
|
---|
| 205 |
|
---|
[8037] | 206 | /** This is used to display the element in the metadata value table */
|
---|
[7978] | 207 | public String toString()
|
---|
| 208 | {
|
---|
[8131] | 209 | return getDisplayName();
|
---|
[7978] | 210 | }
|
---|
[7822] | 211 | }
|
---|