package openmods.datastore; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.List; import java.util.Map; import openmods.utils.io.IStreamReader; import openmods.utils.io.IStreamSerializer; import openmods.utils.io.IStreamWriter; import openmods.utils.io.TypeRW; public class DataStoreBuilder<K, V> { private final DataStoreManager owner; private final DataStoreKey<K, V> key; private final Class<? extends K> keyClass; private final Class<? extends V> valueClass; private IStreamWriter<K> keyWriter; private IStreamWriter<V> valueWriter; private IStreamReader<K> keyReader; private IStreamReader<V> valueReader; private List<IDataVisitor<K, V>> visitors = Lists.newArrayList(); private final Map<K, V> values = Maps.newHashMap(); DataStoreBuilder(DataStoreManager owner, DataStoreKey<K, V> key, Class<? extends K> keyClass, Class<? extends V> valueClass) { this.owner = owner; this.key = key; this.keyClass = keyClass; this.valueClass = valueClass; } public DataStoreKey<K, V> register() { Preconditions.checkNotNull(keyWriter, "Key writer not set"); Preconditions.checkNotNull(valueWriter, "Value writer not set"); Preconditions.checkNotNull(keyReader, "Key reader not set"); Preconditions.checkNotNull(valueReader, "Value reader not set"); final DataStoreWrapper<K, V> wrapper = new DataStoreWrapper<K, V>(values, keyWriter, valueWriter, keyReader, valueReader); for (IDataVisitor<K, V> visitor : visitors) wrapper.addVisitor(visitor); wrapper.activateLocalData(); owner.register(key, wrapper); return key; } public boolean isRegistered(K key) { return values.containsKey(key); } public void addEntry(K key, V value) { Preconditions.checkNotNull(key, "Null key not allowed"); Preconditions.checkNotNull(value, "Null values not allowed"); V prev = values.put(key, value); Preconditions.checkState(prev == null, "Replacing value for key %s: %s -> %s, id: %s", key, prev, value, this.key.id); } private <T> TypeRW<T> getDefaultReaderWriter(Class<? extends T> cls) { @SuppressWarnings("unchecked") TypeRW<T> rw = (TypeRW<T>)TypeRW.UNIVERSAL_SERIALIZERS.get(cls); Preconditions.checkNotNull(rw, "Can't find default reader/writer for class %s, id: %s", cls, key.id); return rw; } public void setDefaultKeyWriter() { this.keyWriter = getDefaultReaderWriter(keyClass); } public void setDefaultValueWriter() { this.valueWriter = getDefaultReaderWriter(valueClass); } public void setDefaultKeyReader() { this.keyReader = getDefaultReaderWriter(keyClass); } public void setDefaultValueReader() { this.valueReader = getDefaultReaderWriter(valueClass); } public void setDefaultKeyReaderWriter() { setDefaultKeyWriter(); setDefaultKeyReader(); } public void setDefaultValueReaderWriter() { setDefaultValueWriter(); setDefaultValueReader(); } public void setDefaultReadersWriters() { setDefaultKeyReaderWriter(); setDefaultValueReaderWriter(); } public void setKeyWriter(IStreamWriter<K> keyWriter) { this.keyWriter = keyWriter; } public void setValueWriter(IStreamWriter<V> valueWriter) { this.valueWriter = valueWriter; } public void setKeyReaderWriter(IStreamSerializer<K> rw) { this.keyReader = rw; this.keyWriter = rw; } public void setKeyReader(IStreamReader<K> keyReader) { this.keyReader = keyReader; } public void setValueReader(IStreamReader<V> valueReader) { this.valueReader = valueReader; } public void setValueReaderWriter(IStreamSerializer<V> rw) { this.valueReader = rw; this.valueWriter = rw; } public void addVisitor(IDataVisitor<K, V> visitor) { visitors.add(visitor); } }