Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .ci/ci_check.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/bash

set -e
tag="v2.7.2"
tag="v2.9.1"
LOG_INFO() {
local content=${1}
echo -e "\033[32m ${content}\033[0m"
Expand Down Expand Up @@ -76,11 +76,11 @@ build_node()
{
local node_type="${1}"
if [ "${node_type}" == "sm" ];then
bash -x build_chain.sh -l 127.0.0.1:4 -g
bash build_chain.sh -l 127.0.0.1:4 -g
sed_cmd=$(get_sed_cmd)
$sed_cmd 's/sm_crypto_channel=false/sm_crypto_channel=true/g' nodes/127.0.0.1/node*/config.ini
else
bash -x build_chain.sh -l 127.0.0.1:4
bash build_chain.sh -l 127.0.0.1:4
fi
./nodes/127.0.0.1/fisco-bcos -v
./nodes/127.0.0.1/start_all.sh
Expand Down
22 changes: 22 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,25 @@
## v2.9.2

(2022-10-31)

Please read documentation of Java SDK.

* [English User Handbook](https://fisco-bcos-documentation.readthedocs.io/en/latest/docs/sdk/java_sdk/index.html)
* [Chinese User Handbook](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/sdk/java_sdk/index.html#)
* [Chinese WIKI](https://github.com/FISCO-BCOS/java-sdk/wiki)

Fix:

* Fixed an issue where 'solidity' generated 'Java' contract code could not compile
* Fix null pointer exception on class TransactionPusherService method pushOnly

----

修复:

* TransactionEncoderInterface添加decode接口
* 修复`solidity`生成`Java`合约代码,合约包含复杂类型时,无法编译的问题

## v2.9.1

(2022-06-15)
Expand Down
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ ext {
ossrhPassword="xxx"
}
// jackson version
jacksonVersion = "2.13.2.2"
jacksonVersion = "2.13.4.2"
commonsIOVersion = "2.4"
commonsLang3Version = "3.1"
javapoetVersion = "1.7.0"
Expand All @@ -36,7 +36,7 @@ ext {
// integrationTest.mustRunAfter test
allprojects {
group = 'org.fisco-bcos.java-sdk'
version = '2.9.1'
version = '2.9.2'
apply plugin: 'maven'
apply plugin: 'maven-publish'
apply plugin: 'idea'
Expand Down
13 changes: 8 additions & 5 deletions sdk-abi/src/main/java/org/fisco/bcos/sdk/abi/TypeDecoder.java
Original file line number Diff line number Diff line change
Expand Up @@ -435,9 +435,10 @@ private static <T extends Type> T decodeDynamicStructElements(
int dynamicParametersToProcess =
getDynamicStructDynamicParametersCount(constructor.getParameterTypes());
for (int i = 0; i < length; ++i) {
java.lang.reflect.Type genericParameterType =
constructor.getGenericParameterTypes()[i];
TypeReference<T> typeReferenceElement =
TypeReference.create(
Utils.getClassType(constructor.getGenericParameterTypes()[i]));
TypeReference.create(Utils.getClassType(genericParameterType));
if (isDynamic(typeReferenceElement.getClassType())) {
final boolean isLastParameterInStruct =
dynamicParametersProcessed == (dynamicParametersToProcess - 1);
Expand All @@ -453,7 +454,8 @@ private static <T extends Type> T decodeDynamicStructElements(
input,
parameterOffsets.get(dynamicParametersProcessed),
parameterLength,
typeReferenceElement));
typeReferenceElement,
genericParameterType));
dynamicParametersProcessed++;
}
}
Expand Down Expand Up @@ -571,7 +573,8 @@ private static <T extends Type> T decodeDynamicParameterFromStruct(
final String input,
final int parameterOffset,
final int parameterLength,
TypeReference<T> typeReference)
TypeReference<T> typeReference,
java.lang.reflect.Type genericParameterType)
throws ClassNotFoundException {
final String dynamicElementData =
input.substring(parameterOffset, parameterOffset + parameterLength);
Expand All @@ -580,7 +583,7 @@ private static <T extends Type> T decodeDynamicParameterFromStruct(
if (DynamicStruct.class.isAssignableFrom(typeReference.getClassType())) {
value = decodeDynamicStruct(dynamicElementData, 0, typeReference);
} else if (DynamicArray.class.isAssignableFrom(typeReference.getClassType())) {
value = decodeDynamicArray(dynamicElementData, 0, typeReference.getType());
value = decodeDynamicArray(dynamicElementData, 0, genericParameterType);
} else {
value = decode(dynamicElementData, 0, typeReference.getClassType());
}
Expand Down
10 changes: 10 additions & 0 deletions sdk-abi/src/main/java/org/fisco/bcos/sdk/abi/datatypes/Array.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.fisco.bcos.sdk.abi.datatypes;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
Expand Down Expand Up @@ -41,6 +42,15 @@ public List<T> getValue() {
return value;
}

public List getNativeValue() {
List list = new ArrayList(value.size());
for (T t : value) {
list.add(t.getValue());
}

return list;
}

@Override
public String getTypeAsString() {
return type;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,36 +136,37 @@ public void generateJavaFiles(
classBuilder.addMethod(buildConstructor(CryptoKeyPair.class, CREDENTIAL));

classBuilder.addFields(buildFuncNameConstants(abiDefinitions));
scanABIDefinitions(abiDefinitions);
classBuilder.addTypes(this.buildStructTypes(abiDefinitions));
structsNamedTypeList.addAll(
abiDefinitions
.stream()
.flatMap(
definition -> {
List<ABIDefinition.NamedType> parameters = new ArrayList<>();
if (definition.getInputs() != null) {
parameters.addAll(definition.getInputs());
}

if (definition.getOutputs() != null) {
parameters.addAll(definition.getOutputs());
}
return parameters
.stream()
.filter(
namedType ->
namedType
.getType()
.startsWith("tuple"));
})
.collect(Collectors.toList()));
classBuilder.addMethods(buildFunctionDefinitions(classBuilder, abiDefinitions));
classBuilder.addMethod(buildLoad(className, CryptoKeyPair.class, CREDENTIAL));
classBuilder.addMethods(buildDeployMethods(className, abiDefinitions));

write(basePackageName, classBuilder.build(), destinationDir);
}

private void scanABIDefinitions(List<ABIDefinition> abiDefinitions) {
for (ABIDefinition abiDefinition : abiDefinitions) {
scanParameters(abiDefinition.getInputs());
scanParameters(abiDefinition.getOutputs());
}
}

private void scanParameters(List<ABIDefinition.NamedType> parameters) {
if (parameters != null) {
for (ABIDefinition.NamedType namedType : parameters) {
scanNameType(namedType);
}
}
}

private void scanNameType(ABIDefinition.NamedType namedType) {
if (namedType.getType().startsWith("tuple")) {
structsNamedTypeList.add(namedType);
}
scanParameters(namedType.getComponents());
}

protected void write(String packageName, TypeSpec typeSpec, String destinationDir)
throws IOException {
JavaFile javaFile =
Expand Down Expand Up @@ -571,10 +572,7 @@ private String createMappedParameterTypes(ParameterSpec parameterSpec) {
return "new "
+ parameterSpecType
+ "(\n"
+ " "
+ componentType
+ ".class,\n"
+ " org.fisco.bcos.sdk.codec.Utils.typeMap("
+ "org.fisco.bcos.sdk.abi.Utils.typeMap("
+ parameterSpec.name
+ ", "
+ typeMapInput
Expand Down Expand Up @@ -621,6 +619,8 @@ protected static TypeName getNativeType(TypeName typeName) {
return TypeName.get(byte[].class);
} else if (simpleName.startsWith(Bool.class.getSimpleName())) {
return TypeName.get(Boolean.class); // boolean cannot be a parameterized type
} else if (simpleName.startsWith("Struct")) {
return typeName;
} else {
throw new UnsupportedOperationException(
"Unsupported type: " + typeName + ", no native type mapping exists.");
Expand Down Expand Up @@ -1383,7 +1383,7 @@ private void buildTupleResultContainer(
.add("$>$>");

String resultStringSimple = "\n($T) results.get($L)";
resultStringSimple += ".getValue()";
String resultGetValue = ".getValue()";

String resultStringNativeList = "\nconvertToNative(($T) results.get($L).getValue())";

Expand All @@ -1394,11 +1394,14 @@ private void buildTupleResultContainer(
TypeName param = outputParameterTypes.get(i);
TypeName convertTo = typeArguments.get(i);

String resultString = resultStringSimple;
String resultString = resultStringSimple + resultGetValue;

// If we use native java types we need to convert
// elements of arrays to native java types too
if (param.equals(convertTo)) {
resultString = resultStringSimple;
}
if (param instanceof ParameterizedTypeName) {
// If we use native java types we need to convert
// elements of arrays to native java types too
ParameterizedTypeName oldContainer = (ParameterizedTypeName) param;
ParameterizedTypeName newContainer = (ParameterizedTypeName) convertTo;
if (newContainer.rawType.compareTo(classList) == 0
Expand Down Expand Up @@ -1439,11 +1442,11 @@ private void buildTupleResultContainer0(

String resultString = resultStringSimple + resultGetValue;

// If we use native java types we need to convert
// elements of arrays to native java types too
if (param.equals(convertTo)) {
resultString = resultStringSimple;
} else if (param instanceof ParameterizedTypeName) {
// If we use native java types we need to convert
// elements of arrays to native java types too
ParameterizedTypeName oldContainer = (ParameterizedTypeName) param;
ParameterizedTypeName newContainer = (ParameterizedTypeName) convertTo;
if (newContainer.rawType.compareTo(classList) == 0
Expand Down Expand Up @@ -1597,32 +1600,47 @@ private List<TypeSpec> buildStructTypes(List<ABIDefinition> functionDefinitions)
builder.addField(typeName, component.getName(), Modifier.PUBLIC);
constructorBuilder.addParameter(typeName, component.getName());
nativeConstructorBuilder.addParameter(typeName, component.getName());

nativeConstructorBuilder.addStatement(
"this." + component.getName() + " = " + component.getName());
constructorBuilder.addStatement(
"this." + component.getName() + " = " + component.getName());
} else if (component.getType().startsWith("tuple")
&& component.getType().endsWith("[]")) {
final TypeName typeName = buildStructArrayTypeName(component);
builder.addField(typeName, component.getName(), Modifier.PUBLIC);
constructorBuilder.addParameter(typeName, component.getName());
nativeConstructorBuilder.addParameter(typeName, component.getName());

nativeConstructorBuilder.addStatement(
"this." + component.getName() + " = " + component.getName());
constructorBuilder.addStatement(
"this." + component.getName() + " = " + component.getName());
} else {
final TypeName typeName = buildTypeName(component.getType());
final TypeName nativeTypeName = getNativeType(typeName);
builder.addField(nativeTypeName, component.getName(), Modifier.PUBLIC);
constructorBuilder.addParameter(typeName, component.getName());
nativeConstructorBuilder.addParameter(nativeTypeName, component.getName());

nativeConstructorBuilder.addStatement(
"this." + component.getName() + " = " + component.getName());
if (component.getType().endsWith("[]")) {
constructorBuilder.addStatement(
"this."
+ component.getName()
+ " = "
+ component.getName()
+ ".getNativeValue()");
} else {
constructorBuilder.addStatement(
"this."
+ component.getName()
+ " = "
+ component.getName()
+ ".getValue()");
}
}
nativeConstructorBuilder.addStatement(
"this." + component.getName() + " = " + component.getName());
constructorBuilder.addStatement(
"this."
+ component.getName()
+ " = "
+ component.getName()
+ (structClassNameMap
.keySet()
.stream()
.noneMatch(i -> i == component.structIdentifier())
? ".getValue()"
: ""));
}

builder.superclass(namedType.isDynamic() ? DynamicStruct.class : StaticStruct.class);
Expand Down Expand Up @@ -1744,14 +1762,29 @@ private String buildStructConstructorParameterDefinition(
final ABIDefinition.NamedType component = components.get(i);
stringBuilder.append(i > 0 ? "," : "");
if (useNativeJavaTypes) {
stringBuilder.append(
!component.getType().startsWith("tuple")
? "new "
+ buildTypeName(component.getType())
+ "("
+ component.getName()
+ ")"
: component.getName());
if (component.getType().startsWith("tuple")) {
stringBuilder.append(component.getName());
} else if (component.getType().endsWith("[]")) {
TypeName typeName = buildTypeName(component.getType());
TypeName baseType = ((ParameterizedTypeName) typeName).typeArguments.get(0);

stringBuilder.append(
"new "
+ buildTypeName(component.getType())
+ "("
+ component.getName()
+ ".stream().map(obj -> new "
+ baseType
+ "(obj)).collect(java.util.stream.Collectors.toList())"
+ ")");
} else {
stringBuilder.append(
"new "
+ buildTypeName(component.getType())
+ "("
+ component.getName()
+ ")");
}
} else {
stringBuilder.append(component.getName());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.fisco.bcos.sdk.model.TransactionReceipt.Logs;
import org.fisco.bcos.sdk.transaction.model.dto.TransactionResponse;
import org.fisco.bcos.sdk.transaction.model.exception.TransactionException;
import org.fisco.bcos.sdk.transaction.model.po.RawTransaction;

/**
* TransactionDecoderInterface @Description: TransactionDecoderInterface
Expand All @@ -30,6 +31,12 @@
*/
public interface TransactionDecoderInterface {

/**
* @param encodedTx
* @return
*/
RawTransaction decode(byte[] encodedTx);

/**
* parse revert message from receipt
*
Expand Down
Loading