source: trunk/gli/src/org/greenstone/gatherer/metadata/MetadataXMLFile.java@ 8141

Last change on this file since 8141 was 8141, checked in by mdewsnip, 20 years ago

Now can add elements to metadata sets when importing non-namespaced metadata elements. Is this the very last piece of new metadata code?

Just a lot of bug fixes to come, I think...

  • Property svn:keywords set to Author Date Id Revision
File size: 15.4 KB
RevLine 
[7822]1package org.greenstone.gatherer.metadata;
2
3
4import java.io.*;
5import java.util.*;
[7827]6import org.greenstone.gatherer.util.XMLTools;
[7822]7import org.w3c.dom.*;
8
9
10/** This class represents one metadata.xml file */
11public class MetadataXMLFile
[7978]12 extends File
[7822]13{
[7978]14 static final private String DESCRIPTION_ELEMENT = "Description";
15 static final private String DIRECTORY_FILENAME = ".*";
16 static final private String FILENAME_ELEMENT = "FileName";
17 static final private String FILESET_ELEMENT = "FileSet";
18 static final private String METADATA_ELEMENT = "Metadata";
[7822]19
20
[7978]21 public MetadataXMLFile(String metadata_xml_file_path)
22 {
23 super(metadata_xml_file_path);
24 }
[7822]25
26
[7978]27 public void addMetadata(File file, MetadataValue metadata_value)
28 {
29 // Parse the metadata.xml file
30 Document document = XMLTools.parseXMLFile(this);
31 if (document == null) {
32 System.err.println("Error: Could not parse metadata.xml file " + getAbsolutePath());
33 return;
34 }
[7822]35
[7978]36 // Determine the file's path relative to the location of the metadata.xml file
37 File metadata_xml_file_directory = getParentFile();
38 String file_relative_path = file.getAbsolutePath().substring(metadata_xml_file_directory.getAbsolutePath().length());
39 if (file_relative_path.startsWith(File.separator)) {
40 file_relative_path = file_relative_path.substring(File.separator.length());
41 }
[7822]42
[7978]43 // Convert the file path into a regular expression that will match it
44 String file_path_regexp = file_relative_path.replaceAll("\\.", "\\\\.");
45 if (file_relative_path.equals("")) {
46 file_path_regexp = DIRECTORY_FILENAME;
47 }
[7822]48
[8124]49 // Square brackets need to be escaped because they are a special character in Greenstone
50 String metadata_value_string = metadata_value.getFullValue();
51 metadata_value_string = metadata_value_string.replaceAll("\\[", "[");
52 metadata_value_string = metadata_value_string.replaceAll("\\]", "]");
53
[7978]54 // Create a new Metadata element to record this metadata
55 Element new_metadata_value_element = document.createElement(METADATA_ELEMENT);
56 new_metadata_value_element.setAttribute("name", metadata_value.getMetadataElement().getFullName());
57 new_metadata_value_element.setAttribute("mode", (metadata_value.isAccumulatingMetadata() ? "accumulate" : "override"));
[8124]58 new_metadata_value_element.appendChild(document.createTextNode(metadata_value_string));
[7978]59 boolean have_added_metadata = false;
[7827]60
[7978]61 // Read all the FileSet elements in the file
62 NodeList fileset_elements_nodelist = document.getElementsByTagName(FILESET_ELEMENT);
63 for (int i = 0; i < fileset_elements_nodelist.getLength(); i++) {
64 Element current_fileset_element = (Element) fileset_elements_nodelist.item(i);
[7822]65
[7978]66 // Check the FileName elements of the FileSet to see if we have a match
67 NodeList filename_elements_nodelist = current_fileset_element.getElementsByTagName(FILENAME_ELEMENT);
68 for (int j = 0; j < filename_elements_nodelist.getLength(); j++) {
69 Element current_filename_element = (Element) filename_elements_nodelist.item(j);
70 String current_filename_element_value = XMLTools.getElementTextValue(current_filename_element);
[7822]71
[7978]72 // Only exact matches can be extended with new metadata
73 if (current_filename_element_value.equals(file_path_regexp)) {
74 // Append the new Metadata element to the Description element of this FileSet
75 Element description_element = (Element) current_fileset_element.getElementsByTagName(DESCRIPTION_ELEMENT).item(0);
[7827]76
[7978]77 // Accumulating metadata: add at the end
78 if (metadata_value.isAccumulatingMetadata()) {
79 description_element.appendChild(new_metadata_value_element);
80 }
81 // Override metadata: add at the start (so it overrides inherited metadata without affecting other assigned metadata)
82 else {
83 description_element.insertBefore(new_metadata_value_element, description_element.getFirstChild());
84 }
[7827]85
[7978]86 have_added_metadata = true;
87 break;
88 }
[7822]89 }
[7978]90 }
[7822]91
[7978]92 // Check if the metadata was added to an existing FileSet
93 if (!have_added_metadata) {
94 // It wasn't, so create a new FileSet element for it
95 Element new_fileset_element = document.createElement(FILESET_ELEMENT);
[7822]96
[7978]97 Element new_filename_element = document.createElement(FILENAME_ELEMENT);
98 new_filename_element.appendChild(document.createTextNode(file_path_regexp));
99 new_fileset_element.appendChild(new_filename_element);
[7822]100
[7978]101 // Append the new Metadata element to the Description element of this FileSet
102 Element new_description_element = document.createElement(DESCRIPTION_ELEMENT);
103 new_description_element.appendChild(new_metadata_value_element);
104 new_fileset_element.appendChild(new_description_element);
[7827]105
[7978]106 document.getDocumentElement().appendChild(new_fileset_element);
107 }
[7822]108
[7978]109 // Rewrite the metadata.xml file
110 XMLTools.writeXMLFile(this, document);
111 }
[7822]112
113
[7978]114 public ArrayList getMetadataAssignedToFile(File file)
115 {
116 // Parse the metadata.xml file
117 Document document = XMLTools.parseXMLFile(this);
118 if (document == null) {
119 System.err.println("Error: Could not parse metadata.xml file " + getAbsolutePath());
120 return null;
121 }
[7822]122
[7978]123 // Determine the file's path relative to the location of the metadata.xml file
124 File metadata_xml_file_directory = getParentFile();
125 String file_relative_path = file.getAbsolutePath().substring(metadata_xml_file_directory.getAbsolutePath().length());
126 if (file_relative_path.startsWith(File.separator)) {
127 file_relative_path = file_relative_path.substring(File.separator.length());
128 }
[7822]129
[7978]130 // Build up a list of metadata assigned to this file
131 ArrayList metadata_values = new ArrayList();
[7822]132
[7978]133 // Read all the FileSet elements in the file
134 NodeList fileset_elements_nodelist = document.getElementsByTagName(FILESET_ELEMENT);
135 for (int i = 0; i < fileset_elements_nodelist.getLength(); i++) {
136 Element current_fileset_element = (Element) fileset_elements_nodelist.item(i);
137 boolean current_fileset_matches = false;
[8135]138 File folder_metadata_inherited_from = null;
[7822]139
[7978]140 // Check the FileName elements of the FileSet to see if we have a match
141 NodeList filename_elements_nodelist = current_fileset_element.getElementsByTagName(FILENAME_ELEMENT);
142 for (int j = 0; j < filename_elements_nodelist.getLength(); j++) {
143 Element current_filename_element = (Element) filename_elements_nodelist.item(j);
144 String current_filename_element_value = XMLTools.getElementTextValue(current_filename_element);
[7822]145
[8135]146 // This fileset specifies metadata for the file
[7978]147 if (file_relative_path.matches(current_filename_element_value)) {
148 current_fileset_matches = true;
[8135]149 if (!file_relative_path.equals("") && current_filename_element_value.equals(DIRECTORY_FILENAME)) {
150 folder_metadata_inherited_from = metadata_xml_file_directory;
151 }
[7978]152 break;
153 }
[8135]154
155 // This fileset specifies metadata for the folder the file is in
156 if (file_relative_path.startsWith(current_filename_element_value + File.separator)) {
157 current_fileset_matches = true;
158 folder_metadata_inherited_from = new File(metadata_xml_file_directory, current_filename_element_value);
159 break;
160 }
[7822]161 }
162
[7978]163 // The FileSet doesn't apply, so move onto the next one
164 if (current_fileset_matches == false) {
165 continue;
166 }
[7822]167
[7978]168 // Read all the Metadata elements in the fileset
169 NodeList metadata_elements_nodelist = current_fileset_element.getElementsByTagName(METADATA_ELEMENT);
170 for (int k = 0; k < metadata_elements_nodelist.getLength(); k++) {
171 Element current_metadata_element = (Element) metadata_elements_nodelist.item(k);
[8140]172 String metadata_element_name_full = current_metadata_element.getAttribute("name");
[7822]173
[8140]174 String metadata_set_namespace = MetadataTools.getMetadataSetNamespace(metadata_element_name_full);
[7978]175 MetadataSet metadata_set = MetadataSetManager.getMetadataSet(metadata_set_namespace);
[7822]176
[8140]177 // If the metadata set isn't loaded give the option of mapping the element into a loaded set
[7978]178 if (metadata_set == null) {
[8140]179 String target_metadata_element_name_full = MetadataSetManager.mapUnloadedMetadataElement(metadata_element_name_full);
180 if (target_metadata_element_name_full == null || target_metadata_element_name_full.equals("")) {
181 // Skip this element if we still don't have a loaded element for it
182 continue;
183 }
184
185 metadata_element_name_full = target_metadata_element_name_full;
186 metadata_set_namespace = MetadataTools.getMetadataSetNamespace(metadata_element_name_full);
187 metadata_set = MetadataSetManager.getMetadataSet(metadata_set_namespace);
[7978]188 }
[7822]189
[8140]190 String metadata_element_name = MetadataTools.getMetadataElementName(metadata_element_name_full);
[7978]191 MetadataElement metadata_element = metadata_set.getMetadataElement(metadata_element_name);
[7822]192
[7978]193 // If the element doesn't exist in the metadata set, we're not interested
194 if (metadata_element == null) {
195 continue;
196 }
[7822]197
[8124]198 // Square brackets need to be escaped because they are a special character in Greenstone
[8140]199 String metadata_element_value = XMLTools.getElementTextValue(current_metadata_element);
200 metadata_element_value = metadata_element_value.replaceAll("&#091;", "[");
201 metadata_element_value = metadata_element_value.replaceAll("&#093;", "]");
[8124]202
[8140]203 MetadataValueTreeNode metadata_value_tree_node = metadata_element.getMetadataValueTreeNode(metadata_element_value);
[7822]204
[8140]205 // If there is no metadata value tree node for this value, create it
[7978]206 if (metadata_value_tree_node == null) {
[8140]207 System.err.println("Note: No value tree node for metadata value \"" + metadata_element_value + "\"");
208 metadata_element.addMetadataValue(metadata_element_value);
209 metadata_value_tree_node = metadata_element.getMetadataValueTreeNode(metadata_element_value);
[7978]210 }
[7822]211
[7978]212 MetadataValue metadata_value = new MetadataValue(metadata_element, metadata_value_tree_node);
[8135]213 metadata_value.inheritsMetadataFromFolder(folder_metadata_inherited_from);
[7827]214
[7978]215 // Is this accumulating metadata?
216 if (current_metadata_element.getAttribute("mode").equals("accumulate")) {
217 metadata_value.setIsAccumulatingMetadata(true);
218 }
219
220 // Add the new metadata value to the list
221 metadata_values.add(metadata_value);
[7827]222 }
[7978]223 }
[7827]224
[7978]225 return metadata_values;
226 }
[7822]227
228
[7978]229 public void removeMetadata(File file, MetadataValue metadata_value)
230 {
231 // Parse the metadata.xml file
232 Document document = XMLTools.parseXMLFile(this);
233 if (document == null) {
234 System.err.println("Error: Could not parse metadata.xml file " + getAbsolutePath());
235 return;
236 }
[7822]237
[7978]238 // Determine the file's path relative to the location of the metadata.xml file
239 File metadata_xml_file_directory = getParentFile();
240 String file_relative_path = file.getAbsolutePath().substring(metadata_xml_file_directory.getAbsolutePath().length());
241 if (file_relative_path.startsWith(File.separator)) {
242 file_relative_path = file_relative_path.substring(File.separator.length());
243 }
[7822]244
[7978]245 // Convert the file path into a regular expression that will match it
246 String file_path_regexp = file_relative_path.replaceAll("\\.", "\\\\.");
247 if (file_relative_path.equals("")) {
248 file_path_regexp = DIRECTORY_FILENAME;
249 }
[7822]250
[7978]251 // Read all the FileSet elements in the file
252 NodeList fileset_elements_nodelist = document.getElementsByTagName(FILESET_ELEMENT);
253 for (int i = 0; i < fileset_elements_nodelist.getLength(); i++) {
254 Element current_fileset_element = (Element) fileset_elements_nodelist.item(i);
255 boolean current_fileset_matches = false;
[7822]256
[7978]257 // Check the FileName elements of the FileSet to see if we have a match
258 NodeList filename_elements_nodelist = current_fileset_element.getElementsByTagName(FILENAME_ELEMENT);
259 for (int j = 0; j < filename_elements_nodelist.getLength(); j++) {
260 Element current_filename_element = (Element) filename_elements_nodelist.item(j);
261 String current_filename_element_value = XMLTools.getElementTextValue(current_filename_element);
[7822]262
[7978]263 // Only exact matches can be edited
264 if (current_filename_element_value.equals(file_path_regexp)) {
265 current_fileset_matches = true;
266 break;
267 }
268 }
[7822]269
[7978]270 // The FileSet doesn't apply, so move onto the next one
271 if (current_fileset_matches == false) {
272 continue;
[7822]273 }
274
[7978]275 // Find the Metadata element to delete from the fileset
276 String metadata_element_name_full = metadata_value.getMetadataElement().getFullName();
277 String metadata_element_value = metadata_value.getFullValue();
278 NodeList metadata_elements_nodelist = current_fileset_element.getElementsByTagName(METADATA_ELEMENT);
279 for (int k = 0; k < metadata_elements_nodelist.getLength(); k++) {
280 Element current_metadata_element = (Element) metadata_elements_nodelist.item(k);
[7822]281
[7978]282 // Check the metadata element name matches
283 String current_metadata_element_name_full = current_metadata_element.getAttribute("name");
284 if (!current_metadata_element_name_full.equals(metadata_element_name_full)) {
285 continue;
286 }
[7822]287
[7978]288 // Check the metadata element value matches
289 String current_metadata_element_value = XMLTools.getElementTextValue(current_metadata_element);
290 if (!current_metadata_element_value.equals(metadata_element_value)) {
291 continue;
292 }
[7822]293
[7978]294 // Remove this Metadata element
295 current_metadata_element.getParentNode().removeChild(current_metadata_element);
[7822]296 }
[7978]297 }
[7822]298
[7978]299 // Rewrite the metadata.xml file
300 XMLTools.writeXMLFile(this, document);
301 }
[8140]302
303
304 public void skimFile()
305 {
306 boolean file_changed = false;
307
308 // Parse the metadata.xml file
309 System.err.println("Skimming metadata.xml file " + this + "...");
310 Document document = XMLTools.parseXMLFile(this);
311 if (document == null) {
312 System.err.println("Error: Could not parse metadata.xml file " + getAbsolutePath());
313 return;
314 }
315
316 // Read all the Metadata elements in the file
317 NodeList metadata_elements_nodelist = document.getElementsByTagName(METADATA_ELEMENT);
318 for (int i = 0; i < metadata_elements_nodelist.getLength(); i++) {
319 Element current_metadata_element = (Element) metadata_elements_nodelist.item(i);
320 String metadata_element_name_full = current_metadata_element.getAttribute("name");
321
322 String metadata_set_namespace = MetadataTools.getMetadataSetNamespace(metadata_element_name_full);
323 MetadataSet metadata_set = MetadataSetManager.getMetadataSet(metadata_set_namespace);
324
325 // If the metadata set isn't loaded give the option of mapping the element into a loaded set
326 if (metadata_set == null) {
327 String target_metadata_element_name_full = MetadataSetManager.mapUnloadedMetadataElement(metadata_element_name_full);
328 if (target_metadata_element_name_full == null || target_metadata_element_name_full.equals("")) {
329 // Skip this element if we still don't have a loaded element for it
330 continue;
331 }
332
333 // Update the metadata.xml file to have the new element name
334 current_metadata_element.setAttribute("name", target_metadata_element_name_full);
335 file_changed = true;
336
337 metadata_element_name_full = target_metadata_element_name_full;
338 metadata_set_namespace = MetadataTools.getMetadataSetNamespace(metadata_element_name_full);
339 metadata_set = MetadataSetManager.getMetadataSet(metadata_set_namespace);
340 }
341
342 String metadata_element_name = MetadataTools.getMetadataElementName(metadata_element_name_full);
343 MetadataElement metadata_element = metadata_set.getMetadataElement(metadata_element_name);
344
[8141]345 // If the element doesn't exist in the metadata set, add it
346 if (metadata_element == null) {
347 metadata_element = metadata_set.addMetadataElementForThisSession(metadata_element_name);
348 }
349
[8140]350 String metadata_element_value = XMLTools.getElementTextValue(current_metadata_element);
351 metadata_element.addMetadataValue(metadata_element_value);
352 }
353
354 // Rewrite the metadata.xml file if it has changed
355 if (file_changed) {
356 XMLTools.writeXMLFile(this, document);
357 }
358 }
[7822]359}
Note: See TracBrowser for help on using the repository browser.