tidied remaining flows

This commit is contained in:
mattbradburyr3 2023-01-29 20:33:28 +00:00
parent 683ef69418
commit 4d07326b78
3 changed files with 58 additions and 40 deletions

View File

@ -6,18 +6,18 @@ import java.util.List;
import java.util.concurrent.Callable;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public final class CorDappHelpers {
public static <T> T findAndExpectExactlyOne(Collection<T> collection, Predicate<? super T> filterFn, String exceptionMsg)
{
Collection<T> results = collection.stream().filter(filterFn).collect(Collectors.toList());
if(results.size() != 1){
throw new RuntimeException(exceptionMsg);
}
return results.iterator().next();
}
public static <T> T findAndExpectExactlyOne(Collection<T> collection, String exceptionMsg) {
return findAndExpectExactlyOne(collection, e -> true, exceptionMsg);
}
}
//
//public final class CorDappHelpers {
// public static <T> T findAndExpectExactlyOne(Collection<T> collection, Predicate<? super T> filterFn, String exceptionMsg)
// {
// Collection<T> results = collection.stream().filter(filterFn).collect(Collectors.toList());
// if(results.size() != 1){
// throw new RuntimeException(exceptionMsg);
// }
// return results.iterator().next();
// }
//
// public static <T> T findAndExpectExactlyOne(Collection<T> collection, String exceptionMsg) {
// return findAndExpectExactlyOne(collection, e -> true, exceptionMsg);
// }
//}

View File

