package com.cyngn.chrono.storage; import com.cyngn.chrono.storage.accessor.PayloadAccessor; import com.cyngn.chrono.storage.entity.Payload; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Row; import com.datastax.driver.mapping.MappingManager; import com.englishtown.vertx.cassandra.CassandraSession; import com.englishtown.vertx.cassandra.FutureUtils; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.ListenableFuture; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Consumer; /** * Interface to the payload storage. * * @author truelove@cyngn.com (Jeremy Truelove) 8/15/15 */ public class PayloadStorage { private static final Logger logger = LoggerFactory.getLogger(PayloadStorage.class); private final CassandraSession session; private final PayloadAccessor payloadAccessor; public PayloadStorage(CassandraSession session) { MappingManager manager = new MappingManager(session.getSession()); this.session = session; payloadAccessor = manager.createAccessor(PayloadAccessor.class); } public void getSupportedPayloads(BiConsumer<Boolean,List<Payload>> onComplete) { logger.info("getSupportedPayloads - "); ListenableFuture<ResultSet> future = payloadAccessor.getSupportedPayloads(); FutureUtils.addCallback(future, new FutureCallback<ResultSet>() { @Override public void onSuccess(ResultSet result) { // we don't care about the data we just want to know which values are currently mapped. List<Payload> payloads = new ArrayList<>(); for (Row row : result.all()) { Payload p = new Payload(); p.unit = row.getString(0); p.size = row.getLong(1); payloads.add(p); } onComplete.accept(true, payloads); } @Override public void onFailure(Throwable t) { logger.error("getSupportedPayloads - ex: ", t); onComplete.accept(false, null); } }, session.getVertx()); } public void getPayload(String unit, int size, BiConsumer<Boolean,Payload> onComplete) { logger.info("getPayload - unit: {} size: {}", unit, size); ListenableFuture<Payload> future = payloadAccessor.getPayloadAsync(unit, size); FutureUtils.addCallback(future, new FutureCallback<Payload>() { @Override public void onSuccess(Payload result) { onComplete.accept(result != null, result); } @Override public void onFailure(Throwable t) { logger.error("getPayload - unit: {} size: {} ex: ", unit, size, t); onComplete.accept(false, null); } }, session.getVertx()); } public void createPayload(String unit, int size, String data, Consumer<Boolean> onComplete) { logger.info("createPayload - unit: {} size: {} data size: {}", unit, size, data.length()); ListenableFuture<ResultSet> future = payloadAccessor.createPayload(unit, size, data); FutureUtils.addCallback(future, new FutureCallback<ResultSet>() { @Override public void onSuccess(ResultSet result) { onComplete.accept(result != null && result.wasApplied()); } @Override public void onFailure(Throwable t) { logger.error("createPayload - unit: {} size: {} data size: {} ex: ", unit, size, data.length(), t); onComplete.accept(false); } }, session.getVertx()); } }