- Timestamp:
- 2010-12-09T22:27:33+13:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/gli/src/org/greenstone/gatherer/metadata/MetadataXMLFileManager.java
r23410 r23433 90 90 if (current_file_directory_path.equals(metadata_xml_file.getParentFile().getAbsolutePath())) { 91 91 applicable_metadata_xml_file_found = true; 92 metadata_xml_file.addMetadata( current_file, metadata_values);92 metadata_xml_file.addMetadata(file_nodes[i], metadata_values); 93 93 if (!modified_metadata_xml_files.contains(metadata_xml_file)) { 94 94 modified_metadata_xml_files.add(metadata_xml_file); … … 107 107 108 108 // ...and add the metadata 109 new_metadata_xml_file.addMetadata( current_file, metadata_values);109 new_metadata_xml_file.addMetadata(file_nodes[i], metadata_values); 110 110 if (!modified_metadata_xml_files.contains(new_metadata_xml_file)) { 111 111 modified_metadata_xml_files.add(new_metadata_xml_file); … … 160 160 161 161 // Get the metadata assigned to the specified file from the applicable metadata.xml files 162 ArrayList assigned_metadata = getMetadataAssignedToFile(file, applicable_metadata_xml_files );162 ArrayList assigned_metadata = getMetadataAssignedToFile(file, applicable_metadata_xml_files, false); 163 163 164 164 // Remove any folder-level metadata … … 173 173 174 174 175 /** Returns the metadata assigned to a file inside the collection, excluding folder-level/inherited metadata. */ 176 static public ArrayList getMetadataAssignedDirectlyToFile(File file) 177 { 178 return getMetadataAssignedDirectlyToFile(file, false); 179 } 180 175 181 /** Returns the metadata assigned to a file inside the collection, excluding folder-level/inherited metadata. */ 176 static public ArrayList getMetadataAssignedDirectlyToFile(File file) 177 { 178 // Get all the metadata assigned to the specified file... 179 ArrayList assigned_metadata = getMetadataAssignedToFile(file); 180 181 // ...then remove any folder-level metadata 182 for (int i = assigned_metadata.size() - 1; i >= 0; i--) { 183 if (((MetadataValue) assigned_metadata.get(i)).isInheritedMetadata()) { 184 assigned_metadata.remove(i); 185 } 186 } 187 188 return assigned_metadata; 189 } 190 182 static public ArrayList getMetadataAssignedDirectlyToFile(File file, boolean filenameEncodingMetaOnly) 183 { 184 185 // Get all the metadata assigned to the specified file... 186 ArrayList assigned_metadata = getMetadataAssignedToFile(file, filenameEncodingMetaOnly); 187 188 // ...then remove any folder-level metadata 189 for (int i = assigned_metadata.size() - 1; i >= 0; i--) { 190 if (((MetadataValue) assigned_metadata.get(i)).isInheritedMetadata()) { 191 assigned_metadata.remove(i); 192 } 193 } 194 195 return assigned_metadata; 196 /* 197 // Get all the metadata assigned to the specified file... 198 // Build up a list of applicable metadata.xml files - which in this case 199 // is exclusively the metadata file at this file/folder's own level. 200 ArrayList applicable_metadata_xml_files = new ArrayList(); 201 202 // Find the metadata.xml file (if any) that is at the same level as the file 203 String file_directory_path = (file.isDirectory() ? file : file.getParentFile()).getAbsolutePath() + File.separator; 204 for (int i = 0; i < metadata_xml_files.size(); i++) { 205 MetadataXMLFile metadata_xml_file = (MetadataXMLFile) metadata_xml_files.get(i); 206 207 if (file_directory_path.equals(metadata_xml_file.getParentFile().getAbsolutePath() + File.separator)) { 208 //System.err.println("Found metadata_xml_file: " + metadata_xml_file); 209 applicable_metadata_xml_files.add(metadata_xml_file); 210 } 211 } 212 213 if(applicable_metadata_xml_files.size() == 0) { 214 return new ArrayList(0); 215 } 216 217 // Return the metadata assigned to the specified file from the applicable metadata.xml files 218 return getMetadataAssignedToFile(file, applicable_metadata_xml_files, filenameEncodingMetaOnly); 219 */ 220 } 221 191 222 192 223 /** Returns all the metadata assigned to a file inside the collection. */ 193 224 static public ArrayList getMetadataAssignedToFile(File file) 225 { 226 return getMetadataAssignedToFile(file, false); 227 } 228 229 /** Returns all the metadata assigned to a file inside the collection (or 230 * just gs.filenameEncoding if parameter filenameEncodingMetaOnly is true), 231 * including folder-level/inherited metadata. 232 */ 233 static public ArrayList getMetadataAssignedToFile(File file, boolean filenameEncodingMetaOnly) 194 234 { 195 235 // Build up a list of applicable metadata.xml files … … 207 247 } 208 248 209 // sort the metadataxml files in order starting from those in the249 // Sort the metadataxml files in order starting from those in the 210 250 // topmost folders down to the one in the lowest level folder. 211 251 Collections.sort(applicable_metadata_xml_files, metadataXMLFileComparator); 212 252 // Return the metadata assigned to the specified file from the applicable metadata.xml files 213 return getMetadataAssignedToFile(file, applicable_metadata_xml_files); 214 } 215 216 217 static private ArrayList getMetadataAssignedToFile(File file, ArrayList applicable_metadata_xml_files) 253 return getMetadataAssignedToFile(file, applicable_metadata_xml_files, filenameEncodingMetaOnly); 254 } 255 256 // package access method 257 static ArrayList getMetadataAssignedToFile(File file, ArrayList applicable_metadata_xml_files, 258 boolean filenameEncodingMetaOnly) 218 259 { 219 260 // Build up a list of metadata values assigned to this file … … 225 266 DebugStream.println("Applicable metadata.xml file: " + metadata_xml_file); 226 267 227 ArrayList metadata_values = metadata_xml_file.getMetadataAssignedToFile(file );268 ArrayList metadata_values = metadata_xml_file.getMetadataAssignedToFile(file, filenameEncodingMetaOnly); 228 269 for (int j = 0; j < metadata_values.size(); j++) { 229 270 MetadataValue metadata_value = (MetadataValue) metadata_values.get(j); … … 316 357 // This metadata.xml file is only potentially applicable if it is above or at the same level as the file 317 358 if (current_file_directory_path.startsWith(metadata_xml_file.getParentFile().getAbsolutePath())) { 318 metadata_xml_file.removeMetadata( current_file, metadata_values);359 metadata_xml_file.removeMetadata(file_nodes[i], metadata_values); 319 360 if (!modified_metadata_xml_files.contains(metadata_xml_file)) { 320 361 modified_metadata_xml_files.add(metadata_xml_file); … … 350 391 // This metadata.xml file is only applicable if it is at the same level as the file 351 392 if (current_file_directory_path.equals(metadata_xml_file.getParentFile().getAbsolutePath())) { 352 metadata_xml_file.replaceMetadata( current_file, old_metadata_value, new_metadata_value);393 metadata_xml_file.replaceMetadata(file_nodes[i], old_metadata_value, new_metadata_value); 353 394 if (!modified_metadata_xml_files.contains(metadata_xml_file)) { 354 395 modified_metadata_xml_files.add(metadata_xml_file); … … 399 440 400 441 401 402 * Comparator to order MetadataXMLFiles in ascending order from403 * those in a higher level folder to those in a lower level folder404 * It is based on the assumption that all MetadataXMLFiles sent to405 * it to compare will be linear descendants of one toplevel folder406 * E.g. /A/metadata.xml, /A/B/metadata.xml, /A/B/C/D/metadata.xml.407 * In other words, that each is a substring of one otheruntil we408 * get to the toplevel folder.409 410 411 412 public int compare(Object o1, Object o2) {413 414 return -1;415 416 return 1;417 418 419 420 421 422 423 424 // if 1 is a prefix2, then 1 < 2 in the ordering (1 comes before 2)425 426 return -1;427 428 return 1;429 430 // unlikely that the metadata.xml files will be the same431 // or that neither is a prefix of the other432 return filename1.compareTo(filename2); // sorts in ascending order433 434 435 436 437 438 439 return false;440 441 442 443 444 445 446 442 /** 443 * Comparator to order MetadataXMLFiles in ascending order from 444 * those in a higher level folder to those in a lower level folder 445 * It is based on the assumption that all MetadataXMLFiles sent to 446 * it to compare will be linear descendants of one toplevel folder 447 * E.g. /A/metadata.xml, /A/B/metadata.xml, /A/B/C/D/metadata.xml. 448 * In other words, that each is a substring of one of the others until we 449 * the toplevel folder is reached. 450 */ 451 private static class MetadataXMLFileComparator implements Comparator { 452 453 public int compare(Object o1, Object o2) { 454 if(!(o1 instanceof MetadataXMLFile)) { 455 return -1; 456 } else if (!(o2 instanceof MetadataXMLFile)) { 457 return 1; 458 } 459 460 // Both are MetadataXMLFiles objects. Remove the terminating 461 // "metadata.xml" from their filenames to get their containing folder 462 String filename1 = ((MetadataXMLFile)o1).getParentFile().getAbsolutePath(); 463 String filename2 = ((MetadataXMLFile)o2).getParentFile().getAbsolutePath(); 464 465 // if 1 is a prefix of 2, then 1 < 2 in the ordering (1 comes before 2) 466 if(filename2.startsWith(filename1)) { 467 return -1; 468 } else if(filename1.startsWith(filename2)) { 469 return 1; 470 } else { 471 // unlikely that the metadata.xml files will be the same 472 // or that neither is a prefix of the other 473 return filename1.compareTo(filename2); // sorts in ascending order 474 } 475 476 } 477 478 public boolean equals(Object obj) { 479 if(!(obj instanceof MetadataXMLFileComparator)) { 480 return false; 481 } 482 483 // else it is the same sort of comparator 484 return true; 485 } 486 487 } 447 488 448 489 }
Note:
See TracChangeset
for help on using the changeset viewer.