source: trunk/gli/src/org/greenstone/gatherer/metadata/MetadataElement.java@ 12672

Last change on this file since 12672 was 12672, checked in by kjdon, 18 years ago

the default attribute with an elements display name is now label, used to be identifier. check label first, then identifier

  • Property svn:keywords set to Author Date Id Revision
File size: 7.8 KB
Line 
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
27package org.greenstone.gatherer.metadata;
28
29
30import java.io.File;
31import org.greenstone.gatherer.Configuration;
32import org.greenstone.gatherer.util.XMLTools;
33import org.greenstone.gatherer.util.StaticStrings;
34import org.w3c.dom.*;
35
36
37/** This class represents one Metadata element */
38public class MetadataElement
39{
40 // Language-independent metadata element name, with namespace (eg. dc.Subject)
41 private String metadata_element_name_full = null;
42 private Element metadata_element_element = null;
43 private MetadataValueTreeModel metadata_value_tree_model = null;
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;
48
49 public MetadataElement(String metadata_element_name_full, Element metadata_element_element)
50 {
51 this.metadata_element_name_full = metadata_element_name_full;
52 this.metadata_element_element = metadata_element_element;
53 this.metadata_value_tree_model = new MetadataValueTreeModel(this);
54 if (metadata_element_element != null) {
55 if (metadata_element_element.getAttribute(StaticStrings.PREDEFINED_METADATA_ATTRIBUTE).equals("true")) {
56 predefined_values = true;
57 loadOptionList();
58 if (metadata_element_element.getAttribute(StaticStrings.RESTRICTED_METADATA_ATTRIBUTE).equals("true")) {
59 // cant have restricted values if no predefined values
60 restricted_values = true;
61 }
62 }
63 }
64 }
65
66 // do this better
67 protected boolean loadOptionList() {
68 NodeList values = metadata_element_element.getElementsByTagName("Value");
69 for (int i=0; i<values.getLength(); i++) {
70 String val = XMLTools.getValue(values.item(i));
71 addMetadataValue(val);
72 }
73 return true;
74 }
75 public MetadataValueTreeNode addMetadataValue(String metadata_value)
76 {
77 return metadata_value_tree_model.addMetadataValue(metadata_value);
78 }
79
80
81 public String getAttribute(String attribute_name, String language_code)
82 {
83 // Some extracted metadata elements may not be in ex.mds, and so have no attributes
84 if (metadata_element_element == null) {
85 return null;
86 }
87
88 Element parent_element = metadata_element_element;
89 boolean language_matches = false;
90
91 NodeList language_elements_nodelist = metadata_element_element.getElementsByTagName("Language");
92 for (int i = 0; i < language_elements_nodelist.getLength(); i++) {
93 Element current_language_element = (Element) language_elements_nodelist.item(i);
94 String current_language_element_code = current_language_element.getAttribute("code");
95 if (current_language_element_code.equals(language_code)) {
96 // Found language; use it for the next step
97 parent_element = current_language_element;
98 language_matches = true;
99 break;
100 }
101 }
102
103 NodeList attribute_elements_nodelist = parent_element.getElementsByTagName("Attribute");
104 for (int i = 0; i < attribute_elements_nodelist.getLength(); i++) {
105 Element current_attribute_element = (Element) attribute_elements_nodelist.item(i);
106 String current_attribute_element_name = current_attribute_element.getAttribute("name");
107 if (!current_attribute_element_name.equals(attribute_name)) {
108 // Move on to the next Attribute element if the name doesn't match
109 continue;
110 }
111
112 // Check if the language matches
113 String current_attribute_element_language = current_attribute_element.getAttribute("language");
114 if (language_matches || current_attribute_element_language.equals(language_code)) {
115 // Found attribute; returns its value
116 return XMLTools.getElementTextValue(current_attribute_element);
117 }
118 }
119
120 return null;
121 }
122
123
124 /** Returns language-dependent metadata element name, with namespace (eg. dc.Subject and Keywords) */
125 public String getDisplayName()
126 {
127 // now we use label, previously we used identifier
128 String metadata_element_display_name = MetadataTools.getMetadataElementAttribute(this, "label", Configuration.getLanguage(), "en");
129 if (metadata_element_display_name == null) {
130 // try identifier
131 metadata_element_display_name = MetadataTools.getMetadataElementAttribute(this, "identifier", Configuration.getLanguage(), "en");
132 }
133 // Root case (no subelements)
134 if (metadata_element_name_full.indexOf(MetadataTools.SUBELEMENT_SEPARATOR) == -1) {
135 if (metadata_element_display_name != null) {
136 return getNamespace() + "." + metadata_element_display_name;
137 }
138
139 return metadata_element_name_full;
140 }
141
142 // Recursive case (hierarchical metadata elements)
143 else {
144 String parent_metadata_element_name_full = metadata_element_name_full.substring(0, metadata_element_name_full.lastIndexOf(MetadataTools.SUBELEMENT_SEPARATOR));
145 MetadataElement parent_metadata_element = MetadataTools.getMetadataElementWithName(parent_metadata_element_name_full);
146
147 String parent_metadata_element_display_name = parent_metadata_element_name_full;
148 if (parent_metadata_element != null) {
149 parent_metadata_element_display_name = parent_metadata_element.getDisplayName();
150 }
151
152 if (metadata_element_display_name != null) {
153 return parent_metadata_element_display_name + MetadataTools.SUBELEMENT_SEPARATOR + metadata_element_display_name;
154 }
155
156 return parent_metadata_element_display_name + metadata_element_name_full.substring(parent_metadata_element_name_full.length());
157 }
158 }
159
160
161 public MetadataValueTreeModel getMetadataValueTreeModel()
162 {
163 return metadata_value_tree_model;
164 }
165
166
167 public MetadataValueTreeNode getMetadataValueTreeNode(String metadata_value)
168 {
169 return metadata_value_tree_model.getMetadataValueTreeNode(metadata_value);
170 }
171
172
173 /** Returns language-independent metadata element name, with namespace (eg. dc.Subject) */
174 public String getFullName()
175 {
176 return metadata_element_name_full;
177 }
178
179
180 public String getNamespace()
181 {
182 return MetadataTools.getMetadataSetNamespace(metadata_element_name_full);
183 }
184
185
186 /** Returns language-independent metadata element name, *without* namespace (eg. Subject) */
187 public String getName()
188 {
189 return MetadataTools.getMetadataElementName(metadata_element_name_full);
190 }
191
192
193 public boolean isExtractedMetadataElement()
194 {
195 return getNamespace().equals(MetadataSetManager.EXTRACTED_METADATA_NAMESPACE);
196 }
197
198 public boolean isPredefined() {
199 return predefined_values;
200 }
201
202 public boolean isRestricted() {
203 return restricted_values;
204 }
205
206 public boolean isSubelement()
207 {
208 return (metadata_element_name_full.indexOf(MetadataTools.SUBELEMENT_SEPARATOR) != -1);
209 }
210
211
212 /** This is used to display the element in the metadata value table */
213 public String toString()
214 {
215 return getDisplayName();
216 }
217}
Note: See TracBrowser for help on using the repository browser.