package sk.stuba.fiit.perconik.preferences;
import com.google.common.base.MoreObjects.ToStringHelper;
import sk.stuba.fiit.perconik.utilities.io.Serialization;
import sk.stuba.fiit.perconik.utilities.reflect.resolver.ClassResolver;
import static java.lang.String.format;
import static com.google.common.base.Preconditions.checkNotNull;
import static sk.stuba.fiit.perconik.utilities.MoreStrings.firstNonNullOrEmpty;
import static sk.stuba.fiit.perconik.utilities.MoreStrings.toDefaultString;
public abstract class AbstractObjectPreferences extends AbstractPreferences {
final ClassResolver resolver;
public AbstractObjectPreferences(final Scope scope, final String qualifier, final ClassResolver resolver) {
super(scope, qualifier);
this.resolver = checkNotNull(resolver);
}
static final Object fromBytes(final String key, final byte[] value, final ClassResolver resolver) {
try {
return Serialization.fromBytes(value, resolver);
} catch (Exception e) {
throw new RuntimeException(format("Unable to read object under key %s from byte array", key), e);
}
}
static final byte[] toBytes(final String key, final Object value) {
try {
return Serialization.toBytes(value);
} catch (Exception e) {
throw new RuntimeException(format("Unable to write object %s under key %s to byte array", toDefaultString(value), key), e);
}
}
protected static final String toString(final Throwable failure) {
return firstNonNullOrEmpty(failure.getMessage(), "Unknown serialization error");
}
protected final void putObject(final String key, final Object value) {
this.data.putByteArray(key, toBytes(key, value));
}
protected final Object getObject(final String key) {
return fromBytes(key, this.data.getByteArray(key, null), this.resolver);
}
@Override
protected ToStringHelper toStringHelper() {
return super.toStringHelper().add("resolver", this.resolver);
}
}