source: other-projects/FileTransfer-WebSocketPair/testGXTWithGreenstone/src/org/greenstone/gatherer/metadata/MetadataValueTreeModel.java@ 33053

Last change on this file since 33053 was 33053, checked in by ak19, 5 years ago

I still had some stuff of Nathan Kelly's (FileTransfer-WebSocketPair) sitting on my USB. Had already commited the Themes folder at the time, 2 years back. Not sure if he wanted this additional folder commited. But I didn't want to delete it and decided it will be better off on SVN. When we use his project, if we find we didn't need this test folder, we can remove it from svn then.

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.