package code4;

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class StringPersistanceMediator implements PersistanceMediator {

    private static int id = 0;

    private Map factories = new HashMap();
    private Map persistorMap = new HashMap();
    private List selectedFactories = new ArrayList();
    private List persistorList = new ArrayList();

    public StringPersistanceMediator() {
	factories.put("text", new TextPersistorFactory());
	factories.put("bubble", new BubblePersistorFactory());
	persistorList.add("test");
    }

    public void addFactory(String factory) {
	selectedFactories.add(factory);
    }

    /**
     * Makes a map of the persistor names and all the persistors that will 
     * be saving the data
     *
     */
    public void makePersistors() {
	Iterator persistorIterator = persistorList.iterator();

	// loop the types of persistors
	while(persistorIterator.hasNext()) {
	    List persistors = new ArrayList();
	    Iterator factoryIterator = selectedFactories.iterator();
	    String persistorName = (String)persistorIterator.next();
	    
	    
	    // loop the factories
	    while(factoryIterator.hasNext()) {
		PersistorFactory
		    factory = (PersistorFactory)factories.get(factoryIterator.next());
		persistors.add(factory.makePersistor(persistorName));
	    }
	    persistorMap.put(persistorName, persistors);
	}
    }
	    
	
    public int doSave(String name, String info) {

	List persistors = (List)persistorMap.get(name);
	Iterator persistorIterator = persistors.iterator();

	id++;
	
	while(persistorIterator.hasNext()) {
	    Persistor persistor = (Persistor)persistorIterator.next();
	    persistor.executeSave(info, id);
	}
	return id;
    }

    public String doLoad(String name, int id) {
	List persistors = (List)persistorMap.get(name);
	Iterator persistorIterator = persistors.iterator();
	String results = null;

	while(persistorIterator.hasNext()) {
	    Persistor persistor = (Persistor)persistorIterator.next();
	    results = persistor.executeLoad(id);
	}
	return results;
    }
	
	
}
