import java.util.Properties; import jdbm.RecordManager; import jdbm.RecordManagerFactory; import jdbm.helper.Tuple; import jdbm.helper.TupleBrowser; import jdbm.helper.StringComparator; import jdbm.btree.BTree; /** * Famous People example. * <p> * Demonstrates the use of B+Tree data structure to manage a list of * people and their occupation. The example covers insertion, * ordered traversal, reverse traversal and range lookup of records. * * @author <a href="mailto:boisvert@intalio.com">Alex Boisvert</a> * @version $Id: FamousPeople.java,v 1.6 2003/10/21 15:32:02 boisvert Exp $ */ public class FamousPeople { static String DATABASE = "people"; static String BTREE_NAME = "FamousPeople"; static String[] people = { "Greenspan, Alan", "Williams-Byrd, Julie", "Picasso, Pablo", "Stallman, Richard", "Fort, Paul", "Schwarzenegger, Arnold", "Dulkinys, Susanna" }; static String[] occupations = { "Federal Reserve Board Chairman", "Engineer", "Painter", "Programmer", "Poet", "Typographer", "Actor", "Designer" }; static String PREFIX = "S"; /** * Example main entrypoint. */ public static void main( String[] args ) { RecordManager recman; long recid; Tuple tuple = new Tuple(); TupleBrowser browser; BTree tree; Properties props; props = new Properties(); try { // open database and setup an object cache recman = RecordManagerFactory.createRecordManager( DATABASE, props ); // try to reload an existing B+Tree recid = recman.getNamedObject( BTREE_NAME ); if ( recid != 0 ) { tree = BTree.load( recman, recid ); System.out.println( "Reloaded existing BTree with " + tree.size() + " famous people." ); } else { // create a new B+Tree data structure and use a StringComparator // to order the records based on people's name. tree = BTree.createInstance( recman, new StringComparator() ); recman.setNamedObject( BTREE_NAME, tree.getRecid() ); System.out.println( "Created a new empty BTree" ); } // insert people with their respective occupation System.out.println(); for ( int i=0; i<people.length; i++ ) { System.out.println( "Insert: " + people[i] ); tree.insert( people[ i ], occupations[ i ], false ); } // make the data persistent in the database recman.commit(); // show list of people with their occupation System.out.println(); System.out.println( "Person Occupation " ); System.out.println( "------------------ ------------------" ); // traverse people in order browser = tree.browse(); while ( browser.getNext( tuple ) ) { print( tuple ); } // traverse people in reverse order System.out.println(); System.out.println( "Reverse order:" ); browser = tree.browse( null ); // position browser at end of the list while ( browser.getPrevious( tuple ) ) { print( tuple ); } // display people whose name start with PREFIX range System.out.println(); System.out.println( "All people whose name start with '" + PREFIX + "':" ); browser = tree.browse( PREFIX ); while ( browser.getNext( tuple ) ) { String key = (String) tuple.getKey(); if ( key.startsWith( PREFIX ) ) { print( tuple ); } else { break; } } } catch ( Exception except ) { except.printStackTrace(); } } /** * Print a Tuple containing a ( Person, Occupation ) pair. */ static void print( Tuple tuple ) { String person = (String) tuple.getKey(); String occupation = (String) tuple.getValue(); System.out.println( pad( person, 25) + occupation ); } /** * Pad a string with spaces on the right. * * @param str String to add spaces * @param width Width of string after padding */ static String pad( String str, int width ) { StringBuffer buf = new StringBuffer( str ); int space = width-buf.length(); while ( space-- > 0 ) { buf.append( ' ' ); } return buf.toString(); } }