[7822] | 1 | package org.greenstone.gatherer.metadata;
|
---|
| 2 |
|
---|
| 3 |
|
---|
[8123] | 4 | import java.io.*;
|
---|
[7822] | 5 | import java.util.*;
|
---|
| 6 | import javax.swing.tree.*;
|
---|
| 7 |
|
---|
| 8 |
|
---|
| 9 | /** This class represents all the metadata values for one metadata element */
|
---|
| 10 | public class MetadataValueTreeModel
|
---|
[7978] | 11 | extends DefaultTreeModel
|
---|
[7822] | 12 | {
|
---|
[7978] | 13 | public MetadataValueTreeModel(MetadataElement metadata_element)
|
---|
| 14 | {
|
---|
| 15 | // The root node of the value tree is the MetadataElement it represents
|
---|
| 16 | super(new MetadataValueTreeNode(metadata_element));
|
---|
| 17 | }
|
---|
[7822] | 18 |
|
---|
| 19 |
|
---|
[7978] | 20 | public MetadataValueTreeNode addMetadataValue(String metadata_value)
|
---|
| 21 | {
|
---|
| 22 | return addMetadataValueInternal((MetadataValueTreeNode) root, metadata_value);
|
---|
| 23 | }
|
---|
[7822] | 24 |
|
---|
| 25 |
|
---|
[7978] | 26 | private MetadataValueTreeNode addMetadataValueInternal(MetadataValueTreeNode parent_metadata_value_tree_node, String metadata_value_remaining)
|
---|
| 27 | {
|
---|
| 28 | // Split the metadata value into a hierarchy
|
---|
| 29 | int split_point = metadata_value_remaining.indexOf(MetadataValueTreeNode.METADATA_VALUE_TREE_NODE_HIERARCHY_TOKEN);
|
---|
| 30 | String metadata_value = ((split_point == -1) ? metadata_value_remaining : metadata_value_remaining.substring(0, split_point));
|
---|
| 31 | metadata_value_remaining = ((split_point == -1) ? "" : metadata_value_remaining.substring(split_point + 1));
|
---|
[7822] | 32 |
|
---|
[7978] | 33 | // Add the value into the tree in the correct place (sorted)
|
---|
| 34 | MetadataValueTreeNode metadata_value_tree_node = null;
|
---|
| 35 | for (int i = 0; i < parent_metadata_value_tree_node.getChildCount(); i++) {
|
---|
| 36 | MetadataValueTreeNode child_metadata_value_tree_node = (MetadataValueTreeNode) parent_metadata_value_tree_node.getChildAt(i);
|
---|
| 37 | int c = metadata_value.compareTo(child_metadata_value_tree_node.getValue());
|
---|
[7822] | 38 |
|
---|
[7978] | 39 | // Insert node before existing value
|
---|
| 40 | if (c < 0) {
|
---|
| 41 | metadata_value_tree_node = new MetadataValueTreeNode(metadata_value);
|
---|
[8126] | 42 | insertNodeInto(metadata_value_tree_node, parent_metadata_value_tree_node, i);
|
---|
[7978] | 43 | break;
|
---|
| 44 | }
|
---|
[7822] | 45 |
|
---|
[7978] | 46 | // Node already exists (don't add again)
|
---|
| 47 | if (c == 0) {
|
---|
| 48 | metadata_value_tree_node = child_metadata_value_tree_node;
|
---|
| 49 | break;
|
---|
| 50 | }
|
---|
| 51 | }
|
---|
[7822] | 52 |
|
---|
[7978] | 53 | // If no node has been added yet, it must go at the end of the list
|
---|
| 54 | if (metadata_value_tree_node == null) {
|
---|
| 55 | metadata_value_tree_node = new MetadataValueTreeNode(metadata_value);
|
---|
[8126] | 56 | insertNodeInto(metadata_value_tree_node, parent_metadata_value_tree_node, parent_metadata_value_tree_node.getChildCount());
|
---|
[7978] | 57 | }
|
---|
[7822] | 58 |
|
---|
[7978] | 59 | // If there is some of the metadata value remaining, add that hierarchically
|
---|
| 60 | if (!metadata_value_remaining.equals("")) {
|
---|
| 61 | metadata_value_tree_node = addMetadataValueInternal(metadata_value_tree_node, metadata_value_remaining);
|
---|
| 62 | }
|
---|
[7822] | 63 |
|
---|
[7978] | 64 | return metadata_value_tree_node;
|
---|
| 65 | }
|
---|
[7822] | 66 |
|
---|
| 67 |
|
---|
[7978] | 68 | public MetadataValueTreeNode getMetadataValueTreeNode(String metadata_value)
|
---|
| 69 | {
|
---|
| 70 | return getMetadataValueTreeNodeInternal((MetadataValueTreeNode) root, metadata_value);
|
---|
| 71 | }
|
---|
[7822] | 72 |
|
---|
| 73 |
|
---|
[7978] | 74 | private MetadataValueTreeNode getMetadataValueTreeNodeInternal(MetadataValueTreeNode parent_metadata_value_tree_node, String metadata_value_remaining)
|
---|
| 75 | {
|
---|
| 76 | // Split the metadata value into a hierarchy
|
---|
| 77 | int split_point = metadata_value_remaining.indexOf(MetadataValueTreeNode.METADATA_VALUE_TREE_NODE_HIERARCHY_TOKEN);
|
---|
| 78 | String metadata_value = ((split_point == -1) ? metadata_value_remaining : metadata_value_remaining.substring(0, split_point));
|
---|
| 79 | metadata_value_remaining = ((split_point == -1) ? "" : metadata_value_remaining.substring(split_point + 1));
|
---|
[7822] | 80 |
|
---|
[7978] | 81 | // Find the value in the tree in the correct place (sorted)
|
---|
| 82 | MetadataValueTreeNode metadata_value_tree_node = null;
|
---|
| 83 | for (int i = 0; i < parent_metadata_value_tree_node.getChildCount(); i++) {
|
---|
| 84 | MetadataValueTreeNode child_metadata_value_tree_node = (MetadataValueTreeNode) parent_metadata_value_tree_node.getChildAt(i);
|
---|
| 85 | int c = metadata_value.compareTo(child_metadata_value_tree_node.getValue());
|
---|
[7822] | 86 |
|
---|
[7978] | 87 | // Node doesn't exist in the tree
|
---|
| 88 | if (c < 0) {
|
---|
| 89 | return null;
|
---|
| 90 | }
|
---|
[7822] | 91 |
|
---|
[7978] | 92 | // Node exists
|
---|
| 93 | if (c == 0) {
|
---|
| 94 | metadata_value_tree_node = child_metadata_value_tree_node;
|
---|
| 95 | break;
|
---|
| 96 | }
|
---|
| 97 | }
|
---|
[7822] | 98 |
|
---|
[7978] | 99 | // If no node has been found, it doesn't exist
|
---|
| 100 | if (metadata_value_tree_node == null) {
|
---|
| 101 | return null;
|
---|
| 102 | }
|
---|
[7822] | 103 |
|
---|
[7978] | 104 | // If there is some of the metadata value remaining, find that recursively
|
---|
| 105 | if (!metadata_value_remaining.equals("")) {
|
---|
| 106 | metadata_value_tree_node = getMetadataValueTreeNodeInternal(metadata_value_tree_node, metadata_value_remaining);
|
---|
| 107 | }
|
---|
[7822] | 108 |
|
---|
[7978] | 109 | return metadata_value_tree_node;
|
---|
| 110 | }
|
---|
[8123] | 111 |
|
---|
| 112 |
|
---|
| 113 | public void writeHierarchyFile(File hierarchy_file)
|
---|
| 114 | {
|
---|
| 115 | try {
|
---|
| 116 | // Write the value tree out to a hierarchy file, for the Hierarchy classifier
|
---|
| 117 | FileOutputStream file_output_stream = new FileOutputStream(hierarchy_file);
|
---|
| 118 | OutputStreamWriter output_stream_writer = new OutputStreamWriter(file_output_stream, "UTF-8");
|
---|
| 119 | BufferedWriter buffered_writer = new BufferedWriter(output_stream_writer);
|
---|
| 120 |
|
---|
| 121 | writeHierarchyFileInternal((MetadataValueTreeNode) root, "", buffered_writer);
|
---|
| 122 |
|
---|
| 123 | buffered_writer.flush();
|
---|
| 124 | buffered_writer.close();
|
---|
| 125 | }
|
---|
| 126 | catch (Exception ex) {
|
---|
| 127 | ex.printStackTrace();
|
---|
| 128 | }
|
---|
| 129 | }
|
---|
| 130 |
|
---|
| 131 |
|
---|
| 132 | private void writeHierarchyFileInternal(MetadataValueTreeNode parent_metadata_value_tree_node, String index, BufferedWriter buffered_writer)
|
---|
| 133 | throws Exception
|
---|
| 134 | {
|
---|
| 135 | // Perform a depth-first traversal of the value tree, writing the metadata values out to the hfile
|
---|
| 136 | for (int i = 0; i < parent_metadata_value_tree_node.getChildCount(); i++) {
|
---|
| 137 | MetadataValueTreeNode child_metadata_value_tree_node = (MetadataValueTreeNode) parent_metadata_value_tree_node.getChildAt(i);
|
---|
| 138 | String metadata_value_full = child_metadata_value_tree_node.getFullValue();
|
---|
| 139 | String index_string = (index.equals("") ? "" + (i + 1) : index + "." + (i + 1));
|
---|
| 140 | String metadata_value = child_metadata_value_tree_node.getValue();
|
---|
| 141 | String hierarchy_string = "\"" + metadata_value_full + "\"\t" + index_string + "\t\"" + metadata_value + "\"\n";
|
---|
| 142 | buffered_writer.write(hierarchy_string, 0, hierarchy_string.length());
|
---|
| 143 |
|
---|
| 144 | // Apply recursively
|
---|
| 145 | writeHierarchyFileInternal(child_metadata_value_tree_node, index_string, buffered_writer);
|
---|
| 146 | }
|
---|
| 147 | }
|
---|
[7822] | 148 | }
|
---|