package com.xxiivv.mute;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Memory {
private final Map<String, Statement> entries = new HashMap<String, Statement>();
public Memory() {
}
public boolean contains(String name) {
return entries.containsKey(name);
}
private void ensureExists(String name) {
if (!contains(name))
throw new RuntimeException("No entry with the name '" + name + "' found");
}
private void ensureSingleton(Statement entry) {
if (!entry.isSingleton())
throw new RuntimeException("Entry '" + entry.name + "' is multi-valued but was accessed as a singleton");
}
public int getInt(String name) {
ensureExists(name);
Statement entry = entries.get(name);
ensureSingleton(entry);
Object value = entry.getSingletonValue();
if (!(value instanceof Integer))
throw new RuntimeException("Entry '" + name + "' does not contain an integer number (type : " + name.getClass().getSimpleName() + ")");
return (int) value;
}
public String getString(String name) {
ensureExists(name);
Statement entry = entries.get(name);
ensureSingleton(entry);
Object value = entry.getSingletonValue();
if (!(value instanceof String))
throw new RuntimeException("Entry '" + name + "' does not contain a string (type : " + name.getClass().getSimpleName() + ")");
return (String) value;
}
public Object[] getArray(String name) {
ensureExists(name);
Statement entry = entries.get(name);
if (entry.isSingleton())
throw new RuntimeException("Entry '" + entry.name + "' is single-valued but was accessed as an array");
ValueCollection values = entry.getValues();
if (!values.isArray())
throw new RuntimeException("Entry '" + entry.name + "' contains named values but was accessed as an array");
return values.asArray();
}
public Map<Object, Object> getObject(String name) {
ensureExists(name);
Statement entry = entries.get(name);
if (entry.isSingleton())
throw new RuntimeException("Entry '" + entry.name + "' is single-valued but was accessed as an array");
return entry.getValueMap();
}
public String fire(String functionName) {
ensureExists(functionName);
return entries.get(functionName).execute();
}
public void put(Statement statement) {
entries.put(statement.name, statement);
}
public void put(String name, int value) {
Statement s = new Statement(name);
s.setValue(new Value(1, value));
entries.put(name, s);
}
public void put(String name, String value) {
Statement s = new Statement(name);
s.setValue(new Value(1, value));
entries.put(name, s);
}
public void put(String name, Object[] values) {
Statement s = new Statement(name);
for (int i=0; i<values.length; i++)
if (values[i] != null)
s.setValue(new Value(i + 1, values[i]));
entries.put(name, s);
}
public Statement get(String name) {
ensureExists(name);
return entries.get(name);
}
public void dump() {
Statement[] ss = new Statement[entries.size()];
entries.values().toArray(ss);
Arrays.sort(ss);
for (Statement s : ss)
System.out.println(s.toString());
}
public void clear() {
entries.clear();
}
}