Java software solutions : foundations of program design