package org.prevayler.demos.scalability.prevayler;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.prevayler.demos.scalability.Record;
import org.prevayler.demos.scalability.RecordIterator;

class QuerySystem implements ScalabilitySystem {
  private static final long serialVersionUID=-8181198939095700706L;
  private Map recordsByName=new HashMap();
  public List queryByName(  String name){
    return (List)recordsByName.get(name);
  }
  public void replaceAllRecords(  RecordIterator newRecords){
    recordsByName.clear();
    while (newRecords.hasNext()) {
      put(newRecords.next());
    }
    makeReadOnly();
  }
  private void put(  Record newRecord){
    List records=queryByName(newRecord.getName());
    if (records == null) {
      records=new ArrayList();
      recordsByName.put(newRecord.getName(),records);
    }
    records.add(newRecord);
  }
  /** 
 * This is necessary so that the clients cannot alter the Lists they receive as query results.
 */
  private void makeReadOnly(){
    Iterator entries=recordsByName.entrySet().iterator();
    while (entries.hasNext()) {
      Map.Entry entry=(Map.Entry)entries.next();
      entry.setValue(Collections.unmodifiableList((List)entry.getValue()));
    }
  }
}
