diff --git a/src/main/java/bdchain/api/TransactionLedgerClient.java b/src/main/java/bdchain/api/TransactionLedgerClient.java new file mode 100644 index 0000000..d333942 --- /dev/null +++ b/src/main/java/bdchain/api/TransactionLedgerClient.java @@ -0,0 +1,89 @@ +package bdchain.api; + +import bdchain.api.grpc.*; +import bdchain.api.grpc.TransactionLedgerGrpc.TransactionLedgerBlockingStub; +import com.google.protobuf.Empty; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.grpc.StatusRuntimeException; + +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; + +// import bdchain.api.grpc.TransactionLedgerGrpc.TransactionLedgerStub; + +public class TransactionLedgerClient { + + private static final Logger logger = Logger.getLogger(TransactionLedgerClient.class.getName()); + + private final ManagedChannel channel; + private final TransactionLedgerBlockingStub blockingStub; + // private final TransactionLedgerStub asyncStub; + + /** Construct client for accessing TransactionLedger server at {@code host:port}. */ + public TransactionLedgerClient(String host, int port) { + this(ManagedChannelBuilder.forAddress(host, port).usePlaintext()); + } + + /** Construct client for accessing TransactionLedger server using the existing channel. */ + public TransactionLedgerClient(ManagedChannelBuilder channelBuilder) { + channel = channelBuilder.build(); + blockingStub = TransactionLedgerGrpc.newBlockingStub(channel); + // asyncStub = TransactionLedgerGrpc.newStub(channel); + } + + public void shutdown() throws InterruptedException { + channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + + public CreateLedgerResponse createLedger(String name) { + + info("*** createLedger: name={0}", name); + + CreateLedgerRequest request = CreateLedgerRequest.newBuilder().setName(name).build(); + + try { + return blockingStub.createLedger(request); + } catch (StatusRuntimeException e) { + warning("RPC failed: {0}", e.getStatus()); + return null; + } + } + + public GetLedgersResponse getLedgers() { + + info("*** getLedgers"); + + try { + return blockingStub.getLedgers(Empty.getDefaultInstance()); + } catch (StatusRuntimeException e) { + warning("RPC failed: {0}", e.getStatus()); + return null; + } + } + + public SendTransactionResponse sendTransaction( + String ledger, SendTransactionRequest.Transaction transaction) { + + info("*** sendTransaction: ledger={0} transaction={1}", ledger, transaction); + + SendTransactionRequest request = + SendTransactionRequest.newBuilder().setLedger(ledger).setTransaction(transaction).build(); + + try { + return blockingStub.sendTransaction(request); + } catch (StatusRuntimeException e) { + warning("RPC failed: {0}", e.getStatus()); + return null; + } + } + + private void info(String msg, Object... params) { + logger.log(Level.INFO, msg, params); + } + + private void warning(String msg, Object... params) { + logger.log(Level.WARNING, msg, params); + } +}