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

Last change on this file since 24367 was 24367, checked in by ak19, 13 years ago

Changes to GLI to do with embedded metadata: the plugin and changes to the processing of ex.metadata to deal with ex.something.metadata

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