package microservices.sample.persistence;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
import microservices.sample.Entity;
import microservices.sample.IdResponse;
import microservices.sample.InvalidValueException;
import microservices.sample.ResourceNotFoundException;
import java.util.function.Consumer;
/**
* Hazelcast-based distributed in-memory store implementation.
*
* @author mamad
* @since 17/03/15.
*/
@Singleton
public class HazelcastEntityStore implements EntityStore {
public static final String TABLE1 = "common";
private final HazelcastInstance hazelcastInstance;
@Inject
public HazelcastEntityStore(HazelcastInstance hazelcastInstance) {
this.hazelcastInstance = hazelcastInstance;
}
@Override
public <T> void saveAsync(T object, Consumer<IdResponse> onSuccessCallback, Consumer<Throwable> onErrorCallback) {
if (object == null) {
onErrorCallback.accept(new NullPointerException("Object can not be null."));
return;
}
if (!(object instanceof Entity)) {
onErrorCallback.accept(new InvalidValueException("Only objects of type Entity are supported."));
return;
}
String id = ((Entity) object).getId();
if (Strings.isNullOrEmpty(id)) {
onErrorCallback.accept(new NullPointerException("Object id can not be null."));
return;
}
try {
IMap<Object, Object> map = getMap();
map.put(id, object);
onSuccessCallback.accept(IdResponse.of(id));
} catch (Exception e) {
onErrorCallback.accept(e);
}
}
private IMap<Object, Object> getMap() {
return hazelcastInstance.getMap(TABLE1);
}
@Override
public <T> void findById(String id, Consumer<T> onSuccessCallback, Consumer<Throwable> onErrorCallback) {
if (id == null) {
onErrorCallback.accept(new NullPointerException("id can not be null."));
return;
}
IMap<Object, Object> map = getMap();
if (map.containsKey(id)) {
T o = (T) map.get(id);
onSuccessCallback.accept(o);
} else {
onErrorCallback.accept(new ResourceNotFoundException(id));
}
}
}