private void checkDeliveringTime() throws CantExecuteDatabaseOperationException, CantExecuteQueryException, UnexpectedResultReturnedFromDatabaseException, CantGetCryptoTransactionException, CantGetTransactionsException, CantLoadWalletException, CantRegisterCreditException, CantRegisterDebitException, CantGetAssetIssuerActorsException, CantSendTransactionNewStatusNotificationException, CantGetAssetUserActorsException, CantAssetUserActorNotFoundException, RecordsNotFoundException, CantCheckAssetUserRedemptionProgressException, InvalidParameterException { for (DeliverRecord record : userRedemptionDao.getDeliveringRecords()) { DistributionStatus currentStatus = userRedemptionDao.getDistributionStatusForGenesisTx(record.getGenesisTransaction()); if (new Date().after(record.getTimeOut()) && currentStatus == DistributionStatus.DELIVERING) { try { bitcoinNetworkManager.cancelBroadcast( record.getDigitalAssetMetadata().getLastTransactionHash()); } catch (CantCancellBroadcastTransactionException e) { e.printStackTrace(); } record.getDigitalAssetMetadata().removeLastTransaction(); digitalAssetUserRedemptionVault.updateWalletBalance( record.getDigitalAssetMetadata(), AssetVerification.foundCryptoTransaction( bitcoinNetworkManager, record.getDigitalAssetMetadata()), BalanceType.AVAILABLE, TransactionType.CREDIT, DAPTransactionType.RECEPTION, record.getRedeemPointPublicKey()); userRedemptionDao.cancelDelivering(record.getTransactionId()); } } }
/** * This method check the pending transactions registered in database and take actions according * to CryptoStatus * * @throws CantExecuteQueryException * @throws CantCheckAssetUserRedemptionProgressException * @throws CantGetCryptoTransactionException * @throws UnexpectedResultReturnedFromDatabaseException * @throws CantGetDigitalAssetFromLocalStorageException * @throws CantDeliverDigitalAssetToAssetWalletException */ private void checkPendingTransactions() throws CantExecuteQueryException, CantCheckAssetUserRedemptionProgressException, CantGetCryptoTransactionException, UnexpectedResultReturnedFromDatabaseException, CantGetDigitalAssetFromLocalStorageException, CantDeliverDigitalAssetToAssetWalletException, CantGetTransactionCryptoStatusException, RecordsNotFoundException, CantGetBroadcastStatusException, CantCancellBroadcastTransactionException, CantBroadcastTransactionException, CantGetTransactionsException, CantGetAssetUserActorsException, CantRegisterDebitException, CantAssetUserActorNotFoundException, CantLoadWalletException, CantGetAssetIssuerActorsException, CantRegisterCreditException, CantCreateDigitalAssetFileException { for (DeliverRecord record : userRedemptionDao.getDeliveredRecords()) { switch (bitcoinNetworkManager.getCryptoStatus(record.getGenesisTransactionSent())) { case ON_BLOCKCHAIN: case IRREVERSIBLE: CryptoTransaction transactionOnBlockChain = AssetVerification.getCryptoTransactionFromCryptoNetworkByCryptoStatus( bitcoinNetworkManager, record.getDigitalAssetMetadata(), CryptoStatus.ON_BLOCKCHAIN); if (transactionOnBlockChain == null) break; // not yet... DigitalAssetMetadata digitalAssetMetadata = digitalAssetUserRedemptionVault.updateMetadataTransactionChain( record.getGenesisTransaction(), transactionOnBlockChain); digitalAssetUserRedemptionVault.setDigitalAssetMetadataAssetIssuerWalletTransaction( transactionOnBlockChain, digitalAssetMetadata, AssetBalanceType.BOOK, TransactionType.DEBIT, DAPTransactionType.RECEPTION, record.getRedeemPointPublicKey()); userRedemptionDao.updateDeliveringStatusForTxId( record.getTransactionId(), DistributionStatus.DISTRIBUTION_FINISHED); break; case REVERSED_ON_BLOCKCHAIN: userRedemptionDao.updateDeliveringStatusForTxId( record.getTransactionId(), DistributionStatus.DISTRIBUTION_FINISHED); break; case REVERSED_ON_CRYPTO_NETWORK: userRedemptionDao.updateDeliveringStatusForTxId( record.getTransactionId(), DistributionStatus.DISTRIBUTION_FINISHED); break; } } for (DeliverRecord record : userRedemptionDao.getSendingCryptoRecords()) { BroadcastStatus status = bitcoinNetworkManager.getBroadcastStatus(record.getGenesisTransactionSent()); switch (status.getStatus()) { case WITH_ERROR: System.out.println("VAMM: USER REDEMPTION BROADCAST WITH ERROR"); if (record.getAttemptNumber() < UserRedemptionDigitalAssetTransactionPluginRoot.BROADCASTING_MAX_ATTEMPT_NUMBER) { System.out.println("VAMM: ATTEMPT NUMBER: " + record.getAttemptNumber()); userRedemptionDao.newAttempt(record.getTransactionId()); bitcoinNetworkManager.broadcastTransaction(record.getGenesisTransactionSent()); } else { System.out.println("VAMM: MAX NUMBER OF ATTEMPT REACHED, CANCELLING."); bitcoinNetworkManager.cancelBroadcast(record.getGenesisTransactionSent()); } break; case BROADCASTED: userRedemptionDao.updateDeliveringStatusForTxId( record.getTransactionId(), DistributionStatus.DELIVERED); break; case BROADCASTING: break; case CANCELLED: digitalAssetUserRedemptionVault.updateWalletBalance( record.getDigitalAssetMetadata(), AssetVerification.foundCryptoTransaction( bitcoinNetworkManager, record.getDigitalAssetMetadata()), BalanceType.AVAILABLE, TransactionType.CREDIT, DAPTransactionType.DISTRIBUTION, record.getRedeemPointPublicKey()); userRedemptionDao.failedToSendCrypto(record.getTransactionId()); break; } } }