Update initial Java work with DP2 branch
This commit is contained in:
		
						commit
						3cffe5ab90
					
				
							
								
								
									
										1
									
								
								.ci/Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.ci/Jenkinsfile
									
									
									
									
										vendored
									
									
								
							@ -6,4 +6,5 @@ cordaPipeline(
 | 
				
			|||||||
    runUnitTests: false,
 | 
					    runUnitTests: false,
 | 
				
			||||||
    dedicatedJobForSnykDelta: false,
 | 
					    dedicatedJobForSnykDelta: false,
 | 
				
			||||||
    slackChannel: '#corda-corda5-dev-ex-build-notifications'
 | 
					    slackChannel: '#corda-corda5-dev-ex-build-notifications'
 | 
				
			||||||
 | 
					    dedicatedJobForSnykDelta: false
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										45
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								build.gradle
									
									
									
									
									
								
							@ -4,7 +4,7 @@ plugins {
 | 
				
			|||||||
    id 'org.jetbrains.kotlin.jvm'
 | 
					    id 'org.jetbrains.kotlin.jvm'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Include the cordapp-cpb plugin. This automatically includes the cordapp-cpk plugin as well.
 | 
					    // Include the cordapp-cpb plugin. This automatically includes the cordapp-cpk plugin as well.
 | 
				
			||||||
    // These extend existing build environment so that CPB and CPK files can be built.
 | 
					    // These extend the existing build environment so that CPB and CPK files can be built.
 | 
				
			||||||
    // This includes a CorDapp DSL that allows the developer to supply metadata for the CorDapp
 | 
					    // This includes a CorDapp DSL that allows the developer to supply metadata for the CorDapp
 | 
				
			||||||
    // required by Corda.
 | 
					    // required by Corda.
 | 
				
			||||||
    id 'net.corda.plugins.cordapp-cpb2'
 | 
					    id 'net.corda.plugins.cordapp-cpb2'
 | 
				
			||||||
@ -45,36 +45,6 @@ cordapp {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
// Declare the set of Kotlin compiler options we need to build a CorDapp.
 | 
					 | 
				
			||||||
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
 | 
					 | 
				
			||||||
    kotlinOptions {
 | 
					 | 
				
			||||||
        allWarningsAsErrors = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Specify the version of Kotlin that we are that we will be developing. 
 | 
					 | 
				
			||||||
        languageVersion = '1.7'
 | 
					 | 
				
			||||||
        // Specify the Kotlin libraries that code is compatible with
 | 
					 | 
				
			||||||
        apiVersion = '1.7'
 | 
					 | 
				
			||||||
        // Note that we Need to use a version of Kotlin that will be compatible with the Corda API.
 | 
					 | 
				
			||||||
        // Currently that is developed in Kotlin 1.7 so picking the same version ensures compatibility with that.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Specify the version of Java to target.
 | 
					 | 
				
			||||||
        jvmTarget = javaVersion
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Needed for reflection to work correctly.
 | 
					 | 
				
			||||||
        javaParameters = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // -Xjvm-default determines how Kotlin supports default methods.
 | 
					 | 
				
			||||||
        // JetBrains currently recommends developers use -Xjvm-default=all
 | 
					 | 
				
			||||||
        // https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-default/
 | 
					 | 
				
			||||||
        freeCompilerArgs += [
 | 
					 | 
				
			||||||
                "-Xjvm-default=all"
 | 
					 | 
				
			||||||
        ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Declare the set of Kotlin compiler options we need to build a CorDapp.
 | 
					// Declare the set of Kotlin compiler options we need to build a CorDapp.
 | 
				
			||||||
tasks.withType(JavaCompile) {
 | 
					tasks.withType(JavaCompile) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -84,8 +54,6 @@ tasks.withType(JavaCompile) {
 | 
				
			|||||||
    ]
 | 
					    ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
repositories {
 | 
					repositories {
 | 
				
			||||||
    mavenLocal()
 | 
					    mavenLocal()
 | 
				
			||||||
    // All dependencies are held in Maven Central
 | 
					    // All dependencies are held in Maven Central
 | 
				
			||||||
@ -138,18 +106,11 @@ repositories {
 | 
				
			|||||||
// 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 built on.
 | 
				
			||||||
dependencies {
 | 
					dependencies {
 | 
				
			||||||
    // We need a version of kotlin-stdlib-jdk8 built as an OSGi bundle, this is "kotlin-stdlib-jdk8-osgi".
 | 
					 | 
				
			||||||
    // R3 builds kotlin-stdlib-jdk8-osgi from Kotlin's kotlin-stdlib-jdk8.
 | 
					 | 
				
			||||||
    // NB:
 | 
					 | 
				
			||||||
    //   Kotlin's kotlin-osgi-bundle does not provide all of the Kotlin API that is required,
 | 
					 | 
				
			||||||
    //   There is no kotlin-stdlib-jdk11, but one is not needed even though we are targetting Java 11.
 | 
					 | 
				
			||||||
    cordaProvided 'net.corda.kotlin:kotlin-stdlib-jdk8-osgi'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 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.
 | 
				
			||||||
    cordaProvided platform("net.corda:corda-api:$cordaApiVersion")
 | 
					    cordaProvided platform("net.corda:corda-api:$cordaApiVersion")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // If using transistive dependencies this will provide most of Corda-API: 
 | 
					    // If using transistive dependencies this will provide most of the Corda-API:
 | 
				
			||||||
    // cordaProvided 'net.corda:corda-application'
 | 
					    // cordaProvided 'net.corda:corda-application'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Alternatively we can explicitly specify all our Corda-API dependencies:
 | 
					    // Alternatively we can explicitly specify all our Corda-API dependencies:
 | 
				
			||||||
@ -178,9 +139,7 @@ dependencies {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Optional but used by exmaple tests.
 | 
					    // Optional but used by exmaple tests.
 | 
				
			||||||
    testImplementation "org.mockito:mockito-core:$mockitoVersion"
 | 
					    testImplementation "org.mockito:mockito-core:$mockitoVersion"
 | 
				
			||||||
    testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
 | 
					 | 
				
			||||||
    testImplementation "org.hamcrest:hamcrest-library:$hamcrestVersion"
 | 
					    testImplementation "org.hamcrest:hamcrest-library:$hamcrestVersion"
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -7,11 +7,11 @@ import net.corda.v5.base.types.MemberX500Name;
 | 
				
			|||||||
// to be able to send from one virtual node to another.
 | 
					// to be able to send from one virtual node to another.
 | 
				
			||||||
@CordaSerializable
 | 
					@CordaSerializable
 | 
				
			||||||
public class Message {
 | 
					public class Message {
 | 
				
			||||||
    // public Message() {}
 | 
					 | 
				
			||||||
    public Message(MemberX500Name sender, String message) {
 | 
					    public Message(MemberX500Name sender, String message) {
 | 
				
			||||||
        this.sender = sender;
 | 
					        this.sender = sender;
 | 
				
			||||||
        this.message = message;
 | 
					        this.message = message;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public MemberX500Name getSender() {
 | 
					    public MemberX500Name getSender() {
 | 
				
			||||||
        return sender;
 | 
					        return sender;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -14,7 +14,7 @@ import org.slf4j.LoggerFactory;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// MyFirstFlow is an initiating flow, it's corresponding responder flow is called MyFirstFlowResponder (defined below)
 | 
					// MyFirstFlow is an initiating flow, it's corresponding responder flow is called MyFirstFlowResponder (defined below)
 | 
				
			||||||
// to link the two sides of the flow together they need to have the same protocol.
 | 
					// to link the two sides of the flow together they need to have the same protocol.
 | 
				
			||||||
@InitiatingFlow(protocol = "another-flow")
 | 
					@InitiatingFlow(protocol = "my-first-flow")
 | 
				
			||||||
// 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 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -26,27 +26,27 @@ public class MyFirstFlow implements RPCStartableFlow {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // JsonMarshallingService provides a Service for manipulating json
 | 
					    // JsonMarshallingService provides a Service for manipulating json
 | 
				
			||||||
    @CordaInject
 | 
					    @CordaInject
 | 
				
			||||||
    JsonMarshallingService jsonMarshallingService;
 | 
					    public JsonMarshallingService jsonMarshallingService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // FlowMessaging provides a service for establishing flow sessions between Virtual Nodes and
 | 
					    // FlowMessaging provides a service for establishing flow sessions between Virtual Nodes and
 | 
				
			||||||
    // sending and receiving payloads between them
 | 
					    // sending and receiving payloads between them
 | 
				
			||||||
    @CordaInject
 | 
					    @CordaInject
 | 
				
			||||||
    FlowMessaging flowMessaging;
 | 
					    public FlowMessaging flowMessaging;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // MemberLookup provides a service for looking up information about members of the Virtual Network which
 | 
					    // MemberLookup provides a service for looking up information about members of the Virtual Network which
 | 
				
			||||||
    // this CorDapp is operating in.
 | 
					    // this CorDapp is operating in.
 | 
				
			||||||
    @CordaInject
 | 
					    @CordaInject
 | 
				
			||||||
    MemberLookup memberLookup;
 | 
					    public MemberLookup memberLookup;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public MyFirstFlow() {}
 | 
					    public MyFirstFlow() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // When a flow is invoked it's 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(@NotNull RPCRequestData requestBody) {
 | 
					    public String call(RPCRequestData requestBody) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Useful logging to follow what's happening in the console or logs
 | 
					        // Useful logging to follow what's happening in the console or logs
 | 
				
			||||||
        log.info("MFF: MyFirstFlow.call() called");
 | 
					        log.info("MFF: MyFirstFlow.call() called");
 | 
				
			||||||
 | 
				
			|||||||
@ -11,9 +11,9 @@ import org.slf4j.Logger;
 | 
				
			|||||||
import org.slf4j.LoggerFactory;
 | 
					import org.slf4j.LoggerFactory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MyFirstFlowResponder is a responder flow, it's corresponding initiating flow is called MyFirstFlow (defined above)
 | 
					// MyFirstFlowResponder is a responder flow, its corresponding initiating flow is called MyFirstFlow (defined in MyFirstFlow.java)
 | 
				
			||||||
// to link the two sides of the flow together they need to have the same protocol.
 | 
					// to link the two sides of the flow together they need to have the same protocol.
 | 
				
			||||||
@InitiatedBy(protocol = "another-flow")
 | 
					@InitiatedBy(protocol = "my-first-flow")
 | 
				
			||||||
// Responder flows must inherit from ResponderFlow
 | 
					// Responder flows must inherit from ResponderFlow
 | 
				
			||||||
public class MyFirstFlowResponder implements ResponderFlow {
 | 
					public class MyFirstFlowResponder implements ResponderFlow {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -23,14 +23,14 @@ public class MyFirstFlowResponder implements ResponderFlow {
 | 
				
			|||||||
    // MemberLookup provides a service for looking up information about members of the Virtual Network which
 | 
					    // MemberLookup provides a service for looking up information about members of the Virtual Network which
 | 
				
			||||||
    // this CorDapp is operating in.
 | 
					    // this CorDapp is operating in.
 | 
				
			||||||
    @CordaInject
 | 
					    @CordaInject
 | 
				
			||||||
    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 it's 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.
 | 
				
			||||||
    @Suspendable
 | 
					    @Suspendable
 | 
				
			||||||
 | 
				
			|||||||
@ -6,15 +6,10 @@ import net.corda.v5.base.types.MemberX500Name;
 | 
				
			|||||||
public class MyFirstFlowStartArgs {
 | 
					public class MyFirstFlowStartArgs {
 | 
				
			||||||
    public MemberX500Name otherMember;
 | 
					    public MemberX500Name otherMember;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public MemberX500Name getOtherMember() {
 | 
					 | 
				
			||||||
        return otherMember;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public MyFirstFlowStartArgs(MemberX500Name otherMember) {
 | 
					    public MyFirstFlowStartArgs(MemberX500Name otherMember) {
 | 
				
			||||||
        this.otherMember = otherMember;
 | 
					        this.otherMember = otherMember;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Without the following we get
 | 
					    // The JSON Marshalling Service, which handles serialisation, needs this constructor.
 | 
				
			||||||
    // "Cannot construct instance of `com.r3.developers.csdetemplate.MyFirstFlowStartArgs` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (String)\"{\"otherMember\":\"CN=Bob, OU=Test Dept, O=R3, L=London, C=GB\"}\"; line: 1, column: 2]"
 | 
					 | 
				
			||||||
    public MyFirstFlowStartArgs() {}
 | 
					    public MyFirstFlowStartArgs() {}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,5 @@
 | 
				
			|||||||
package com.r3.developers.csdetemplate;
 | 
					package com.r3.developers.csdetemplate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
import net.corda.simulator.HoldingIdentity;
 | 
					import net.corda.simulator.HoldingIdentity;
 | 
				
			||||||
import net.corda.simulator.RequestData;
 | 
					import net.corda.simulator.RequestData;
 | 
				
			||||||
import net.corda.simulator.SimulatedVirtualNode;
 | 
					import net.corda.simulator.SimulatedVirtualNode;
 | 
				
			||||||
@ -16,8 +15,8 @@ class MyFirstFlowTest {
 | 
				
			|||||||
    private MemberX500Name bobX500 = MemberX500Name.parse("CN=Bob, OU=Test Dept, O=R3, L=London, C=GB");
 | 
					    private MemberX500Name bobX500 = MemberX500Name.parse("CN=Bob, OU=Test Dept, O=R3, L=London, C=GB");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
 | 
					    @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();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -26,7 +25,7 @@ class MyFirstFlowTest {
 | 
				
			|||||||
        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 and Bob's virtual nodes, including the Class's of the flows which will be registered on each node.
 | 
				
			||||||
        // We don't assign Bob's virtual node to a val because we don't need it for this particular test.
 | 
					        // We don't assign Bob's virtual node to a variable because we 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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -36,7 +35,7 @@ class MyFirstFlowTest {
 | 
				
			|||||||
        // 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
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user