Skip to content

Commit

Permalink
Merge pull request hyperledger-web3j#375 from danieldietrich/event-lo…
Browse files Browse the repository at this point in the history
…g-ref

Fixes the Log addition to contract events
  • Loading branch information
iikirilov authored Feb 27, 2018
2 parents f6d63a8 + 5052b6a commit f8a41c9
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -674,8 +674,8 @@ MethodSpec buildEventObservableFunction(
.addModifiers(Modifier.PUBLIC)
.addParameter(Log.class, "log")
.returns(ClassName.get("", responseClassName))
.addStatement("$T eventValues = extractEventParameters(event, log)",
EventValues.class)
.addStatement("$T eventValues = extractEventParametersWithLog(event, log)",
Contract.EventValuesWithLog.class)
.addStatement("$1T typedResponse = new $1T()",
ClassName.get("", responseClassName))
.addCode(buildTypedResponse("typedResponse", indexedParameters,
Expand Down Expand Up @@ -715,12 +715,14 @@ MethodSpec buildEventTransactionReceiptFunction(
buildVariableLengthEventConstructor(
transactionMethodBuilder, functionName, indexedParameters, nonIndexedParameters);

transactionMethodBuilder.addStatement("$T valueList = extractEventParameters(event, "
+ "transactionReceipt)", ParameterizedTypeName.get(List.class, EventValues.class))
transactionMethodBuilder.addStatement("$T valueList = extractEventParametersWithLog(event, "
+ "transactionReceipt)", ParameterizedTypeName.get(List.class,
Contract.EventValuesWithLog.class))
.addStatement("$1T responses = new $1T(valueList.size())",
ParameterizedTypeName.get(ClassName.get(ArrayList.class),
ClassName.get("", responseClassName)))
.beginControlFlow("for ($T eventValues : valueList)", EventValues.class)
.beginControlFlow("for ($T eventValues : valueList)",
Contract.EventValuesWithLog.class)
.addStatement("$1T typedResponse = new $1T()",
ClassName.get("", responseClassName))
.addCode(buildTypedResponse("typedResponse", indexedParameters,
Expand Down Expand Up @@ -787,7 +789,7 @@ CodeBlock buildTypedResponse(
builder.addStatement("$L.log = log", objectName);
} else {
builder.addStatement(
"$L.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues))",
"$L.log = eventValues.getLog()",
objectName);
}
for (int i = 0; i < indexedParameters.size(); i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,11 +313,11 @@ public void testBuildEventConstantMultipleValueReturn() throws Exception {
+ " final org.web3j.abi.datatypes.Event event = new org.web3j.abi.datatypes.Event(\"Transfer\", \n"
+ " java.util.Arrays.<org.web3j.abi.TypeReference<?>>asList(new org.web3j.abi.TypeReference<org.web3j.abi.datatypes.Utf8String>() {}, new org.web3j.abi.TypeReference<org.web3j.abi.datatypes.Address>() {}, new org.web3j.abi.TypeReference<org.web3j.abi.datatypes.Address>() {}),\n"
+ " java.util.Arrays.<org.web3j.abi.TypeReference<?>>asList(new org.web3j.abi.TypeReference<org.web3j.abi.datatypes.generated.Uint256>() {}, new org.web3j.abi.TypeReference<org.web3j.abi.datatypes.Utf8String>() {}));\n"
+ " java.util.List<org.web3j.abi.EventValues> valueList = extractEventParameters(event, transactionReceipt);\n"
+ " java.util.List<org.web3j.tx.Contract.EventValuesWithLog> valueList = extractEventParametersWithLog(event, transactionReceipt);\n"
+ " java.util.ArrayList<TransferEventResponse> responses = new java.util.ArrayList<TransferEventResponse>(valueList.size());\n"
+ " for (org.web3j.abi.EventValues eventValues : valueList) {\n"
+ " for (org.web3j.tx.Contract.EventValuesWithLog eventValues : valueList) {\n"
+ " TransferEventResponse typedResponse = new TransferEventResponse();\n"
+ " typedResponse.log = transactionReceipt.getLogs().get(valueList.indexOf(eventValues));\n"
+ " typedResponse.log = eventValues.getLog();\n"
+ " typedResponse.id = (byte[]) eventValues.getIndexedValues().get(0).getValue();\n"
+ " typedResponse.from = (java.lang.String) eventValues.getIndexedValues().get(1).getValue();\n"
+ " typedResponse.to = (java.lang.String) eventValues.getIndexedValues().get(2).getValue();\n"
Expand All @@ -337,7 +337,7 @@ public void testBuildEventConstantMultipleValueReturn() throws Exception {
+ " return web3j.ethLogObservable(filter).map(new rx.functions.Func1<org.web3j.protocol.core.methods.response.Log, TransferEventResponse>() {\n"
+ " @java.lang.Override\n"
+ " public TransferEventResponse call(org.web3j.protocol.core.methods.response.Log log) {\n"
+ " org.web3j.abi.EventValues eventValues = extractEventParameters(event, log);\n"
+ " org.web3j.tx.Contract.EventValuesWithLog eventValues = extractEventParametersWithLog(event, log);\n"
+ " TransferEventResponse typedResponse = new TransferEventResponse();\n"
+ " typedResponse.log = log;\n"
+ " typedResponse.id = (byte[]) eventValues.getIndexedValues().get(0).getValue();\n"
Expand Down
51 changes: 42 additions & 9 deletions core/src/main/java/org/web3j/tx/Contract.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

import org.web3j.abi.EventEncoder;
import org.web3j.abi.EventValues;
Expand Down Expand Up @@ -391,17 +393,23 @@ protected EventValues extractEventParameters(Event event, Log log) {

protected List<EventValues> extractEventParameters(
Event event, TransactionReceipt transactionReceipt) {
return transactionReceipt.getLogs().stream()
.map(log -> extractEventParameters(event, log))
.filter(Objects::nonNull)
.collect(Collectors.toList());
}

List<Log> logs = transactionReceipt.getLogs();
List<EventValues> values = new ArrayList<>();
for (Log log : logs) {
EventValues eventValues = extractEventParameters(event, log);
if (eventValues != null) {
values.add(eventValues);
}
}
protected EventValuesWithLog extractEventParametersWithLog(Event event, Log log) {
final EventValues eventValues = staticExtractEventParameters(event, log);
return (eventValues == null) ? null : new EventValuesWithLog(eventValues, log);
}

return values;
protected List<EventValuesWithLog> extractEventParametersWithLog(
Event event, TransactionReceipt transactionReceipt) {
return transactionReceipt.getLogs().stream()
.map(log -> extractEventParametersWithLog(event, log))
.filter(Objects::nonNull)
.collect(Collectors.toList());
}

/**
Expand Down Expand Up @@ -430,4 +438,29 @@ public final String getDeployedAddress(String networkId) {
return addr == null ? getStaticDeployedAddress(networkId) : addr;
}

/**
* Adds a log field to {@link EventValues}.
*/
public static class EventValuesWithLog {
private final EventValues eventValues;
private final Log log;

private EventValuesWithLog(EventValues eventValues, Log log) {
this.eventValues = eventValues;
this.log = log;
}

public List<Type> getIndexedValues() {
return eventValues.getIndexedValues();
}

public List<Type> getNonIndexedValues() {
return eventValues.getNonIndexedValues();
}

public Log getLog() {
return log;
}
}

}
44 changes: 41 additions & 3 deletions core/src/test/java/org/web3j/tx/ContractTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.function.BiFunction;

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

import org.web3j.abi.EventEncoder;
import org.web3j.abi.EventValues;
import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.TypeReference;
Expand Down Expand Up @@ -37,6 +39,8 @@
import org.web3j.utils.Async;
import org.web3j.utils.Numeric;

import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import static junit.framework.TestCase.assertNotNull;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
Expand Down Expand Up @@ -181,7 +185,7 @@ public void testCallMultipleValueEmpty() throws Exception {
prepareCall(ethCall);

assertThat(contract.callMultipleValue().send(),
equalTo(Collections.emptyList()));
equalTo(emptyList()));
}

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -222,10 +226,10 @@ public void testProcessEvent() {
EventValues eventValues = contract.processEvent(transactionReceipt).get(0);

assertThat(eventValues.getIndexedValues(),
equalTo(Collections.singletonList(
equalTo(singletonList(
new Address("0x3d6cb163f7c72d20b0fcd6baae5889329d138a4a"))));
assertThat(eventValues.getNonIndexedValues(),
equalTo(Collections.singletonList(new Uint256(BigInteger.ONE))));
equalTo(singletonList(new Uint256(BigInteger.ONE))));
}

@Test(expected = TransactionException.class)
Expand Down Expand Up @@ -293,6 +297,40 @@ public void testInvalidTransactionReceipt() throws Throwable {
testErrorScenario();
}

@Test
public void testExtractEventParametersWithLogGivenATransactionReceipt() {

final java.util.function.Function<String, Event> eventFactory = name ->
new Event(name, emptyList(), emptyList());

final BiFunction<Integer, Event, Log> logFactory = (logIndex, event) ->
new Log(false, "" + logIndex, "0", "0x0", "0x0", "0", "0x" + logIndex, "", "",
singletonList(EventEncoder.encode(event)));

final Event testEvent1 = eventFactory.apply("TestEvent1");
final Event testEvent2 = eventFactory.apply("TestEvent2");

final List<Log> logs = Arrays.asList(
logFactory.apply(0, testEvent1),
logFactory.apply(1, testEvent2)
);

final TransactionReceipt transactionReceipt = new TransactionReceipt();
transactionReceipt.setLogs(logs);

final List<Contract.EventValuesWithLog> eventValuesWithLogs1 =
contract.extractEventParametersWithLog(testEvent1, transactionReceipt);

assertEquals(eventValuesWithLogs1.size(), 1);
assertEquals(eventValuesWithLogs1.get(0).getLog(), logs.get(0));

final List<Contract.EventValuesWithLog> eventValuesWithLogs2 =
contract.extractEventParametersWithLog(testEvent2, transactionReceipt);

assertEquals(eventValuesWithLogs2.size(), 1);
assertEquals(eventValuesWithLogs2.get(0).getLog(), logs.get(1));
}

void testErrorScenario() throws Throwable {
try {
contract.performTransaction(
Expand Down

0 comments on commit f8a41c9

Please sign in to comment.