source: trunk/gli/src/org/greenstone/gatherer/metadata/MetadataValueTreeModel.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: 5.8 KB
Line 
1package org.greenstone.gatherer.metadata;
2
3
4import java.io.*;
5import java.util.*;
6import javax.swing.tree.*;
7
8
9/** This class represents all the metadata values for one metadata element */
10public 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 parent_metadata_value_tree_node.insert(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 parent_metadata_value_tree_node.add(metadata_value_tree_node);
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}
Note: See TracBrowser for help on using the repository browser.