1 | package org.greenstone.gatherer.metadata;
|
---|
2 |
|
---|
3 |
|
---|
4 | import java.io.*;
|
---|
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
|
---|
11 | extends DefaultTreeModel
|
---|
12 | {
|
---|
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 | }
|
---|
18 |
|
---|
19 |
|
---|
20 | public MetadataValueTreeNode addMetadataValue(String metadata_value)
|
---|
21 | {
|
---|
22 | return addMetadataValueInternal((MetadataValueTreeNode) root, metadata_value);
|
---|
23 | }
|
---|
24 |
|
---|
25 |
|
---|
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));
|
---|
32 |
|
---|
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());
|
---|
38 |
|
---|
39 | // Insert node before existing value
|
---|
40 | if (c < 0) {
|
---|
41 | metadata_value_tree_node = new MetadataValueTreeNode(metadata_value);
|
---|
42 | insertNodeInto(metadata_value_tree_node, parent_metadata_value_tree_node, i);
|
---|
43 | break;
|
---|
44 | }
|
---|
45 |
|
---|
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 | }
|
---|
52 |
|
---|
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);
|
---|
56 | insertNodeInto(metadata_value_tree_node, parent_metadata_value_tree_node, parent_metadata_value_tree_node.getChildCount());
|
---|
57 | }
|
---|
58 |
|
---|
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 | }
|
---|
63 |
|
---|
64 | return metadata_value_tree_node;
|
---|
65 | }
|
---|
66 |
|
---|
67 |
|
---|
68 | public MetadataValueTreeNode getMetadataValueTreeNode(String metadata_value)
|
---|
69 | {
|
---|
70 | return getMetadataValueTreeNodeInternal((MetadataValueTreeNode) root, metadata_value);
|
---|
71 | }
|
---|
72 |
|
---|
73 |
|
---|
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));
|
---|
80 |
|
---|
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());
|
---|
86 |
|
---|
87 | // Node doesn't exist in the tree
|
---|
88 | if (c < 0) {
|
---|
89 | return null;
|
---|
90 | }
|
---|
91 |
|
---|
92 | // Node exists
|
---|
93 | if (c == 0) {
|
---|
94 | metadata_value_tree_node = child_metadata_value_tree_node;
|
---|
95 | break;
|
---|
96 | }
|
---|
97 | }
|
---|
98 |
|
---|
99 | // If no node has been found, it doesn't exist
|
---|
100 | if (metadata_value_tree_node == null) {
|
---|
101 | return null;
|
---|
102 | }
|
---|
103 |
|
---|
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 | }
|
---|
108 |
|
---|
109 | return metadata_value_tree_node;
|
---|
110 | }
|
---|
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 | }
|
---|
148 | }
|
---|