Skip to content

Commit fe07802

Browse files
authored
<feat&fix>(client,transaction): add get support configs interfaces, fix transaction builder set extension version bug. (#922)
* <feat>(client): add get support configs interfaces. * <fix>(transaction,contract): fix transaction builder set extension version bug.
1 parent 6a7b902 commit fe07802

File tree

13 files changed

+256
-36
lines changed

13 files changed

+256
-36
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ ext {
3535
// integrationTest.mustRunAfter test
3636
allprojects {
3737
group = 'org.fisco-bcos.java-sdk'
38-
version = '3.7.0'
38+
version = '3.8.0-SNAPSHOT'
3939

4040
apply plugin: 'maven-publish'
4141
apply plugin: 'idea'

src/integration-test/java/org/fisco/bcos/sdk/v3/test/BcosSDKTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.Arrays;
2222
import java.util.Collections;
2323
import java.util.List;
24+
import java.util.Map;
25+
import java.util.Optional;
2426
import java.util.concurrent.CompletableFuture;
2527
import java.util.concurrent.ExecutionException;
2628

@@ -92,6 +94,16 @@ public void testClient() {
9294
System.out.println(
9395
"New block, group: " + groupId + ", blockNumber: " + blockNumber));
9496

97+
Map<String, Optional<SystemConfig>> systemConfigList = client.getSystemConfigList();
98+
systemConfigList.forEach(
99+
(key, value) ->
100+
System.out.println(
101+
key
102+
+ " : "
103+
+ (value.isPresent()
104+
? value.get().getSystemConfig()
105+
: "null")));
106+
95107
// test getBlockNumber
96108
BlockNumber blockNumber = client.getBlockNumber();
97109
Assert.assertTrue(blockNumber.getBlockNumber().compareTo(BigInteger.ZERO) >= 0);

src/main/java/org/fisco/bcos/sdk/v3/client/Client.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
package org.fisco.bcos.sdk.v3.client;
1717

1818
import java.math.BigInteger;
19+
import java.util.Map;
20+
import java.util.Optional;
21+
import java.util.Set;
1922
import org.fisco.bcos.sdk.jni.BcosSDKJniObj;
2023
import org.fisco.bcos.sdk.v3.client.protocol.request.Transaction;
2124
import org.fisco.bcos.sdk.v3.client.protocol.response.Abi;
@@ -840,6 +843,13 @@ void getTransactionReceiptAsync(
840843
*/
841844
SystemConfig getSystemConfigByKey(String node, String key);
842845

846+
/**
847+
* Peer operation: get system config list, witch will fetch all config
848+
*
849+
* @return all config value
850+
*/
851+
Map<String, Optional<SystemConfig>> getSystemConfigList();
852+
843853
/**
844854
* Peer operation: async get system config
845855
*
@@ -857,6 +867,20 @@ void getTransactionReceiptAsync(
857867
*/
858868
void getSystemConfigByKeyAsync(String node, String key, RespCallback<SystemConfig> callback);
859869

870+
/**
871+
* async get all connect nodes support keys
872+
*
873+
* @param callback the callback instance
874+
*/
875+
void getSupportSysConfigKeysAsync(RespCallback<Set<String>> callback);
876+
877+
/**
878+
* Peer operation: async get system config list, witch will fetch all config
879+
*
880+
* @param callback the callback instance
881+
*/
882+
void getSystemConfigListAsync(RespCallback<Map<String, Optional<SystemConfig>>> callback);
883+
860884
/**
861885
* Peer operation: get sync status
862886
*

src/main/java/org/fisco/bcos/sdk/v3/client/ClientImpl.java

Lines changed: 141 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,17 @@
2121
import java.util.Arrays;
2222
import java.util.Collections;
2323
import java.util.List;
24+
import java.util.Map;
2425
import java.util.Objects;
26+
import java.util.Optional;
27+
import java.util.Set;
28+
import java.util.TreeSet;
2529
import java.util.concurrent.CompletableFuture;
30+
import java.util.concurrent.ConcurrentSkipListMap;
2631
import java.util.concurrent.ExecutionException;
32+
import java.util.concurrent.TimeUnit;
33+
import java.util.concurrent.TimeoutException;
34+
import java.util.stream.Collectors;
2735
import org.fisco.bcos.sdk.jni.BcosSDKJniObj;
2836
import org.fisco.bcos.sdk.jni.rpc.RpcJniObj;
2937
import org.fisco.bcos.sdk.v3.client.exceptions.ClientException;
@@ -58,6 +66,7 @@
5866
import org.fisco.bcos.sdk.v3.client.protocol.response.SystemConfig;
5967
import org.fisco.bcos.sdk.v3.client.protocol.response.TotalTransactionCount;
6068
import org.fisco.bcos.sdk.v3.config.ConfigOption;
69+
import org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig.SystemConfigFeature;
6170
import org.fisco.bcos.sdk.v3.contract.precompiled.sysconfig.SystemConfigService;
6271
import org.fisco.bcos.sdk.v3.crypto.CryptoSuite;
6372
import org.fisco.bcos.sdk.v3.model.CryptoType;
@@ -1008,6 +1017,32 @@ public SystemConfig getSystemConfigByKey(String node, String key) {
10081017
SystemConfig.class);
10091018
}
10101019

1020+
@Override
1021+
public Map<String, Optional<SystemConfig>> getSystemConfigList() {
1022+
CompletableFuture<Map<String, Optional<SystemConfig>>> future = new CompletableFuture<>();
1023+
this.getSystemConfigListAsync(
1024+
new RespCallback<Map<String, Optional<SystemConfig>>>() {
1025+
@Override
1026+
public void onResponse(Map<String, Optional<SystemConfig>> configMap) {
1027+
future.complete(configMap);
1028+
}
1029+
1030+
@Override
1031+
public void onError(Response errorResponse) {
1032+
future.completeExceptionally(
1033+
new ClientException(
1034+
"getSystemConfigList failed, error: "
1035+
+ errorResponse.getErrorMessage()));
1036+
}
1037+
});
1038+
try {
1039+
return future.get(configOption.getNetworkConfig().getTimeout(), TimeUnit.MILLISECONDS);
1040+
} catch (Exception e) {
1041+
logger.warn("getSystemConfigList failed, error: {}", e.getMessage(), e);
1042+
throw new ClientException("getSystemConfigList failed, error: " + e.getMessage(), e);
1043+
}
1044+
}
1045+
10111046
@Override
10121047
public void getSystemConfigByKeyAsync(String key, RespCallback<SystemConfig> callback) {
10131048
this.getSystemConfigByKeyAsync(nodeToSendRequest, key, callback);
@@ -1026,6 +1061,89 @@ public void getSystemConfigByKeyAsync(
10261061
callback);
10271062
}
10281063

1064+
@Override
1065+
public void getSupportSysConfigKeysAsync(RespCallback<Set<String>> callback) {
1066+
this.getGroupInfoListAsync(
1067+
new RespCallback<BcosGroupInfoList>() {
1068+
@Override
1069+
public void onResponse(BcosGroupInfoList bcosGroupInfoList) {
1070+
Optional<BcosGroupInfo.GroupInfo> group =
1071+
bcosGroupInfoList.getResult().stream()
1072+
.filter(gInfo -> gInfo.getGroupID().equals(getGroup()))
1073+
.findFirst();
1074+
Set<String> keys = new TreeSet<>();
1075+
keys.addAll(
1076+
Arrays.stream(SystemConfigFeature.Features.values())
1077+
.map(SystemConfigFeature.Features::toString)
1078+
.collect(Collectors.toList()));
1079+
keys.addAll(SystemConfigService.getConfigKeys());
1080+
if (group.isPresent() && !group.get().getNodeList().isEmpty()) {
1081+
group.get()
1082+
.getNodeList()
1083+
.forEach(
1084+
groupNodeInfo -> {
1085+
keys.addAll(groupNodeInfo.getFeatureKeys());
1086+
keys.addAll(groupNodeInfo.getSupportConfigs());
1087+
});
1088+
}
1089+
callback.onResponse(keys);
1090+
}
1091+
1092+
@Override
1093+
public void onError(Response errorResponse) {
1094+
callback.onError(errorResponse);
1095+
}
1096+
});
1097+
}
1098+
1099+
@Override
1100+
public void getSystemConfigListAsync(
1101+
RespCallback<Map<String, Optional<SystemConfig>>> callback) {
1102+
1103+
this.getSupportSysConfigKeysAsync(
1104+
new RespCallback<Set<String>>() {
1105+
@Override
1106+
public void onResponse(Set<String> keys) {
1107+
Map<String, Optional<SystemConfig>> configMap =
1108+
new ConcurrentSkipListMap<>();
1109+
if (keys.isEmpty()) {
1110+
callback.onResponse(configMap);
1111+
return;
1112+
}
1113+
keys.forEach(
1114+
key ->
1115+
getSystemConfigByKeyAsync(
1116+
key,
1117+
new RespCallback<SystemConfig>() {
1118+
@Override
1119+
public void onResponse(
1120+
SystemConfig systemConfig) {
1121+
configMap.put(
1122+
key,
1123+
Optional.ofNullable(systemConfig));
1124+
if (configMap.size() == keys.size()) {
1125+
callback.onResponse(configMap);
1126+
}
1127+
}
1128+
1129+
@Override
1130+
public void onError(Response errorResponse) {
1131+
// maybe not exist
1132+
configMap.put(key, Optional.empty());
1133+
if (configMap.size() == keys.size()) {
1134+
callback.onResponse(configMap);
1135+
}
1136+
}
1137+
}));
1138+
}
1139+
1140+
@Override
1141+
public void onError(Response errorResponse) {
1142+
callback.onError(errorResponse);
1143+
}
1144+
});
1145+
}
1146+
10291147
@Override
10301148
public SyncStatus getSyncStatus(String node) {
10311149
node = Objects.isNull(node) ? "" : node;
@@ -1130,7 +1248,8 @@ public BcosGroupInfo getGroupInfo() {
11301248

11311249
future.complete(response);
11321250
});
1133-
Response response = future.get();
1251+
Response response =
1252+
future.get(configOption.getNetworkConfig().getTimeout(), TimeUnit.MILLISECONDS);
11341253
return ClientImpl.parseResponseIntoJsonRpcResponse(
11351254
JsonRpcMethods.GET_GROUP_INFO, response, BcosGroupInfo.class);
11361255
} catch (ClientException e) {
@@ -1146,6 +1265,12 @@ public BcosGroupInfo getGroupInfo() {
11461265
"getGroupInfo failed for decode the message exception, error message:"
11471266
+ e.getMessage(),
11481267
e);
1268+
} catch (TimeoutException e) {
1269+
logger.error("e: ", e);
1270+
throw new ClientException(
1271+
"getGroupInfo failed for get group info timeout, error message:"
1272+
+ e.getMessage(),
1273+
e);
11491274
}
11501275
}
11511276

@@ -1604,41 +1729,44 @@ public static <T extends JsonRpcResponse<?>> T parseResponseIntoJsonRpcResponse(
16041729
// parse the response into JsonRPCResponse
16051730
T jsonRpcResponse =
16061731
getObjectMapper().readValue(response.getContent(), responseType);
1607-
if (jsonRpcResponse.getError() != null) {
1608-
logger.error(
1609-
"parseResponseIntoJsonRpcResponse failed for non-empty error message, method: {}, retErrorMessage: {}, retErrorCode: {}",
1732+
// error code inside json rpc response
1733+
if (jsonRpcResponse.hasError()) {
1734+
logger.info(
1735+
"parseResponseIntoJsonRpcResponse failed for non-empty error message, method: {}, msg: {}, code: {}, rawRsp: {}",
16101736
method,
16111737
jsonRpcResponse.getError().getMessage(),
1612-
jsonRpcResponse.getError().getCode());
1738+
jsonRpcResponse.getError().getCode(),
1739+
response.getContentString());
16131740
throw new ClientException(
16141741
jsonRpcResponse.getError().getCode(),
16151742
jsonRpcResponse.getError().getMessage(),
1616-
"ErrorMessage: " + jsonRpcResponse.getError().getMessage());
1743+
"msg: " + jsonRpcResponse.getError().getMessage());
16171744
}
16181745
return jsonRpcResponse;
16191746
} else {
1620-
logger.error(
1621-
"parseResponseIntoJsonRpcResponse failed, method: {}, retErrorMessage: {}, retErrorCode: {}",
1747+
logger.info(
1748+
"parseResponseIntoJsonRpcResponse failed, method: {}, msg: {}, code: {}, rawRsp: {}",
16221749
method,
16231750
response.getErrorMessage(),
1624-
response.getErrorCode());
1751+
response.getErrorCode(),
1752+
response.getContent());
16251753
throw new ClientException(
16261754
response.getErrorCode(),
16271755
response.getErrorMessage(),
1628-
"get response failed, errorCode: "
1756+
"get response failed, code: "
16291757
+ response.getErrorCode()
1630-
+ ", error message: "
1758+
+ ", msg: "
16311759
+ response.getErrorMessage());
16321760
}
16331761
} catch (ClientException e) {
1634-
logger.error(
1762+
logger.info(
16351763
"parseResponseIntoJsonRpcResponse failed for decode the message exception, response: {}, errorMessage: {}",
16361764
response,
16371765
e.getMessage(),
16381766
e);
16391767
throw e;
16401768
} catch (Exception e) {
1641-
logger.error(
1769+
logger.info(
16421770
"parseResponseIntoJsonRpcResponse failed for decode the message exception, response: {}, errorMessage: {}",
16431771
response,
16441772
e.getMessage(),

src/main/java/org/fisco/bcos/sdk/v3/client/exceptions/ClientException.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ public String toString() {
6464
+ ", errorMessage='"
6565
+ errorMessage
6666
+ '\''
67+
+ ", msg="
68+
+ getMessage()
6769
+ '}';
6870
}
6971

src/main/java/org/fisco/bcos/sdk/v3/client/protocol/response/BcosGroupNodeInfo.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.fasterxml.jackson.databind.type.TypeFactory;
1313
import com.fasterxml.jackson.databind.util.Converter;
1414
import java.io.IOException;
15+
import java.util.ArrayList;
1516
import java.util.List;
1617
import org.fisco.bcos.sdk.v3.client.protocol.model.GroupNodeIniInfo;
1718
import org.fisco.bcos.sdk.v3.model.JsonRpcResponse;
@@ -80,7 +81,8 @@ public static class GroupNodeInfo {
8081
private String name;
8182
private List<ServiceInfo> serviceInfoList;
8283
private Protocol protocol;
83-
private List<String> featureKeys;
84+
private List<String> featureKeys = new ArrayList<>();
85+
private List<String> supportConfigs = new ArrayList<>();
8486

8587
@Override
8688
public String toString() {
@@ -150,6 +152,14 @@ public void setFeatureKeys(List<String> featureKeys) {
150152
this.featureKeys = featureKeys;
151153
}
152154

155+
public List<String> getSupportConfigs() {
156+
return supportConfigs;
157+
}
158+
159+
public void setSupportConfigs(List<String> supportConfigs) {
160+
this.supportConfigs = supportConfigs;
161+
}
162+
153163
static class ServiceInfo {
154164
private String serviceName;
155165
private int type;

src/main/java/org/fisco/bcos/sdk/v3/config/model/NetworkConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class NetworkConfig {
2828

2929
private List<String> peers;
3030
private List<String> tarsPeers;
31-
private int timeout = -1;
31+
private int timeout = 10000; // ms
3232
private String defaultGroup;
3333
private boolean sendRpcRequestToHighestBlockNode = true;
3434

0 commit comments

Comments
 (0)