Signal-Android/app/src/main/java/org/thoughtcrime/securesms/keyvalue/KeyValueDataSet.java

131 wiersze
3.2 KiB
Java

package org.thoughtcrime.securesms.keyvalue;
import androidx.annotation.NonNull;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class KeyValueDataSet implements KeyValueReader {
private final Map<String, Object> values = new HashMap<>();
private final Map<String, Class> types = new HashMap<>();
public void putBlob(@NonNull String key, byte[] value) {
values.put(key, value);
types.put(key, byte[].class);
}
public void putBoolean(@NonNull String key, boolean value) {
values.put(key, value);
types.put(key, Boolean.class);
}
public void putFloat(@NonNull String key, float value) {
values.put(key, value);
types.put(key, Float.class);
}
public void putInteger(@NonNull String key, int value) {
values.put(key, value);
types.put(key, Integer.class);
}
public void putLong(@NonNull String key, long value) {
values.put(key, value);
types.put(key, Long.class);
}
public void putString(@NonNull String key, String value) {
values.put(key, value);
types.put(key, String.class);
}
void putAll(@NonNull KeyValueDataSet other) {
values.putAll(other.values);
types.putAll(other.types);
}
void removeAll(@NonNull Collection<String> removes) {
for (String remove : removes) {
values.remove(remove);
types.remove(remove);
}
}
@Override
public byte[] getBlob(@NonNull String key, byte[] defaultValue) {
if (containsKey(key)) {
return readValueAsType(key, byte[].class, true);
} else {
return defaultValue;
}
}
@Override
public boolean getBoolean(@NonNull String key, boolean defaultValue) {
if (containsKey(key)) {
return readValueAsType(key, Boolean.class, false);
} else {
return defaultValue;
}
}
@Override
public float getFloat(@NonNull String key, float defaultValue) {
if (containsKey(key)) {
return readValueAsType(key, Float.class, false);
} else {
return defaultValue;
}
}
@Override
public int getInteger(@NonNull String key, int defaultValue) {
if (containsKey(key)) {
return readValueAsType(key, Integer.class, false);
} else {
return defaultValue;
}
}
@Override
public long getLong(@NonNull String key, long defaultValue) {
if (containsKey(key)) {
return readValueAsType(key, Long.class, false);
} else {
return defaultValue;
}
}
@Override
public String getString(@NonNull String key, String defaultValue) {
if (containsKey(key)) {
return readValueAsType(key, String.class, true);
} else {
return defaultValue;
}
}
@Override
public boolean containsKey(@NonNull String key) {
return values.containsKey(key);
}
public @NonNull Map<String, Object> getValues() {
return values;
}
public Class getType(@NonNull String key) {
return types.get(key);
}
private <E> E readValueAsType(@NonNull String key, Class<E> type, boolean nullable) {
Object value = values.get(key);
if ((value == null && nullable) || (value != null && value.getClass() == type)) {
return type.cast(value);
} else {
throw new IllegalArgumentException("Type mismatch!");
}
}
}