package org.greenstone.gatherer.metadata; import java.io.*; import java.util.*; import javax.swing.tree.*; /** This class represents all the metadata values for one metadata element */ public class MetadataValueTreeModel extends DefaultTreeModel { public MetadataValueTreeModel(MetadataElement metadata_element) { // The root node of the value tree is the MetadataElement it represents super(new MetadataValueTreeNode(metadata_element)); } public MetadataValueTreeNode addMetadataValue(String metadata_value) { return addMetadataValueInternal((MetadataValueTreeNode) root, metadata_value); } private MetadataValueTreeNode addMetadataValueInternal(MetadataValueTreeNode parent_metadata_value_tree_node, String metadata_value_remaining) { // Split the metadata value into a hierarchy int split_point = metadata_value_remaining.indexOf(MetadataValueTreeNode.METADATA_VALUE_TREE_NODE_HIERARCHY_TOKEN); String metadata_value = ((split_point == -1) ? metadata_value_remaining : metadata_value_remaining.substring(0, split_point)); metadata_value_remaining = ((split_point == -1) ? "" : metadata_value_remaining.substring(split_point + 1)); // Add the value into the tree in the correct place (sorted) MetadataValueTreeNode metadata_value_tree_node = null; for (int i = 0; i < parent_metadata_value_tree_node.getChildCount(); i++) { MetadataValueTreeNode child_metadata_value_tree_node = (MetadataValueTreeNode) parent_metadata_value_tree_node.getChildAt(i); int c = metadata_value.compareTo(child_metadata_value_tree_node.getValue()); // Insert node before existing value if (c < 0) { metadata_value_tree_node = new MetadataValueTreeNode(metadata_value); insertNodeInto(metadata_value_tree_node, parent_metadata_value_tree_node, i); break; } // Node already exists (don't add again) if (c == 0) { metadata_value_tree_node = child_metadata_value_tree_node; break; } } // If no node has been added yet, it must go at the end of the list if (metadata_value_tree_node == null) { metadata_value_tree_node = new MetadataValueTreeNode(metadata_value); insertNodeInto(metadata_value_tree_node, parent_metadata_value_tree_node, parent_metadata_value_tree_node.getChildCount()); } // If there is some of the metadata value remaining, add that hierarchically if (!metadata_value_remaining.equals("")) { metadata_value_tree_node = addMetadataValueInternal(metadata_value_tree_node, metadata_value_remaining); } return metadata_value_tree_node; } public MetadataValueTreeNode getMetadataValueTreeNode(String metadata_value) { return getMetadataValueTreeNodeInternal((MetadataValueTreeNode) root, metadata_value); } private MetadataValueTreeNode getMetadataValueTreeNodeInternal(MetadataValueTreeNode parent_metadata_value_tree_node, String metadata_value_remaining) { // Split the metadata value into a hierarchy int split_point = metadata_value_remaining.indexOf(MetadataValueTreeNode.METADATA_VALUE_TREE_NODE_HIERARCHY_TOKEN); String metadata_value = ((split_point == -1) ? metadata_value_remaining : metadata_value_remaining.substring(0, split_point)); metadata_value_remaining = ((split_point == -1) ? "" : metadata_value_remaining.substring(split_point + 1)); // Find the value in the tree in the correct place (sorted) MetadataValueTreeNode metadata_value_tree_node = null; for (int i = 0; i < parent_metadata_value_tree_node.getChildCount(); i++) { MetadataValueTreeNode child_metadata_value_tree_node = (MetadataValueTreeNode) parent_metadata_value_tree_node.getChildAt(i); int c = metadata_value.compareTo(child_metadata_value_tree_node.getValue()); // Node doesn't exist in the tree if (c < 0) { return null; } // Node exists if (c == 0) { metadata_value_tree_node = child_metadata_value_tree_node; break; } } // If no node has been found, it doesn't exist if (metadata_value_tree_node == null) { return null; } // If there is some of the metadata value remaining, find that recursively if (!metadata_value_remaining.equals("")) { metadata_value_tree_node = getMetadataValueTreeNodeInternal(metadata_value_tree_node, metadata_value_remaining); } return metadata_value_tree_node; } public void writeHierarchyFile(File hierarchy_file) { try { // Write the value tree out to a hierarchy file, for the Hierarchy classifier FileOutputStream file_output_stream = new FileOutputStream(hierarchy_file); OutputStreamWriter output_stream_writer = new OutputStreamWriter(file_output_stream, "UTF-8"); BufferedWriter buffered_writer = new BufferedWriter(output_stream_writer); writeHierarchyFileInternal((MetadataValueTreeNode) root, "", buffered_writer); buffered_writer.flush(); buffered_writer.close(); } catch (Exception ex) { ex.printStackTrace(); } } private void writeHierarchyFileInternal(MetadataValueTreeNode parent_metadata_value_tree_node, String index, BufferedWriter buffered_writer) throws Exception { // Perform a depth-first traversal of the value tree, writing the metadata values out to the hfile for (int i = 0; i < parent_metadata_value_tree_node.getChildCount(); i++) { MetadataValueTreeNode child_metadata_value_tree_node = (MetadataValueTreeNode) parent_metadata_value_tree_node.getChildAt(i); String metadata_value_full = child_metadata_value_tree_node.getFullValue(); String index_string = (index.equals("") ? "" + (i + 1) : index + "." + (i + 1)); String metadata_value = child_metadata_value_tree_node.getValue(); String hierarchy_string = "\"" + metadata_value_full + "\"\t" + index_string + "\t\"" + metadata_value + "\"\n"; buffered_writer.write(hierarchy_string, 0, hierarchy_string.length()); // Apply recursively writeHierarchyFileInternal(child_metadata_value_tree_node, index_string, buffered_writer); } } }