source: main/trunk/gli/src/org/greenstone/gatherer/metadata/MetadataValueTreeModel.java@ 29793

Last change on this file since 29793 was 9131, checked in by mdewsnip, 19 years ago

Removed all hfile writing from the GLI -- users should now be using AutoHierarchy, which doesn't require hfiles. In the case where the user really needs to a custom hierarchy, they're going to have to create the hfiles themselves anyway (and use Hierarchy).

  • Property svn:keywords set to Author Date Id Revision
File size: 5.4 KB
Line 
1/**
2 *############################################################################
3 * A component of the Greenstone Librarian Interface, part of the Greenstone
4 * digital library suite from the New Zealand Digital Library Project at the
5 * University of Waikato, New Zealand.
6 *
7 * Author: Michael Dewsnip, NZDL Project, University of Waikato, NZ
8 *
9 * Copyright (C) 2004 New Zealand Digital Library Project
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 *############################################################################
25 */
26
27package org.greenstone.gatherer.metadata;
28
29
30import java.io.*;
31import java.util.*;
32import javax.swing.tree.*;
33
34
35/** This class represents all the metadata values for one metadata element */
36public class MetadataValueTreeModel
37 extends DefaultTreeModel
38{
39 public MetadataValueTreeModel(MetadataElement metadata_element)
40 {
41 // The root node of the value tree is the MetadataElement it represents
42 super(new MetadataValueTreeNode(metadata_element));
43 }
44
45
46 public MetadataValueTreeNode addMetadataValue(String metadata_value)
47 {
48 return addMetadataValueInternal((MetadataValueTreeNode) root, metadata_value);
49 }
50
51
52 private MetadataValueTreeNode addMetadataValueInternal(MetadataValueTreeNode parent_metadata_value_tree_node, String metadata_value_remaining)
53 {
54 // Split the metadata value into a hierarchy
55 int split_point = metadata_value_remaining.indexOf(MetadataValueTreeNode.METADATA_VALUE_TREE_NODE_HIERARCHY_TOKEN);
56 String metadata_value = ((split_point == -1) ? metadata_value_remaining : metadata_value_remaining.substring(0, split_point));
57 metadata_value_remaining = ((split_point == -1) ? "" : metadata_value_remaining.substring(split_point + 1));
58
59 // Add the value into the tree in the correct place (sorted)
60 MetadataValueTreeNode metadata_value_tree_node = null;
61 for (int i = 0; i < parent_metadata_value_tree_node.getChildCount(); i++) {
62 MetadataValueTreeNode child_metadata_value_tree_node = (MetadataValueTreeNode) parent_metadata_value_tree_node.getChildAt(i);
63 int c = metadata_value.compareTo(child_metadata_value_tree_node.getValue());
64
65 // Insert node before existing value
66 if (c < 0) {
67 metadata_value_tree_node = new MetadataValueTreeNode(metadata_value);
68 insertNodeInto(metadata_value_tree_node, parent_metadata_value_tree_node, i);
69 break;
70 }
71
72 // Node already exists (don't add again)
73 if (c == 0) {
74 metadata_value_tree_node = child_metadata_value_tree_node;
75 break;
76 }
77 }
78
79 // If no node has been added yet, it must go at the end of the list
80 if (metadata_value_tree_node == null) {
81 metadata_value_tree_node = new MetadataValueTreeNode(metadata_value);
82 insertNodeInto(metadata_value_tree_node, parent_metadata_value_tree_node, parent_metadata_value_tree_node.getChildCount());
83 }
84
85 // If there is some of the metadata value remaining, add that hierarchically
86 if (!metadata_value_remaining.equals("")) {
87 metadata_value_tree_node = addMetadataValueInternal(metadata_value_tree_node, metadata_value_remaining);
88 }
89
90 return metadata_value_tree_node;
91 }
92
93
94 public MetadataValueTreeNode getMetadataValueTreeNode(String metadata_value)
95 {
96 return getMetadataValueTreeNodeInternal((MetadataValueTreeNode) root, metadata_value);
97 }
98
99
100 private MetadataValueTreeNode getMetadataValueTreeNodeInternal(MetadataValueTreeNode parent_metadata_value_tree_node, String metadata_value_remaining)
101 {
102 // Split the metadata value into a hierarchy
103 int split_point = metadata_value_remaining.indexOf(MetadataValueTreeNode.METADATA_VALUE_TREE_NODE_HIERARCHY_TOKEN);
104 String metadata_value = ((split_point == -1) ? metadata_value_remaining : metadata_value_remaining.substring(0, split_point));
105 metadata_value_remaining = ((split_point == -1) ? "" : metadata_value_remaining.substring(split_point + 1));
106
107 // Find the value in the tree in the correct place (sorted)
108 MetadataValueTreeNode metadata_value_tree_node = null;
109 for (int i = 0; i < parent_metadata_value_tree_node.getChildCount(); i++) {
110 MetadataValueTreeNode child_metadata_value_tree_node = (MetadataValueTreeNode) parent_metadata_value_tree_node.getChildAt(i);
111 int c = metadata_value.compareTo(child_metadata_value_tree_node.getValue());
112
113 // Node doesn't exist in the tree
114 if (c < 0) {
115 return null;
116 }
117
118 // Node exists
119 if (c == 0) {
120 metadata_value_tree_node = child_metadata_value_tree_node;
121 break;
122 }
123 }
124
125 // If no node has been found, it doesn't exist
126 if (metadata_value_tree_node == null) {
127 return null;
128 }
129
130 // If there is some of the metadata value remaining, find that recursively
131 if (!metadata_value_remaining.equals("")) {
132 metadata_value_tree_node = getMetadataValueTreeNodeInternal(metadata_value_tree_node, metadata_value_remaining);
133 }
134
135 return metadata_value_tree_node;
136 }
137}
Note: See TracBrowser for help on using the repository browser.