From 3b75cc2fd08b69b6f1f69d64032a02448aa28142 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Wed, 26 Nov 2014 21:10:01 +0100 Subject: [PATCH] Add null checks --- src/main/java/io/bitsquare/gui/bitsquare.css | 2 - .../createoffer/CreateOfferDataModel.java | 4 +- .../trade/takeoffer/TakeOfferDataModel.java | 13 +++- .../java/io/bitsquare/trade/TradeManager.java | 68 +++++++++++-------- .../offerer/BuyerAcceptsOfferProtocol.java | 3 + 5 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/main/java/io/bitsquare/gui/bitsquare.css b/src/main/java/io/bitsquare/gui/bitsquare.css index 2b5492f01b..e7badd4c37 100644 --- a/src/main/java/io/bitsquare/gui/bitsquare.css +++ b/src/main/java/io/bitsquare/gui/bitsquare.css @@ -2,8 +2,6 @@ Theme colors: logo colors: -blue: 0096c9 -dark grey: #333333 new blue: 0f87c3 new grey: 666666 diff --git a/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferDataModel.java b/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferDataModel.java index 0c26b7b9de..219f1b1fc6 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferDataModel.java +++ b/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferDataModel.java @@ -59,7 +59,7 @@ import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; /** * Domain for that UI element. @@ -244,7 +244,7 @@ class CreateOfferDataModel implements Activatable, DataModel { @SuppressWarnings("NullableProblems") void setDirection(Direction direction) { // direction can not be changed once it is initially set - checkArgument(direction != null); + checkNotNull(direction); this.direction = direction; } diff --git a/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferDataModel.java b/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferDataModel.java index 0680da0bbe..590fc0350a 100644 --- a/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferDataModel.java +++ b/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferDataModel.java @@ -129,15 +129,22 @@ class TakeOfferDataModel implements Activatable, DataModel { } void takeOffer() { - Trade trade = tradeManager.takeOffer(amountAsCoin.get(), offer); + final Trade trade = tradeManager.takeOffer(amountAsCoin.get(), offer); trade.stateProperty().addListener((ov, oldValue, newValue) -> { log.debug("trade state = " + newValue); switch (newValue) { // TODO Check why DEPOSIT_CONFIRMED can happen, refactor state handling case DEPOSIT_PUBLISHED: case DEPOSIT_CONFIRMED: - transactionId.set(trade.getDepositTx().getHashAsString()); - requestTakeOfferSuccess.set(true); + // TODO null pointer happened here! + if (trade.getDepositTx() != null) { + transactionId.set(trade.getDepositTx().getHashAsString()); + requestTakeOfferSuccess.set(true); + } + else { + log.warn("trade.getDepositTx() = null. at trade state " + newValue + + " That should not happen and needs more investigation why it can happen."); + } break; case FAILED: requestTakeOfferErrorMessage.set("An error occurred. Error: " + trade.getFault().getMessage()); diff --git a/src/main/java/io/bitsquare/trade/TradeManager.java b/src/main/java/io/bitsquare/trade/TradeManager.java index 43c1fcf71f..006501c61b 100644 --- a/src/main/java/io/bitsquare/trade/TradeManager.java +++ b/src/main/java/io/bitsquare/trade/TradeManager.java @@ -418,34 +418,48 @@ public class TradeManager { log.trace("onIncomingTradeMessage sender " + sender); String tradeId = tradeMessage.getTradeId(); - - if (tradeMessage instanceof RequestTakeOfferMessage) { - createOffererAsBuyerProtocol(tradeId, sender); + if (tradeId != null) { + if (tradeMessage instanceof RequestTakeOfferMessage) { + createOffererAsBuyerProtocol(tradeId, sender); + } + else if (tradeMessage instanceof RespondToTakeOfferRequestMessage) { + takerAsSellerProtocolMap.get(tradeId).onRespondToTakeOfferRequestMessage( + (RespondToTakeOfferRequestMessage) tradeMessage); + } + else if (tradeMessage instanceof TakeOfferFeePayedMessage) { + offererAsBuyerProtocolMap.get(tradeId).onTakeOfferFeePayedMessage((TakeOfferFeePayedMessage) + tradeMessage); + } + else if (tradeMessage instanceof RequestTakerDepositPaymentMessage) { + takerAsSellerProtocolMap.get(tradeId).onRequestTakerDepositPaymentMessage( + (RequestTakerDepositPaymentMessage) tradeMessage); + } + else if (tradeMessage instanceof RequestOffererPublishDepositTxMessage) { + offererAsBuyerProtocolMap.get(tradeId).onRequestOffererPublishDepositTxMessage( + (RequestOffererPublishDepositTxMessage) tradeMessage); + } + else if (tradeMessage instanceof DepositTxPublishedMessage) { + persistPendingTrades(); + takerAsSellerProtocolMap.get(tradeId).onDepositTxPublishedMessage((DepositTxPublishedMessage) + tradeMessage); + } + else if (tradeMessage instanceof BankTransferInitedMessage) { + // Here happened a null pointer. I assume the only possible reason was that we got a null for the + // tradeID + // as the takerAsSellerProtocolMap need to have that trade got added earlier. + // For getting better info we add a check. tradeId is checked above. + if (takerAsSellerProtocolMap.get(tradeId) == null) + log.error("takerAsSellerProtocolMap.get(tradeId) = null. That must not happen."); + takerAsSellerProtocolMap.get(tradeId).onBankTransferInitedMessage((BankTransferInitedMessage) + tradeMessage); + } + else if (tradeMessage instanceof PayoutTxPublishedMessage) { + offererAsBuyerProtocolMap.get(tradeId).onPayoutTxPublishedMessage((PayoutTxPublishedMessage) + tradeMessage); + } } - else if (tradeMessage instanceof RespondToTakeOfferRequestMessage) { - takerAsSellerProtocolMap.get(tradeId).onRespondToTakeOfferRequestMessage( - (RespondToTakeOfferRequestMessage) tradeMessage); - } - else if (tradeMessage instanceof TakeOfferFeePayedMessage) { - offererAsBuyerProtocolMap.get(tradeId).onTakeOfferFeePayedMessage((TakeOfferFeePayedMessage) tradeMessage); - } - else if (tradeMessage instanceof RequestTakerDepositPaymentMessage) { - takerAsSellerProtocolMap.get(tradeId).onRequestTakerDepositPaymentMessage( - (RequestTakerDepositPaymentMessage) tradeMessage); - } - else if (tradeMessage instanceof RequestOffererPublishDepositTxMessage) { - offererAsBuyerProtocolMap.get(tradeId).onRequestOffererPublishDepositTxMessage( - (RequestOffererPublishDepositTxMessage) tradeMessage); - } - else if (tradeMessage instanceof DepositTxPublishedMessage) { - persistPendingTrades(); - takerAsSellerProtocolMap.get(tradeId).onDepositTxPublishedMessage((DepositTxPublishedMessage) tradeMessage); - } - else if (tradeMessage instanceof BankTransferInitedMessage) { - takerAsSellerProtocolMap.get(tradeId).onBankTransferInitedMessage((BankTransferInitedMessage) tradeMessage); - } - else if (tradeMessage instanceof PayoutTxPublishedMessage) { - offererAsBuyerProtocolMap.get(tradeId).onPayoutTxPublishedMessage((PayoutTxPublishedMessage) tradeMessage); + else { + log.error("tradeId from onIncomingTradeMessage is null. That must not happen."); } } diff --git a/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAcceptsOfferProtocol.java b/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAcceptsOfferProtocol.java index a108585be6..5ed28a5247 100644 --- a/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAcceptsOfferProtocol.java +++ b/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAcceptsOfferProtocol.java @@ -156,6 +156,9 @@ public class BuyerAcceptsOfferProtocol { tradeId = trade.getId(); offer = trade.getOffer(); + checkNotNull(tradeId); + checkNotNull(offer); + //TODO use first for now arbitratorPubKey = offer.getArbitrators().get(0).getPubKeyAsHex();