diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 748c960dce..5f1b6183c7 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -9,6 +9,9 @@ Unreleased * Upgraded H2 to v1.4.197. +* Shell (embedded available only in dev mode or via SSH) connects to the node via RPC instead of using the ``CordaRPCOps`` object directly. + To enable RPC connectivity ensure node’s ``rpcSettings.address`` and ``rpcSettings.adminAddress`` settings are present. + * Changes to the network bootstrapper: * The whitelist.txt file is no longer needed. The existing network parameters file is used to update the current contracts whitelist. @@ -65,7 +68,26 @@ than 2.12.3 (including 2.12.4) exhibit a different issue. * java.math.BigInteger serialization support added. +* Fix CORDA-1355: Reduce amount of classpath scanning during integration tests execution. + * java.security.cert.CRLReason added to the default Whitelist. +* Fix CORDA-1355: Reduce amount of classpath scanning during integration tests execution. + +.. _changelog_v3.1: + +Version 3.1 +----------- + +* Update the fast-classpath-scanner dependent library version from 2.0.21 to 2.12.3 + + .. note:: Whilst this is not the latest version of this library, that being 2.18.1 at time of writing, versions later + than 2.12.3 (including 2.12.4) exhibit a different issue. + +* Updated the api scanner gradle plugin to work the same way as the version in master. These changes make the api scanner more + accurate and fix a couple of bugs, and change the format of the api-current.txt file slightly. Backporting these changes + to the v3 branch will make it easier for us to ensure that apis are stable for future versions. These changes are + released in gradle plugins version 3.0.10. For more information on the api scanner see + the `documentation `_. * java.security.cert.X509CRL serialization support added. diff --git a/docs/source/cordapp-custom-serializers.rst b/docs/source/cordapp-custom-serializers.rst index 4541d18f3d..969348fbad 100644 --- a/docs/source/cordapp-custom-serializers.rst +++ b/docs/source/cordapp-custom-serializers.rst @@ -17,11 +17,16 @@ Custom serializer classes should follow the rules for including classes found in Writing a Custom Serializer --------------------------- Serializers must - * Inherit from net.corda.core.serialization.SerializationCustomSerializer + * Inherit from ``net.corda.core.serialization.SerializationCustomSerializer`` * Provide a proxy class to transform the object to and from * Implement the ``toProxy`` and ``fromProxy`` methods + * Be either included into CorDapp Jar or made known to the running process via ``amqp.custom.serialization.scanSpec`` +system property. +This system property may be necessary to be able to discover custom serializer in the classpath. At a minimum the value +of the property should include comma separated set of packages where custom serializers located. Full syntax includes +scanning specification as defined by: `` -Serializers inheriting from SerializationCustomSerializer have to implement two methods and two types. +Serializers inheriting from ``SerializationCustomSerializer`` have to implement two methods and two types. Example ------- diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt index 78c0597060..d2240540f2 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt @@ -51,16 +51,26 @@ abstract class AbstractAMQPSerializationScheme( // TODO: This method of initialisation for the Whitelist and plugin serializers will have to change // when we have per-cordapp contexts and dynamic app reloading but for now it's the easiest way companion object { + + const val SCAN_SPEC_PROP_NAME = "amqp.custom.serialization.scanSpec" + private val serializationWhitelists: List by lazy { ServiceLoader.load(SerializationWhitelist::class.java, this::class.java.classLoader).toList() + DefaultWhitelist } private val customSerializers: List> by lazy { - FastClasspathScanner().addClassLoader(this::class.java.classLoader).scan() - .getNamesOfClassesImplementing(SerializationCustomSerializer::class.java) - .mapNotNull { this::class.java.classLoader.loadClass(it).asSubclass(SerializationCustomSerializer::class.java) } - .filterNot { Modifier.isAbstract(it.modifiers) } - .map { it.kotlin.objectOrNewInstance() } + + val scanSpec: String? = System.getProperty(SCAN_SPEC_PROP_NAME) + + if(scanSpec == null) { + emptyList() + } else { + FastClasspathScanner(scanSpec).addClassLoader(this::class.java.classLoader).scan() + .getNamesOfClassesImplementing(SerializationCustomSerializer::class.java) + .mapNotNull { this::class.java.classLoader.loadClass(it).asSubclass(SerializationCustomSerializer::class.java) } + .filterNot { Modifier.isAbstract(it.modifiers) } + .map { it.kotlin.objectOrNewInstance() } + } } } diff --git a/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt b/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt index 02d98752d3..f9bc72f88e 100644 --- a/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt +++ b/samples/simm-valuation-demo/src/integration-test/kotlin/net/corda/vega/SimmValuationTest.kt @@ -12,7 +12,9 @@ package net.corda.vega import com.opengamma.strata.product.common.BuySell import net.corda.core.identity.CordaX500Name +import net.corda.core.internal.packageName import net.corda.core.utilities.getOrThrow +import net.corda.nodeapi.internal.serialization.amqp.AbstractAMQPSerializationScheme import net.corda.testing.core.DUMMY_BANK_A_NAME import net.corda.testing.core.DUMMY_BANK_B_NAME import net.corda.testing.core.DUMMY_NOTARY_NAME @@ -26,7 +28,10 @@ import net.corda.vega.api.PortfolioApi import net.corda.vega.api.PortfolioApiUtils import net.corda.vega.api.SwapDataModel import net.corda.vega.api.SwapDataView +import net.corda.vega.plugin.customserializers.CurrencyParameterSensitivitiesSerializer import org.assertj.core.api.Assertions.assertThat +import org.junit.After +import org.junit.Before import org.junit.ClassRule import org.junit.Test import java.math.BigDecimal @@ -46,6 +51,16 @@ class SimmValuationTest : IntegrationTest() { .map { it.toDatabaseSchemaName() }.toTypedArray()) } + @Before + fun setup() { + System.setProperty(AbstractAMQPSerializationScheme.SCAN_SPEC_PROP_NAME, CurrencyParameterSensitivitiesSerializer::class.packageName) + } + + @After + fun tearDown() { + System.clearProperty(AbstractAMQPSerializationScheme.SCAN_SPEC_PROP_NAME) + } + @Test fun `runs SIMM valuation demo`() { driver(DriverParameters(isDebug = true, extraCordappPackagesToScan = listOf("net.corda.vega.contracts", "net.corda.vega.plugin.customserializers"))) { diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt index d5a24ee12a..73084b0bd1 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt @@ -49,6 +49,7 @@ import net.corda.nodeapi.internal.crypto.X509KeyStore import net.corda.nodeapi.internal.crypto.X509Utilities import net.corda.nodeapi.internal.network.NetworkParametersCopier import net.corda.nodeapi.internal.network.NodeInfoFilesCopier +import net.corda.nodeapi.internal.serialization.amqp.AbstractAMQPSerializationScheme import net.corda.testing.core.ALICE_NAME import net.corda.testing.core.BOB_NAME import net.corda.testing.core.DUMMY_BANK_A_NAME @@ -761,10 +762,11 @@ class DriverDSLImpl( val systemProperties = mutableMapOf( "name" to config.corda.myLegalName, "visualvm.display.name" to "corda-${config.corda.myLegalName}", - "java.io.tmpdir" to System.getProperty("java.io.tmpdir"), // Inherit from parent process "log4j2.debug" to if (debugPort != null) "true" else "false" ) + systemProperties += inheritFromParentProcess() + if (cordappPackages.isNotEmpty()) { systemProperties += Node.scanPackagesSystemProperty to cordappPackages.joinToString(Node.scanPackagesSeparator) } @@ -808,15 +810,26 @@ class DriverDSLImpl( className = className, // cannot directly get class for this, so just use string arguments = listOf("--base-directory", handle.baseDirectory.toString()), jdwpPort = debugPort, - extraJvmArguments = listOf( - "-Dname=node-${handle.p2pAddress}-webserver", - "-Djava.io.tmpdir=${System.getProperty("java.io.tmpdir")}" // Inherit from parent process - ), + extraJvmArguments = listOf("-Dname=node-${handle.p2pAddress}-webserver") + + inheritFromParentProcess().map { "-D${it.first}=${it.second}" }, workingDirectory = null, maximumHeapSize = maximumHeapSize ) } + private val propertiesInScope = setOf("java.io.tmpdir", AbstractAMQPSerializationScheme.SCAN_SPEC_PROP_NAME) + + private fun inheritFromParentProcess() : Iterable> { + return propertiesInScope.flatMap { propName -> + val propValue : String? = System.getProperty(propName) + if(propValue == null) { + emptySet() + } else { + setOf(Pair(propName, propValue)) + } + } + } + private fun NodeHandleInternal.toWebServerConfig(): Config { var config = ConfigFactory.empty()