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

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

metadata elements can now have predefined values, defined in the metadata set xml file. An element can have attributes predefined (have predefined metadata) and restricted (only allowed these predefined values). If there are predefined values, load them into the value tree, if its restricted, don't allow the user to add any other values

  • Property svn:keywords set to Author Date Id Revision
File size: 7.5 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.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 }
62 }
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 }
73 public MetadataValueTreeNode addMetadataValue(String metadata_value)
74 {
75 return metadata_value_tree_model.addMetadataValue(metadata_value);
76 }
77
78
79 public String getAttribute(String attribute_name, String language_code)
80 {
81 // Some extracted metadata elements may not be in ex.mds, and so have no attributes
82 if (metadata_element_element == null) {
83 return null;
84 }
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;
119 }
120
121
122 /** Returns language-dependent metadata element name, with namespace (eg. dc.Subject and Keywords) */
123 public String getDisplayName()
124 {
125 String metadata_element_display_name = MetadataTools.getMetadataElementAttribute(this, "identifier", Configuration.getLanguage(), "en");
126
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 {
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
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
150 return parent_metadata_element_display_name + metadata_element_name_full.substring(parent_metadata_element_name_full.length());
151 }
152 }
153
154
155 public MetadataValueTreeModel getMetadataValueTreeModel()
156 {
157 return metadata_value_tree_model;
158 }
159
160
161 public MetadataValueTreeNode getMetadataValueTreeNode(String metadata_value)
162 {
163 return metadata_value_tree_model.getMetadataValueTreeNode(metadata_value);
164 }
165
166
167 /** Returns language-independent metadata element name, with namespace (eg. dc.Subject) */
168 public String getFullName()
169 {
170 return metadata_element_name_full;
171 }
172
173
174 public String getNamespace()
175 {
176 return MetadataTools.getMetadataSetNamespace(metadata_element_name_full);
177 }
178
179
180 /** Returns language-independent metadata element name, *without* namespace (eg. Subject) */
181 public String getName()
182 {
183 return MetadataTools.getMetadataElementName(metadata_element_name_full);
184 }
185
186
187 public boolean isExtractedMetadataElement()
188 {
189 return getNamespace().equals(MetadataSetManager.EXTRACTED_METADATA_NAMESPACE);
190 }
191
192 public boolean isPredefined() {
193 return predefined_values;
194 }
195
196 public boolean isRestricted() {
197 return restricted_values;
198 }
199
200 public boolean isSubelement()
201 {
202 return (metadata_element_name_full.indexOf(MetadataTools.SUBELEMENT_SEPARATOR) != -1);
203 }
204
205
206 /** This is used to display the element in the metadata value table */
207 public String toString()
208 {
209 return getDisplayName();
210 }
211}
Note: See TracBrowser for help on using the repository browser.