From 0f16b1588c9f9b206494c57519bda3f6b0dc4db9 Mon Sep 17 00:00:00 2001 From: Kc Date: Sat, 9 Jun 2018 00:29:21 +0200 Subject: [PATCH] more refactoring --- src/data/block/Block.java | 2 +- .../block/{IBlockData.java => BlockData.java} | 2 +- src/data/repository/IRepository.java | 9 ------ src/data/transaction/Transaction.java | 5 +++- src/qora/block/BlockFactory.java | 10 +++---- src/repository/BlockRepository.java | 8 ++++++ src/repository/DataException.java | 22 +++++++++++++++ src/repository/Repository.java | 4 +++ src/repository/RepositoryManager.java | 4 +++ .../hsqldb/HSQLDBBlockRepository.java} | 28 +++++++++++++------ ...> HSQLDBGenesisTransactionRepository.java} | 2 +- src/repository/hsqldb/HSQLDBRepository.java | 2 +- ....java => HSQLDBTransactionRepository.java} | 8 +++--- 13 files changed, 75 insertions(+), 31 deletions(-) rename src/data/block/{IBlockData.java => BlockData.java} (93%) delete mode 100644 src/data/repository/IRepository.java create mode 100644 src/repository/BlockRepository.java create mode 100644 src/repository/DataException.java rename src/{data/repository/HSQLDBRepository.java => repository/hsqldb/HSQLDBBlockRepository.java} (67%) rename src/repository/hsqldb/{HSQLDBGenesisTransaction.java => HSQLDBGenesisTransactionRepository.java} (90%) rename src/repository/hsqldb/{HSQLDBTransaction.java => HSQLDBTransactionRepository.java} (93%) diff --git a/src/data/block/Block.java b/src/data/block/Block.java index 20f9944c..b75d4c88 100644 --- a/src/data/block/Block.java +++ b/src/data/block/Block.java @@ -4,7 +4,7 @@ import java.math.BigDecimal; import qora.account.PublicKeyAccount; -public class Block implements IBlockData { +public class Block implements BlockData { private int version; private byte[] reference; private int transactionCount; diff --git a/src/data/block/IBlockData.java b/src/data/block/BlockData.java similarity index 93% rename from src/data/block/IBlockData.java rename to src/data/block/BlockData.java index e1b7979f..20db7a94 100644 --- a/src/data/block/IBlockData.java +++ b/src/data/block/BlockData.java @@ -2,7 +2,7 @@ package data.block; import java.math.BigDecimal; -public interface IBlockData { +public interface BlockData { public int getVersion(); public byte[] getReference(); public int getTransactionCount(); diff --git a/src/data/repository/IRepository.java b/src/data/repository/IRepository.java deleted file mode 100644 index eb4a3c8c..00000000 --- a/src/data/repository/IRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package data.repository; - -import data.block.IBlockData; - -public interface IRepository { - // XXX use NoDataFoundException? - IBlockData getBlockBySignature(byte[] signature) throws Exception; - IBlockData getBlockByHeight(int height) throws Exception; -} diff --git a/src/data/transaction/Transaction.java b/src/data/transaction/Transaction.java index 6b0f835c..4d722664 100644 --- a/src/data/transaction/Transaction.java +++ b/src/data/transaction/Transaction.java @@ -11,6 +11,8 @@ import static java.util.stream.Collectors.toMap; public abstract class Transaction { // Transaction types + // TODO Transaction types are semantic and should go into the business logic layer. + // No need to know the meaning of the integer value in data layer public enum TransactionType { GENESIS(1), PAYMENT(2), REGISTER_NAME(3), UPDATE_NAME(4), SELL_NAME(5), CANCEL_SELL_NAME(6), BUY_NAME(7), CREATE_POLL(8), VOTE_ON_POLL(9), ARBITRARY( 10), ISSUE_ASSET(11), TRANSFER_ASSET(12), CREATE_ASSET_ORDER(13), CANCEL_ASSET_ORDER(14), MULTIPAYMENT(15), DEPLOY_AT(16), MESSAGE(17); @@ -29,7 +31,8 @@ public abstract class Transaction { } // Properties shared with all transaction types - protected TransactionType type; + protected TransactionType type; + // TODO PublicKeyAccount is a separate data entity, so here should only be a key to reference it protected PublicKeyAccount creator; protected long timestamp; protected byte[] reference; diff --git a/src/qora/block/BlockFactory.java b/src/qora/block/BlockFactory.java index ac6a3c63..bc5351db 100644 --- a/src/qora/block/BlockFactory.java +++ b/src/qora/block/BlockFactory.java @@ -6,19 +6,19 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import data.block.IBlockData; -import data.repository.HSQLDBRepository; -import data.repository.IRepository; +import data.block.BlockData; import database.DB; import database.NoDataFoundException; import qora.account.PublicKeyAccount; import qora.transaction.Transaction; import qora.transaction.TransactionFactory; +import repository.BlockRepository; +import repository.hsqldb.HSQLDBBlockRepository; public class BlockFactory { // XXX repository should be pushed here from the root entry, no need to know the repository type - private static IRepository repository = new HSQLDBRepository(); + private static BlockRepository repository = new HSQLDBBlockRepository(); /** * Load Block from DB using block signature. @@ -52,7 +52,7 @@ public class BlockFactory { return GenesisBlock.getInstance(); try { - IBlockData data = repository.getBlockByHeight(height); + BlockData data = repository.fromHeight(height); // TODO fill this list from TransactionFactory List transactions = new ArrayList(); diff --git a/src/repository/BlockRepository.java b/src/repository/BlockRepository.java new file mode 100644 index 00000000..b637a667 --- /dev/null +++ b/src/repository/BlockRepository.java @@ -0,0 +1,8 @@ +package repository; + +import data.block.BlockData; + +public interface BlockRepository { + BlockData fromSignature(byte[] signature) throws DataException; + BlockData fromHeight(int height) throws DataException; +} diff --git a/src/repository/DataException.java b/src/repository/DataException.java new file mode 100644 index 00000000..7c01697c --- /dev/null +++ b/src/repository/DataException.java @@ -0,0 +1,22 @@ +package repository; + +public class DataException extends Exception { + + private static final long serialVersionUID = -3963965667288257605L; + + public DataException() {} + + public DataException(String message) + { + super(message); + } + + public DataException(String message, Throwable cause) { + super(message, cause); + } + + public DataException(Throwable cause) { + super(cause); + } + +} diff --git a/src/repository/Repository.java b/src/repository/Repository.java index 45cca751..9e97edc5 100644 --- a/src/repository/Repository.java +++ b/src/repository/Repository.java @@ -3,9 +3,13 @@ package repository; public abstract class Repository { protected TransactionRepository transactionRepository; + protected BlockRepository blockRepository; public TransactionRepository getTransactionRepository() { return this.transactionRepository; } + public BlockRepository getBlockRepository() { + return this.blockRepository; + } } diff --git a/src/repository/RepositoryManager.java b/src/repository/RepositoryManager.java index b7dd5c5b..74260444 100644 --- a/src/repository/RepositoryManager.java +++ b/src/repository/RepositoryManager.java @@ -12,4 +12,8 @@ public abstract class RepositoryManager { return repository.transactionRepository; } + public static BlockRepository getBlockRepository() { + return repository.blockRepository; + } + } diff --git a/src/data/repository/HSQLDBRepository.java b/src/repository/hsqldb/HSQLDBBlockRepository.java similarity index 67% rename from src/data/repository/HSQLDBRepository.java rename to src/repository/hsqldb/HSQLDBBlockRepository.java index f4caf3bd..c00aba58 100644 --- a/src/data/repository/HSQLDBRepository.java +++ b/src/repository/hsqldb/HSQLDBBlockRepository.java @@ -1,4 +1,4 @@ -package data.repository; +package repository.hsqldb; import java.math.BigDecimal; import java.sql.PreparedStatement; @@ -7,11 +7,13 @@ import java.sql.SQLException; import java.sql.Timestamp; import data.block.Block; -import data.block.IBlockData; +import data.block.BlockData; import database.DB; import qora.account.PublicKeyAccount; +import repository.BlockRepository; +import repository.DataException; -public class HSQLDBRepository implements IRepository +public class HSQLDBBlockRepository implements BlockRepository { protected static final int TRANSACTIONS_SIGNATURE_LENGTH = 64; protected static final int GENERATOR_SIGNATURE_LENGTH = 64; @@ -20,19 +22,29 @@ public class HSQLDBRepository implements IRepository private static final String BLOCK_DB_COLUMNS = "version, reference, transaction_count, total_fees, " + "transactions_signature, height, generation, generating_balance, generator, generator_signature, AT_data, AT_fees"; - public IBlockData getBlockBySignature(byte[] signature) throws SQLException + public BlockData fromSignature(byte[] signature) throws DataException { - ResultSet rs = DB.checkedExecute("SELECT " + BLOCK_DB_COLUMNS + " FROM Blocks WHERE signature = ?", signature); + ResultSet rs; + try { + rs = DB.checkedExecute("SELECT " + BLOCK_DB_COLUMNS + " FROM Blocks WHERE signature = ?", signature); + } catch (SQLException e) { + throw new DataException("Error loading data from DB", e); + } return getBlockFromResultSet(rs); } - public IBlockData getBlockByHeight(int height) throws SQLException + public BlockData fromHeight(int height) throws DataException { - ResultSet rs = DB.checkedExecute("SELECT " + BLOCK_DB_COLUMNS + " FROM Blocks WHERE height = ?", height); + ResultSet rs; + try { + rs = DB.checkedExecute("SELECT " + BLOCK_DB_COLUMNS + " FROM Blocks WHERE height = ?", height); + } catch (SQLException e) { + throw new DataException("Error loading data from DB", e); + } return getBlockFromResultSet(rs); } - private IBlockData getBlockFromResultSet(ResultSet rs) throws SQLException { + private BlockData getBlockFromResultSet(ResultSet rs) throws DataException { int version = rs.getInt(1); byte[] reference = DB.getResultSetBytes(rs.getBinaryStream(2), REFERENCE_LENGTH); int transactionCount = rs.getInt(3); diff --git a/src/repository/hsqldb/HSQLDBGenesisTransaction.java b/src/repository/hsqldb/HSQLDBGenesisTransactionRepository.java similarity index 90% rename from src/repository/hsqldb/HSQLDBGenesisTransaction.java rename to src/repository/hsqldb/HSQLDBGenesisTransactionRepository.java index e7142b6d..a8d66ffa 100644 --- a/src/repository/hsqldb/HSQLDBGenesisTransaction.java +++ b/src/repository/hsqldb/HSQLDBGenesisTransactionRepository.java @@ -10,7 +10,7 @@ import data.transaction.GenesisTransaction; import data.transaction.Transaction; import database.DB; -public class HSQLDBGenesisTransaction extends HSQLDBTransaction { +public class HSQLDBGenesisTransactionRepository extends HSQLDBTransactionRepository { Transaction fromBase(byte[] signature, byte[] reference, PublicKeyAccount creator, long timestamp, BigDecimal fee) { try { diff --git a/src/repository/hsqldb/HSQLDBRepository.java b/src/repository/hsqldb/HSQLDBRepository.java index d3595507..2210d917 100644 --- a/src/repository/hsqldb/HSQLDBRepository.java +++ b/src/repository/hsqldb/HSQLDBRepository.java @@ -5,7 +5,7 @@ import repository.Repository; public class HSQLDBRepository extends Repository { public HSQLDBRepository() { - this.transactionRepository = new HSQLDBTransaction(); + this.transactionRepository = new HSQLDBTransactionRepository(); } } diff --git a/src/repository/hsqldb/HSQLDBTransaction.java b/src/repository/hsqldb/HSQLDBTransactionRepository.java similarity index 93% rename from src/repository/hsqldb/HSQLDBTransaction.java rename to src/repository/hsqldb/HSQLDBTransactionRepository.java index f4e79072..3749946e 100644 --- a/src/repository/hsqldb/HSQLDBTransaction.java +++ b/src/repository/hsqldb/HSQLDBTransactionRepository.java @@ -12,12 +12,12 @@ import database.DB; import qora.block.Block; import repository.TransactionRepository; -public class HSQLDBTransaction implements TransactionRepository { +public class HSQLDBTransactionRepository implements TransactionRepository { - private HSQLDBGenesisTransaction genesisTransactionRepository; + private HSQLDBGenesisTransactionRepository genesisTransactionRepository; - public HSQLDBTransaction() { - genesisTransactionRepository = new HSQLDBGenesisTransaction(); + public HSQLDBTransactionRepository() { + genesisTransactionRepository = new HSQLDBGenesisTransactionRepository(); } public Transaction fromSignature(byte[] signature) {