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()));
}
}
}