@ -6,6 +6,7 @@ import net.corda.v5.application.flows.RPCRequestData;
import net.corda.v5.application.flows.RPCStartableFlow;
import net.corda.v5.application.marshalling.JsonMarshallingService;
import net.corda.v5.base.annotations.Suspendable;
import net.corda.v5.base.exceptions.CordaRuntimeException;
import net.corda.v5.crypto.SecureHash;
import net.corda.v5.ledger.utxo.StateAndRef;
import net.corda.v5.ledger.utxo.UtxoLedgerService;
@ -16,8 +17,9 @@ import org.slf4j.LoggerFactory;
import java.util.*;
import static com.r3.developers.csdetemplate.utilities.CorDappHelpers.findAndExpectExactlyOne;
//import static com.r3.developers.csdetemplate.utilities.CorDappHelpers.findAndExpectExactlyOne;
import static java.util.Objects.*;
import static java.util.stream.Collectors.toList;
public class GetChatFlow implements RPCStartableFlow {
@ -29,27 +31,36 @@ public class GetChatFlow implements RPCStartableFlow {
@CordaInject
public UtxoLedgerService ledgerService;
@NotNull
// @NotNull
@Override
@Suspendable
public String call(RPCRequestData requestBody) throws IllegalArgumentException {
public String call(RPCRequestData requestBody) {
GetChatFlowArgs flowArgs = requestBody.getRequestBodyAs(jsonMarshallingService, GetChatFlowArgs.class);
List<StateAndRef<ChatState>> stateAndRefs = ledgerService.findUnconsumedStatesByType(ChatState.class);
log.info("GetChatFlow Number of stateAndRefs = " + stateAndRefs.size());
log.info("GetChatFlow stateAndRefs = " + stateAndRefs);
List<StateAndRef<ChatState>> chatStateAndRefs = ledgerService.findUnconsumedStatesByType(ChatState.class);
List<StateAndRef<ChatState>> chatStateAndRefsWithId = chatStateAndRefs.stream()
.filter(sar -> sar.getState().getContractState().getId().equals(flowArgs.getId())).collect(toList());
if (chatStateAndRefsWithId.size() != 1) throw new CordaRuntimeException("Multiple or zero Chat states with id " + flowArgs.getId() + " found");
StateAndRef<ChatState> chatStateAndRef = chatStateAndRefsWithId.get(0);
StateAndRef<ChatState> state = findAndExpectExactlyOne(stateAndRefs,
stateAndRef -> stateAndRef.getState().getContractState().getId().equals(flowArgs.getId()),
"did not find an unique ChatState"
);
return jsonMarshallingService.format(resolveMessagesFromBackchain(state, flowArgs.getNumberOfRecords() ));
// log.info("GetChatFlow Number of stateAndRefs = " + stateAndRefs.size());
// log.info("GetChatFlow stateAndRefs = " + stateAndRefs);
// StateAndRef<ChatState> state = findAndExpectExactlyOne(stateAndRefs,
// stateAndRef -> stateAndRef.getState().getContractState().getId().equals(flowArgs.getId()),
// "did not find an unique ChatState"
// );
return jsonMarshallingService.format(resolveMessagesFromBackchain(chatStateAndRef, flowArgs.getNumberOfRecords() ));
}
@NotNull
@Suspendable
private List<GetChatResponse> resolveMessagesFromBackchain(StateAndRef<?> stateAndRef, int numberOfRecords) throws IllegalArgumentException {
private List<GetChatResponse> resolveMessagesFromBackchain(StateAndRef<?> stateAndRef, int numberOfRecords) {
List<GetChatResponse> messages = new LinkedList<>();
@ -58,17 +69,24 @@ public class GetChatFlow implements RPCStartableFlow {
boolean moreBackchain = true;
while (moreBackchain) {
SecureHash transactionId = currentStateAndRef.getRef().getTransactionHash();
UtxoLedgerTransaction transaction = requireNonNull(
ledgerService.findLedgerTransaction(transactionId),
"Transaction $transactionId not found"
"Transaction " + transactionId + " not found."
);
ChatState output = findAndExpectExactlyOne(
transaction.getOutputStates(ChatState.class),
"Expecting one and only one ChatState output for transaction " + transactionId
);
// ChatState output = findAndExpectExactlyOne(
// transaction.getOutputStates(ChatState.class),
// "Expecting one and only one ChatState output for transaction " + transactionId
// );
List<ChatState> chatStates = transaction.getOutputStates(ChatState.class);
if (chatStates.size() != 1) throw new CordaRuntimeException(
"Expecting one and only one ChatState output for transaction " + transactionId + ".");
ChatState output = chatStates.get(0);
messages.add(new GetChatResponse(output.getMessageFrom().toString(), output.getMessage()));
recordsToFetch--;
@ -78,7 +96,7 @@ public class GetChatFlow implements RPCStartableFlow {
if (inputStateAndRefs.isEmpty() || recordsToFetch == 0) {
moreBackchain = false;
} else if (inputStateAndRefs.size() > 1) {
throw new IllegalArgumentException("More than one input state found for transaction " + transactionId + ".");
throw new CordaRuntimeException("More than one input state found for transaction " + transactionId + ".");
} else {
currentStateAndRef = inputStateAndRefs.get(0);
}

View File

@ -72,15 +72,15 @@ public class UpdateChatFlow implements RPCStartableFlow {
// "Multiple or zero Chat states with id " + flowArgs.getId() + " found"
// );
List<StateAndRef<ChatState>> chatStates = ledgerService.findUnconsumedStatesByType(ChatState.class);
List<StateAndRef<ChatState>> chatStatesWithId = chatStates.stream()
List<StateAndRef<ChatState>> chatStateAndRefs = ledgerService.findUnconsumedStatesByType(ChatState.class);
List<StateAndRef<ChatState>> chatStateAndRefsWithId = chatStateAndRefs.stream()
.filter(sar -> sar.getState().getContractState().getId().equals(flowArgs.getId())).collect(toList());
if (chatStatesWithId.size() != 1) throw new CordaRuntimeException("Multiple or zero Chat states with id " + flowArgs.getId() + " found");
StateAndRef<ChatState> stateAndRef = chatStatesWithId.get(0);
if (chatStateAndRefsWithId.size() != 1) throw new CordaRuntimeException("Multiple or zero Chat states with id " + flowArgs.getId() + " found");
StateAndRef<ChatState> chatStateAndRef = chatStateAndRefsWithId.get(0);
MemberInfo myInfo = memberLookup.myInfo();
ChatState state = stateAndRef.getState().getContractState();
ChatState state = chatStateAndRef.getState().getContractState();
List<MemberInfo> members = state.getParticipants().stream().map(
it -> requireNonNull(memberLookup.lookup(it), "Member not found from public Key "+ it + ".")
@ -95,10 +95,10 @@ public class UpdateChatFlow implements RPCStartableFlow {
ChatState newChatState = state.updateMessage(myInfo.getName(), flowArgs.getMessage());
UtxoTransactionBuilder txBuilder = ledgerService.getTransactionBuilder()
.setNotary(stateAndRef.getState().getNotary())
.setNotary(chatStateAndRef.getState().getNotary())
.setTimeWindowBetween(Instant.now(), Instant.now().plusMillis(Duration.ofDays(1).toMillis()))
.addOutputState(newChatState)
.addInputState(stateAndRef.getRef())
.addInputState(chatStateAndRef.getRef())
.addCommand(new ChatContract.Update())
.addSignatories(newChatState.getParticipants());