Mercurial > hg > digilib-old
comparison servlet/src/digilib/auth/HashTree.java @ 205:6221d688eab6
Servlet version 1.18b9 -- cleanup and bugfixes
- fixed bug with slow color JPEGs
- better pathname handling
- better filehandle cleanup (hopefully)
| author | robcast |
|---|---|
| date | Fri, 12 Mar 2004 19:52:06 +0100 |
| parents | afe7ff98bb71 |
| children | 6e6bf5aa7ad2 |
comparison
equal
deleted
inserted
replaced
| 204:37a697fd8ec6 | 205:6221d688eab6 |
|---|---|
| 1 /* HashTree -- Tree in a Hashtable | 1 /* HashTree -- Tree in a Hashtable |
| 2 | 2 |
| 3 Digital Image Library servlet components | 3 Digital Image Library servlet components |
| 4 | 4 |
| 5 Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de) | 5 Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de) |
| 6 | 6 |
| 7 This program is free software; you can redistribute it and/or modify it | 7 This program is free software; you can redistribute it and/or modify it |
| 8 under the terms of the GNU General Public License as published by the | 8 under the terms of the GNU General Public License as published by the |
| 9 Free Software Foundation; either version 2 of the License, or (at your | 9 Free Software Foundation; either version 2 of the License, or (at your |
| 10 option) any later version. | 10 option) any later version. |
| 11 | 11 |
| 12 Please read license.txt for the full details. A copy of the GPL | 12 Please read license.txt for the full details. A copy of the GPL |
| 13 may be found at http://www.gnu.org/copyleft/lgpl.html | 13 may be found at http://www.gnu.org/copyleft/lgpl.html |
| 14 | 14 |
| 15 You should have received a copy of the GNU General Public License | 15 You should have received a copy of the GNU General Public License |
| 16 along with this program; if not, write to the Free Software | 16 along with this program; if not, write to the Free Software |
| 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 18 | 18 |
| 19 */ | 19 */ |
| 20 | 20 |
| 21 package digilib.auth; | 21 package digilib.auth; |
| 22 | 22 |
| 23 import java.util.*; | 23 import java.util.*; |
| 24 | 24 |
| 25 /** | |
| 26 * Tree representation wrapper for a HashMap. | |
| 27 * | |
| 28 * The HashTree is constructed from a HashMap filled with 'branches' with | |
| 29 * 'leaves'. The branches are stored as String keys in the HashMap. The String | |
| 30 * values are leaves. | |
| 31 * | |
| 32 * Branches are matched in 'twigs' separated by 'twig separator' Strings. The | |
| 33 * return values for a match are leaf values separated by 'leaf separator' | |
| 34 * Strings. | |
| 35 * | |
| 36 * @author casties | |
| 37 */ | |
| 25 public class HashTree { | 38 public class HashTree { |
| 26 | 39 |
| 27 private HashMap table; | 40 private HashMap table; |
| 28 private String twigSep = "/"; | |
| 29 private String leafSep = ","; | |
| 30 | 41 |
| 31 public HashTree() { | 42 private String twigSep = "/"; |
| 32 table = new HashMap(); | |
| 33 } | |
| 34 | 43 |
| 35 public HashTree(HashMap t, String twig_separator, String leaf_separator) { | 44 private String leafSep = ","; |
| 36 table = t; | |
| 37 twigSep = twig_separator; | |
| 38 leafSep = leaf_separator; | |
| 39 optimizeTable(); | |
| 40 } | |
| 41 | 45 |
| 42 void optimizeTable() { | 46 /** |
| 43 } | 47 * Constructor of a HashTree. |
| 48 * | |
| 49 * Creates a HashTree wrapper around a given HashMap, using the given twig | |
| 50 * separator and leaf separator. | |
| 51 * | |
| 52 * @param t | |
| 53 * @param twig_separator | |
| 54 * @param leaf_separator | |
| 55 */ | |
| 56 public HashTree(HashMap t, String twig_separator, String leaf_separator) { | |
| 57 table = t; | |
| 58 twigSep = twig_separator; | |
| 59 leafSep = leaf_separator; | |
| 60 optimizeTable(); | |
| 61 } | |
| 44 | 62 |
| 45 List match(String branch) { | 63 void optimizeTable() { |
| 46 String b = ""; | 64 } |
| 47 String m; | |
| 48 LinkedList matches = new LinkedList(); | |
| 49 | 65 |
| 50 // split branch | 66 /** |
| 51 StringTokenizer twig = new StringTokenizer(branch, twigSep); | 67 * Matches the given branch against the HashTree. |
| 52 // walk branch and check with tree | 68 * |
| 53 while (twig.hasMoreTokens()) { | 69 * Returns a LinkedList of all leaves on all matching branches in the tree. |
| 54 if (b.length() == 0) { | 70 * Branches in the tree match if they are substrings starting at the same |
| 55 b = twig.nextToken(); | 71 * root. |
| 56 } else { | 72 * |
| 57 b += twigSep + twig.nextToken(); | 73 * @param branch |
| 58 } | 74 * @return |
| 59 m = (String)table.get(b); | 75 */ |
| 60 if (m != null) { | 76 List match(String branch) { |
| 61 if (m.indexOf(leafSep) < 0) { | 77 String b = ""; |
| 62 // single leaf | 78 String m; |
| 63 matches.add(m); | 79 LinkedList matches = new LinkedList(); |
| 80 | |
| 81 // split branch | |
| 82 StringTokenizer twig = new StringTokenizer(branch, twigSep); | |
| 83 // walk branch and check with tree | |
| 84 while (twig.hasMoreTokens()) { | |
| 85 if (b.length() == 0) { | |
| 86 b = twig.nextToken(); | |
| 87 } else { | |
| 88 b += twigSep + twig.nextToken(); | |
| 89 } | |
| 90 m = (String) table.get(b); | |
| 91 if (m != null) { | |
| 92 if (m.indexOf(leafSep) < 0) { | |
| 93 // single leaf | |
| 94 matches.add(m); | |
| 95 } else { | |
| 96 // split leaves | |
| 97 StringTokenizer leaf = new StringTokenizer(m, leafSep); | |
| 98 while (leaf.hasMoreTokens()) { | |
| 99 matches.add(leaf.nextToken()); | |
| 100 } | |
| 101 } | |
| 102 } | |
| 103 } | |
| 104 if (matches.size() > 0) { | |
| 105 return matches; | |
| 64 } else { | 106 } else { |
| 65 // split leaves | 107 return null; |
| 66 StringTokenizer leaf = new StringTokenizer(m, leafSep); | |
| 67 while (leaf.hasMoreTokens()) { | |
| 68 matches.add(leaf.nextToken()); | |
| 69 } | |
| 70 } | 108 } |
| 71 } | |
| 72 } | 109 } |
| 73 if (matches.size() > 0) { | |
| 74 return matches; | |
| 75 } else { | |
| 76 return null; | |
| 77 } | |
| 78 } | |
| 79 } | 110 } |
