From 63c9b4670fdb7292367e40b9e4e8635821aa04ac Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 17 Apr 2015 15:23:35 +0200 Subject: [PATCH] Add error handling for serialization inconsistency --- .../main/java/io/bitsquare/app/Version.java | 4 +- .../arbitration/ArbitrationRepository.java | 4 +- .../io/bitsquare/arbitration/Arbitrator.java | 3 +- .../io/bitsquare/arbitration/Reputation.java | 4 +- .../java/io/bitsquare/btc/AddressEntry.java | 6 +- .../io/bitsquare/btc/AddressEntryList.java | 3 +- .../main/java/io/bitsquare/crypto/Bucket.java | 4 +- .../java/io/bitsquare/crypto/PubKeyRing.java | 4 +- .../crypto/SealedAndSignedMessage.java | 3 +- .../java/io/bitsquare/fiat/FiatAccount.java | 3 +- .../java/io/bitsquare/locale/Country.java | 4 +- .../main/java/io/bitsquare/locale/Region.java | 4 +- .../io/bitsquare/p2p/tomp2p/TomP2PNode.java | 2 +- .../io/bitsquare/p2p/tomp2p/TomP2PPeer.java | 3 +- .../java/io/bitsquare/storage/Storage.java | 22 +++++-- .../bitsquare/trade/BuyerAsOffererTrade.java | 3 +- .../io/bitsquare/trade/BuyerAsTakerTrade.java | 3 +- .../java/io/bitsquare/trade/BuyerTrade.java | 3 +- .../java/io/bitsquare/trade/Contract.java | 3 +- .../bitsquare/trade/SellerAsOffererTrade.java | 3 +- .../bitsquare/trade/SellerAsTakerTrade.java | 3 +- .../java/io/bitsquare/trade/SellerTrade.java | 3 +- .../java/io/bitsquare/trade/TradableList.java | 3 +- .../main/java/io/bitsquare/trade/Trade.java | 5 +- .../java/io/bitsquare/trade/offer/Offer.java | 3 +- .../io/bitsquare/trade/offer/OpenOffer.java | 3 +- .../messages/OfferAvailabilityRequest.java | 3 +- .../messages/OfferAvailabilityResponse.java | 4 +- .../availability/messages/OfferMessage.java | 3 +- .../trade/protocol/trade/ProcessModel.java | 3 +- .../trade/protocol/trade/TradingPeer.java | 7 +- .../messages/DepositTxInputsRequest.java | 3 +- .../messages/DepositTxPublishedMessage.java | 3 +- .../messages/FiatTransferStartedMessage.java | 3 +- .../messages/FinalizePayoutTxRequest.java | 3 +- .../trade/messages/PayDepositRequest.java | 3 +- .../messages/PayoutTxFinalizedMessage.java | 3 +- .../messages/PublishDepositTxRequest.java | 3 +- .../protocol/trade/messages/TradeMessage.java | 3 +- .../tasks/buyer/SignAndFinalizePayoutTx.java | 2 +- .../trade/tasks/shared/CommitPayoutTx.java | 2 +- .../tasks/taker/BroadcastTakeOfferFeeTx.java | 2 +- .../io/bitsquare/user/AccountSettings.java | 3 +- .../java/io/bitsquare/user/Preferences.java | 3 +- .../src/main/java/io/bitsquare/user/User.java | 12 +++- doc/bitsquare.conf | 2 +- .../java/io/bitsquare/app/BitsquareApp.java | 65 +++++++++++++++++-- .../io/bitsquare/app/BitsquareAppMain.java | 2 +- .../io/bitsquare/app/BitsquareAppModule.java | 2 +- .../java/io/bitsquare/gui/Navigation.java | 3 +- .../bitsquare/gui/common/view/ViewPath.java | 4 +- .../java/io/bitsquare/gui/main/MainView.java | 16 +++++ .../main/funds/withdrawal/WithdrawalView.java | 2 +- .../main/offer/offerbook/OfferBookView.java | 2 +- .../openoffer/OpenOfferListItem.java | 1 + .../bitsquare/gui/util/ComponentBuilder.java | 6 +- 56 files changed, 210 insertions(+), 71 deletions(-) diff --git a/core/src/main/java/io/bitsquare/app/Version.java b/core/src/main/java/io/bitsquare/app/Version.java index eb8ccd745d..c400fd904b 100644 --- a/core/src/main/java/io/bitsquare/app/Version.java +++ b/core/src/main/java/io/bitsquare/app/Version.java @@ -27,8 +27,8 @@ public class Version { public static final int MINOR_VERSION = 2; public static final int PATCH_VERSION = 1; - public static final byte[] NETWORK_PROTOCOL_VERSION = new byte[]{0x01}; - public static final int LOCLA_DB_VERSION = 1; + public static final long NETWORK_PROTOCOL_VERSION = 1; + public static final long LOCAL_DB_VERSION = 1; public static final String VERSION = MAJOR_VERSION + "." + MINOR_VERSION + "." + PATCH_VERSION; diff --git a/core/src/main/java/io/bitsquare/arbitration/ArbitrationRepository.java b/core/src/main/java/io/bitsquare/arbitration/ArbitrationRepository.java index eab63fc597..b7becc43e3 100644 --- a/core/src/main/java/io/bitsquare/arbitration/ArbitrationRepository.java +++ b/core/src/main/java/io/bitsquare/arbitration/ArbitrationRepository.java @@ -17,6 +17,7 @@ package io.bitsquare.arbitration; +import io.bitsquare.app.Version; import io.bitsquare.crypto.Util; import io.bitsquare.locale.LanguageUtil; import io.bitsquare.storage.Storage; @@ -47,7 +48,7 @@ import org.slf4j.LoggerFactory; public class ArbitrationRepository implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(ArbitrationRepository.class); transient private final ArbitratorService arbitratorService; @@ -63,7 +64,6 @@ public class ArbitrationRepository implements Serializable { public ArbitrationRepository(Storage storage, Storage arbitratorStorage, ArbitratorService arbitratorService) throws InvalidKeySpecException, NoSuchAlgorithmException { - Storage storage1 = storage; this.arbitratorService = arbitratorService; byte[] walletPubKey = Utils.HEX.decode("03a418bf0cb60a35ce217c7f80a2db08a4f5efbe56a0e7602fbc392dea6b63f840"); diff --git a/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java b/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java index 2f4768bfc5..c31e4647de 100644 --- a/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java +++ b/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java @@ -17,6 +17,7 @@ package io.bitsquare.arbitration; +import io.bitsquare.app.Version; import io.bitsquare.storage.Storage; import org.bitcoinj.core.Coin; @@ -30,7 +31,7 @@ import java.util.Objects; public class Arbitrator implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/io/bitsquare/arbitration/Reputation.java b/core/src/main/java/io/bitsquare/arbitration/Reputation.java index 7f430fffb2..d85e67c088 100644 --- a/core/src/main/java/io/bitsquare/arbitration/Reputation.java +++ b/core/src/main/java/io/bitsquare/arbitration/Reputation.java @@ -17,6 +17,8 @@ package io.bitsquare.arbitration; +import io.bitsquare.app.Version; + import java.io.Serializable; //TODO still open if we use that really... @@ -26,7 +28,7 @@ import java.io.Serializable; */ public class Reputation implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; //TODO public Reputation() { diff --git a/core/src/main/java/io/bitsquare/btc/AddressEntry.java b/core/src/main/java/io/bitsquare/btc/AddressEntry.java index 87399e3bda..5607e29605 100644 --- a/core/src/main/java/io/bitsquare/btc/AddressEntry.java +++ b/core/src/main/java/io/bitsquare/btc/AddressEntry.java @@ -17,6 +17,8 @@ package io.bitsquare.btc; +import io.bitsquare.app.Version; + import org.bitcoinj.core.Address; import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.crypto.DeterministicKey; @@ -31,9 +33,9 @@ import org.jetbrains.annotations.NotNull; */ public class AddressEntry implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; - // that will be restored from the wallet at deserialisation + // that will be restored from the wallet at deserialization private transient DeterministicKey keyPair; private final String offerId; diff --git a/core/src/main/java/io/bitsquare/btc/AddressEntryList.java b/core/src/main/java/io/bitsquare/btc/AddressEntryList.java index f74c3def90..0c04c7c6b0 100644 --- a/core/src/main/java/io/bitsquare/btc/AddressEntryList.java +++ b/core/src/main/java/io/bitsquare/btc/AddressEntryList.java @@ -17,6 +17,7 @@ package io.bitsquare.btc; +import io.bitsquare.app.Version; import io.bitsquare.storage.Storage; import org.bitcoinj.core.Wallet; @@ -33,7 +34,7 @@ import org.slf4j.LoggerFactory; public class AddressEntryList extends ArrayList implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(AddressEntryList.class); final transient private Storage storage; diff --git a/core/src/main/java/io/bitsquare/crypto/Bucket.java b/core/src/main/java/io/bitsquare/crypto/Bucket.java index 9a50e8d48e..0db05869aa 100644 --- a/core/src/main/java/io/bitsquare/crypto/Bucket.java +++ b/core/src/main/java/io/bitsquare/crypto/Bucket.java @@ -17,6 +17,8 @@ package io.bitsquare.crypto; +import io.bitsquare.app.Version; + import java.io.Serializable; import javax.annotation.concurrent.Immutable; @@ -24,7 +26,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class Bucket implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final byte[] encryptedKey; public final byte[] encryptedPayload; diff --git a/core/src/main/java/io/bitsquare/crypto/PubKeyRing.java b/core/src/main/java/io/bitsquare/crypto/PubKeyRing.java index 8859779d0e..1894aa2ac9 100644 --- a/core/src/main/java/io/bitsquare/crypto/PubKeyRing.java +++ b/core/src/main/java/io/bitsquare/crypto/PubKeyRing.java @@ -17,6 +17,8 @@ package io.bitsquare.crypto; +import io.bitsquare.app.Version; + import java.io.Serializable; import java.security.KeyFactory; @@ -37,7 +39,7 @@ import org.slf4j.LoggerFactory; */ public class PubKeyRing implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; private static final Logger log = LoggerFactory.getLogger(PubKeyRing.class); diff --git a/core/src/main/java/io/bitsquare/crypto/SealedAndSignedMessage.java b/core/src/main/java/io/bitsquare/crypto/SealedAndSignedMessage.java index 1956f9a420..37e69faf11 100644 --- a/core/src/main/java/io/bitsquare/crypto/SealedAndSignedMessage.java +++ b/core/src/main/java/io/bitsquare/crypto/SealedAndSignedMessage.java @@ -17,6 +17,7 @@ package io.bitsquare.crypto; +import io.bitsquare.app.Version; import io.bitsquare.p2p.Message; import java.io.Serializable; @@ -35,7 +36,7 @@ import javax.crypto.SealedObject; */ public class SealedAndSignedMessage implements Serializable, Message { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; private static final Logger log = LoggerFactory.getLogger(SealedAndSignedMessage.class); diff --git a/core/src/main/java/io/bitsquare/fiat/FiatAccount.java b/core/src/main/java/io/bitsquare/fiat/FiatAccount.java index 3d7452e660..ff36687415 100644 --- a/core/src/main/java/io/bitsquare/fiat/FiatAccount.java +++ b/core/src/main/java/io/bitsquare/fiat/FiatAccount.java @@ -17,6 +17,7 @@ package io.bitsquare.fiat; +import io.bitsquare.app.Version; import io.bitsquare.locale.Country; import java.io.Serializable; @@ -30,7 +31,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class FiatAccount implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public static final long HOUR_IN_BLOCKS = 6; public static final long DAY_IN_BLOCKS = HOUR_IN_BLOCKS * 24; diff --git a/core/src/main/java/io/bitsquare/locale/Country.java b/core/src/main/java/io/bitsquare/locale/Country.java index e1f5327075..4ebe87b373 100644 --- a/core/src/main/java/io/bitsquare/locale/Country.java +++ b/core/src/main/java/io/bitsquare/locale/Country.java @@ -17,6 +17,8 @@ package io.bitsquare.locale; +import io.bitsquare.app.Version; + import java.io.Serializable; import javax.annotation.concurrent.Immutable; @@ -24,7 +26,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class Country implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final String code; public final String name; diff --git a/core/src/main/java/io/bitsquare/locale/Region.java b/core/src/main/java/io/bitsquare/locale/Region.java index 04242029b9..da14557448 100644 --- a/core/src/main/java/io/bitsquare/locale/Region.java +++ b/core/src/main/java/io/bitsquare/locale/Region.java @@ -17,6 +17,8 @@ package io.bitsquare.locale; +import io.bitsquare.app.Version; + import java.io.Serializable; import javax.annotation.concurrent.Immutable; @@ -24,7 +26,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class Region implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final String code; public final String name; diff --git a/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PNode.java b/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PNode.java index f06122c5af..e7750b3717 100644 --- a/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PNode.java +++ b/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PNode.java @@ -64,7 +64,7 @@ public class TomP2PNode implements ClientNode { private final Subject bootstrapStateSubject; private final List resultHandlers = new CopyOnWriteArrayList<>(); private final IntegerProperty numPeers = new SimpleIntegerProperty(0); - + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor diff --git a/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PPeer.java b/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PPeer.java index e2d11a44bb..63aeaa0ebd 100644 --- a/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PPeer.java +++ b/core/src/main/java/io/bitsquare/p2p/tomp2p/TomP2PPeer.java @@ -17,6 +17,7 @@ package io.bitsquare.p2p.tomp2p; +import io.bitsquare.app.Version; import io.bitsquare.p2p.Peer; import com.google.common.base.Objects; @@ -35,7 +36,7 @@ import net.tomp2p.peers.PeerAddress; @Immutable public class TomP2PPeer implements Peer, Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; private final PeerAddress peerAddress; diff --git a/core/src/main/java/io/bitsquare/storage/Storage.java b/core/src/main/java/io/bitsquare/storage/Storage.java index 2b535ba0fb..db2257c496 100644 --- a/core/src/main/java/io/bitsquare/storage/Storage.java +++ b/core/src/main/java/io/bitsquare/storage/Storage.java @@ -55,6 +55,16 @@ public class Storage { private static final Logger log = LoggerFactory.getLogger(Storage.class); public static final String DIR_KEY = "storage.dir"; + private static DataBaseCorruptionHandler databaseCorruptionHandler; + + public static void setDatabaseCorruptionHandler(DataBaseCorruptionHandler databaseCorruptionHandler) { + Storage.databaseCorruptionHandler = databaseCorruptionHandler; + } + + public interface DataBaseCorruptionHandler { + void onFileCorrupted(String fileName); + } + private final File dir; private FileManager fileManager; private File storageFile; @@ -120,7 +130,8 @@ public class Storage { log.info("Backup {} completed in {}msec", serializable.getClass().getSimpleName(), System.currentTimeMillis() - now); return persistedObject; - } catch (InvalidClassException e) { + } catch (InvalidClassException | ClassCastException | ClassNotFoundException e) { + e.printStackTrace(); log.error("Version of persisted class has changed. We cannot read the persisted data anymore. We make a backup and remove the inconsistent " + "file."); try { @@ -131,10 +142,11 @@ public class Storage { log.error(e1.getMessage()); // We swallow Exception if backup fails } - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - log.error(e.getMessage()); - Throwables.propagate(e); + databaseCorruptionHandler.onFileCorrupted(storageFile.getName()); + } catch (Throwable throwable) { + throwable.printStackTrace(); + log.error(throwable.getMessage()); + Throwables.propagate(throwable); } } return null; diff --git a/core/src/main/java/io/bitsquare/trade/BuyerAsOffererTrade.java b/core/src/main/java/io/bitsquare/trade/BuyerAsOffererTrade.java index 6215731854..4c4a99f77b 100644 --- a/core/src/main/java/io/bitsquare/trade/BuyerAsOffererTrade.java +++ b/core/src/main/java/io/bitsquare/trade/BuyerAsOffererTrade.java @@ -17,6 +17,7 @@ package io.bitsquare.trade; +import io.bitsquare.app.Version; import io.bitsquare.p2p.Peer; import io.bitsquare.storage.Storage; import io.bitsquare.trade.offer.Offer; @@ -35,7 +36,7 @@ import org.slf4j.LoggerFactory; public class BuyerAsOffererTrade extends BuyerTrade implements OffererTrade, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererTrade.class); diff --git a/core/src/main/java/io/bitsquare/trade/BuyerAsTakerTrade.java b/core/src/main/java/io/bitsquare/trade/BuyerAsTakerTrade.java index 6928ebe875..c70505152a 100644 --- a/core/src/main/java/io/bitsquare/trade/BuyerAsTakerTrade.java +++ b/core/src/main/java/io/bitsquare/trade/BuyerAsTakerTrade.java @@ -17,6 +17,7 @@ package io.bitsquare.trade; +import io.bitsquare.app.Version; import io.bitsquare.p2p.Peer; import io.bitsquare.storage.Storage; import io.bitsquare.trade.offer.Offer; @@ -34,7 +35,7 @@ import org.slf4j.LoggerFactory; public class BuyerAsTakerTrade extends BuyerTrade implements TakerTrade, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(BuyerAsTakerTrade.class); diff --git a/core/src/main/java/io/bitsquare/trade/BuyerTrade.java b/core/src/main/java/io/bitsquare/trade/BuyerTrade.java index 511e300bef..e1a4bdfacb 100644 --- a/core/src/main/java/io/bitsquare/trade/BuyerTrade.java +++ b/core/src/main/java/io/bitsquare/trade/BuyerTrade.java @@ -17,6 +17,7 @@ package io.bitsquare.trade; +import io.bitsquare.app.Version; import io.bitsquare.p2p.Peer; import io.bitsquare.storage.Storage; import io.bitsquare.trade.offer.Offer; @@ -33,7 +34,7 @@ import org.slf4j.LoggerFactory; public abstract class BuyerTrade extends Trade implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererTrade.class); diff --git a/core/src/main/java/io/bitsquare/trade/Contract.java b/core/src/main/java/io/bitsquare/trade/Contract.java index b57f68bc2d..280113a2ce 100644 --- a/core/src/main/java/io/bitsquare/trade/Contract.java +++ b/core/src/main/java/io/bitsquare/trade/Contract.java @@ -17,6 +17,7 @@ package io.bitsquare.trade; +import io.bitsquare.app.Version; import io.bitsquare.crypto.PubKeyRing; import io.bitsquare.fiat.FiatAccount; import io.bitsquare.trade.offer.Offer; @@ -31,7 +32,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class Contract implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final Offer offer; public final String takeOfferFeeTxID; diff --git a/core/src/main/java/io/bitsquare/trade/SellerAsOffererTrade.java b/core/src/main/java/io/bitsquare/trade/SellerAsOffererTrade.java index e5f61d269c..44618d43bd 100644 --- a/core/src/main/java/io/bitsquare/trade/SellerAsOffererTrade.java +++ b/core/src/main/java/io/bitsquare/trade/SellerAsOffererTrade.java @@ -17,6 +17,7 @@ package io.bitsquare.trade; +import io.bitsquare.app.Version; import io.bitsquare.p2p.Peer; import io.bitsquare.storage.Storage; import io.bitsquare.trade.offer.Offer; @@ -33,7 +34,7 @@ import org.slf4j.LoggerFactory; public class SellerAsOffererTrade extends SellerTrade implements OffererTrade, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(SellerAsOffererTrade.class); diff --git a/core/src/main/java/io/bitsquare/trade/SellerAsTakerTrade.java b/core/src/main/java/io/bitsquare/trade/SellerAsTakerTrade.java index d0b2c99bea..ebb3d8d6f3 100644 --- a/core/src/main/java/io/bitsquare/trade/SellerAsTakerTrade.java +++ b/core/src/main/java/io/bitsquare/trade/SellerAsTakerTrade.java @@ -17,6 +17,7 @@ package io.bitsquare.trade; +import io.bitsquare.app.Version; import io.bitsquare.p2p.Peer; import io.bitsquare.storage.Storage; import io.bitsquare.trade.offer.Offer; @@ -33,7 +34,7 @@ import org.slf4j.LoggerFactory; public class SellerAsTakerTrade extends SellerTrade implements TakerTrade, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(SellerAsTakerTrade.class); diff --git a/core/src/main/java/io/bitsquare/trade/SellerTrade.java b/core/src/main/java/io/bitsquare/trade/SellerTrade.java index f7bf03944a..de587d3480 100644 --- a/core/src/main/java/io/bitsquare/trade/SellerTrade.java +++ b/core/src/main/java/io/bitsquare/trade/SellerTrade.java @@ -17,6 +17,7 @@ package io.bitsquare.trade; +import io.bitsquare.app.Version; import io.bitsquare.p2p.Peer; import io.bitsquare.storage.Storage; import io.bitsquare.trade.offer.Offer; @@ -33,7 +34,7 @@ import org.slf4j.LoggerFactory; public abstract class SellerTrade extends Trade implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(BuyerAsTakerTrade.class); diff --git a/core/src/main/java/io/bitsquare/trade/TradableList.java b/core/src/main/java/io/bitsquare/trade/TradableList.java index 4891a9bae7..8e1ff3fa7b 100644 --- a/core/src/main/java/io/bitsquare/trade/TradableList.java +++ b/core/src/main/java/io/bitsquare/trade/TradableList.java @@ -17,6 +17,7 @@ package io.bitsquare.trade; +import io.bitsquare.app.Version; import io.bitsquare.storage.Storage; import java.io.IOException; @@ -33,7 +34,7 @@ import org.slf4j.LoggerFactory; public class TradableList extends ArrayList implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(TradableList.class); diff --git a/core/src/main/java/io/bitsquare/trade/Trade.java b/core/src/main/java/io/bitsquare/trade/Trade.java index 8303082c5b..205b4b44bf 100644 --- a/core/src/main/java/io/bitsquare/trade/Trade.java +++ b/core/src/main/java/io/bitsquare/trade/Trade.java @@ -17,6 +17,7 @@ package io.bitsquare.trade; +import io.bitsquare.app.Version; import io.bitsquare.arbitration.ArbitrationRepository; import io.bitsquare.btc.BlockChainService; import io.bitsquare.btc.TradeWalletService; @@ -68,7 +69,7 @@ import org.slf4j.LoggerFactory; */ abstract public class Trade implements Tradable, Model, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; private transient static final Logger log = LoggerFactory.getLogger(Trade.class); @@ -78,7 +79,7 @@ abstract public class Trade implements Tradable, Model, Serializable { COMPLETED, FAILED } - + // Mutable private Coin tradeAmount; private Peer tradingPeer; diff --git a/core/src/main/java/io/bitsquare/trade/offer/Offer.java b/core/src/main/java/io/bitsquare/trade/offer/Offer.java index 3fcacd6e27..c18f12238c 100644 --- a/core/src/main/java/io/bitsquare/trade/offer/Offer.java +++ b/core/src/main/java/io/bitsquare/trade/offer/Offer.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.offer; +import io.bitsquare.app.Version; import io.bitsquare.btc.Restrictions; import io.bitsquare.common.handlers.ResultHandler; import io.bitsquare.crypto.KeyRing; @@ -48,7 +49,7 @@ import static com.google.common.base.Preconditions.*; public class Offer implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; transient private static final Logger log = LoggerFactory.getLogger(Offer.class); public enum Direction {BUY, SELL} diff --git a/core/src/main/java/io/bitsquare/trade/offer/OpenOffer.java b/core/src/main/java/io/bitsquare/trade/offer/OpenOffer.java index 14db034658..ed30057478 100644 --- a/core/src/main/java/io/bitsquare/trade/offer/OpenOffer.java +++ b/core/src/main/java/io/bitsquare/trade/offer/OpenOffer.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.offer; +import io.bitsquare.app.Version; import io.bitsquare.storage.Storage; import io.bitsquare.trade.Tradable; import io.bitsquare.trade.TradableList; @@ -34,7 +35,7 @@ import org.slf4j.LoggerFactory; public class OpenOffer implements Tradable, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; private static final Logger log = LoggerFactory.getLogger(OpenOffer.class); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityRequest.java index 8feb239ef0..92efbd25f9 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityRequest.java @@ -17,13 +17,14 @@ package io.bitsquare.trade.protocol.availability.messages; +import io.bitsquare.app.Version; import io.bitsquare.crypto.PubKeyRing; import java.io.Serializable; public class OfferAvailabilityRequest extends OfferMessage implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; private final PubKeyRing pubKeyRing; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityResponse.java b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityResponse.java index 16746ba282..8d8e428964 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityResponse.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityResponse.java @@ -17,11 +17,13 @@ package io.bitsquare.trade.protocol.availability.messages; +import io.bitsquare.app.Version; + import java.io.Serializable; public class OfferAvailabilityResponse extends OfferMessage implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final boolean isAvailable; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferMessage.java index 2b6b779f1f..4e18eaa7b2 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferMessage.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.availability.messages; +import io.bitsquare.app.Version; import io.bitsquare.p2p.Message; import java.io.Serializable; @@ -26,7 +27,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public abstract class OfferMessage implements Message, Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final String offerId; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/ProcessModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/ProcessModel.java index 4ad9418a8b..efaf147c8f 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/ProcessModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/ProcessModel.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade; +import io.bitsquare.app.Version; import io.bitsquare.arbitration.ArbitrationRepository; import io.bitsquare.btc.AddressEntry; import io.bitsquare.btc.BlockChainService; @@ -50,7 +51,7 @@ import org.slf4j.LoggerFactory; public class ProcessModel implements Model, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; private static final Logger log = LoggerFactory.getLogger(ProcessModel.class); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/TradingPeer.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/TradingPeer.java index 7f607229cc..52d6cc6b0a 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/TradingPeer.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/TradingPeer.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade; +import io.bitsquare.app.Version; import io.bitsquare.crypto.PubKeyRing; import io.bitsquare.fiat.FiatAccount; @@ -34,7 +35,7 @@ import org.slf4j.LoggerFactory; public class TradingPeer implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(TradingPeer.class); @@ -79,7 +80,7 @@ public class TradingPeer implements Serializable { public void setAccountId(String accountId) { this.accountId = accountId; } - + public byte[] getTradeWalletPubKey() { return tradeWalletPubKey; } @@ -87,7 +88,7 @@ public class TradingPeer implements Serializable { public void setTradeWalletPubKey(byte[] tradeWalletPubKey) { this.tradeWalletPubKey = tradeWalletPubKey; } - + public FiatAccount getFiatAccount() { return fiatAccount; } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxInputsRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxInputsRequest.java index 102648c10c..e11cfd9806 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxInputsRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxInputsRequest.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade.messages; +import io.bitsquare.app.Version; import io.bitsquare.crypto.PubKeyRing; import org.bitcoinj.core.Coin; @@ -28,7 +29,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class DepositTxInputsRequest extends TradeMessage implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final Coin tradeAmount; public final PubKeyRing sellerPubKeyRing; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxPublishedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxPublishedMessage.java index fc1aa6a3ca..57fb330299 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxPublishedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxPublishedMessage.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade.messages; +import io.bitsquare.app.Version; import io.bitsquare.p2p.MailboxMessage; import org.bitcoinj.core.Transaction; @@ -28,7 +29,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class DepositTxPublishedMessage extends TradeMessage implements MailboxMessage, Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final Transaction depositTx; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FiatTransferStartedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FiatTransferStartedMessage.java index 5447bc249f..4b0c16fc4f 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FiatTransferStartedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FiatTransferStartedMessage.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade.messages; +import io.bitsquare.app.Version; import io.bitsquare.p2p.MailboxMessage; import java.io.Serializable; @@ -26,7 +27,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class FiatTransferStartedMessage extends TradeMessage implements MailboxMessage, Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final String buyerPayoutAddress; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FinalizePayoutTxRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FinalizePayoutTxRequest.java index f0842f1cca..32cae4121b 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FinalizePayoutTxRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FinalizePayoutTxRequest.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade.messages; +import io.bitsquare.app.Version; import io.bitsquare.p2p.MailboxMessage; import java.io.Serializable; @@ -26,7 +27,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class FinalizePayoutTxRequest extends TradeMessage implements MailboxMessage, Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final byte[] sellerSignature; public final String sellerPayoutAddress; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayDepositRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayDepositRequest.java index a89b80911d..18d0f01e78 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayDepositRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayDepositRequest.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade.messages; +import io.bitsquare.app.Version; import io.bitsquare.crypto.PubKeyRing; import io.bitsquare.fiat.FiatAccount; @@ -32,7 +33,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class PayDepositRequest extends TradeMessage implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final List buyerConnectedOutputsForAllInputs; public final List buyerOutputs; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayoutTxFinalizedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayoutTxFinalizedMessage.java index 62c5890554..f27f04829b 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayoutTxFinalizedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayoutTxFinalizedMessage.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade.messages; +import io.bitsquare.app.Version; import io.bitsquare.p2p.MailboxMessage; import org.bitcoinj.core.Transaction; @@ -28,7 +29,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class PayoutTxFinalizedMessage extends TradeMessage implements MailboxMessage, Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final Transaction payoutTx; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PublishDepositTxRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PublishDepositTxRequest.java index 3f9848a411..f240095e06 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PublishDepositTxRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PublishDepositTxRequest.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade.messages; +import io.bitsquare.app.Version; import io.bitsquare.fiat.FiatAccount; import org.bitcoinj.core.Transaction; @@ -31,7 +32,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public class PublishDepositTxRequest extends TradeMessage implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final FiatAccount sellerFiatAccount; public final String sellerAccountId; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java index f5cfa41cc0..3147007ad1 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade.messages; +import io.bitsquare.app.Version; import io.bitsquare.p2p.Message; import java.io.Serializable; @@ -26,7 +27,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public abstract class TradeMessage implements Message, Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; public final String tradeId; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/buyer/SignAndFinalizePayoutTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/buyer/SignAndFinalizePayoutTx.java index 1ac862439b..9299c6480c 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/buyer/SignAndFinalizePayoutTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/buyer/SignAndFinalizePayoutTx.java @@ -41,7 +41,7 @@ public class SignAndFinalizePayoutTx extends TradeTask { assert trade.getSecurityDeposit() != null; Coin sellerPayoutAmount = trade.getSecurityDeposit(); Coin buyerPayoutAmount = sellerPayoutAmount.add(trade.getTradeAmount()); - + Transaction transaction = processModel.getTradeWalletService().signAndFinalizePayoutTx( trade.getDepositTx(), processModel.tradingPeer.getSignature(), diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/shared/CommitPayoutTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/shared/CommitPayoutTx.java index 12ab6730b3..a019000540 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/shared/CommitPayoutTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/shared/CommitPayoutTx.java @@ -48,7 +48,7 @@ public class CommitPayoutTx extends TradeTask { trade.setProcessState(BuyerTradeState.ProcessState.PAYOUT_TX_COMMITTED); else if (trade instanceof SellerTrade) trade.setProcessState(SellerTradeState.ProcessState.PAYOUT_TX_COMMITTED); - + complete(); } catch (Throwable t) { t.printStackTrace(); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/taker/BroadcastTakeOfferFeeTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/taker/BroadcastTakeOfferFeeTx.java index 5ef25ce8d4..156ff59306 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/taker/BroadcastTakeOfferFeeTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/taker/BroadcastTakeOfferFeeTx.java @@ -48,7 +48,7 @@ public class BroadcastTakeOfferFeeTx extends TradeTask { /* if (trade instanceof SellerTrade) trade.setProcessState(TakerTradeState.ProcessState.TAKE_OFFER_FEE_PUBLISHED);*/ - + complete(); } diff --git a/core/src/main/java/io/bitsquare/user/AccountSettings.java b/core/src/main/java/io/bitsquare/user/AccountSettings.java index 4acb9957ee..260224adbc 100644 --- a/core/src/main/java/io/bitsquare/user/AccountSettings.java +++ b/core/src/main/java/io/bitsquare/user/AccountSettings.java @@ -17,6 +17,7 @@ package io.bitsquare.user; +import io.bitsquare.app.Version; import io.bitsquare.arbitration.ArbitrationRepository; import io.bitsquare.arbitration.Arbitrator; import io.bitsquare.locale.Country; @@ -38,7 +39,7 @@ import javax.inject.Inject; public class AccountSettings implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; final transient private Storage storage; diff --git a/core/src/main/java/io/bitsquare/user/Preferences.java b/core/src/main/java/io/bitsquare/user/Preferences.java index d6befff2d1..c87e4201c0 100644 --- a/core/src/main/java/io/bitsquare/user/Preferences.java +++ b/core/src/main/java/io/bitsquare/user/Preferences.java @@ -17,6 +17,7 @@ package io.bitsquare.user; +import io.bitsquare.app.Version; import io.bitsquare.storage.Storage; import org.bitcoinj.utils.MonetaryFormat; @@ -38,7 +39,7 @@ import org.slf4j.LoggerFactory; public class Preferences implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(Preferences.class); diff --git a/core/src/main/java/io/bitsquare/user/User.java b/core/src/main/java/io/bitsquare/user/User.java index 79c355d803..29a3dd9c3a 100644 --- a/core/src/main/java/io/bitsquare/user/User.java +++ b/core/src/main/java/io/bitsquare/user/User.java @@ -17,9 +17,12 @@ package io.bitsquare.user; +import io.bitsquare.app.Version; import io.bitsquare.fiat.FiatAccount; import io.bitsquare.storage.Storage; +import java.io.IOException; +import java.io.ObjectInputStream; import java.io.Serializable; import java.security.NoSuchAlgorithmException; @@ -46,7 +49,7 @@ import org.slf4j.LoggerFactory; */ public class User implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(User.class); @@ -56,6 +59,7 @@ public class User implements Serializable { // Persisted fields private String accountID; private List fiatAccounts = new ArrayList<>(); + private FiatAccount currentFiatAccount; // Observable wrappers @@ -94,6 +98,12 @@ public class User implements Serializable { } + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + log.trace("Created from serialized form."); + } + + /////////////////////////////////////////////////////////////////////////////////////////// // Public Methods /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/doc/bitsquare.conf b/doc/bitsquare.conf index 2a4da4ad8d..3a60c30762 100644 --- a/doc/bitsquare.conf +++ b/doc/bitsquare.conf @@ -19,4 +19,4 @@ # Supported properties: # bitcoin.network=regtest | testnet | mainnet -bitcoin.network=regtest +bitcoin.network = regtest diff --git a/gui/src/main/java/io/bitsquare/app/BitsquareApp.java b/gui/src/main/java/io/bitsquare/app/BitsquareApp.java index 28df08249f..1fd054f0b4 100644 --- a/gui/src/main/java/io/bitsquare/app/BitsquareApp.java +++ b/gui/src/main/java/io/bitsquare/app/BitsquareApp.java @@ -22,10 +22,10 @@ import io.bitsquare.gui.common.view.CachingViewLoader; import io.bitsquare.gui.common.view.View; import io.bitsquare.gui.common.view.ViewLoader; import io.bitsquare.gui.common.view.guice.InjectorViewFactory; -import io.bitsquare.gui.components.Popups; import io.bitsquare.gui.main.MainView; import io.bitsquare.gui.main.debug.DebugView; import io.bitsquare.gui.util.ImageUtil; +import io.bitsquare.storage.Storage; import io.bitsquare.util.Utilities; import org.bitcoinj.utils.Threading; @@ -35,15 +35,21 @@ import com.google.inject.Injector; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + import javafx.application.Application; import javafx.application.Platform; import javafx.scene.*; import javafx.scene.image.*; import javafx.scene.input.*; +import javafx.scene.layout.*; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.StageStyle; +import org.controlsfx.dialog.Dialogs; + import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Logger; @@ -60,6 +66,8 @@ public class BitsquareApp extends Application { private Injector injector; private Stage primaryStage; private Scene scene; + private List corruptedDatabaseFiles = new ArrayList<>(); + private MainView mainView; public static void setEnvironment(Environment env) { BitsquareApp.env = env; @@ -68,6 +76,15 @@ public class BitsquareApp extends Application { @Override public void start(Stage primaryStage) throws IOException { this.primaryStage = primaryStage; + + // setup UncaughtExceptionHandler + Thread.UncaughtExceptionHandler handler = (thread, throwable) -> { + // Might come from another thread + Platform.runLater(() -> showErrorPopup(throwable, true)); + }; + Thread.setDefaultUncaughtExceptionHandler(handler); + Thread.currentThread().setUncaughtExceptionHandler(handler); + try { log.trace("BitsquareApp.start"); @@ -80,6 +97,12 @@ public class BitsquareApp extends Application { URI.create("http://188.226.179.109/crashfx/upload"));*/ // Server not setup yet, so we use client side only support + Storage.setDatabaseCorruptionHandler((String fileName) -> { + corruptedDatabaseFiles.add(fileName); + if (mainView != null) + mainView.setPersistedFilesCorrupted(corruptedDatabaseFiles); + }); + // Guice bitsquareAppModule = new BitsquareAppModule(env, primaryStage); injector = Guice.createInjector(bitsquareAppModule); @@ -87,10 +110,11 @@ public class BitsquareApp extends Application { // load the main view and create the main scene CachingViewLoader viewLoader = injector.getInstance(CachingViewLoader.class); - MainView view = (MainView) viewLoader.load(MainView.class); - view.setExitHandler(this::stop); + mainView = (MainView) viewLoader.load(MainView.class); + mainView.setExitHandler(this::stop); + mainView.setPersistedFilesCorrupted(corruptedDatabaseFiles); - scene = new Scene(view.getRoot(), 1000, 650); + scene = new Scene(mainView.getRoot(), 1000, 650); scene.getStylesheets().setAll( "/io/bitsquare/gui/bitsquare.css", "/io/bitsquare/gui/images.css"); @@ -135,8 +159,37 @@ public class BitsquareApp extends Application { //TODO just temp. //showDebugWindow(); - } catch (Throwable t) { - Popups.openExceptionPopup(t); + } catch (Throwable throwable) { + showErrorPopup(throwable, true); + } + } + + private void showErrorPopup(Throwable throwable, boolean doShutDown) { + if (scene == null) { + scene = new Scene(new StackPane(), 1000, 650); + primaryStage.setScene(scene); + primaryStage.show(); + } + try { + throwable.printStackTrace(); + Dialogs.create() + .owner(primaryStage) + .title("") + .message("") + .masthead("") + .showException(throwable); + if (doShutDown) + stop(); + } catch (Throwable throwable2) { + // If printStackTrace cause a further exception we don't pass the throwable to the Popup. + Dialogs.create() + .owner(primaryStage) + .title("Error") + .message(throwable.toString()) + .masthead("A fatal exception occurred at startup.") + .showError(); + if (doShutDown) + stop(); } } diff --git a/gui/src/main/java/io/bitsquare/app/BitsquareAppMain.java b/gui/src/main/java/io/bitsquare/app/BitsquareAppMain.java index 4caeb80294..829d988554 100644 --- a/gui/src/main/java/io/bitsquare/app/BitsquareAppMain.java +++ b/gui/src/main/java/io/bitsquare/app/BitsquareAppMain.java @@ -71,7 +71,7 @@ public class BitsquareAppMain extends BitsquareExecutable { String updatesDirectory = bitsquareEnvironment.getProperty(BitsquareEnvironment.APP_DATA_DIR_KEY); Logging.setup(Paths.get(bitsquareEnvironment.getProperty(BitsquareEnvironment.APP_DATA_DIR_KEY), "bitsquare").toString()); - + // app dir need to be setup before UpdateFX bootstrap initAppDir(updatesDirectory); diff --git a/gui/src/main/java/io/bitsquare/app/BitsquareAppModule.java b/gui/src/main/java/io/bitsquare/app/BitsquareAppModule.java index 98d1f671ad..f9d588b457 100644 --- a/gui/src/main/java/io/bitsquare/app/BitsquareAppModule.java +++ b/gui/src/main/java/io/bitsquare/app/BitsquareAppModule.java @@ -69,7 +69,7 @@ class BitsquareAppModule extends BitsquareModule { File storageDir = new File(env.getRequiredProperty(Storage.DIR_KEY)); bind(File.class).annotatedWith(named(Storage.DIR_KEY)).toInstance(storageDir); - + File keyStorageDir = new File(env.getRequiredProperty(KeyStorage.DIR_KEY)); bind(File.class).annotatedWith(named(KeyStorage.DIR_KEY)).toInstance(keyStorageDir); diff --git a/gui/src/main/java/io/bitsquare/gui/Navigation.java b/gui/src/main/java/io/bitsquare/gui/Navigation.java index eb3c15d52f..f46cfddfa4 100644 --- a/gui/src/main/java/io/bitsquare/gui/Navigation.java +++ b/gui/src/main/java/io/bitsquare/gui/Navigation.java @@ -17,6 +17,7 @@ package io.bitsquare.gui; +import io.bitsquare.app.Version; import io.bitsquare.gui.common.view.View; import io.bitsquare.gui.common.view.ViewPath; import io.bitsquare.gui.main.MainView; @@ -36,7 +37,7 @@ import org.slf4j.LoggerFactory; public class Navigation implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; transient private static final Logger log = LoggerFactory.getLogger(Navigation.class); transient private static final ViewPath DEFAULT_VIEW_PATH = ViewPath.to(MainView.class, BuyOfferView.class); diff --git a/gui/src/main/java/io/bitsquare/gui/common/view/ViewPath.java b/gui/src/main/java/io/bitsquare/gui/common/view/ViewPath.java index 6f9f2f5063..dfdcd4ecdd 100644 --- a/gui/src/main/java/io/bitsquare/gui/common/view/ViewPath.java +++ b/gui/src/main/java/io/bitsquare/gui/common/view/ViewPath.java @@ -17,6 +17,8 @@ package io.bitsquare.gui.common.view; +import io.bitsquare.app.Version; + import java.io.Serializable; import java.util.ArrayList; @@ -26,7 +28,7 @@ import java.util.List; public class ViewPath extends ArrayList> implements Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = Version.LOCAL_DB_VERSION; public ViewPath() { } diff --git a/gui/src/main/java/io/bitsquare/gui/main/MainView.java b/gui/src/main/java/io/bitsquare/gui/main/MainView.java index 8d490c47af..03eb8fab55 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/MainView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/MainView.java @@ -38,6 +38,8 @@ import io.bitsquare.gui.main.portfolio.PortfolioView; import io.bitsquare.gui.main.settings.SettingsView; import io.bitsquare.gui.util.Transitions; +import java.util.List; + import javax.inject.Inject; import javax.inject.Named; @@ -80,6 +82,7 @@ public class MainView extends InitializableView { private Label blockchainSyncLabel; private Label updateInfoLabel; private Runnable exitHandler; + private List persistedFilesCorrupted; @Inject public MainView(MainViewModel model, CachingViewLoader viewLoader, Navigation navigation, OverlayManager overlayManager, Transitions transitions, @@ -170,6 +173,15 @@ public class MainView extends InitializableView { navigation.navigateToPreviousVisitedView(); + if (!persistedFilesCorrupted.isEmpty()) { + // show warning that some files has been corrupted + Popups.openWarningPopup("Those data base file(s) are not compatible with our current code base." + + "\n" + persistedFilesCorrupted.toString() + + "\n\nWe made a backup of the corrupted file(s) and applied the default values." + + "\n\nThe backup is located at: [data directory]/db/corrupted" + ); + } + transitions.fadeOutAndRemove(splashScreen, 1500, actionEvent -> disposeSplashScreen()); } }); @@ -182,6 +194,10 @@ public class MainView extends InitializableView { this.exitHandler = exitHandler; } + public void setPersistedFilesCorrupted(List persistedFilesCorrupted) { + this.persistedFilesCorrupted = persistedFilesCorrupted; + } + private VBox createSplashScreen() { VBox vBox = new VBox(); vBox.setAlignment(Pos.CENTER); diff --git a/gui/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java b/gui/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java index cc82d4a863..8a7caed188 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java @@ -73,7 +73,7 @@ public class WithdrawalView extends ActivatableViewAndModel { private final ObservableList addressList = FXCollections.observableArrayList(); @Inject - private WithdrawalView(WalletService walletService, TradeManager tradeManager, OpenOfferManager openOfferManager, BSFormatter formatter) { + private WithdrawalView(WalletService walletService, TradeManager tradeManager, OpenOfferManager openOfferManager, BSFormatter formatter) { this.walletService = walletService; this.tradeManager = tradeManager; this.openOfferManager = openOfferManager; diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java index 2a8500e0bc..9ce78f9fe5 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java @@ -163,7 +163,7 @@ public class OfferBookView extends ActivatableViewAndModel onActionHandler) { + int rowIndex, + String ButtonTitle, + EventHandler onActionHandler) { HBox hBox = new HBox(); hBox.setSpacing(10); Button button = new Button(ButtonTitle);