001: package jdbm;
002:
003: import jdbm.RecordManager;
004: import jdbm.RecordManagerFactory;
005: import jdbm.helper.FastIterator;
006: import jdbm.htree.HTree;
007: import java.io.IOException;
008: import java.io.PrintStream;
009:
010: /**
011: * Test case provided by Daniel Herlemont to demonstrate a bug in
012: * HashDirectory. The returned Enumeration got into an infinite loop
013: * on the same key/val pair.
014: *
015: * @version $Id: HashtableTest.java,v 1.6 2005/06/25 23:12:32 doomdark Exp $
016: */
017: public class HashtableTest {
018:
019: private RecordManager recman;
020: private HTree hashtable;
021:
022: private boolean enumerate = false;
023: private boolean populate = false;
024: private boolean retrieve = false;
025: private String jdbmName = "hashtest";
026: private String name = "hashtable";
027: private String onekey = "onekey";
028:
029: /**
030: * Initialize RecordManager and HTree
031: */
032: protected void init() throws IOException {
033: recman = RecordManagerFactory.createRecordManager(jdbmName);
034:
035: // create or reload HTree
036: long recid = recman.getNamedObject(name);
037: if (recid == 0) {
038: hashtable = HTree.createInstance(recman);
039: recman.setNamedObject(name, hashtable.getRecid());
040: } else {
041: hashtable = HTree.load(recman, recid);
042: }
043:
044: }
045:
046: /**
047: * Populate HTree with some data
048: */
049: protected void populate() throws IOException {
050: try {
051: int max = 1000;
052: for (int i = 0; i < max; i++) {
053: String key = "key" + i;
054: String val = "val" + i;
055: hashtable.put(key, val);
056: System.out.println("put key=" + key + " val=" + val);
057: }
058:
059: System.out.println("populate completed");
060: } finally {
061: recman.close();
062: }
063: }
064:
065: /**
066: * Retrieve a given object based on key
067: */
068: protected Object retrieve(Object key) throws IOException {
069: init();
070:
071: try {
072: Object val = hashtable.get(key);
073: System.out.println("retrieve key=" + key + " val=" + val);
074: return val;
075: } finally {
076: recman.close();
077: }
078: }
079:
080: /**
081: * Enumerate keys and objects found in HTree
082: */
083: protected void enumerate() throws IOException {
084: init();
085:
086: try {
087: FastIterator iter = hashtable.keys();
088: Object key = iter.next();
089: while (key != null) {
090: Object val = hashtable.get(key);
091: System.out.println("enum key=" + key + " val=" + val);
092: }
093: } finally {
094: recman.close();
095: }
096: }
097:
098: /**
099: * Execute commands specified on command-line
100: */
101: protected void doCommands() throws IOException {
102: if (enumerate) {
103: enumerate();
104: }
105:
106: if (populate) {
107: populate();
108: }
109:
110: if (retrieve) {
111: retrieve(onekey);
112: }
113: }
114:
115: /**
116: * Parse command-line arguments
117: */
118: protected void parseArgs(String args[]) {
119: for (int argn = 0; argn < args.length; argn++) {
120: if (args[argn].equals("-enum")) {
121: enumerate = true;
122: } else if (args[argn].equals("-populate")) {
123: populate = true;
124: } else if (args[argn].equals("-retrieve")) {
125: retrieve = true;
126: } else if (args[argn].equals("-jdbmName")
127: && argn < args.length - 1) {
128: jdbmName = args[++argn];
129: } else if (args[argn].equals("-key")
130: && argn < args.length - 1) {
131: onekey = args[++argn];
132: } else if (args[argn].equals("-name")
133: && argn < args.length - 1) {
134: name = args[++argn];
135: } else {
136: System.err
137: .println("Unrecognized option: " + args[argn]);
138: usage(System.err);
139: }
140: }
141: }
142:
143: /**
144: * Display usage information
145: */
146: protected void usage(PrintStream ps) {
147: ps.println("Usage: java " + getClass().getName() + " Options");
148: ps.println();
149: ps.println("Options (with default values):");
150: ps.println("-help print this");
151: }
152:
153: /**
154: * Static program entrypoint
155: */
156: public static void main(String[] args) {
157: HashtableTest instance = new HashtableTest();
158: instance.parseArgs(args);
159: try {
160: instance.doCommands();
161: } catch (IOException except) {
162: except.printStackTrace();
163: }
164: }
165:
166: }
|