Browse Source

Completed marking the data type of the value of KV Entry;

tags/1.0.0
huanghaiquan 6 years ago
parent
commit
5076b5ff7e
30 changed files with 600 additions and 342 deletions
  1. +2
    -2
      source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java
  2. +1
    -1
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountAccessPolicy.java
  3. +10
    -16
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountSet.java
  4. +12
    -26
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/BaseAccount.java
  5. +15
    -4
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccount.java
  6. +9
    -0
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PermissionService.java
  7. +0
    -11
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/Privilege.java
  8. +1
    -1
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PrivilegeModelSetting.java
  9. +1
    -1
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/OpeningAccessPolicy.java
  10. +83
    -33
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java
  11. +1
    -2
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java
  12. +2
    -4
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/BaseAccountTest.java
  13. +2
    -2
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java
  14. +68
    -7
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java
  15. +2
    -3
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java
  16. +3
    -3
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java
  17. +0
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerException.java
  18. +15
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerPermissionException.java
  19. +68
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/PermissionType.java
  20. +0
    -42
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/PrivilegeType.java
  21. +61
    -22
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java
  22. +93
    -6
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilder.java
  23. +49
    -18
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilderImpl.java
  24. +4
    -2
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountOperator.java
  25. +4
    -4
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/PrivilegeSettingOperationBuilder.java
  26. +9
    -10
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/DataAccountKVSetOpTemplateTest.java
  27. +28
    -29
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/KVDataTest.java
  28. +2
    -2
      source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/PrivilegeSetting.java
  29. +1
    -1
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestDataAccount.java
  30. +54
    -90
      source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/BytesUtils.java

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

