package code4;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.StringTokenizer;

public class TestCompositePersistableObject implements PersistableObject {

    private static final String PERSISTOR_TYPE = "test";

    private String infoString;
    private List children = new ArrayList();

    public TestCompositePersistableObject(String info) {
	infoString = info;
    }

    public void addChild(PersistableObject object) {
	children.add(object);
    }

    private String getInfoString() {
	return infoString;
    }

    private void setInfoString(String string) {
	infoString = string;
    }

    public int save(PersistanceMediator mediator) {
	Iterator iterator = children.iterator();
	while(iterator.hasNext()) {
	    setInfoString(getInfoString() + ":" +
			  ((PersistableObject)iterator.next()).save(mediator));
	}
	
	Memento memento = new Memento();
	return memento.setState(mediator);
    }

    public void load(PersistanceMediator mediator, int id) {

	Memento memento = new Memento();
	memento.getState(mediator, id);

	Iterator iterator = children.iterator();

	System.err.println("infoString: " + getInfoString());
	setInfoString("1:2:");
	
	StringTokenizer tokenizer = new StringTokenizer(getInfoString(), ":");
	// bogus, we should be going the other direction
	// and this is decidedly not defensive programming
	while (iterator.hasNext()) {
	    ((PersistableObject)iterator.next()).load(mediator,
						      Integer.parseInt(tokenizer.nextToken()));
	}
	
    }
	
    class Memento {
	private int setState(PersistanceMediator mediator) {
	    return mediator.doSave(PERSISTOR_TYPE, getInfoString());
	}

	private void getState(PersistanceMediator mediator, int id) {
	    setInfoString(mediator.doLoad(PERSISTOR_TYPE, id));
	}
    }
	    
}
