To perform a deep copy, one would normally implement the Object.clone() method, implementing Cloneable .... much as in C++ with the copy constructor.
Inside the clone() method, we would call clone on all the instance variables, resulting in a separate but identical object, with no instance sharing between the two objects.
If, however, some of your instance variables don't implement Cloneable, you would have to manually clone them by using the objects exposed interfaces.
Maybe that would help you a bit. I didn't go through the code you posted. Much too long and way too lazy.
Nathaniel Stodard<br />SCJP, SCJD, SCWCD, SCBCD, SCDJWS, ICAD, ICSD, ICED