source: trunk/gli/src/org/greenstone/gatherer/metadata/MetadataXMLFileManager.java@ 8123

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

More improvements to the new metadata code, including hfile writing.

  • Property svn:keywords set to Author Date Id Revision
File size: 9.6 KB
Line 
1package org.greenstone.gatherer.metadata;
2
3
4import java.io.*;
5import java.util.*;
6import org.greenstone.gatherer.file.FileNode;
7import org.greenstone.gatherer.util.Utility;
8import org.greenstone.gatherer.util.XMLTools;
9
10
11/** This class is a static class that manages the metadata.xml files */
12public class MetadataXMLFileManager
13{
14 static private ArrayList metadata_xml_files = new ArrayList();
15
16
17 static public void addMetadata(FileNode file_node, MetadataValue metadata_value)
18 {
19 FileNode[] file_nodes = new FileNode[1];
20 file_nodes[0] = file_node;
21 addMetadata(file_nodes, metadata_value);
22 }
23
24
25 static public void addMetadata(FileNode[] file_nodes, MetadataValue metadata_value)
26 {
27 // Add the metadata to each file node in turn
28 for (int i = 0; i < file_nodes.length; i++) {
29 File current_file = file_nodes[i].getFile();
30 System.err.println("Adding metadata to " + current_file.getAbsolutePath());
31
32 // Find which metadata.xml file needs editing
33 boolean applicable_metadata_xml_file_found = false;
34 File current_file_directory = (current_file.isDirectory() ? current_file : current_file.getParentFile());
35 for (int j = 0; j < metadata_xml_files.size(); j++) {
36 MetadataXMLFile metadata_xml_file = (MetadataXMLFile) metadata_xml_files.get(j);
37
38 // This metadata.xml file is only applicable if it is above or at the same level as the file
39 // if (current_file_directory.getAbsolutePath().startsWith(metadata_xml_file.getParentFile().getAbsolutePath())) {
40 // This metadata.xml file is only applicable if it is at the same level as the file
41 if (current_file_directory.getAbsolutePath().equals(metadata_xml_file.getParentFile().getAbsolutePath())) {
42 applicable_metadata_xml_file_found = true;
43 metadata_xml_file.addMetadata(current_file, metadata_value);
44 }
45 }
46
47 // If no applicable metadata.xml file exists, we have to create a new one
48 if (!applicable_metadata_xml_file_found) {
49 // Create a new (empty) metadata.xml file in the file's directory...
50 File new_metadata_xml_file_file = new File(current_file_directory, "metadata.xml");
51 XMLTools.writeXMLFile(new_metadata_xml_file_file, Utility.parse("xml/metadata.xml", true));
52
53 // ...load it...
54 MetadataXMLFile new_metadata_xml_file = loadMetadataXMLFile(new_metadata_xml_file_file);
55
56 // ...and add the metadata
57 new_metadata_xml_file.addMetadata(current_file, metadata_value);
58 }
59 }
60 }
61
62
63 static public void clearMetadataXMLFiles()
64 {
65 metadata_xml_files.clear();
66 }
67
68
69 /** Returns the metadata assigned to files outside the collection, excluding folder-level/inherited metadata. */
70 static public ArrayList getMetadataAssignedDirectlyToExternalFile(File file)
71 {
72 System.err.println("Getting metadata assigned directly to external file " + file + "...");
73
74 // Build up a list of applicable metadata.xml files
75 ArrayList applicable_metadata_xml_files = new ArrayList();
76
77 File directory = (file.isDirectory() ? file : file.getParentFile());
78 while (directory != null) {
79 File[] directory_files = directory.listFiles();
80 for (int i = 0; i < directory_files.length; i++) {
81 File child_file = directory_files[i];
82 if (!child_file.isDirectory() && child_file.getName().equals("metadata.xml")) {
83 System.err.println("Found: " + child_file);
84 applicable_metadata_xml_files.add(new MetadataXMLFile(child_file.getAbsolutePath()));
85 }
86 }
87
88 directory = directory.getParentFile();
89 }
90
91 // Get the metadata assigned to the specified file from the applicable metadata.xml files
92 ArrayList assigned_metadata = getMetadataAssignedToFile(file, applicable_metadata_xml_files);
93
94 // Remove any folder-level metadata
95 for (int i = assigned_metadata.size() - 1; i >= 0; i--) {
96 if (((MetadataValue) assigned_metadata.get(i)).isInheritedMetadata()) {
97 assigned_metadata.remove(i);
98 }
99 }
100
101 return assigned_metadata;
102 }
103
104
105 /** This excludes folder-level/inherited metadata. */
106 static public ArrayList getMetadataAssignedDirectlyToFile(File file)
107 {
108 // Build up a list of applicable metadata.xml files
109 ArrayList applicable_metadata_xml_files = new ArrayList();
110
111 // Look at each loaded metadata.xml file to see if it is potentially applicable
112 File file_directory = (file.isDirectory() ? file : file.getParentFile());
113 for (int i = 0; i < metadata_xml_files.size(); i++) {
114 MetadataXMLFile metadata_xml_file = (MetadataXMLFile) metadata_xml_files.get(i);
115
116 // This metadata.xml file is only applicable if it is at the same level as the file
117 if (file_directory.getAbsolutePath().equals(metadata_xml_file.getParentFile().getAbsolutePath())) {
118 applicable_metadata_xml_files.add(metadata_xml_file);
119 }
120 }
121
122 // Get the metadata assigned to the specified file from the applicable metadata.xml files
123 ArrayList assigned_metadata = getMetadataAssignedToFile(file, applicable_metadata_xml_files);
124
125 // Remove any folder-level metadata
126 for (int i = assigned_metadata.size() - 1; i >= 0; i--) {
127 if (((MetadataValue) assigned_metadata.get(i)).isInheritedMetadata()) {
128 assigned_metadata.remove(i);
129 }
130 }
131
132 return assigned_metadata;
133 }
134
135
136 static public ArrayList getMetadataAssignedToFile(File file)
137 {
138 // Build up a list of applicable metadata.xml files
139 ArrayList applicable_metadata_xml_files = new ArrayList();
140
141 // Look at each loaded metadata.xml file to see if it is potentially applicable
142 File file_directory = (file.isDirectory() ? file : file.getParentFile());
143 for (int i = 0; i < metadata_xml_files.size(); i++) {
144 MetadataXMLFile metadata_xml_file = (MetadataXMLFile) metadata_xml_files.get(i);
145
146 // This metadata.xml file is only potentially applicable if it is above or at the same level as the file
147 if (file_directory.getAbsolutePath().startsWith(metadata_xml_file.getParentFile().getAbsolutePath())) {
148 applicable_metadata_xml_files.add(metadata_xml_file);
149 }
150 }
151
152 // Return the metadata assigned to the specified file from the applicable metadata.xml files
153 return getMetadataAssignedToFile(file, applicable_metadata_xml_files);
154 }
155
156
157 static private ArrayList getMetadataAssignedToFile(File file, ArrayList applicable_metadata_xml_files)
158 {
159 // Build up a list of metadata values assigned to this file
160 ArrayList metadata_values_all = new ArrayList();
161
162 // Look at each applicable metadata.xml file to see if it assigns metadata to this file
163 for (int i = 0; i < applicable_metadata_xml_files.size(); i++) {
164 MetadataXMLFile metadata_xml_file = (MetadataXMLFile) applicable_metadata_xml_files.get(i);
165 System.err.println("Applicable metadata.xml file: " + metadata_xml_file);
166
167 ArrayList metadata_values = metadata_xml_file.getMetadataAssignedToFile(file);
168 for (int j = 0; j < metadata_values.size(); j++) {
169 MetadataValue metadata_value = (MetadataValue) metadata_values.get(j);
170
171 // Overriding metadata: remove any values with this metadata element
172 if (metadata_value.isAccumulatingMetadata() == false) {
173 for (int k = metadata_values_all.size() - 1; k >= 0; k--) {
174 if (((MetadataValue) metadata_values_all.get(k)).getMetadataElement().equals(metadata_value.getMetadataElement())) {
175 metadata_values_all.remove(k);
176 }
177 }
178 }
179
180 metadata_values_all.add(metadata_value);
181 }
182 }
183
184 return metadata_values_all;
185 }
186
187
188 static public void loadMetadataXMLFiles(File directory)
189 {
190 // Make sure the directory (import) exists
191 if (directory.exists() == false) {
192 return;
193 }
194
195 // Look recursively at each subfile of the directory for metadata.xml files
196 File[] directory_files = directory.listFiles();
197 for (int i = 0; i < directory_files.length; i++) {
198 File child_file = directory_files[i];
199 if (child_file.isDirectory()) {
200 loadMetadataXMLFiles(child_file);
201 }
202 else if (child_file.getName().equals("metadata.xml")) {
203 loadMetadataXMLFile(child_file);
204 }
205 }
206 }
207
208
209 static private MetadataXMLFile loadMetadataXMLFile(File metadata_xml_file_file)
210 {
211 MetadataXMLFile metadata_xml_file = new MetadataXMLFile(metadata_xml_file_file.getAbsolutePath());
212 metadata_xml_files.add(metadata_xml_file);
213 return metadata_xml_file;
214 }
215
216
217 static public void removeMetadata(FileNode file_node, MetadataValue metadata_value)
218 {
219 FileNode[] file_nodes = new FileNode[1];
220 file_nodes[0] = file_node;
221 removeMetadata(file_nodes, metadata_value);
222 }
223
224
225 static public void removeMetadata(FileNode[] file_nodes, MetadataValue metadata_value)
226 {
227 // Remove the metadata from each file node in turn
228 for (int i = 0; i < file_nodes.length; i++) {
229 File current_file = file_nodes[i].getFile();
230 System.err.println("Removing metadata from " + current_file.getAbsolutePath());
231
232 // Find which metadata.xml file needs editing
233 File current_file_directory = (current_file.isDirectory() ? current_file : current_file.getParentFile());
234 for (int j = 0; j < metadata_xml_files.size(); j++) {
235 MetadataXMLFile metadata_xml_file = (MetadataXMLFile) metadata_xml_files.get(j);
236
237 // This metadata.xml file is only potentially applicable if it is above or at the same level as the file
238 if (current_file_directory.getAbsolutePath().startsWith(metadata_xml_file.getParentFile().getAbsolutePath())) {
239 metadata_xml_file.removeMetadata(current_file, metadata_value);
240 }
241 }
242 }
243 }
244
245
246 static public void unloadMetadataXMLFile(File metadata_xml_file_file)
247 {
248 System.err.println("Unloading metadata.xml file " + metadata_xml_file_file);
249
250 // Find the metadata.xml file in the list of loaded files, and remove it
251 for (int i = 0; i < metadata_xml_files.size(); i++) {
252 MetadataXMLFile metadata_xml_file = (MetadataXMLFile) metadata_xml_files.get(i);
253 if (metadata_xml_file_file.getAbsolutePath().equals(metadata_xml_file.getAbsolutePath())) {
254 metadata_xml_files.remove(i);
255 break;
256 }
257 }
258 }
259}
Note: See TracBrowser for help on using the repository browser.