DOC-4345: updated edited Java CSDE template code comments

This commit is contained in:
Niamh25 2022-11-17 16:27:11 +00:00
parent 87be2276ff
commit fe9ab2cda1
7 changed files with 55 additions and 55 deletions

View File

@ -31,7 +31,7 @@ def javaVersion = VERSION_11
cordapp { cordapp {
// "targetPlatformVersion" and "minimumPlatformVersion" are intended to specify the preferred // "targetPlatformVersion" and "minimumPlatformVersion" are intended to specify the preferred
// and earliest versions of the Corda platform that the CorDapp will run on respectively. // and earliest versions of the Corda platform that the CorDapp will run on respectively.
// Enforced versioning has not implemented yet so we need to pass in a dummy value for now. // Enforced versioning has not been implemented yet, so enter a dummy value for now.
// The platform version will correspond to and be roughly equivalent to the Corda API version. // The platform version will correspond to and be roughly equivalent to the Corda API version.
targetPlatformVersion platformVersion.toInteger() targetPlatformVersion platformVersion.toInteger()
minimumPlatformVersion platformVersion.toInteger() minimumPlatformVersion platformVersion.toInteger()
@ -61,7 +61,7 @@ repositories {
// Declare dependencies for the modules we will use. // Declare dependencies for the modules we will use.
// A cordaProvided declaration is required for anything that we use that the Corda API provides. // A cordaProvided declaration is required for anything that we use that the Corda API provides.
// This is required to allow us to build CorDapp modules as OSGi bundles that CPI and CPB files are built on. // This is required to allow us to build CorDapp modules as OSGi bundles that CPI and CPB files are then built upon.
dependencies { dependencies {
// Declare a "platform" so that we use the correct set of dependency versions for the version of the // Declare a "platform" so that we use the correct set of dependency versions for the version of the
// Corda API specified. // Corda API specified.

View File

@ -34,8 +34,8 @@ def cordaBinDir= System.getProperty('user.home') + "/.corda/corda5"
def cordaCliBinDir = System.getProperty('user.home') + "/.corda/cli" def cordaCliBinDir = System.getProperty('user.home') + "/.corda/cli"
def cordaJDBCDir = cordaBinDir + "/jdbcDrivers" def cordaJDBCDir = cordaBinDir + "/jdbcDrivers"
def signingCertAlias="gradle-plugin-default-key" def signingCertAlias="gradle-plugin-default-key"
// Get error if this is not a autotyped object // You will receive an error if this is not a autotyped object.
// def signingCertFName = "$rootDir/config/gradle-plugin-default-key.pem" // def signingCertFName = "$rootDir/config/gradle-plugin-default-key.pem".
def signingCertFName = rootDir.toString() + "/config/gradle-plugin-default-key.pem" def signingCertFName = rootDir.toString() + "/config/gradle-plugin-default-key.pem"
def keystoreAlias = "my-signing-key" def keystoreAlias = "my-signing-key"
def keystoreFName = devEnvWorkspace + "/signingkeys.pfx" def keystoreFName = devEnvWorkspace + "/signingkeys.pfx"
@ -136,7 +136,7 @@ tasks.register('createKeystore') {
"-storetype", "pkcs12", "-storetype", "pkcs12",
"-validity", "4000" "-validity", "4000"
} }
// Need to add the default signing key to the keystore // Add the default signing key to the keystore.
exec { exec {
commandLine "${System.getProperty("java.home")}/bin/keytool", "-importcert", commandLine "${System.getProperty("java.home")}/bin/keytool", "-importcert",
"-keystore", keystoreFName, "-keystore", keystoreFName,
@ -172,7 +172,7 @@ tasks.register('buildCPI') {
File srcDir File srcDir
srcDir = file('build/libs') srcDir = file('build/libs')
// Create a file collection using a closure // Create a file collection using a closure.
def collection = layout.files { srcDir.listFiles() } def collection = layout.files { srcDir.listFiles() }
def cpbs = collection.filter { it.getName().endsWith(".cpb") } def cpbs = collection.filter { it.getName().endsWith(".cpb") }
@ -225,7 +225,7 @@ tasks.register('listCPIs') {
} }
} }
// Empty task, just acts as the Task user entry point task. // Empty task, this acts as the user entry point task.
tasks.register('deployCordapp') { tasks.register('deployCordapp') {
group = pluginGroupName group = pluginGroupName
dependsOn("createAndRegVNodes") dependsOn("createAndRegVNodes")

View File

@ -202,9 +202,9 @@ public class CsdeRpcInterface {
private boolean uploadStatusRetry(kong.unirest.HttpResponse<kong.unirest.JsonNode> response) { private boolean uploadStatusRetry(kong.unirest.HttpResponse<kong.unirest.JsonNode> response) {
int status = response.getStatus(); int status = response.getStatus();
kong.unirest.JsonNode body = response.getBody(); kong.unirest.JsonNode body = response.getBody();
// Do not retry on success // Do not retry if successful.
if(status == 200) { if(status == 200) {
// Keep retrying until we get "OK" may move through "Validateing upload", "Persisting CPI" // Retry until you get an "OK", it may move to "Validating upload", "Persisting CPI".
return !(body.getObject().get("status").equals("OK")); return !(body.getObject().get("status").equals("OK"));
} }
else if (status == 400){ else if (status == 400){
@ -269,7 +269,7 @@ public class CsdeRpcInterface {
out.println("Upload Status:" + status); out.println("Upload Status:" + status);
out.println("Pretty print the body\n" + body.toPrettyString()); out.println("Pretty print the body\n" + body.toPrettyString());
// We expect the id field to be a string. // Expect the ID field to be a string.
if (status == 200) { if (status == 200) {
String id = (String) body.getObject().get("id"); String id = (String) body.getObject().get("id");
out.println("get id:\n" + id); out.println("get id:\n" + id);
@ -299,7 +299,7 @@ public class CsdeRpcInterface {
LinkedList<String> x500Ids = getConfigX500Ids(); LinkedList<String> x500Ids = getConfigX500Ids();
LinkedList<String> OKHoldingShortIds = new LinkedList<>(); LinkedList<String> OKHoldingShortIds = new LinkedList<>();
// For each identity check that it already exists. // Check that each identity already exists.
Set<MemberX500Name> existingX500 = new HashSet<>(); Set<MemberX500Name> existingX500 = new HashSet<>();
kong.unirest.HttpResponse<kong.unirest.JsonNode> vnodeListResponse = getVNodeInfo(); kong.unirest.HttpResponse<kong.unirest.JsonNode> vnodeListResponse = getVNodeInfo();
@ -322,9 +322,9 @@ public class CsdeRpcInterface {
.asJson(); .asJson();
// Logging. // Logging.
// need to check this and report errors. // Check this and report errors.
// 200 - OK // 200 - OK.
// 409 - Vnode already exists // 409 - Vnode already exists.
if (jsonNode.getStatus() != 409) { if (jsonNode.getStatus() != 409) {
if (jsonNode.getStatus() != 200) { if (jsonNode.getStatus() != 200) {
reportError(jsonNode); reportError(jsonNode);
@ -340,7 +340,7 @@ public class CsdeRpcInterface {
} }
} }
// Register the VNodes // Register the VNodes.
for(String shortHoldingIdHash: OKHoldingShortIds) { for(String shortHoldingIdHash: OKHoldingShortIds) {
kong.unirest.HttpResponse<kong.unirest.JsonNode> vnodeResponse = Unirest.post(baseURL + "/api/v1/membership/" + shortHoldingIdHash) kong.unirest.HttpResponse<kong.unirest.JsonNode> vnodeResponse = Unirest.post(baseURL + "/api/v1/membership/" + shortHoldingIdHash)
.body("{ \"memberRegistrationRequest\": { \"action\": \"requestJoin\", \"context\": { \"corda.key.scheme\" : \"CORDA.ECDSA.SECP256R1\" } } }") .body("{ \"memberRegistrationRequest\": { \"action\": \"requestJoin\", \"context\": { \"corda.key.scheme\" : \"CORDA.ECDSA.SECP256R1\" } } }")

View File

@ -3,8 +3,8 @@ package com.r3.developers.csdetemplate;
import net.corda.v5.base.annotations.CordaSerializable; import net.corda.v5.base.annotations.CordaSerializable;
import net.corda.v5.base.types.MemberX500Name; import net.corda.v5.base.types.MemberX500Name;
// A class which will contain a message, It must be marked with @CordaSerializable for Corda // Where a class contains a message, mark it with @CordaSerializable to enable Corda to
// to be able to send from one virtual node to another. // send it from one virtual node to another.
@CordaSerializable @CordaSerializable
public class Message { public class Message {
public Message(MemberX500Name sender, String message) { public Message(MemberX500Name sender, String message) {

View File

@ -18,46 +18,46 @@ import org.slf4j.LoggerFactory;
// MyFirstFlow should inherit from RPCStartableFlow, which tells Corda it can be started via an RPC call // MyFirstFlow should inherit from RPCStartableFlow, which tells Corda it can be started via an RPC call
public class MyFirstFlow implements RPCStartableFlow { public class MyFirstFlow implements RPCStartableFlow {
// It is useful to be able to log messages from the flows for debugging. // Log messages from the flows for debugging.
private final Logger log = LoggerFactory.getLogger(MyFirstFlow.class); private final Logger log = LoggerFactory.getLogger(MyFirstFlow.class);
// Corda has a set of injectable services which are injected into the flow at runtime. // Corda has a set of injectable services which are injected into the flow at runtime.
// Flows declare them with @CordaInjectable, then the flows have access to their services. // Flows declare them with @CordaInjectable, then the flows have access to their services.
// JsonMarshallingService provides a Service for manipulating json // JsonMarshallingService provides a service for manipulating JSON.
@CordaInject @CordaInject
public JsonMarshallingService jsonMarshallingService; public JsonMarshallingService jsonMarshallingService;
// FlowMessaging provides a service for establishing flow sessions between Virtual Nodes and // FlowMessaging establishes flow sessions between virtual nodes
// sending and receiving payloads between them // that sends and receives payloads between them.
@CordaInject @CordaInject
public FlowMessaging flowMessaging; public FlowMessaging flowMessaging;
// MemberLookup provides a service for looking up information about members of the Virtual Network which // MemberLookup looks for information about members of the virtual network
// this CorDapp is operating in. // which this CorDapp operates in.
@CordaInject @CordaInject
public MemberLookup memberLookup; public MemberLookup memberLookup;
public MyFirstFlow() {} public MyFirstFlow() {}
// When a flow is invoked its call() method is called. // When a flow is invoked its call() method is called.
// call() methods must be marked as @Suspendable, this allows Corda to pause mid-execution to wait // Call() methods must be marked as @Suspendable, this allows Corda to pause mid-execution to wait
// for a response from the other flows and services // for a response from the other flows and services.
@NotNull @NotNull
@Suspendable @Suspendable
@Override @Override
public String call(RPCRequestData requestBody) { public String call(RPCRequestData requestBody) {
// Useful logging to follow what's happening in the console or logs // Follow what happens in the console or logs.
log.info("MFF: MyFirstFlow.call() called"); log.info("MFF: MyFirstFlow.call() called");
// Show the requestBody in the logs - this can be used to help establish the format for starting a flow on corda // Show the requestBody in the logs - this can be used to help establish the format for starting a flow on Corda.
log.info("MFF: requestBody: " + requestBody.getRequestBody()); log.info("MFF: requestBody: " + requestBody.getRequestBody());
// Deserialize the Json requestBody into the MyfirstFlowStartArgs class using the JsonSerialisation Service // Deserialize the Json requestBody into the MyfirstFlowStartArgs class using the JsonSerialisation service.
MyFirstFlowStartArgs flowArgs = requestBody.getRequestBodyAs(jsonMarshallingService, MyFirstFlowStartArgs.class); MyFirstFlowStartArgs flowArgs = requestBody.getRequestBodyAs(jsonMarshallingService, MyFirstFlowStartArgs.class);
// Obtain the MemberX500Name of counterparty // Obtain the MemberX500Name of counterparty.
MemberX500Name otherMember = flowArgs.otherMember; MemberX500Name otherMember = flowArgs.otherMember;
// Get our identity from the MemberLookup service. // Get our identity from the MemberLookup service.
@ -69,19 +69,19 @@ public class MyFirstFlow implements RPCStartableFlow {
// Log the message to be sent. // Log the message to be sent.
log.info("MFF: message.message: " + message.message); log.info("MFF: message.message: " + message.message);
// Start a flow session with the otherMember using the FlowMessaging service // Start a flow session with the otherMember using the FlowMessaging service.
// The otherMember's Virtual Node will run the corresponding MyFirstFlowResponder responder flow // The otherMember's virtual node will run the corresponding MyFirstFlowResponder responder flow.
FlowSession session = flowMessaging.initiateFlow(otherMember); FlowSession session = flowMessaging.initiateFlow(otherMember);
// Send the Payload using the send method on the session to the MyFirstFlowResponder Responder flow // Send the Payload using the send method on the session to the MyFirstFlowResponder responder flow.
session.send(message); session.send(message);
// Receive a response from the Responder flow // Receive a response from the responder flow.
Message response = session.receive(Message.class); Message response = session.receive(Message.class);
// The return value of a RPCStartableFlow must always be a String, this string will be passed // The return value of a RPCStartableFlow must always be a string. This string will pass
// back as the REST RPC response when the status of the flow is queried on Corda, or as the return // back as the REST RPC response when the status of the flow is queried on Corda, or as the return
// value from the flow when testing using the Simulator // value from the flow when testing using the simulator.
return response.message; return response.message;
} }
} }

View File

@ -17,19 +17,19 @@ import org.slf4j.LoggerFactory;
// Responder flows must inherit from ResponderFlow // Responder flows must inherit from ResponderFlow
public class MyFirstFlowResponder implements ResponderFlow { public class MyFirstFlowResponder implements ResponderFlow {
// It is useful to be able to log messages from the flows for debugging. // Log messages from the flows for debugging.
private final Logger log = LoggerFactory.getLogger(MyFirstFlowResponder.class); private final Logger log = LoggerFactory.getLogger(MyFirstFlowResponder.class);
// MemberLookup provides a service for looking up information about members of the Virtual Network which // MemberLookup looks for information about members of the virtual network which
// this CorDapp is operating in. // this CorDapp operates in.
@CordaInject @CordaInject
public MemberLookup memberLookup; public MemberLookup memberLookup;
public MyFirstFlowResponder() {} public MyFirstFlowResponder() {}
// Responder flows are invoked when an initiating flow makes a call via a session set up with the Virtual // Responder flows are invoked when an initiating flow makes a call via a session set up with the virtual
// node hosting the Responder flow. When a responder flow is invoked its call() method is called. // node hosting the responder flow. When a responder flow is invoked its call() method is called.
// call() methods must be marked as @Suspendable, this allows Corda to pause mid-execution to wait // Call() methods must be marked as @Suspendable, this allows Corda to pause mid-execution to wait
// for a response from the other flows and services. // for a response from the other flows and services.
// The Call method has the flow session passed in as a parameter by Corda so the session is available to // The Call method has the flow session passed in as a parameter by Corda so the session is available to
// responder flow code, you don't need to inject the FlowMessaging service. // responder flow code, you don't need to inject the FlowMessaging service.
@ -37,10 +37,10 @@ public class MyFirstFlowResponder implements ResponderFlow {
@Override @Override
public void call(FlowSession session) { public void call(FlowSession session) {
// Useful logging to follow what's happening in the console or logs // Follow what happens in the console or logs.
log.info("MFF: MyFirstResponderFlow.call() called"); log.info("MFF: MyFirstResponderFlow.call() called");
// Receive the payload and deserialize it into a Message class // Receive the payload and deserialize it into a message class.
Message receivedMessage = session.receive(Message.class); Message receivedMessage = session.receive(Message.class);
// Log the message as a proxy for performing some useful operation on it. // Log the message as a proxy for performing some useful operation on it.
@ -49,7 +49,7 @@ public class MyFirstFlowResponder implements ResponderFlow {
// Get our identity from the MemberLookup service. // Get our identity from the MemberLookup service.
MemberX500Name ourIdentity = memberLookup.myInfo().getName(); MemberX500Name ourIdentity = memberLookup.myInfo().getName();
// Create a response to greet the sender // Create a message to greet the sender.
Message response = new Message(ourIdentity, Message response = new Message(ourIdentity,
"Hello " + session.getCounterparty().getCommonName() + ", best wishes from " + ourIdentity.getCommonName()); "Hello " + session.getCounterparty().getCommonName() + ", best wishes from " + ourIdentity.getCommonName());

View File

@ -17,32 +17,32 @@ class MyFirstFlowTest {
@Test @Test
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void test_that_MyFirstFLow_returns_correct_message() { public void test_that_MyFirstFLow_returns_correct_message() {
// Instantiate an instance of the Simulator // Instantiate an instance of the simulator.
Simulator simulator = new Simulator(); Simulator simulator = new Simulator();
// Create Alice's and Bob HoldingIDs // Create Alice's and Bob HoldingIDs.
HoldingIdentity aliceHoldingID = HoldingIdentity.Companion.create(aliceX500); HoldingIdentity aliceHoldingID = HoldingIdentity.Companion.create(aliceX500);
HoldingIdentity bobHoldingID = HoldingIdentity.Companion.create(bobX500); HoldingIdentity bobHoldingID = HoldingIdentity.Companion.create(bobX500);
// Create Alice and Bob's virtual nodes, including the Class's of the flows which will be registered on each node. // Create Alice's and Bob's virtual nodes, including the classes of the flows which will be registered on each node.
// We don't assign Bob's virtual node to a variable because we don't need it for this particular test. // Don't assign Bob's virtual node to a value. You don't need it for this particular test.
SimulatedVirtualNode aliceVN = simulator.createVirtualNode(aliceHoldingID, MyFirstFlow.class); SimulatedVirtualNode aliceVN = simulator.createVirtualNode(aliceHoldingID, MyFirstFlow.class);
simulator.createVirtualNode(bobHoldingID, MyFirstFlowResponder.class); simulator.createVirtualNode(bobHoldingID, MyFirstFlowResponder.class);
// Create an instance of the MyFirstFlowStartArgs which contains the request arguments for starting the flow // Create an instance of the MyFirstFlowStartArgs which contains the request arguments for starting the flow.
MyFirstFlowStartArgs myFirstFlowStartArgs = new MyFirstFlowStartArgs(bobX500); MyFirstFlowStartArgs myFirstFlowStartArgs = new MyFirstFlowStartArgs(bobX500);
// Create a requestData object // Create a requestData object.
RequestData requestData = RequestData.Companion.create( RequestData requestData = RequestData.Companion.create(
"request no 1", // A unique reference for the instance of the flow request "request no 1", // A unique reference for the instance of the flow request.
MyFirstFlow.class, // The name of the flow class which is to be started MyFirstFlow.class, // The name of the flow class which is to be started.
myFirstFlowStartArgs // The object which contains the start arguments of the flow myFirstFlowStartArgs // The object which contains the start arguments of the flow.
); );
// Call the Flow on Alice's virtual node and capture the response from the flow // Call the flow on Alice's virtual node and capture the response.
String flowResponse = aliceVN.callFlow(requestData); String flowResponse = aliceVN.callFlow(requestData);
// Check that the flow has returned the expected string // Check that the flow has returned the expected string.
assert(flowResponse.equals("Hello Alice, best wishes from Bob")); assert(flowResponse.equals("Hello Alice, best wishes from Bob"));
} }
} }