Browse Source

Refactored the type system of ledger;

tags/1.0.0
huanghaiquan 5 years ago
parent
commit
4b7a5ad38e
8 changed files with 129 additions and 127 deletions
  1. +23
    -3
      source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/BaseType.java
  2. +11
    -57
      source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java
  3. +2
    -2
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java
  4. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java
  5. +21
    -21
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java
  6. +50
    -22
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataType.java
  7. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataEntry.java
  8. +20
    -20
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java

+ 23
- 3
source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/BaseType.java View File

@@ -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);

/**
* 文本


+ 11
- 57
source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java View File

@@ -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;


+ 2
- 2
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java View File

@@ -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);
}


+ 1
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java View File

@@ -21,7 +21,7 @@ public interface BytesValue {
* @return
*/
@DataField(order = 0, refEnum = true)
BytesValueType getType();
DataType getType();

/**
* 数据值的二进制序列;


+ 21
- 21
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java View File

@@ -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;
}



source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java → source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataType.java View File

@@ -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;
}

+ 1
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataEntry.java View File

@@ -25,7 +25,7 @@ public interface KVDataEntry {
*
* @return
*/
BytesValueType getType();
DataType getType();
/**
* 值;


+ 20
- 20
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java View File

@@ -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));
}

// // ----------------


Loading…
Cancel
Save