[8313] | 1 | package org.greenstone.gatherer.collection;
|
---|
| 2 |
|
---|
| 3 |
|
---|
| 4 | import java.io.*;
|
---|
| 5 | import org.greenstone.gatherer.DebugStream;
|
---|
| 6 | import org.greenstone.gatherer.Gatherer;
|
---|
| 7 | import org.greenstone.gatherer.cdm.Argument;
|
---|
| 8 | import org.greenstone.gatherer.cdm.Classifier;
|
---|
| 9 | import org.greenstone.gatherer.cdm.CollectionDesignManager;
|
---|
| 10 | import org.greenstone.gatherer.metadata.MetadataElement;
|
---|
| 11 | import org.greenstone.gatherer.metadata.MetadataTools;
|
---|
| 12 | import org.greenstone.gatherer.metadata.ProfileXMLFileManager;
|
---|
| 13 | import org.greenstone.gatherer.util.StaticStrings;
|
---|
| 14 | import org.greenstone.gatherer.util.Utility;
|
---|
| 15 |
|
---|
| 16 |
|
---|
| 17 | /**
|
---|
| 18 | * Importing legacy collections involves two main steps:
|
---|
| 19 | *
|
---|
| 20 | * 1. Read the existing metadata.xml files and namespace them, usually by prompting the user
|
---|
| 21 | * to specify the mapping between old metadata elements and new elements.
|
---|
| 22 | *
|
---|
| 23 | * 2. Fix up the classify commands in the collect.cfg file to specify the new element names.
|
---|
| 24 | *
|
---|
| 25 | * @author Michael Dewsnip
|
---|
| 26 | */
|
---|
| 27 | public class LegacyCollectionImporter
|
---|
| 28 | {
|
---|
[11052] | 29 | /** Definition of an important directory name, in this case the backup import directory for the collection. */
|
---|
| 30 | static final public String IMPORT_BAK_DIR = "import.bak" + File.separator;
|
---|
| 31 |
|
---|
| 32 |
|
---|
[8313] | 33 | // This copies all the existing metadata.xml files into a backup directory
|
---|
| 34 | static public void backupMetadataXMLFiles(File collection_dir)
|
---|
| 35 | {
|
---|
[11625] | 36 | File import_dir = new File(collection_dir, "import");
|
---|
[11053] | 37 | File import_bak_dir = new File(collection_dir, IMPORT_BAK_DIR);
|
---|
[8313] | 38 | import_bak_dir.mkdir();
|
---|
| 39 | copyMetadataXMLFiles(import_dir, import_bak_dir);
|
---|
| 40 | }
|
---|
| 41 |
|
---|
| 42 |
|
---|
| 43 | static private void copyMetadataXMLFiles(File source_dir, File backup_dir)
|
---|
| 44 | {
|
---|
| 45 | if (source_dir == null || !source_dir.exists()) {
|
---|
| 46 | return;
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | // Find the metadata file in this dir
|
---|
| 50 | File metadata_xml_file_file = new File(source_dir, "metadata.xml");
|
---|
| 51 | if (metadata_xml_file_file.exists()) {
|
---|
| 52 | File new_metadata_xml_file_file = new File(backup_dir, "metadata.xml");
|
---|
| 53 | try {
|
---|
| 54 | backup_dir.mkdirs();
|
---|
[11080] | 55 | Gatherer.f_man.getQueue().copyFile(metadata_xml_file_file, new_metadata_xml_file_file, false);
|
---|
[8313] | 56 | if (!new_metadata_xml_file_file.exists()) {
|
---|
| 57 | throw new Exception("");
|
---|
| 58 | }
|
---|
| 59 | }
|
---|
| 60 | catch (Exception e) {
|
---|
| 61 | DebugStream.println("Exception: couldn't copy the file " + metadata_xml_file_file.getPath() + e.getMessage());
|
---|
| 62 | }
|
---|
| 63 | }
|
---|
| 64 |
|
---|
| 65 | // Now go through child directories
|
---|
| 66 | File [] children = source_dir.listFiles();
|
---|
| 67 | for (int i = 0; i < children.length; i++) {
|
---|
| 68 | File child = children[i];
|
---|
| 69 | if (child.isDirectory()) {
|
---|
| 70 | copyMetadataXMLFiles(child, new File(backup_dir, child.getName()));
|
---|
| 71 | }
|
---|
| 72 | }
|
---|
| 73 | }
|
---|
| 74 |
|
---|
| 75 |
|
---|
| 76 | static public void updateClassifiers(CollectionDesignManager cdm)
|
---|
| 77 | {
|
---|
| 78 | // Update the metadata elements in each of the classifiers
|
---|
| 79 | for (int i = 0; i < cdm.classifier_manager.getSize(); i++) {
|
---|
| 80 | Classifier classifier = cdm.classifier_manager.getClassifier(i);
|
---|
| 81 | // System.err.println("Classifier: " + classifier);
|
---|
| 82 |
|
---|
| 83 | // Update the "-metadata" value
|
---|
| 84 | Argument metadata_argument = classifier.getArgument("-metadata");
|
---|
| 85 | String metadata_argument_value = metadata_argument.getValue();
|
---|
| 86 | String metadata_element_name_full = mapLegacyMetadataElementName(metadata_argument_value);
|
---|
| 87 | if (metadata_element_name_full != null && !metadata_element_name_full.equals("")) {
|
---|
| 88 | String metadata_element_display_name_full = MetadataTools.getDisplayNameForMetadataElementWithName(metadata_element_name_full);
|
---|
| 89 | if (metadata_element_display_name_full != null) {
|
---|
| 90 | metadata_argument_value = metadata_element_display_name_full;
|
---|
| 91 | metadata_argument.setValue(metadata_argument_value);
|
---|
| 92 | }
|
---|
| 93 | }
|
---|
| 94 |
|
---|
| 95 | // Update the "-sort" value
|
---|
| 96 | Argument sort_argument = classifier.getArgument("-sort");
|
---|
| 97 | if (sort_argument != null) {
|
---|
| 98 | String sort_element_name_full = mapLegacyMetadataElementName(sort_argument.getValue());
|
---|
| 99 | if (sort_element_name_full != null && !sort_element_name_full.equals("")) {
|
---|
| 100 | String sort_element_display_name_full = MetadataTools.getDisplayNameForMetadataElementWithName(sort_element_name_full);
|
---|
| 101 | if (sort_element_display_name_full != null) {
|
---|
| 102 | sort_argument.setValue(sort_element_display_name_full);
|
---|
| 103 | }
|
---|
| 104 | }
|
---|
| 105 | }
|
---|
| 106 |
|
---|
| 107 | // Set the "-buttonname" value if it isn't already set
|
---|
| 108 | Argument buttonname_argument = classifier.getArgument("-buttonname");
|
---|
[9670] | 109 | if (buttonname_argument != null && buttonname_argument.getValue().equals("")) {
|
---|
[8313] | 110 | int namespace_index = metadata_argument_value.indexOf(".");
|
---|
| 111 | if (namespace_index != -1) {
|
---|
| 112 | buttonname_argument.setValue(metadata_argument_value.substring(namespace_index + 1));
|
---|
| 113 | }
|
---|
| 114 | else {
|
---|
| 115 | buttonname_argument.setValue(metadata_argument_value);
|
---|
| 116 | }
|
---|
| 117 | buttonname_argument.setAssigned(true);
|
---|
| 118 | }
|
---|
| 119 |
|
---|
| 120 | // With Hierarchy classifiers, update the hfile arguments
|
---|
| 121 | if (classifier.getName().equalsIgnoreCase(StaticStrings.HIERARCHY_CLASSIFIER)) {
|
---|
| 122 | // Update the "-hfile" value
|
---|
| 123 | Argument hfile_argument = classifier.getArgument(StaticStrings.HFILE_ARGUMENT);
|
---|
| 124 | hfile_argument.setValue(metadata_element_name_full + ".txt");
|
---|
| 125 | }
|
---|
| 126 |
|
---|
| 127 | // System.err.println("Classifier (after): " + classifier);
|
---|
| 128 | }
|
---|
| 129 | }
|
---|
| 130 |
|
---|
| 131 |
|
---|
| 132 | static private String mapLegacyMetadataElementName(String metadata_element_name)
|
---|
| 133 | {
|
---|
[24367] | 134 | // Remove the extracted namespace if it has been added, but only
|
---|
| 135 | // if there are no subsequent namespaces following it (like ex.dc.*)
|
---|
| 136 | // since we want to preserve embedded metadata names as is.
|
---|
| 137 | if (metadata_element_name.startsWith(StaticStrings.EXTRACTED_NAMESPACE) && metadata_element_name.indexOf(StaticStrings.NS_SEP, StaticStrings.EXTRACTED_NAMESPACE.length()) == -1) {
|
---|
[8313] | 138 | metadata_element_name = metadata_element_name.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
|
---|
| 139 | }
|
---|
| 140 |
|
---|
| 141 | // Update the metadata value to the new (namespaced) one
|
---|
| 142 | return ProfileXMLFileManager.getMetadataElementFor(metadata_element_name);
|
---|
| 143 | }
|
---|
| 144 | }
|
---|