@@ -30,9 +30,9 @@ public enum PrimitiveType {
INT64((byte) (DataType.NUMERIC | 0x04)), INT64((byte) (DataType.NUMERIC | 0x04)),
/** /**
* 日期时间;
* 时间
*/ */
DATETIME((byte) (DataType.NUMERIC | 0x08)),
TIMESTAMP((byte) (DataType.NUMERIC | 0x08)),
/** /**
* 文本数据; * 文本数据;


+ 1
- 1
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountAccessPolicy.java View File

@@ -19,7 +19,7 @@ public interface AccountAccessPolicy {
* @param account * @param account
* @return Return true if it satisfies this policy, or false if it doesn't; * @return Return true if it satisfies this policy, or false if it doesn't;
*/ */
boolean checkCommitting(AccountHeader account);
boolean checkDataWriting(AccountHeader account);


boolean checkRegistering(Bytes address, PubKey pubKey); boolean checkRegistering(Bytes address, PubKey pubKey);




+ 10
- 16
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/AccountSet.java View File

@@ -160,10 +160,8 @@ public class AccountSet implements Transactional, MerkleProvable {
* *
* 只有最新版本的账户才能可写的,其它都是只读; * 只有最新版本的账户才能可写的,其它都是只读;
* *
* @param address
* 账户地址;
* @param version
* 账户版本;如果指定为 -1,则返回最新版本;
* @param address 账户地址;
* @param version 账户版本;如果指定为 -1,则返回最新版本;
* @return * @return
*/ */
public BaseAccount getAccount(Bytes address, long version) { public BaseAccount getAccount(Bytes address, long version) {
@@ -226,10 +224,8 @@ public class AccountSet implements Transactional, MerkleProvable {
* *
* 如果指定的地址和公钥不匹配,则会引发 {@link LedgerException} 异常; * 如果指定的地址和公钥不匹配,则会引发 {@link LedgerException} 异常;
* *
* @param address
* 区块链地址;
* @param pubKey
* 公钥;
* @param address 区块链地址;
* @param pubKey 公钥;
* @return 注册成功的账户对象; * @return 注册成功的账户对象;
*/ */
public BaseAccount register(Bytes address, PubKey pubKey) { public BaseAccount register(Bytes address, PubKey pubKey) {
@@ -283,15 +279,14 @@ public class AccountSet implements Transactional, MerkleProvable {
private VersioningAccount createInstance(Bytes address, PubKey pubKey, CryptoSetting cryptoSetting, private VersioningAccount createInstance(Bytes address, PubKey pubKey, CryptoSetting cryptoSetting,
String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, long version) { String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, long version) {
return new VersioningAccount(address, pubKey, cryptoSetting, keyPrefix, exStorage, verStorage, accessPolicy,
version);
return new VersioningAccount(address, pubKey, cryptoSetting, keyPrefix, exStorage, verStorage, version);
} }
private VersioningAccount deserialize(byte[] bytes, CryptoSetting cryptoSetting, String keyPrefix, private VersioningAccount deserialize(byte[] bytes, CryptoSetting cryptoSetting, String keyPrefix,
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly, long version) { ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly, long version) {
AccountHeader accInfo = BinaryProtocol.decode(bytes); AccountHeader accInfo = BinaryProtocol.decode(bytes);
return new VersioningAccount(accInfo.getAddress(), accInfo.getPubKey(), accInfo.getRootHash(), cryptoSetting, return new VersioningAccount(accInfo.getAddress(), accInfo.getPubKey(), accInfo.getRootHash(), cryptoSetting,
keyPrefix, exStorage, verStorage, readonly, accessPolicy, version);
keyPrefix, exStorage, verStorage, readonly, version);
} }
private byte[] serialize(AccountHeader account) { private byte[] serialize(AccountHeader account) {
@@ -388,15 +383,14 @@ public class AccountSet implements Transactional, MerkleProvable {
public VersioningAccount(Bytes address, PubKey pubKey, HashDigest rootHash, CryptoSetting cryptoSetting, public VersioningAccount(Bytes address, PubKey pubKey, HashDigest rootHash, CryptoSetting cryptoSetting,
String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly, String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly,
AccountAccessPolicy accessPolicy, long version) {
super(address, pubKey, rootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly, accessPolicy);
long version) {
super(address, pubKey, rootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly);
this.version = version; this.version = version;
} }
public VersioningAccount(Bytes address, PubKey pubKey, CryptoSetting cryptoSetting, String keyPrefix, public VersioningAccount(Bytes address, PubKey pubKey, CryptoSetting cryptoSetting, String keyPrefix,
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, AccountAccessPolicy accessPolicy,
long version) {
super(address, pubKey, cryptoSetting, keyPrefix, exStorage, verStorage, accessPolicy);
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, long version) {
super(address, pubKey, cryptoSetting, keyPrefix, exStorage, verStorage);
this.version = version; this.version = version;
} }


+ 12
- 26
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/BaseAccount.java View File

@@ -23,8 +23,6 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional


protected MerkleDataSet dataset; protected MerkleDataSet dataset;


private AccountAccessPolicy accessPolicy;

/** /**
* Create a new Account with the specified address and pubkey; <br> * Create a new Account with the specified address and pubkey; <br>
* *
@@ -38,8 +36,8 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional
* @param pubKey * @param pubKey
*/ */
public BaseAccount(Bytes address, PubKey pubKey, CryptoSetting cryptoSetting, String keyPrefix, public BaseAccount(Bytes address, PubKey pubKey, CryptoSetting cryptoSetting, String keyPrefix,
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, AccountAccessPolicy accessPolicy) {
this(address, pubKey, null, cryptoSetting, keyPrefix, exStorage, verStorage, false, accessPolicy);
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage) {
this(address, pubKey, null, cryptoSetting, keyPrefix, exStorage, verStorage, false);
} }


/** /**
@@ -58,8 +56,8 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional
* @param accessPolicy * @param accessPolicy
*/ */
public BaseAccount(BlockchainIdentity bcid, CryptoSetting cryptoSetting, String keyPrefix, public BaseAccount(BlockchainIdentity bcid, CryptoSetting cryptoSetting, String keyPrefix,
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, AccountAccessPolicy accessPolicy) {
this(bcid, null, cryptoSetting, keyPrefix, exStorage, verStorage, false, accessPolicy);
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage) {
this(bcid, null, cryptoSetting, keyPrefix, exStorage, verStorage, false);
} }


/** /**
@@ -69,9 +67,8 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional
* *
* @param address * @param address
* @param pubKey * @param pubKey
* @param dataRootHash
* merkle root hash of account's data; if null be set, create a new
* empty merkle dataset;
* @param dataRootHash merkle root hash of account's data; if null be set,
* create a new empty merkle dataset;
* @param cryptoSetting * @param cryptoSetting
* @param exStorage * @param exStorage
* @param verStorage * @param verStorage
@@ -79,18 +76,15 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional
* @param accessPolicy * @param accessPolicy
*/ */
public BaseAccount(Bytes address, PubKey pubKey, HashDigest dataRootHash, CryptoSetting cryptoSetting, public BaseAccount(Bytes address, PubKey pubKey, HashDigest dataRootHash, CryptoSetting cryptoSetting,
String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly,
AccountAccessPolicy accessPolicy) {
String keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly) {
this(new BlockchainIdentityData(address, pubKey), dataRootHash, cryptoSetting, keyPrefix, exStorage, verStorage, this(new BlockchainIdentityData(address, pubKey), dataRootHash, cryptoSetting, keyPrefix, exStorage, verStorage,
readonly, accessPolicy);
readonly);
} }


public BaseAccount(BlockchainIdentity bcid, HashDigest dataRootHash, CryptoSetting cryptoSetting, String keyPrefix, public BaseAccount(BlockchainIdentity bcid, HashDigest dataRootHash, CryptoSetting cryptoSetting, String keyPrefix,
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly,
AccountAccessPolicy accessPolicy) {
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly) {
this.bcid = bcid; this.bcid = bcid;
this.dataset = new MerkleDataSet(dataRootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly); this.dataset = new MerkleDataSet(dataRootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly);
this.accessPolicy = accessPolicy;
} }


/* /*
@@ -151,12 +145,9 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional
* If updating is performed, the version of the key increase by 1. <br> * If updating is performed, the version of the key increase by 1. <br>
* If creating is performed, the version of the key initialize by 0. <br> * If creating is performed, the version of the key initialize by 0. <br>
* *
* @param key
* The key of data;
* @param value
* The value of data;
* @param version
* The expected version of the key.
* @param key The key of data;
* @param value The value of data;
* @param version The expected version of the key.
* @return The new version of the key. <br> * @return The new version of the key. <br>
* If the key is new created success, then return 0; <br> * If the key is new created success, then return 0; <br>
* If the key is updated success, then return the new version;<br> * If the key is updated success, then return the new version;<br>
@@ -164,7 +155,6 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional
* return -1; * return -1;
*/ */
public long setBytes(Bytes key, byte[] value, long version) { public long setBytes(Bytes key, byte[] value, long version) {
// TODO: 支持多种数据类型;
return dataset.setValue(key, value, version); return dataset.setValue(key, value, version);
} }


@@ -207,10 +197,6 @@ public class BaseAccount implements AccountHeader, MerkleProvable, Transactional


@Override @Override
public void commit() { public void commit() {
if (!accessPolicy.checkCommitting(this)) {
throw new LedgerException("Account Committing was rejected for the access policy!");
}

dataset.commit(); dataset.commit();
} }




+ 15
- 4
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccount.java View File

@@ -6,10 +6,10 @@ import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.ledger.AccountHeader; import com.jd.blockchain.ledger.AccountHeader;
import com.jd.blockchain.ledger.BytesValue; import com.jd.blockchain.ledger.BytesValue;
import com.jd.blockchain.ledger.BytesValueEntry;
import com.jd.blockchain.ledger.KVDataEntry; import com.jd.blockchain.ledger.KVDataEntry;
import com.jd.blockchain.ledger.KVDataObject; import com.jd.blockchain.ledger.KVDataObject;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils;
public class DataAccount implements AccountHeader, MerkleProvable { public class DataAccount implements AccountHeader, MerkleProvable {
@@ -41,9 +41,22 @@ public class DataAccount implements AccountHeader, MerkleProvable {
public MerkleProof getProof(Bytes key) { public MerkleProof getProof(Bytes key) {
return baseAccount.getProof(key); return baseAccount.getProof(key);
} }
public long setBytes(Bytes key, BytesValue value, long version) {
byte[] bytesValue = BinaryProtocol.encode(value, BytesValue.class);
return baseAccount.setBytes(key, bytesValue, version);
}
public long setBytes(Bytes key, String value, long version) {
BytesValue bv = BytesValueEntry.fromText(value);
return setBytes(key, bv, version);
}
public long setBytes(Bytes key, byte[] value, long version) { public long setBytes(Bytes key, byte[] value, long version) {
return baseAccount.setBytes(key, value, version);
BytesValue bv = BytesValueEntry.fromBytes(value);
return setBytes(key, bv, version);
} }
/** /**
@@ -119,7 +132,6 @@ public class DataAccount implements AccountHeader, MerkleProvable {
*/ */
public KVDataEntry[] getDataEntries(int fromIndex, int count) { public KVDataEntry[] getDataEntries(int fromIndex, int count) {
if (getDataEntriesTotalCount() == 0 || count == 0) { if (getDataEntriesTotalCount() == 0 || count == 0) {
return null; return null;
} }
@@ -162,5 +174,4 @@ public class DataAccount implements AccountHeader, MerkleProvable {
} }
return baseAccount.dataset.getDataCount(); return baseAccount.dataset.getDataCount();
} }
} }

+ 9
- 0
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PermissionService.java View File

@@ -0,0 +1,9 @@
package com.jd.blockchain.ledger.core;

import java.util.SortedSet;

public interface PermissionService {
boolean checkLedgerPermission();
}

+ 0
- 11
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/Privilege.java View File

@@ -1,11 +0,0 @@
package com.jd.blockchain.ledger.core;

import java.util.SortedSet;

public interface Privilege {
SortedSet<Byte> getOpCodes();
long getVersion();
}

+ 1
- 1
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/PrivilegeModelSetting.java View File

@@ -4,6 +4,6 @@ public interface PrivilegeModelSetting {
long getLatestVersion(); long getLatestVersion();
Privilege getPrivilege(long version);
PermissionService getPrivilege(long version);
} }

+ 1
- 1
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/OpeningAccessPolicy.java View File

@@ -16,7 +16,7 @@ import com.jd.blockchain.utils.Bytes;
public class OpeningAccessPolicy implements AccountAccessPolicy { public class OpeningAccessPolicy implements AccountAccessPolicy {


@Override @Override
public boolean checkCommitting(AccountHeader account) {
public boolean checkDataWriting(AccountHeader account) {
return true; return true;
} }




+ 83
- 33
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java View File

@@ -3,10 +3,25 @@ package com.jd.blockchain.ledger.core.impl.handles;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;


import com.alibaba.fastjson.JSON;
import com.jd.blockchain.contract.LedgerContext; import com.jd.blockchain.contract.LedgerContext;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.*;
import com.jd.blockchain.ledger.AccountHeader;
import com.jd.blockchain.ledger.BlockchainIdentity;
import com.jd.blockchain.ledger.BytesValue;
import com.jd.blockchain.ledger.BytesValueEntry;
import com.jd.blockchain.ledger.DataAccountKVSetOperation;
import com.jd.blockchain.ledger.DataAccountRegisterOperation;
import com.jd.blockchain.ledger.KVDataEntry;
import com.jd.blockchain.ledger.KVInfoVO;
import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInfo;
import com.jd.blockchain.ledger.LedgerMetadata;
import com.jd.blockchain.ledger.LedgerTransaction;
import com.jd.blockchain.ledger.Operation;
import com.jd.blockchain.ledger.ParticipantNode;
import com.jd.blockchain.ledger.TransactionState;
import com.jd.blockchain.ledger.UserInfo;
import com.jd.blockchain.ledger.UserRegisterOperation;
import com.jd.blockchain.ledger.core.impl.OperationHandleContext; import com.jd.blockchain.ledger.core.impl.OperationHandleContext;
import com.jd.blockchain.transaction.BlockchainQueryService; import com.jd.blockchain.transaction.BlockchainQueryService;
import com.jd.blockchain.transaction.DataAccountKVSetOperationBuilder; import com.jd.blockchain.transaction.DataAccountKVSetOperationBuilder;
@@ -16,7 +31,6 @@ import com.jd.blockchain.transaction.KVData;
import com.jd.blockchain.transaction.UserRegisterOperationBuilder; import com.jd.blockchain.transaction.UserRegisterOperationBuilder;
import com.jd.blockchain.transaction.UserRegisterOperationBuilderImpl; import com.jd.blockchain.transaction.UserRegisterOperationBuilderImpl;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.io.BytesUtils;


public class ContractLedgerContext implements LedgerContext { public class ContractLedgerContext implements LedgerContext {


@@ -250,17 +264,6 @@ public class ContractLedgerContext implements LedgerContext {
this.accountAddress = accountAddress; this.accountAddress = accountAddress;
} }


public boolean isJson(String str) {
boolean result = false;
try {
Object obj=JSON.parse(str);
result = true;
} catch (Exception e) {
result=false;
}
return result;
}

@Override @Override
public DataAccountKVSetOperation getOperation() { public DataAccountKVSetOperation getOperation() {
return op; return op;
@@ -268,41 +271,88 @@ public class ContractLedgerContext implements LedgerContext {


@Override @Override
public DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion) { public DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion) {
BytesValue bytesValue = new BytesValueEntry(BytesValueType.BYTES, value);
BytesValue bytesValue = BytesValueEntry.fromBytes(value);
this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion);
generatedOpList.add(op);
opHandleContext.handle(op);
handle(op);
return this; return this;
} }

@Override
public DataAccountKVSetOperationBuilder setText(String key, String value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromText(value);
this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion);
handle(op);
return this;
}

@Override
public DataAccountKVSetOperationBuilder setBytes(String key, Bytes value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromBytes(value);
this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion);
handle(op);
return this;
}

@Override
public DataAccountKVSetOperationBuilder setInt64(String key, long value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromInt64(value);
this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion);
handle(op);
return this;
}
@Deprecated
@Override @Override
public DataAccountKVSetOperationBuilder set(String key, String value, long expVersion) { public DataAccountKVSetOperationBuilder set(String key, String value, long expVersion) {
BytesValue bytesValue;
if (isJson(value)) {
bytesValue = new BytesValueEntry(BytesValueType.JSON, value.getBytes());
}
else {
bytesValue = new BytesValueEntry(BytesValueType.TEXT, value.getBytes());
}
BytesValue bytesValue = BytesValueEntry.fromText(value);
this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion);
generatedOpList.add(op);
opHandleContext.handle(op);
handle(op);
return this; return this;
} }
@Override @Override
public DataAccountKVSetOperationBuilder set(String key, Bytes value, long expVersion) {
BytesValue bytesValue = new BytesValueEntry(BytesValueType.BYTES, value.toBytes());
public DataAccountKVSetOperationBuilder setJSON(String key, String value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromJSON(value);
this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion);
generatedOpList.add(op);
opHandleContext.handle(op);
handle(op);
return this;
}
@Override
public DataAccountKVSetOperationBuilder setXML(String key, String value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromXML(value);
this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion);
handle(op);
return this;
}
@Override
public DataAccountKVSetOperationBuilder setBytes(String key, byte[] value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromBytes(value);
this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion);
handle(op);
return this;
}
@Override
public DataAccountKVSetOperationBuilder setImage(String key, byte[] value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromImage(value);
this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion);
handle(op);
return this; return this;
} }
@Override @Override
public DataAccountKVSetOperationBuilder set(String key, long value, long expVersion) {
BytesValue bytesValue = new BytesValueEntry(BytesValueType.INT64, BytesUtils.toBytes(value));
public DataAccountKVSetOperationBuilder setTimestamp(String key, long value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromTimestamp(value);
this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion); this.op = new SingleKVSetOpTemplate(key, bytesValue, expVersion);
handle(op);
return this;
}
private void handle(Operation op) {
generatedOpList.add(op); generatedOpList.add(op);
opHandleContext.handle(op); opHandleContext.handle(op);
return this;
} }


/** /**


+ 1
- 2
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/DataAccountKVSetOperationHandle.java View File

@@ -24,8 +24,7 @@ public class DataAccountKVSetOperationHandle implements OperationHandle{
DataAccount account = dataset.getDataAccountSet().getDataAccount(kvWriteOp.getAccountAddress()); DataAccount account = dataset.getDataAccountSet().getDataAccount(kvWriteOp.getAccountAddress());
KVWriteEntry[] writeset = kvWriteOp.getWriteSet(); KVWriteEntry[] writeset = kvWriteOp.getWriteSet();
for (KVWriteEntry kvw : writeset) { for (KVWriteEntry kvw : writeset) {
byte[] value = BinaryProtocol.encode(kvw.getValue(), BytesValue.class);
account.setBytes(Bytes.fromString(kvw.getKey()), value, kvw.getExpectedVersion());
account.setBytes(Bytes.fromString(kvw.getKey()), kvw.getValue(), kvw.getExpectedVersion());
} }
} }




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

@@ -14,7 +14,6 @@ import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.core.BaseAccount; import com.jd.blockchain.ledger.core.BaseAccount;
import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.CryptoConfig;
import com.jd.blockchain.ledger.core.impl.OpeningAccessPolicy;
import com.jd.blockchain.storage.service.utils.MemoryKVStorage; import com.jd.blockchain.storage.service.utils.MemoryKVStorage;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.io.BytesUtils; import com.jd.blockchain.utils.io.BytesUtils;
@@ -44,13 +43,12 @@ public class BaseAccountTest {
cryptoConf.setAutoVerifyHash(true); cryptoConf.setAutoVerifyHash(true);
cryptoConf.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConf.setHashAlgorithm(ClassicAlgorithm.SHA256);


OpeningAccessPolicy accPlc = new OpeningAccessPolicy();
// OpeningAccessPolicy accPlc = new OpeningAccessPolicy();


BlockchainKeypair bck = BlockchainKeyGenerator.getInstance().generate(); BlockchainKeypair bck = BlockchainKeyGenerator.getInstance().generate();


// 新建账户; // 新建账户;
BaseAccount baseAccount = new BaseAccount(bck.getIdentity(), cryptoConf, keyPrefix, testStorage, testStorage,
accPlc);
BaseAccount baseAccount = new BaseAccount(bck.getIdentity(), cryptoConf, keyPrefix, testStorage, testStorage);
assertFalse(baseAccount.isUpdated());// 空的账户; assertFalse(baseAccount.isUpdated());// 空的账户;
assertFalse(baseAccount.isReadonly()); assertFalse(baseAccount.isReadonly());




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

@@ -4,7 +4,7 @@ import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField; import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes; import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.utils.io.BytesSlice;
import com.jd.blockchain.utils.Bytes;


/** /**
* BytesValue is the base structure of Value in Blockchain Account; * BytesValue is the base structure of Value in Blockchain Account;
@@ -29,6 +29,6 @@ public interface BytesValue {
* @return * @return
*/ */
@DataField(order = 1, primitiveType = PrimitiveType.BYTES) @DataField(order = 1, primitiveType = PrimitiveType.BYTES)
BytesSlice getValue();
Bytes getValue();
} }

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

@@ -1,18 +1,79 @@
package com.jd.blockchain.ledger; package com.jd.blockchain.ledger;


import com.jd.blockchain.utils.io.BytesSlice;
import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.io.BytesUtils;


/** /**
* Created by zhangshuang3 on 2018/12/3.
*
* @author huanghaiquan
*
*/ */
public class BytesValueEntry implements BytesValue{ public class BytesValueEntry implements BytesValue{
BytesValueType type; BytesValueType type;
BytesSlice slice;
Bytes value;


public BytesValueEntry(BytesValueType type, byte[] bytes) {
private BytesValueEntry(BytesValueType type, byte[] bytes) {
this.type = type; this.type = type;
this.slice = new BytesSlice(bytes);
this.value = new Bytes(bytes);
} }
private BytesValueEntry(BytesValueType type, Bytes bytes) {
this.type = type;
this.value = bytes;
}
public static BytesValue fromBytes(byte[] value) {
return new BytesValueEntry(BytesValueType.BYTES, value);
}
public static BytesValue fromBytes(Bytes value) {
return new BytesValueEntry(BytesValueType.BYTES, value);
}
public static BytesValue fromImage(byte[] value) {
return new BytesValueEntry(BytesValueType.IMG, value);
}
public static BytesValue fromImage(Bytes value) {
return new BytesValueEntry(BytesValueType.IMG, value);
}
public static BytesValue fromText(String value) {
return new BytesValueEntry(BytesValueType.TEXT, BytesUtils.toBytes(value));
}
public static BytesValue fromJSON(String value) {
return new BytesValueEntry(BytesValueType.JSON, BytesUtils.toBytes(value));
}
public static BytesValue fromXML(String value) {
return new BytesValueEntry(BytesValueType.XML, BytesUtils.toBytes(value));
}
public static BytesValue fromInt32(int value) {
return new BytesValueEntry(BytesValueType.INT32, BytesUtils.toBytes(value));
}
public static BytesValue fromInt64(long value) {
return new BytesValueEntry(BytesValueType.INT64, BytesUtils.toBytes(value));
}
public static BytesValue fromInt16(short value) {
return new BytesValueEntry(BytesValueType.INT16, BytesUtils.toBytes(value));
}
public static BytesValue fromInt8(byte value) {
return new BytesValueEntry(BytesValueType.INT8, BytesUtils.toBytes(value));
}
public static BytesValue fromTimestamp(long value) {
return new BytesValueEntry(BytesValueType.TIMESTAMP, BytesUtils.toBytes(value));
}
public static BytesValue fromBoolean(boolean value) {
return new BytesValueEntry(BytesValueType.BOOLEAN, BytesUtils.toBytes(value));
}


@Override @Override
public BytesValueType getType() { public BytesValueType getType() {
@@ -24,8 +85,8 @@ public class BytesValueEntry implements BytesValue{
} }


@Override @Override
public BytesSlice getValue() {
return this.slice;
public Bytes getValue() {
return this.value;
} }


} }

+ 2
- 3
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java View File

@@ -37,9 +37,9 @@ public enum BytesValueType {
INT64(PrimitiveType.INT64.CODE), INT64(PrimitiveType.INT64.CODE),
/** /**
* 日期时间;
* 时间
*/ */
DATETIME(PrimitiveType.DATETIME.CODE),
TIMESTAMP(PrimitiveType.TIMESTAMP.CODE),
/** /**
* 文本数据; * 文本数据;
@@ -81,7 +81,6 @@ public enum BytesValueType {
*/ */
LOCATION(PrimitiveType.LOCATION.CODE); LOCATION(PrimitiveType.LOCATION.CODE);
@EnumField(type = PrimitiveType.INT8) @EnumField(type = PrimitiveType.INT8)
public final byte CODE; public final byte CODE;


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

@@ -228,7 +228,7 @@ public class KVDataObject implements KVDataEntry {
* 返回日期时间值; * 返回日期时间值;
* <p> * <p>
* *
* 仅当数据类型 {@link #getType()} 为 {@link PrimitiveType#DATETIME} 有效;
* 仅当数据类型 {@link #getType()} 为 {@link PrimitiveType#TIMESTAMP} 有效;
* <p> * <p>
* *
* 无效类型将引发 {@link IllegalStateException} 异常; * 无效类型将引发 {@link IllegalStateException} 异常;
@@ -236,11 +236,11 @@ public class KVDataObject implements KVDataEntry {
* @return * @return
*/ */
public Date datetimeValue() { public Date datetimeValue() {
if (PrimitiveType.DATETIME == type) {
if (PrimitiveType.TIMESTAMP == type) {
long ts = BytesUtils.toLong(bytesValue); long ts = BytesUtils.toLong(bytesValue);
return new Date(ts); return new Date(ts);
} }
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", PrimitiveType.DATETIME, type));
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", PrimitiveType.TIMESTAMP, type));
} }


/** /**


source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerException.java → source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerException.java View File


+ 15
- 0
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerPermissionException.java View File

@@ -0,0 +1,15 @@
package com.jd.blockchain.ledger.core;

public class LedgerPermissionException extends LedgerException {

private static final long serialVersionUID = 6077975401474519117L;

public LedgerPermissionException(String message) {
super(message);
}

public LedgerPermissionException(String message, Throwable cause) {
super(message, cause);
}

}

+ 68
- 0
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/PermissionType.java View File

@@ -0,0 +1,68 @@
package com.jd.blockchain.ledger;
/**
* 权限类型;
*
* @author huanghaiquan
*
*/
public enum PermissionType {
/**
* 账户权限配置;
*/
SET_PRIVILEGE(1),
/**
* 注册参与方;
*/
REG_PARTICIPANT(2),
/**
* 配置账本;包括除了{@link #SET_PRIVILEGE}、 {@link #REG_PARTICIPANT} 之外的其它账本设置,例如:设置密码参数、共识参数等;
*/
CONFIG_LEDGER(4),
/**
* 用户注册;
*/
REG_USER(8),
/**
* 注册数据账户;
*/
REG_DATA_ACCOUNT(16),
/**
* 部署新的合约代码;
*/
DEPLOY_CONTRACT(32),
/**
* 写入用户信息;
*/
SET_USER(1024),
/**
* 写入数据;
*/
SET_DATA(2048),
/**
* 写入数据;
*/
INVOKE_CONTRACT(4096),
/**
* 升级合约代码;
*/
UPDATE_CONTRACT(8192);
public final int CODE;
private PermissionType(int code) {
this.CODE = code;
}
}

+ 0
- 42
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/PrivilegeType.java View File

@@ -1,42 +0,0 @@
package com.jd.blockchain.ledger;
/**
* 权限类型;
*
* @author huanghaiquan
*
*/
public enum PrivilegeType {
/**
* 账户注册;
*/
ACCOUNT_REGISTER(1),
/**
* 账户权限配置;
*/
PRIVILEGE_CONFIG(2),
/**
* 状态数据写入;
*/
STATE_WRITE(4),
/**
* 合约应用部署;
*/
CONTRACT_APP_DEPLOY(8),
/**
* 合约应用调用;
*/
CONTRACT_APP_INVOKE(16);
public final int CODE;
private PrivilegeType(int code) {
this.CODE = code;
}
}

+ 61
- 22
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java View File

@@ -31,7 +31,6 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe
private static final ContractEventSendOperationBuilderImpl CONTRACT_EVENT_SEND_OP_BUILDER = new ContractEventSendOperationBuilderImpl(); private static final ContractEventSendOperationBuilderImpl CONTRACT_EVENT_SEND_OP_BUILDER = new ContractEventSendOperationBuilderImpl();
private LedgerInitOperationBuilder ledgerInitOpBuilder = new LedgerInitOperationBuilderFilter(); private LedgerInitOperationBuilder ledgerInitOpBuilder = new LedgerInitOperationBuilderFilter();
private UserRegisterOperationBuilder userRegOpBuilder = new UserRegisterOperationBuilderFilter(); private UserRegisterOperationBuilder userRegOpBuilder = new UserRegisterOperationBuilderFilter();
@@ -78,7 +77,7 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe
public ContractEventSendOperationBuilder contractEvents() { public ContractEventSendOperationBuilder contractEvents() {
return contractEventSendOpBuilder; return contractEventSendOpBuilder;
} }
@Override @Override
public <T> T contract(String address, Class<T> contractIntf) { public <T> T contract(String address, Class<T> contractIntf) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
@@ -144,40 +143,80 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe
return innerBuilder.getOperation(); return innerBuilder.getOperation();
} }
@Override
public DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion) {
innerBuilder.set(key, value, expVersion);
private void addOperation() {
if (op == null) { if (op == null) {
op = innerBuilder.getOperation(); op = innerBuilder.getOperation();
operationList.add(op); operationList.add(op);
} }
}
@Override
public DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion) {
innerBuilder.set(key, value, expVersion);
addOperation();
return this;
}
@Override
public DataAccountKVSetOperationBuilder setText(String key, String value, long expVersion) {
innerBuilder.setText(key, value, expVersion);
addOperation();
return this; return this;
} }
@Override
public DataAccountKVSetOperationBuilder setInt64(String key, long value, long expVersion) {
innerBuilder.setInt64(key, value, expVersion);
addOperation();
return this;
}
@Override
public DataAccountKVSetOperationBuilder setBytes(String key, Bytes value, long expVersion) {
innerBuilder.setBytes(key, value, expVersion);
addOperation();
return this;
}
@Override
public DataAccountKVSetOperationBuilder setBytes(String key, byte[] value, long expVersion) {
innerBuilder.setBytes(key, value, expVersion);
addOperation();
return this;
}
@Override
public DataAccountKVSetOperationBuilder setImage(String key, byte[] value, long expVersion) {
innerBuilder.setImage(key, value, expVersion);
addOperation();
return this;
}
@Override @Override
public DataAccountKVSetOperationBuilder set(String key, String value, long expVersion) { public DataAccountKVSetOperationBuilder set(String key, String value, long expVersion) {
innerBuilder.set(key, value, expVersion);
if (op == null) {
op = innerBuilder.getOperation();
operationList.add(op);
}
innerBuilder.setText(key, value, expVersion);
addOperation();
return this; return this;
} }
@Override @Override
public DataAccountKVSetOperationBuilder set(String key, long value, long expVersion) {
innerBuilder.set(key, value, expVersion);
if (op == null) {
op = innerBuilder.getOperation();
operationList.add(op);
}
public DataAccountKVSetOperationBuilder setJSON(String key, String value, long expVersion) {
innerBuilder.setJSON(key, value, expVersion);
addOperation();
return this; return this;
} }
@Override @Override
public DataAccountKVSetOperationBuilder set(String key, Bytes value, long expVersion) {
innerBuilder.set(key, value, expVersion);
if (op == null) {
op = innerBuilder.getOperation();
operationList.add(op);
}
public DataAccountKVSetOperationBuilder setXML(String key, String value, long expVersion) {
innerBuilder.setXML(key, value, expVersion);
addOperation();
return this;
}
@Override
public DataAccountKVSetOperationBuilder setTimestamp(String key, long value, long expVersion) {
innerBuilder.setTimestamp(key, value, expVersion);
addOperation();
return this; return this;
} }


+ 93
- 6
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilder.java View File

@@ -3,6 +3,10 @@ package com.jd.blockchain.transaction;
import com.jd.blockchain.ledger.DataAccountKVSetOperation; import com.jd.blockchain.ledger.DataAccountKVSetOperation;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
/**
* @author huanghaiquan
*
*/
public interface DataAccountKVSetOperationBuilder { public interface DataAccountKVSetOperationBuilder {
/** /**
@@ -13,7 +17,7 @@ public interface DataAccountKVSetOperationBuilder {
DataAccountKVSetOperation getOperation(); DataAccountKVSetOperation getOperation();
/** /**
* 写入键值
* 写入字节数组
* *
* @param key * @param key
* 键; * 键;
@@ -23,7 +27,35 @@ public interface DataAccountKVSetOperationBuilder {
* 预期的当前版本;如果版本不匹配,则写入失败; * 预期的当前版本;如果版本不匹配,则写入失败;
* @return * @return
*/ */
@Deprecated
DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion); DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion);
/**
* 写入字节数组;
*
* @param key
* 键;
* @param value
* 值;byte[]格式
* @param expVersion
* 预期的当前版本;如果版本不匹配,则写入失败;
* @return
*/
DataAccountKVSetOperationBuilder setBytes(String key, byte[] value, long expVersion);
/**
* 写入字节数组;
*
* @param key
* 键;
* @param value
* 值;Bytes格式
* @param expVersion
* 预期的当前版本;如果版本不匹配,则写入失败;
* @return
*/
DataAccountKVSetOperationBuilder setBytes(String key, Bytes value, long expVersion);
/** /**
* 写入键值; * 写入键值;
* *
@@ -35,21 +67,76 @@ public interface DataAccountKVSetOperationBuilder {
* 预期的当前版本;如果版本不匹配,则写入失败; * 预期的当前版本;如果版本不匹配,则写入失败;
* @return * @return
*/ */
DataAccountKVSetOperationBuilder setImage(String key, byte[] value, long expVersion);
/**
* 写入文本键值;
*
* @param key
* 键;
* @param value
* 值;String格式
* @param expVersion
* 预期的当前版本;如果版本不匹配,则写入失败;
* @return
*/
@Deprecated
DataAccountKVSetOperationBuilder set(String key, String value, long expVersion); DataAccountKVSetOperationBuilder set(String key, String value, long expVersion);
/** /**
* 写入键值;
* 写入文本键值;
* *
* @param key * @param key
* 键; * 键;
* @param value * @param value
* 值;Bytes格式
* 值;String格式
* @param expVersion * @param expVersion
* 预期的当前版本;如果版本不匹配,则写入失败; * 预期的当前版本;如果版本不匹配,则写入失败;
* @return * @return
*/ */
DataAccountKVSetOperationBuilder set(String key, Bytes value, long expVersion);
DataAccountKVSetOperationBuilder setText(String key, String value, long expVersion);
/** /**
* 写入键值;
* 写入JSON键值;
*
* @param key
* 键;
* @param value
* 值;String格式
* @param expVersion
* 预期的当前版本;如果版本不匹配,则写入失败;
* @return
*/
DataAccountKVSetOperationBuilder setJSON(String key, String value, long expVersion);
/**
* 写入XML键值;
*
* @param key
* 键;
* @param value
* 值;String格式
* @param expVersion
* 预期的当前版本;如果版本不匹配,则写入失败;
* @return
*/
DataAccountKVSetOperationBuilder setXML(String key, String value, long expVersion);
/**
* 写入64位整数;
*
* @param key
* 键;
* @param value
* 值;long格式
* @param expVersion
* 预期的当前版本;如果版本不匹配,则写入失败;
* @return
*/
DataAccountKVSetOperationBuilder setInt64(String key, long value, long expVersion);
/**
* 写入时间戳;
* *
* @param key * @param key
* 键; * 键;
@@ -59,6 +146,6 @@ public interface DataAccountKVSetOperationBuilder {
* 预期的当前版本;如果版本不匹配,则写入失败; * 预期的当前版本;如果版本不匹配,则写入失败;
* @return * @return
*/ */
DataAccountKVSetOperationBuilder set(String key, long value, long expVersion);
DataAccountKVSetOperationBuilder setTimestamp(String key, long value, long expVersion);
} }

+ 49
- 18
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilderImpl.java View File

@@ -3,15 +3,12 @@ package com.jd.blockchain.transaction;
import com.jd.blockchain.ledger.BytesValue; import com.jd.blockchain.ledger.BytesValue;
import com.jd.blockchain.ledger.BytesValueEntry; import com.jd.blockchain.ledger.BytesValueEntry;
import com.jd.blockchain.ledger.DataAccountKVSetOperation; import com.jd.blockchain.ledger.DataAccountKVSetOperation;
import com.jd.blockchain.ledger.BytesValueType;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.io.BytesUtils;
import com.jd.blockchain.utils.serialize.json.JSONSerializeUtils;
public class DataAccountKVSetOperationBuilderImpl implements DataAccountKVSetOperationBuilder{
public class DataAccountKVSetOperationBuilderImpl implements DataAccountKVSetOperationBuilder {
private DataAccountKVSetOpTemplate operation; private DataAccountKVSetOpTemplate operation;
public DataAccountKVSetOperationBuilderImpl(Bytes accountAddress) { public DataAccountKVSetOperationBuilderImpl(Bytes accountAddress) {
operation = new DataAccountKVSetOpTemplate(accountAddress); operation = new DataAccountKVSetOpTemplate(accountAddress);
} }
@@ -21,35 +18,69 @@ public class DataAccountKVSetOperationBuilderImpl implements DataAccountKVSetOpe
return operation; return operation;
} }
@Deprecated
@Override @Override
public DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion) { public DataAccountKVSetOperationBuilder set(String key, byte[] value, long expVersion) {
BytesValue bytesValue = new BytesValueEntry(BytesValueType.BYTES, value);
return setBytes(key, value, expVersion);
}
@Override
public DataAccountKVSetOperationBuilder setBytes(String key, byte[] value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromBytes(value);
operation.set(key, bytesValue, expVersion);
return this;
}
@Override
public DataAccountKVSetOperationBuilder setImage(String key, byte[] value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromImage(value);
operation.set(key, bytesValue, expVersion); operation.set(key, bytesValue, expVersion);
return this; return this;
} }
@Override @Override
public DataAccountKVSetOperationBuilder set(String key, String value, long expVersion) { public DataAccountKVSetOperationBuilder set(String key, String value, long expVersion) {
BytesValue bytesValue;
if (JSONSerializeUtils.isJSON(value)) {
bytesValue = new BytesValueEntry(BytesValueType.JSON, value.getBytes());
}
else {
bytesValue = new BytesValueEntry(BytesValueType.TEXT, value.getBytes());
}
return setText(key, value, expVersion);
}
@Override
public DataAccountKVSetOperationBuilder setText(String key, String value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromText(value);
operation.set(key, bytesValue, expVersion); operation.set(key, bytesValue, expVersion);
return this; return this;
} }
@Override @Override
public DataAccountKVSetOperationBuilder set(String key, Bytes value, long expVersion) {
BytesValue bytesValue = new BytesValueEntry(BytesValueType.BYTES, value.toBytes());
public DataAccountKVSetOperationBuilder setBytes(String key, Bytes value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromBytes(value);
operation.set(key, bytesValue, expVersion); operation.set(key, bytesValue, expVersion);
return this; return this;
} }
@Override
public DataAccountKVSetOperationBuilder setInt64(String key, long value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromInt64(value);
operation.set(key, bytesValue, expVersion);
return this;
}
@Override
public DataAccountKVSetOperationBuilder setJSON(String key, String value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromJSON(value);
operation.set(key, bytesValue, expVersion);
return this;
}
@Override
public DataAccountKVSetOperationBuilder setXML(String key, String value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromXML(value);
operation.set(key, bytesValue, expVersion);
return this;
}
@Override @Override
public DataAccountKVSetOperationBuilder set(String key, long value, long expVersion) {
BytesValue bytesValue = new BytesValueEntry(BytesValueType.INT64, BytesUtils.toBytes(value));
public DataAccountKVSetOperationBuilder setTimestamp(String key, long value, long expVersion) {
BytesValue bytesValue = BytesValueEntry.fromTimestamp(value);
operation.set(key, bytesValue, expVersion); operation.set(key, bytesValue, expVersion);
return this; return this;
} }


+ 4
- 2
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountOperator.java View File

@@ -13,14 +13,16 @@ public interface DataAccountOperator {
DataAccountRegisterOperationBuilder dataAccounts(); DataAccountRegisterOperationBuilder dataAccounts();


/** /**
* 写入数据;
* 写入数据; <br>
*
* @param accountAddress * @param accountAddress
* @return * @return
*/ */
DataAccountKVSetOperationBuilder dataAccount(String accountAddress); DataAccountKVSetOperationBuilder dataAccount(String accountAddress);
/** /**
* 写入数据; * 写入数据;
*
* @param accountAddress * @param accountAddress
* @return * @return
*/ */


+ 4
- 4
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/PrivilegeSettingOperationBuilder.java View File

@@ -1,6 +1,6 @@
package com.jd.blockchain.transaction; package com.jd.blockchain.transaction;
import com.jd.blockchain.ledger.PrivilegeType;
import com.jd.blockchain.ledger.PermissionType;
/** /**
* 账户权限设置操作; * 账户权限设置操作;
@@ -16,10 +16,10 @@ import com.jd.blockchain.ledger.PrivilegeType;
*/ */
public interface PrivilegeSettingOperationBuilder { public interface PrivilegeSettingOperationBuilder {
PrivilegeSettingOperationBuilder setThreshhold(PrivilegeType privilege, long threshhold);
PrivilegeSettingOperationBuilder setThreshhold(PermissionType privilege, long threshhold);
PrivilegeSettingOperationBuilder enable(PrivilegeType privilege, String address, int weight);
PrivilegeSettingOperationBuilder enable(PermissionType privilege, String address, int weight);
PrivilegeSettingOperationBuilder disable(PrivilegeType privilege, String address);
PrivilegeSettingOperationBuilder disable(PermissionType privilege, String address);
} }

+ 9
- 10
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/DataAccountKVSetOpTemplateTest.java View File

@@ -8,22 +8,21 @@
*/ */
package test.com.jd.blockchain.ledger.data; package test.com.jd.blockchain.ledger.data;


import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;

import org.junit.Before;
import org.junit.Test;

import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.ledger.BytesValueEntry; import com.jd.blockchain.ledger.BytesValueEntry;
import com.jd.blockchain.ledger.DataAccountKVSetOperation; import com.jd.blockchain.ledger.DataAccountKVSetOperation;
import com.jd.blockchain.ledger.BytesValueType;
import com.jd.blockchain.ledger.Operation; import com.jd.blockchain.ledger.Operation;
import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate; import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate;
import com.jd.blockchain.transaction.KVData; import com.jd.blockchain.transaction.KVData;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;


import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;

/** /**
* *
* @author shaozhuguang * @author shaozhuguang
@@ -43,11 +42,11 @@ public class DataAccountKVSetOpTemplateTest {
String accountAddress = "zhangsandhakhdkah"; String accountAddress = "zhangsandhakhdkah";
data = new DataAccountKVSetOpTemplate(Bytes.fromString(accountAddress)); data = new DataAccountKVSetOpTemplate(Bytes.fromString(accountAddress));
KVData kvData1 = KVData kvData1 =
new KVData("test1", new BytesValueEntry(BytesValueType.TEXT, "zhangsan".getBytes()), 9999L);
new KVData("test1", BytesValueEntry.fromText("zhangsan"), 9999L);
KVData kvData2 = KVData kvData2 =
new KVData("test2", new BytesValueEntry(BytesValueType.TEXT, "lisi".getBytes()), 9990L);
new KVData("test2", BytesValueEntry.fromText("lisi"), 9990L);
KVData kvData3 = KVData kvData3 =
new KVData("test3", new BytesValueEntry(BytesValueType.TEXT, "wangwu".getBytes()), 1990L);
new KVData("test3", BytesValueEntry.fromText("wangwu"), 1990L);
data.set(kvData1); data.set(kvData1);
data.set(kvData2); data.set(kvData2);
data.set(kvData3); data.set(kvData3);


+ 28
- 29
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/KVDataTest.java View File

@@ -8,20 +8,19 @@
*/ */
package test.com.jd.blockchain.ledger.data; package test.com.jd.blockchain.ledger.data;


import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;

import org.junit.Before;
import org.junit.Test;

import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.ledger.BytesValueEntry; import com.jd.blockchain.ledger.BytesValueEntry;
import com.jd.blockchain.ledger.DataAccountKVSetOperation; import com.jd.blockchain.ledger.DataAccountKVSetOperation;
import com.jd.blockchain.ledger.BytesValueType;
import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate; import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate;
import com.jd.blockchain.transaction.KVData; import com.jd.blockchain.transaction.KVData;


import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;

/** /**
* *
* @author shaozhuguang * @author shaozhuguang
@@ -30,26 +29,26 @@ import static org.junit.Assert.assertEquals;
*/ */


public class KVDataTest { public class KVDataTest {
private KVData kvData;
@Before
public void initKVData() throws Exception {
DataContractRegistry.register(DataAccountKVSetOperation.KVWriteEntry.class);
String key = "test-key";
byte[] value = "test-value".getBytes();
long expectedVersion = 9999L;
kvData = new KVData(key, new BytesValueEntry(BytesValueType.BYTES, value), expectedVersion);
}
@Test
public void testSerialize_KVEntry() throws Exception {
byte[] serialBytes = BinaryProtocol.encode(kvData, DataAccountKVSetOperation.KVWriteEntry.class);
DataAccountKVSetOpTemplate.KVWriteEntry resolvedKvData = BinaryProtocol.decode(serialBytes);
System.out.println("------Assert start ------");
assertEquals(resolvedKvData.getKey(), kvData.getKey());
assertEquals(resolvedKvData.getExpectedVersion(), kvData.getExpectedVersion());
assertArrayEquals(resolvedKvData.getValue().getValue().toBytes(), kvData.getValue().getValue().toBytes());
System.out.println("------Assert OK ------");
}
private KVData kvData;
@Before
public void initKVData() throws Exception {
DataContractRegistry.register(DataAccountKVSetOperation.KVWriteEntry.class);
String key = "test-key";
byte[] value = "test-value".getBytes();
long expectedVersion = 9999L;
kvData = new KVData(key, BytesValueEntry.fromBytes(value), expectedVersion);
}
@Test
public void testSerialize_KVEntry() throws Exception {
byte[] serialBytes = BinaryProtocol.encode(kvData, DataAccountKVSetOperation.KVWriteEntry.class);
DataAccountKVSetOpTemplate.KVWriteEntry resolvedKvData = BinaryProtocol.decode(serialBytes);
System.out.println("------Assert start ------");
assertEquals(resolvedKvData.getKey(), kvData.getKey());
assertEquals(resolvedKvData.getExpectedVersion(), kvData.getExpectedVersion());
assertArrayEquals(resolvedKvData.getValue().getValue().toBytes(), kvData.getValue().getValue().toBytes());
System.out.println("------Assert OK ------");
}
} }

+ 2
- 2
source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/PrivilegeSetting.java View File

@@ -1,6 +1,6 @@
package com.jd.blockchain.sdk; package com.jd.blockchain.sdk;
import com.jd.blockchain.ledger.PrivilegeType;
import com.jd.blockchain.ledger.PermissionType;
/** /**
* 权限设置;<br> * 权限设置;<br>
@@ -16,6 +16,6 @@ public interface PrivilegeSetting {
long getMask(String address); long getMask(String address);
boolean isEnable(String address, PrivilegeType privilege);
boolean isEnable(String address, PermissionType privilege);
} }

+ 1
- 1
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestDataAccount.java View File

@@ -197,7 +197,7 @@ public class IntegrationTestDataAccount {
// //
// //add kv ops for data account: Bytes, string, long, json string // //add kv ops for data account: Bytes, string, long, json string
DataAccountKVSetOperation dataKvsetOP = txTpl.dataAccount(dataAddr).set("A", "Value_A_0".getBytes(), -1) DataAccountKVSetOperation dataKvsetOP = txTpl.dataAccount(dataAddr).set("A", "Value_A_0".getBytes(), -1)
.set("B", "Value_B_0", -1).set("C", currentTime, -1).set("D", JSON.toJSONString(jsonTest), -1)
.setText("B", "Value_B_0", -1).setInt64("C", currentTime, -1).setText("D", JSON.toJSONString(jsonTest), -1)
.getOperation(); .getOperation();


// 签名; // 签名;


+ 54
- 90
source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/BytesUtils.java View File

@@ -19,6 +19,10 @@ public class BytesUtils {
public static final int MAX_BUFFER_SIZE = 1024 * 1024 * 1024; public static final int MAX_BUFFER_SIZE = 1024 * 1024 * 1024;
public static final int BUFFER_SIZE = 64; public static final int BUFFER_SIZE = 64;
public static final byte TRUE_BYTE = 1;
public static final byte FALSE_BYTE = 0;
private BytesUtils() { private BytesUtils() {
} }
@@ -28,10 +32,8 @@ public class BytesUtils {
* *
* 此方法不处理两者其中之一为 null 的情形,因为无法定义相等性,所以将引发 {@link NullPointerException} 异常; * 此方法不处理两者其中之一为 null 的情形,因为无法定义相等性,所以将引发 {@link NullPointerException} 异常;
* *
* @param bytes1
* bytes1
* @param bytes2
* bytes2
* @param bytes1 bytes1
* @param bytes2 bytes2
* @return boolean * @return boolean
*/ */
public static boolean equals(byte[] bytes1, byte[] bytes2) { public static boolean equals(byte[] bytes1, byte[] bytes2) {
@@ -64,8 +66,7 @@ public class BytesUtils {
* 将输入流的所有内容都读入到字节数组返回; 如果输入流的长度超出 MAX_BUFFER_SIZE 定义的值,则抛出 * 将输入流的所有内容都读入到字节数组返回; 如果输入流的长度超出 MAX_BUFFER_SIZE 定义的值,则抛出
* IllegalArgumentException ; * IllegalArgumentException ;
* *
* @param in
* in
* @param in in
* @return byte[] * @return byte[]
*/ */
public static byte[] copyToBytes(InputStream in) { public static byte[] copyToBytes(InputStream in) {
@@ -95,15 +96,11 @@ public class BytesUtils {
/** /**
* 将输入流复制到输出流; * 将输入流复制到输出流;
* *
* @param in
* 输入流;
* @param out
* 输出流;
* @param maxSize
* 最大字节大小;
* @param in 输入流;
* @param out 输出流;
* @param maxSize 最大字节大小;
* @return 返回实际复制的字节数; * @return 返回实际复制的字节数;
* @throws IOException
* exception
* @throws IOException exception
*/ */
public static int copy(InputStream in, OutputStream out, int maxSize) throws IOException { public static int copy(InputStream in, OutputStream out, int maxSize) throws IOException {
byte[] buffer = new byte[BUFFER_SIZE]; byte[] buffer = new byte[BUFFER_SIZE];
@@ -126,8 +123,7 @@ public class BytesUtils {
/** /**
* 将 int 值转为4字节的二进制数组; * 将 int 值转为4字节的二进制数组;
* *
* @param value
* value
* @param value value
* @return 转换后的二进制数组,高位在前,低位在后; * @return 转换后的二进制数组,高位在前,低位在后;
*/ */
public static byte[] toBytes(int value) { public static byte[] toBytes(int value) {
@@ -142,11 +138,14 @@ public class BytesUtils {
return bytes; return bytes;
} }
public static byte[] toBytes(boolean value) {
return new byte[] { value ? TRUE_BYTE : FALSE_BYTE };
}
/** /**
* 将 long 值转为8字节的二进制数组; * 将 long 值转为8字节的二进制数组;
* *
* @param value
* value
* @param value value
* @return 转换后的二进制数组,高位在前,低位在后; * @return 转换后的二进制数组,高位在前,低位在后;
*/ */
public static byte[] toBytes(long value) { public static byte[] toBytes(long value) {
@@ -158,10 +157,8 @@ public class BytesUtils {
/** /**
* 将 int 值转为4字节的二进制数组; * 将 int 值转为4字节的二进制数组;
* *
* @param value
* 要转换的int整数;
* @param bytes
* 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 0 开始的4个元素;
* @param value 要转换的int整数;
* @param bytes 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 0 开始的4个元素;
*/ */
public static void toBytes(short value, byte[] bytes) { public static void toBytes(short value, byte[] bytes) {
toBytes(value, bytes, 0); toBytes(value, bytes, 0);
@@ -176,12 +173,9 @@ public class BytesUtils {
* <p> * <p>
* 以“高位在前”的方式转换,即:数值的高位保存在数组地址的低位; * 以“高位在前”的方式转换,即:数值的高位保存在数组地址的低位;
* *
* @param value
* 要转换的int整数;
* @param bytes
* 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素;
* @param offset
* 写入转换结果的起始位置;
* @param value 要转换的int整数;
* @param bytes 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素;
* @param offset 写入转换结果的起始位置;
* @return 返回写入的长度; * @return 返回写入的长度;
*/ */
public static int toBytes(int value, byte[] bytes, int offset) { public static int toBytes(int value, byte[] bytes, int offset) {
@@ -197,12 +191,9 @@ public class BytesUtils {
* <p> * <p>
* 以“高位在后”的方式转换,即:数值的高位保存在数组地址的高位; * 以“高位在后”的方式转换,即:数值的高位保存在数组地址的高位;
* *
* @param value
* 要转换的int整数;
* @param bytes
* 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素;
* @param offset
* 写入转换结果的起始位置;
* @param value 要转换的int整数;
* @param bytes 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素;
* @param offset 写入转换结果的起始位置;
* @return 返回写入的长度; * @return 返回写入的长度;
*/ */
public static int toBytesInReverse(int value, byte[] bytes, int offset) { public static int toBytesInReverse(int value, byte[] bytes, int offset) {
@@ -218,14 +209,10 @@ public class BytesUtils {
* <p> * <p>
* 以“高位在后”的方式转换,即:数值的高位保存在数组地址的高位; * 以“高位在后”的方式转换,即:数值的高位保存在数组地址的高位;
* *
* @param value
* 要转换的int整数;
* @param bytes
* 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素;
* @param offset
* 写入转换结果的起始位置;
* @param len
* 写入长度;必须大于 0 ,小于等于 4;
* @param value 要转换的int整数;
* @param bytes 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的4个元素;
* @param offset 写入转换结果的起始位置;
* @param len 写入长度;必须大于 0 ,小于等于 4;
* @return 返回写入的长度; * @return 返回写入的长度;
*/ */
public static int toBytesInReverse(int value, byte[] bytes, int offset, int len) { public static int toBytesInReverse(int value, byte[] bytes, int offset, int len) {
@@ -263,12 +250,9 @@ public class BytesUtils {
/** /**
* 将 long 值转为8字节的二进制数组; * 将 long 值转为8字节的二进制数组;
* *
* @param value
* 要转换的long整数;
* @param bytes
* 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的8个元素;
* @param offset
* 写入转换结果的起始位置;
* @param value 要转换的long整数;
* @param bytes 要保存转换结果的二进制数组;转换结果将从高位至低位的顺序写入数组从 offset 指定位置开始的8个元素;
* @param offset 写入转换结果的起始位置;
* @return 返回写入的长度; * @return 返回写入的长度;
*/ */
public static int toBytes(long value, byte[] bytes, int offset) { public static int toBytes(long value, byte[] bytes, int offset) {
@@ -345,8 +329,7 @@ public class BytesUtils {
/** /**
* 按从高位到低位的顺序将指定二进制数组从位置 0 开始的 4 个字节转换为 int 整数; * 按从高位到低位的顺序将指定二进制数组从位置 0 开始的 4 个字节转换为 int 整数;
* *
* @param bytes
* 要转换的二进制数组;
* @param bytes 要转换的二进制数组;
* @return 转换后的 int 整数; * @return 转换后的 int 整数;
*/ */
public static int toInt(byte[] bytes) { public static int toInt(byte[] bytes) {
@@ -362,10 +345,8 @@ public class BytesUtils {
/** /**
* 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 2 个字节转换为 short 整数; * 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 2 个字节转换为 short 整数;
* *
* @param bytes
* 要转换的二进制数组;
* @param offset
* 要读取数据的开始位置
* @param bytes 要转换的二进制数组;
* @param offset 要读取数据的开始位置
* @return 转换后的 short 整数; * @return 转换后的 short 整数;
*/ */
public static short toShort(byte[] bytes, int offset) { public static short toShort(byte[] bytes, int offset) {
@@ -387,10 +368,8 @@ public class BytesUtils {
/** /**
* 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 4 个字节转换为 int 整数; * 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 4 个字节转换为 int 整数;
* *
* @param bytes
* 要转换的二进制数组;
* @param offset
* 要读取数据的开始位置
* @param bytes 要转换的二进制数组;
* @param offset 要读取数据的开始位置
* @return 转换后的 int 整数; * @return 转换后的 int 整数;
*/ */
public static int toInt(byte[] bytes, int offset) { public static int toInt(byte[] bytes, int offset) {
@@ -407,14 +386,11 @@ public class BytesUtils {
/** /**
* 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 4 个字节转换为 int 整数; * 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 4 个字节转换为 int 整数;
* *
* @param bytes
* 要转换的二进制数组;
* @param offset
* 要读取数据的开始位置
* @param bytes 要转换的二进制数组;
* @param offset 要读取数据的开始位置
* @return 转换后的 int 整数; * @return 转换后的 int 整数;
* *
* @param len
* 长度;len 必须满足: len 大于等于 1 且小于等于4;
* @param len 长度;len 必须满足: len 大于等于 1 且小于等于4;
* @return 转换后的 int 整数; * @return 转换后的 int 整数;
*/ */
public static int toInt(byte[] bytes, int offset, int len) { public static int toInt(byte[] bytes, int offset, int len) {
@@ -433,18 +409,14 @@ public class BytesUtils {
/** /**
* 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 4 个字节转换为 int 整数; * 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 4 个字节转换为 int 整数;
* *
* @param bytes
* 要转换的二进制数组;
* @param offset
* 要读取数据的开始位置
* @param bytes 要转换的二进制数组;
* @param offset 要读取数据的开始位置
* @return 转换后的 int 整数; * @return 转换后的 int 整数;
* *
* @param len
* 长度;len 必须满足: len 大于等于 1 且小于等于4;
* @param highAlign
* 是否高位对齐;<br>
* true 表示参数 bytes 的首个字节对应为整数的最高8位;<br>
* false 表示参数 bytes 的最后字节对应为整数的最低8位;
* @param len 长度;len 必须满足: len 大于等于 1 且小于等于4;
* @param highAlign 是否高位对齐;<br>
* true 表示参数 bytes 的首个字节对应为整数的最高8位;<br>
* false 表示参数 bytes 的最后字节对应为整数的最低8位;
* @return 转换后的 int 整数; * @return 转换后的 int 整数;
*/ */
public static int toInt(byte[] bytes, int offset, int len, boolean highAlign) { public static int toInt(byte[] bytes, int offset, int len, boolean highAlign) {
@@ -472,10 +444,8 @@ public class BytesUtils {
/** /**
* 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 8个字节转换为 long 整数; * 按从高位到低位的顺序将指定二进制数组从 offset 参数指定的位置开始的 8个字节转换为 long 整数;
* *
* @param bytes
* 要转换的二进制数组;
* @param offset
* 要读取数据的开始位置
* @param bytes 要转换的二进制数组;
* @param offset 要读取数据的开始位置
* @return 转换后的 long 整数; * @return 转换后的 long 整数;
*/ */
public static long toLong(byte[] bytes, int offset) { public static long toLong(byte[] bytes, int offset) {
@@ -495,8 +465,7 @@ public class BytesUtils {
/** /**
* 从指定的输入流中读入2个字节,由前到后按由高位到低位的方式转为 short 整数; * 从指定的输入流中读入2个字节,由前到后按由高位到低位的方式转为 short 整数;
* *
* @param in
* in
* @param in in
* @return short * @return short
*/ */
public static short readShort(InputStream in) { public static short readShort(InputStream in) {
@@ -531,8 +500,7 @@ public class BytesUtils {
/** /**
* 从指定的输入流中读入4个字节,由前到后按由高位到低位的方式转为 int 整数; * 从指定的输入流中读入4个字节,由前到后按由高位到低位的方式转为 int 整数;
* *
* @param in
* in
* @param in in
* @return int * @return int
*/ */
public static int readInt(InputStream in) { public static int readInt(InputStream in) {
@@ -658,11 +626,9 @@ public class BytesUtils {
/** /**
* 从字节数组获取对象 * 从字节数组获取对象
* *
* @param objBytes
* objBytes
* @param objBytes objBytes
* @return object * @return object
* @throws Exception
* exception
* @throws Exception exception
*/ */
// public static Object getObjectFromBytes(byte[] objBytes) throws Exception { // public static Object getObjectFromBytes(byte[] objBytes) throws Exception {
// if (objBytes == null || objBytes.length == 0) { // if (objBytes == null || objBytes.length == 0) {
@@ -676,11 +642,9 @@ public class BytesUtils {
/** /**
* 从对象获取一个字节数组; * 从对象获取一个字节数组;
* *
* @param obj
* obj
* @param obj obj
* @return byte array * @return byte array
* @throws Exception
* exception
* @throws Exception exception
*/ */
public static byte[] getBytesFromObject(Object obj) throws Exception { public static byte[] getBytesFromObject(Object obj) throws Exception {
if (obj == null) { if (obj == null) {


Loading…
Cancel
Save