From 4b7a5ad38ed9e9644746faf1e3ff2e4aa7424e17 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Tue, 11 Jun 2019 18:05:41 +0800 Subject: [PATCH] Refactored the type system of ledger; --- .../jd/blockchain/binaryproto/BaseType.java | 26 ++++++- .../blockchain/binaryproto/PrimitiveType.java | 68 +++--------------- .../blockchain/ledger/LedgerEditerTest.java | 4 +- .../com/jd/blockchain/ledger/BytesValue.java | 2 +- .../jd/blockchain/ledger/BytesValueEntry.java | 42 +++++------ .../{BytesValueType.java => DataType.java} | 72 +++++++++++++------ .../com/jd/blockchain/ledger/KVDataEntry.java | 2 +- .../jd/blockchain/ledger/KVDataObject.java | 40 +++++------ 8 files changed, 129 insertions(+), 127 deletions(-) rename source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/{BytesValueType.java => DataType.java} (53%) diff --git a/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/BaseType.java b/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/BaseType.java index c294174d..f649171e 100644 --- a/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/BaseType.java +++ b/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/BaseType.java @@ -1,7 +1,7 @@ package com.jd.blockchain.binaryproto; /** - * 基础类型; + * 基础类型标志; * * @author huanghaiquan * @@ -19,9 +19,29 @@ public interface BaseType { public static final byte BOOLEAN = (byte) 0x01; /** - * 数值; + * 整数; */ - public static final byte NUMERIC = (byte) 0x10; + public static final byte INTEGER = (byte) 0x10; + + /** + * 8位整数; + */ + public static final byte INT8 = (byte) (INTEGER | 0x01); + + /** + * 16位整数; + */ + public static final byte INT16 = (byte) (INTEGER | 0x02); + + /** + * 32位整数; + */ + public static final byte INT32 = (byte) (INTEGER | 0x03); + + /** + * 64位整数; + */ + public static final byte INT64 = (byte) (INTEGER | 0x04); /** * 文本 diff --git a/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java b/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java index a70ff94b..b43f743e 100644 --- a/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java +++ b/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java @@ -19,80 +19,34 @@ public enum PrimitiveType { BOOLEAN(BaseType.BOOLEAN), /** - * 数值型: + * 8位的整数: */ - INT8((byte) (BaseType.NUMERIC | 0x01)), - - INT16((byte) (BaseType.NUMERIC | 0x02)), - - INT32((byte) (BaseType.NUMERIC | 0x03)), - - INT64((byte) (BaseType.NUMERIC | 0x04)), + INT8(BaseType.INT8), /** - * 时间戳; + * 16位整数; */ - TIMESTAMP((byte) (BaseType.NUMERIC | 0x08)), + INT16(BaseType.INT16), /** - * 文本数据; + * 32位整数; */ - TEXT(BaseType.TEXT), + INT32(BaseType.INT32), /** - * 文本数据; + * 64位整数; */ - JSON((byte) (BaseType.TEXT | 0x01)), + INT64(BaseType.INT64), /** - * 文本数据; + * 文本; */ - XML((byte) (BaseType.TEXT | 0x02)), + TEXT(BaseType.TEXT), /** * 二进制数据; */ - BYTES(BaseType.BYTES), - - /** - * 大整数; - */ - BIG_INT((byte) (BaseType.BYTES | 0x01)), - - /** - * 图片; - */ - IMG((byte) (BaseType.BYTES | 0x02)), - - /** - * 视频; - */ - VIDEO((byte) (BaseType.BYTES | 0x03)), - - /** - * 位置坐标; - */ - LOCATION((byte) (BaseType.BYTES | 0x04)), - - /** - * 公钥; - */ - PUB_KEY((byte) (BaseType.BYTES | 0x05)), - - /** - * 签名摘要; - */ - SIGNATURE_DIGEST((byte) (BaseType.BYTES | 0x06)), - - /** - * 哈希摘要; - */ - HASH_DIGEST((byte) (BaseType.BYTES | 0x07)), - - /** - * 加密数据; - */ - ENCRYPTED_DATA((byte) (BaseType.BYTES | 0x08)); + BYTES(BaseType.BYTES); public final byte CODE; diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java index 5018ede7..defed4b8 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java @@ -18,7 +18,7 @@ import com.jd.blockchain.crypto.service.classic.ClassicCryptoService; import com.jd.blockchain.crypto.service.sm.SMCryptoService; import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BytesValue; -import com.jd.blockchain.ledger.BytesValueType; +import com.jd.blockchain.ledger.DataType; import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerInitSetting; import com.jd.blockchain.ledger.LedgerTransaction; @@ -109,7 +109,7 @@ public class LedgerEditerTest { // 验证数据读写的一致性; BytesValue bytes = dataAccount.getBytes("A"); - assertEquals(BytesValueType.TEXT, bytes.getType()); + assertEquals(DataType.TEXT, bytes.getType()); String textValue = bytes.getValue().toUTF8String(); assertEquals("abc", textValue); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java index ae340106..6e7b9b46 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java @@ -21,7 +21,7 @@ public interface BytesValue { * @return */ @DataField(order = 0, refEnum = true) - BytesValueType getType(); + DataType getType(); /** * 数据值的二进制序列; diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java index 2189d2b1..612c6111 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java @@ -9,37 +9,37 @@ import com.jd.blockchain.utils.io.BytesUtils; * */ public class BytesValueEntry implements BytesValue { - BytesValueType type; + DataType type; Bytes value; - private BytesValueEntry(BytesValueType type, byte[] bytes) { + private BytesValueEntry(DataType type, byte[] bytes) { this.type = type; this.value = new Bytes(bytes); } - private BytesValueEntry(BytesValueType type, Bytes bytes) { + private BytesValueEntry(DataType type, Bytes bytes) { this.type = type; this.value = bytes; } - public static BytesValue fromType(BytesValueType type, byte[] value) { + public static BytesValue fromType(DataType type, byte[] value) { return new BytesValueEntry(type, value); } public static BytesValue fromBytes(byte[] value) { - return new BytesValueEntry(BytesValueType.BYTES, value); + return new BytesValueEntry(DataType.BYTES, value); } public static BytesValue fromBytes(Bytes value) { - return new BytesValueEntry(BytesValueType.BYTES, value); + return new BytesValueEntry(DataType.BYTES, value); } public static BytesValue fromImage(byte[] value) { - return new BytesValueEntry(BytesValueType.IMG, value); + return new BytesValueEntry(DataType.IMG, value); } public static BytesValue fromImage(Bytes value) { - return new BytesValueEntry(BytesValueType.IMG, value); + return new BytesValueEntry(DataType.IMG, value); } /** @@ -49,7 +49,7 @@ public class BytesValueEntry implements BytesValue { * @return */ public static BytesValue fromText(String value) { - return new BytesValueEntry(BytesValueType.TEXT, BytesUtils.toBytes(value)); + return new BytesValueEntry(DataType.TEXT, BytesUtils.toBytes(value)); } /** @@ -62,51 +62,51 @@ public class BytesValueEntry implements BytesValue { if (bytesValue == null) { return null; } - if (bytesValue.getType() != BytesValueType.TEXT) { - throw new ValueTypeCastException("The expected value type is " + BytesValueType.TEXT.toString() + if (bytesValue.getType() != DataType.TEXT) { + throw new ValueTypeCastException("The expected value type is " + DataType.TEXT.toString() + ", but it is actually " + bytesValue.getType().toString() + "!"); } return bytesValue.getValue().toUTF8String(); } public static BytesValue fromJSON(String value) { - return new BytesValueEntry(BytesValueType.JSON, BytesUtils.toBytes(value)); + return new BytesValueEntry(DataType.JSON, BytesUtils.toBytes(value)); } public static BytesValue fromXML(String value) { - return new BytesValueEntry(BytesValueType.XML, BytesUtils.toBytes(value)); + return new BytesValueEntry(DataType.XML, BytesUtils.toBytes(value)); } public static BytesValue fromInt32(int value) { - return new BytesValueEntry(BytesValueType.INT32, BytesUtils.toBytes(value)); + return new BytesValueEntry(DataType.INT32, BytesUtils.toBytes(value)); } public static BytesValue fromInt64(long value) { - return new BytesValueEntry(BytesValueType.INT64, BytesUtils.toBytes(value)); + return new BytesValueEntry(DataType.INT64, BytesUtils.toBytes(value)); } public static BytesValue fromInt16(short value) { - return new BytesValueEntry(BytesValueType.INT16, BytesUtils.toBytes(value)); + return new BytesValueEntry(DataType.INT16, BytesUtils.toBytes(value)); } public static BytesValue fromInt8(byte value) { - return new BytesValueEntry(BytesValueType.INT8, BytesUtils.toBytes(value)); + return new BytesValueEntry(DataType.INT8, BytesUtils.toBytes(value)); } public static BytesValue fromTimestamp(long value) { - return new BytesValueEntry(BytesValueType.TIMESTAMP, BytesUtils.toBytes(value)); + return new BytesValueEntry(DataType.TIMESTAMP, BytesUtils.toBytes(value)); } public static BytesValue fromBoolean(boolean value) { - return new BytesValueEntry(BytesValueType.BOOLEAN, BytesUtils.toBytes(value)); + return new BytesValueEntry(DataType.BOOLEAN, BytesUtils.toBytes(value)); } @Override - public BytesValueType getType() { + public DataType getType() { return this.type; } - public void setType(BytesValueType type) { + public void setType(DataType type) { this.type = type; } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataType.java similarity index 53% rename from source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java rename to source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataType.java index 11049ea9..a5361695 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataType.java @@ -1,8 +1,9 @@ package com.jd.blockchain.ledger; -import com.jd.blockchain.binaryproto.PrimitiveType; +import com.jd.blockchain.binaryproto.BaseType; import com.jd.blockchain.binaryproto.EnumContract; import com.jd.blockchain.binaryproto.EnumField; +import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.consts.DataCodes; /** @@ -11,8 +12,8 @@ import com.jd.blockchain.consts.DataCodes; * @author huanghaiquan * */ -@EnumContract(code = DataCodes.ENUM_TYPE_BYTES_VALUE_TYPE, name = "BytesValueType", decription = "") -public enum BytesValueType { +@EnumContract(code = DataCodes.ENUM_TYPE_BYTES_VALUE_TYPE) +public enum DataType { /** * 空; @@ -35,61 +36,88 @@ public enum BytesValueType { INT32(PrimitiveType.INT32.CODE), INT64(PrimitiveType.INT64.CODE), - - /** - * 时间戳; - */ - TIMESTAMP(PrimitiveType.TIMESTAMP.CODE), - + /** * 文本数据; */ TEXT(PrimitiveType.TEXT.CODE), + /** - * 文本数据; + * 二进制数据; */ - JSON(PrimitiveType.JSON.CODE), + BYTES(PrimitiveType.BYTES.CODE), + + /** + * 时间戳; + */ + TIMESTAMP((byte) (BaseType.INTEGER | 0x08)), + /** * 文本数据; */ - XML(PrimitiveType.XML.CODE), + JSON((byte) (BaseType.TEXT | 0x01)), /** - * 二进制数据; + * 文本数据; */ - BYTES(PrimitiveType.BYTES.CODE), + XML((byte) (BaseType.TEXT | 0x02)), + /** * 大整数; */ - BIG_INT(PrimitiveType.BIG_INT.CODE), + BIG_INT((byte) (BaseType.BYTES | 0x01)), /** * 图片; */ - IMG(PrimitiveType.IMG.CODE), + IMG((byte) (BaseType.BYTES | 0x02)), /** * 视频; */ - VIDEO(PrimitiveType.VIDEO.CODE), + VIDEO((byte) (BaseType.BYTES | 0x03)), /** - * 位置; + * 位置坐标; */ - LOCATION(PrimitiveType.LOCATION.CODE); + LOCATION((byte) (BaseType.BYTES | 0x04)), + + /** + * 公钥; + */ + PUB_KEY((byte) (BaseType.BYTES | 0x05)), + + /** + * 签名摘要; + */ + SIGNATURE_DIGEST((byte) (BaseType.BYTES | 0x06)), + + /** + * 哈希摘要; + */ + HASH_DIGEST((byte) (BaseType.BYTES | 0x07)), + + /** + * 加密数据; + */ + ENCRYPTED_DATA((byte) (BaseType.BYTES | 0x08)); + + + + @EnumField(type = PrimitiveType.INT8) public final byte CODE; - private BytesValueType(byte code) { + private DataType(byte code) { this.CODE = code; } - public static BytesValueType valueOf(byte code) { - for (BytesValueType dataType : BytesValueType.values()) { + public static DataType valueOf(byte code) { + for (DataType dataType : DataType.values()) { if (dataType.CODE == code) { return dataType; } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataEntry.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataEntry.java index 9d4e0870..396cc36d 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataEntry.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataEntry.java @@ -25,7 +25,7 @@ public interface KVDataEntry { * * @return */ - BytesValueType getType(); + DataType getType(); /** * 值; diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java index 2f081642..2769631c 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java @@ -58,8 +58,8 @@ public class KVDataObject implements KVDataEntry { * @see com.jd.blockchain.ledger.KVDataEntry#getType() */ @Override - public BytesValueType getType() { - return bytesValue == null ? BytesValueType.NIL : bytesValue.getType(); + public DataType getType() { + return bytesValue == null ? DataType.NIL : bytesValue.getType(); } @Override @@ -95,7 +95,7 @@ public class KVDataObject implements KVDataEntry { * @return */ public boolean isNil() { - return bytesValue == null || BytesValueType.NIL == bytesValue.getType(); + return bytesValue == null || DataType.NIL == bytesValue.getType(); } /** @@ -119,10 +119,10 @@ public class KVDataObject implements KVDataEntry { * @return */ public byte tinyValue() { - if (BytesValueType.INT8 == getType()) { + if (DataType.INT8 == getType()) { return bytesValue.getValue().toBytes()[0]; } - throw new IllegalStateException(String.format("Expected type [%s], but [%s]", BytesValueType.INT8, getType())); + throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT8, getType())); } /** @@ -137,10 +137,10 @@ public class KVDataObject implements KVDataEntry { * @return */ public short shortValue() { - if (BytesValueType.INT16 == getType()) { + if (DataType.INT16 == getType()) { return BytesUtils.toShort(bytesValue.getValue().toBytes(), 0); } - throw new IllegalStateException(String.format("Expected type [%s], but [%s]", BytesValueType.INT16, getType())); + throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT16, getType())); } /** @@ -155,10 +155,10 @@ public class KVDataObject implements KVDataEntry { * @return */ public int intValue() { - if (BytesValueType.INT32 == getType()) { + if (DataType.INT32 == getType()) { return BytesUtils.toInt(bytesValue.getValue().toBytes(), 0); } - throw new IllegalStateException(String.format("Expected type [%s], but [%s]", BytesValueType.INT32, getType())); + throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT32, getType())); } /** @@ -173,10 +173,10 @@ public class KVDataObject implements KVDataEntry { * @return */ public long longValue() { - if (BytesValueType.INT64 == getType()) { + if (DataType.INT64 == getType()) { return BytesUtils.toLong(bytesValue.getValue().toBytes(), 0); } - throw new IllegalStateException(String.format("Expected type [%s], but [%s]", BytesValueType.INT64, getType())); + throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT64, getType())); } @@ -192,11 +192,11 @@ public class KVDataObject implements KVDataEntry { * @return */ public BigInteger bigIntValue() { - if (BytesValueType.BIG_INT == getType()) { + if (DataType.BIG_INT == getType()) { return new BigInteger(bytesValue.getValue().toBytes()); } throw new IllegalStateException( - String.format("Expected type [%s], but [%s]", BytesValueType.BIG_INT, getType())); + String.format("Expected type [%s], but [%s]", DataType.BIG_INT, getType())); } /** @@ -211,11 +211,11 @@ public class KVDataObject implements KVDataEntry { * @return */ public boolean boolValue() { - if (BytesValueType.BOOLEAN == getType()) { + if (DataType.BOOLEAN == getType()) { return BytesUtils.toBoolean(bytesValue.getValue().toBytes()[0]); } throw new IllegalStateException( - String.format("Expected type [%s], but [%s]", BytesValueType.BOOLEAN, getType())); + String.format("Expected type [%s], but [%s]", DataType.BOOLEAN, getType())); } /** @@ -230,12 +230,12 @@ public class KVDataObject implements KVDataEntry { * @return */ public Date datetimeValue() { - if (BytesValueType.TIMESTAMP == getType()) { + if (DataType.TIMESTAMP == getType()) { long ts = BytesUtils.toLong(bytesValue.getValue().toBytes()); return new Date(ts); } throw new IllegalStateException( - String.format("Expected type [%s], but [%s]", BytesValueType.TIMESTAMP, getType())); + String.format("Expected type [%s], but [%s]", DataType.TIMESTAMP, getType())); } /** @@ -251,12 +251,12 @@ public class KVDataObject implements KVDataEntry { * @return */ public String stringValue() { - BytesValueType type = getType(); - if (BytesValueType.TEXT == type || BytesValueType.JSON == type || BytesValueType.XML == type) { + DataType type = getType(); + if (DataType.TEXT == type || DataType.JSON == type || DataType.XML == type) { return bytesValue.getValue().toUTF8String(); } throw new IllegalStateException(String.format("Expected type [%s] or [%s] or [%s] , but [%s]", - PrimitiveType.TEXT, BytesValueType.JSON, BytesValueType.XML, type)); + PrimitiveType.TEXT, DataType.JSON, DataType.XML, type)); } // // ----------------