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",
"Søndergaard, Ole",
"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();
}
}
|