From a9f6d8481b0ab52f696564a2cba23cab0bf4decd Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 26 Mar 2015 18:56:54 +0100 Subject: [PATCH] Refactor trade object --- .../offer/tomp2p/TomP2POfferBookService.java | 4 +- .../java/io/bitsquare/trade/OffererTrade.java | 50 +++++++++++++---- .../java/io/bitsquare/trade/TakerTrade.java | 47 +++++++++++++--- .../main/java/io/bitsquare/trade/Trade.java | 56 ++++--------------- .../java/io/bitsquare/trade/TradeManager.java | 9 ++- .../trade/offerer/OffererAsBuyerProtocol.java | 2 +- .../offerer/tasks/CreateAndSignPayoutTx.java | 10 ++-- .../ProcessRequestDepositTxInputsMessage.java | 6 +- .../offerer/tasks/VerifyAndSignContract.java | 14 ++--- 9 files changed, 109 insertions(+), 89 deletions(-) diff --git a/core/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBookService.java b/core/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBookService.java index 1d6e57b2bb..ef34b75921 100644 --- a/core/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBookService.java +++ b/core/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBookService.java @@ -195,12 +195,12 @@ public class TomP2POfferBookService extends TomP2PDHTService implements OfferBoo e.printStackTrace(); } } - + log.trace("Get offers with offers.size(): " + offers.size()); executor.execute(() -> offerRepositoryListeners.stream().forEach(listener -> listener.onOffersReceived(offers))); } - log.trace("Get offers from DHT was successful. Stored data: [key: " + locationKey + log.trace("Get offers from DHT was successful. Received data: [key: " + locationKey + ", values: " + futureGet.dataMap() + "]"); } else { diff --git a/core/src/main/java/io/bitsquare/trade/OffererTrade.java b/core/src/main/java/io/bitsquare/trade/OffererTrade.java index 2925331ca4..eb3e267646 100644 --- a/core/src/main/java/io/bitsquare/trade/OffererTrade.java +++ b/core/src/main/java/io/bitsquare/trade/OffererTrade.java @@ -18,9 +18,12 @@ package io.bitsquare.trade; import io.bitsquare.offer.Offer; +import io.bitsquare.p2p.Peer; import io.bitsquare.trade.protocol.trade.offerer.OffererAsBuyerProtocol; +import org.bitcoinj.core.Coin; import org.bitcoinj.core.TransactionConfidence; +import org.bitcoinj.utils.Fiat; import com.google.common.base.Throwables; import com.google.common.util.concurrent.FutureCallback; @@ -42,6 +45,7 @@ public class OffererTrade extends Trade implements Serializable { private static final long serialVersionUID = 1L; transient private static final Logger log = LoggerFactory.getLogger(OffererTrade.class); + /////////////////////////////////////////////////////////////////////////////////////////// // Enum /////////////////////////////////////////////////////////////////////////////////////////// @@ -66,11 +70,14 @@ public class OffererTrade extends Trade implements Serializable { EXCEPTION } - protected OffererProcessState processState; - protected OffererLifeCycleState lifeCycleState; - transient protected ObjectProperty processStateProperty = new SimpleObjectProperty<>(processState); - transient protected ObjectProperty lifeCycleStateProperty = new SimpleObjectProperty<>(lifeCycleState); + private Coin tradeAmount; + private Peer tradingPeer; + private OffererProcessState processState; + private OffererLifeCycleState lifeCycleState; + + transient private ObjectProperty processStateProperty = new SimpleObjectProperty<>(processState); + transient private ObjectProperty lifeCycleStateProperty = new SimpleObjectProperty<>(lifeCycleState); /////////////////////////////////////////////////////////////////////////////////////////// @@ -89,6 +96,7 @@ public class OffererTrade extends Trade implements Serializable { lifeCycleStateProperty = new SimpleObjectProperty<>(lifeCycleState); } + public void onFiatPaymentStarted() { ((OffererAsBuyerProtocol) protocol).onFiatPaymentStarted(); } @@ -123,28 +131,46 @@ public class OffererTrade extends Trade implements Serializable { lifeCycleStateProperty.set(lifeCycleState); } + public void setTradeAmount(Coin tradeAmount) { + this.tradeAmount = tradeAmount; + tradeAmountProperty.set(tradeAmount); + tradeVolumeProperty.set(getTradeVolume()); + } + public void setTradingPeer(Peer tradingPeer) { + this.tradingPeer = tradingPeer; + } + /////////////////////////////////////////////////////////////////////////////////////////// // Getters /////////////////////////////////////////////////////////////////////////////////////////// - public OffererProcessState getProcessState() { - return processState; - } - - public OffererLifeCycleState getLifeCycleState() { - return lifeCycleState; - } - + @Override public ReadOnlyObjectProperty processStateProperty() { return processStateProperty; } + @Override public ReadOnlyObjectProperty lifeCycleStateProperty() { return lifeCycleStateProperty; } + @Override + public Coin getTradeAmount() { + return tradeAmount; + } + + @Override + public Fiat getTradeVolume() { + return offer.getVolumeByAmount(tradeAmount); + } + + @Override + public Peer getTradingPeer() { + return tradingPeer; + } + /////////////////////////////////////////////////////////////////////////////////////////// // Private diff --git a/core/src/main/java/io/bitsquare/trade/TakerTrade.java b/core/src/main/java/io/bitsquare/trade/TakerTrade.java index 30ce1ccff2..6158c5d426 100644 --- a/core/src/main/java/io/bitsquare/trade/TakerTrade.java +++ b/core/src/main/java/io/bitsquare/trade/TakerTrade.java @@ -18,9 +18,12 @@ package io.bitsquare.trade; import io.bitsquare.offer.Offer; +import io.bitsquare.p2p.Peer; import io.bitsquare.trade.protocol.trade.taker.TakerAsSellerProtocol; +import org.bitcoinj.core.Coin; import org.bitcoinj.core.TransactionConfidence; +import org.bitcoinj.utils.Fiat; import com.google.common.base.Throwables; import com.google.common.util.concurrent.FutureCallback; @@ -42,7 +45,6 @@ public class TakerTrade extends Trade implements Serializable { private static final long serialVersionUID = 1L; transient private static final Logger log = LoggerFactory.getLogger(TakerTrade.class); - /////////////////////////////////////////////////////////////////////////////////////////// // Enum /////////////////////////////////////////////////////////////////////////////////////////// @@ -70,19 +72,28 @@ public class TakerTrade extends Trade implements Serializable { EXCEPTION } - protected TakerProcessState processState; - protected TakerLifeCycleState lifeCycleState; - transient protected ObjectProperty processStateProperty = new SimpleObjectProperty<>(processState); - transient protected ObjectProperty lifeCycleStateProperty = new SimpleObjectProperty<>(lifeCycleState); + private final Coin tradeAmount; + private final Peer tradingPeer; + + private TakerProcessState processState; + private TakerLifeCycleState lifeCycleState; + + transient private ObjectProperty processStateProperty = new SimpleObjectProperty<>(processState); + transient private ObjectProperty lifeCycleStateProperty = new SimpleObjectProperty<>(lifeCycleState); /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// - public TakerTrade(Offer offer) { + public TakerTrade(Offer offer, Coin tradeAmount, Peer peer) { super(offer); + this.tradeAmount = tradeAmount; + this.tradingPeer = peer; + + tradeAmountProperty = new SimpleObjectProperty<>(tradeAmount); + tradeVolumeProperty = new SimpleObjectProperty<>(getTradeVolume()); // cannot be set before offer is set } // Serialized object does not create our transient objects @@ -91,6 +102,8 @@ public class TakerTrade extends Trade implements Serializable { processStateProperty = new SimpleObjectProperty<>(processState); lifeCycleStateProperty = new SimpleObjectProperty<>(lifeCycleState); + tradeAmountProperty = new SimpleObjectProperty<>(tradeAmount); + tradeVolumeProperty = new SimpleObjectProperty<>(getTradeVolume()); } public void onFiatPaymentReceived() { @@ -127,20 +140,36 @@ public class TakerTrade extends Trade implements Serializable { /////////////////////////////////////////////////////////////////////////////////////////// // Getters /////////////////////////////////////////////////////////////////////////////////////////// - + + @Override public ReadOnlyObjectProperty processStateProperty() { return processStateProperty; } - + @Override public ReadOnlyObjectProperty lifeCycleStateProperty() { return lifeCycleStateProperty; } + @Override + public Coin getTradeAmount() { + return tradeAmount; + } + + @Override + public Fiat getTradeVolume() { + return offer.getVolumeByAmount(tradeAmount); + } + + @Override + public Peer getTradingPeer() { + return tradingPeer; + } + /////////////////////////////////////////////////////////////////////////////////////////// // Private /////////////////////////////////////////////////////////////////////////////////////////// - + @Override protected void setConfidenceListener() { TransactionConfidence transactionConfidence = depositTx.getConfidence(); diff --git a/core/src/main/java/io/bitsquare/trade/Trade.java b/core/src/main/java/io/bitsquare/trade/Trade.java index 1d5285be88..35227c30a1 100644 --- a/core/src/main/java/io/bitsquare/trade/Trade.java +++ b/core/src/main/java/io/bitsquare/trade/Trade.java @@ -27,7 +27,6 @@ import org.bitcoinj.core.Coin; import org.bitcoinj.core.Transaction; import org.bitcoinj.utils.Fiat; -import java.io.IOException; import java.io.Serializable; import java.util.Date; @@ -57,20 +56,18 @@ abstract public class Trade implements Serializable { protected final Offer offer; protected final Date date; - protected Coin tradeAmount; protected Contract contract; protected String contractAsJson; protected String takerContractSignature; protected String offererContractSignature; protected Transaction depositTx; protected Transaction payoutTx; - protected Peer tradingPeer; protected int depthInBlocks = 0; transient protected String errorMessage; transient protected Throwable throwable; - transient protected ObjectProperty tradeAmountProperty; - transient protected ObjectProperty tradeVolumeProperty; + transient protected ObjectProperty tradeAmountProperty = new SimpleObjectProperty<>(); + transient protected ObjectProperty tradeVolumeProperty = new SimpleObjectProperty<>(); /////////////////////////////////////////////////////////////////////////////////////////// @@ -79,25 +76,14 @@ abstract public class Trade implements Serializable { public Trade(Offer offer) { this.offer = offer; + date = new Date(); - tradeAmountProperty = new SimpleObjectProperty<>(tradeAmount); - tradeVolumeProperty = new SimpleObjectProperty<>(getTradeVolume()); // cannot be set before offer is set - } - - // Serialized object does not create our transient objects - private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - - tradeAmountProperty = new SimpleObjectProperty<>(tradeAmount); - tradeVolumeProperty = new SimpleObjectProperty<>(getTradeVolume()); } // The deserialized tx has not actual confidence data, so we need to get the fresh one from the wallet. public void updateTxFromWallet(TradeWalletService tradeWalletService) { - if (depositTx != null) { - depositTx = tradeWalletService.commitsDepositTx(depositTx); - setConfidenceListener(); - } + if (depositTx != null) + setDepositTx(tradeWalletService.commitsDepositTx(depositTx)); } public void setDepositTx(Transaction tx) { @@ -134,18 +120,6 @@ abstract public class Trade implements Serializable { // Setters /////////////////////////////////////////////////////////////////////////////////////////// - - public void setTradeAmount(Coin tradeAmount) { - this.tradeAmount = tradeAmount; - tradeAmountProperty.set(tradeAmount); - tradeVolumeProperty.set(getTradeVolume()); - } - - - public void setTradingPeer(Peer tradingPeer) { - this.tradingPeer = tradingPeer; - } - public void setTakerContractSignature(String takerSignature) { this.takerContractSignature = takerSignature; } @@ -154,10 +128,6 @@ abstract public class Trade implements Serializable { this.offererContractSignature = offererContractSignature; } - public Coin getTradeAmount() { - return tradeAmount; - } - public Contract getContract() { return contract; } @@ -187,10 +157,6 @@ abstract public class Trade implements Serializable { // Getters /////////////////////////////////////////////////////////////////////////////////////////// - public Fiat getTradeVolume() { - return offer.getVolumeByAmount(tradeAmount); - } - public String getTakerContractSignature() { return takerContractSignature; } @@ -227,10 +193,6 @@ abstract public class Trade implements Serializable { return date; } - public Peer getTradingPeer() { - return tradingPeer; - } - public ReadOnlyObjectProperty tradeAmountProperty() { return tradeAmountProperty; } @@ -251,6 +213,12 @@ abstract public class Trade implements Serializable { public abstract ReadOnlyObjectProperty lifeCycleStateProperty(); + public abstract Coin getTradeAmount(); + + public abstract Fiat getTradeVolume(); + + public abstract Peer getTradingPeer(); + protected abstract void setConfidenceListener(); @Override @@ -260,14 +228,12 @@ abstract public class Trade implements Serializable { ", mailboxMessage=" + mailboxMessage + ", offer=" + offer + ", date=" + date + - ", tradeAmount=" + tradeAmount + ", contract=" + contract + ", contractAsJson='" + contractAsJson + '\'' + ", takerContractSignature='" + takerContractSignature + '\'' + ", offererContractSignature='" + offererContractSignature + '\'' + ", depositTx=" + depositTx + ", payoutTx=" + payoutTx + - ", tradingPeer=" + tradingPeer + ", depthInBlocks=" + depthInBlocks + '}'; } diff --git a/core/src/main/java/io/bitsquare/trade/TradeManager.java b/core/src/main/java/io/bitsquare/trade/TradeManager.java index 24f4cff217..622a946211 100644 --- a/core/src/main/java/io/bitsquare/trade/TradeManager.java +++ b/core/src/main/java/io/bitsquare/trade/TradeManager.java @@ -107,7 +107,7 @@ public class TradeManager { @Inject public TradeManager(User user, AccountSettings accountSettings, MessageService messageService, MailboxService mailboxService, AddressService addressService, BlockChainService blockChainService, - WalletService walletService, TradeWalletService tradeWalletService, SignatureService signatureService, + WalletService walletService, TradeWalletService tradeWalletService, SignatureService signatureService, EncryptionService encryptionService, OfferBookService offerBookService, ArbitrationRepository arbitrationRepository, @Named("storage.dir") File storageDir) { this.user = user; @@ -179,6 +179,7 @@ public class TradeManager { TakerTrade takerTrade = (TakerTrade) trade; TakerAsSellerProtocol sellerTakesOfferProtocol = createTakerAsSellerProtocol(takerTrade); takerTrade.setProtocol(sellerTakesOfferProtocol); + takerTrade.updateTxFromWallet(tradeWalletService); } } @@ -305,7 +306,7 @@ public class TradeManager { // TODO handle overpaid securityDeposit Coin amountToWithdraw = trade.getSecurityDeposit(); if (trade instanceof OffererTrade) - amountToWithdraw = amountToWithdraw.add(trade.getTradeAmount()); + amountToWithdraw = amountToWithdraw.add(((OffererTrade) trade).getTradeAmount()); FutureCallback callback = new FutureCallback() { @Override @@ -411,9 +412,7 @@ public class TradeManager { /////////////////////////////////////////////////////////////////////////////////////////// private TakerTrade takeAvailableOffer(Coin amount, Offer offer, Peer peer) { - TakerTrade takerTrade = new TakerTrade(offer); - takerTrade.setTradeAmount(amount); - takerTrade.setTradingPeer(peer); + TakerTrade takerTrade = new TakerTrade(offer, amount, peer); takerTrade.setLifeCycleState(TakerTrade.TakerLifeCycleState.PENDING); pendingTrades.add(takerTrade); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/OffererAsBuyerProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/OffererAsBuyerProtocol.java index 3898c5a1c7..04197f22b6 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/OffererAsBuyerProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/OffererAsBuyerProtocol.java @@ -107,7 +107,7 @@ public class OffererAsBuyerProtocol implements Protocol { // We don't store anything in the model as we might be in a trade process and receive that request from another peer who wants to take the offer // at the same time - boolean isOfferOpen = model.trade.getLifeCycleState() == OffererTrade.OffererLifeCycleState.OPEN_OFFER; + boolean isOfferOpen = model.trade.lifeCycleStateProperty().get() == OffererTrade.OffererLifeCycleState.OPEN_OFFER; ReportOfferAvailabilityMessage reportOfferAvailabilityMessage = new ReportOfferAvailabilityMessage(model.id, isOfferOpen); model.messageService.sendMessage(sender, reportOfferAvailabilityMessage, new SendMessageListener() { @Override diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateAndSignPayoutTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateAndSignPayoutTx.java index 5738ba8437..28e4abf561 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateAndSignPayoutTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateAndSignPayoutTx.java @@ -19,7 +19,7 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; -import io.bitsquare.trade.Trade; +import io.bitsquare.trade.OffererTrade; import io.bitsquare.trade.protocol.trade.offerer.models.OffererAsBuyerModel; import org.bitcoinj.core.Coin; @@ -37,13 +37,13 @@ public class CreateAndSignPayoutTx extends Task { @Override protected void doRun() { try { - Trade trade = model.trade; - Coin securityDeposit = trade.getSecurityDeposit(); - Coin offererPayoutAmount = trade.getTradeAmount().add(securityDeposit); + OffererTrade offererTrade = model.trade; + Coin securityDeposit = offererTrade.getSecurityDeposit(); + Coin offererPayoutAmount = offererTrade.getTradeAmount().add(securityDeposit); @SuppressWarnings("UnnecessaryLocalVariable") Coin takerPayoutAmount = securityDeposit; byte[] offererPayoutTxSignature = model.tradeWalletService.offererCreatesAndSignsPayoutTx( - trade.getDepositTx(), + offererTrade.getDepositTx(), offererPayoutAmount, takerPayoutAmount, model.offerer.addressEntry, diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestDepositTxInputsMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestDepositTxInputsMessage.java index 6acd83d548..a1ee82f834 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestDepositTxInputsMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestDepositTxInputsMessage.java @@ -19,7 +19,7 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.TaskRunner; -import io.bitsquare.trade.Trade; +import io.bitsquare.trade.OffererTrade; import io.bitsquare.trade.protocol.trade.messages.RequestDepositTxInputsMessage; import io.bitsquare.trade.protocol.trade.offerer.models.OffererAsBuyerModel; @@ -40,10 +40,10 @@ public class ProcessRequestDepositTxInputsMessage extends Task { @Override protected void doRun() { try { - Trade trade = model.trade; + OffererTrade offererTrade = model.trade; Contract contract = new Contract( model.offer, - trade.getTradeAmount(), + offererTrade.getTradeAmount(), model.getTakeOfferFeeTxId(), model.offerer.accountId, model.taker.accountId, @@ -52,10 +52,10 @@ public class VerifyAndSignContract extends Task { String contractAsJson = Utilities.objectToJson(contract); String signature = model.signatureService.signMessage(model.offerer.registrationKeyPair, contractAsJson); - trade.setContract(contract); - trade.setContractAsJson(contractAsJson); - trade.setOffererContractSignature(signature); - trade.setTakerContractSignature(model.taker.contractSignature); + offererTrade.setContract(contract); + offererTrade.setContractAsJson(contractAsJson); + offererTrade.setOffererContractSignature(signature); + offererTrade.setTakerContractSignature(model.taker.contractSignature); complete(); } catch (Throwable t) {