From 3cdd908714fec80237f40ce6f8a90a37198ac128 Mon Sep 17 00:00:00 2001 From: Shams Asari Date: Thu, 17 May 2018 16:18:07 +0100 Subject: [PATCH 01/12] Moved the serialisation logic in nodeapi.internal.serialization into its own module: serialization (#3179) node-api now depends on this module and upcoming changes will use this as well rather than having to depend on node-api. EnumEvolveTests.deserializeWithRename and EnumEvolveTests.multiOperations are temporarily ignored since their test resources can't be regenerated due to bugs. --- .idea/compiler.xml | 2 + build.gradle | 2 +- .../net/corda/client/rpc/CordaRPCClient.kt | 6 +- .../amqp/AMQPClientSerializationScheme.kt | 10 +- .../amqp/RpcClientCordaFutureSerializer.kt | 5 +- .../amqp/RpcClientObservableSerializer.kt | 2 +- ...VerificationExceptionSerialisationTests.kt | 12 +- .../corda/core/utilities/KotlinUtilsTest.kt | 10 +- .../net/corda/blobinspector/BlobInspector.kt | 4 +- .../net/corda/blobinspector/InMemoryTests.kt | 8 +- node-api/build.gradle | 14 +- .../internal/network/NetworkBootstrapper.kt | 14 +- .../amqp/custom/RxNotificationSerializer.kt | 4 +- .../amqp/custom/StringBufferSerializer.kt | 8 - .../internal/crypto/X509UtilitiesTest.kt | 8 +- ...EnumEvolvabilityTests.testUnknownTransform | Bin 785 -> 0 bytes ...umEvolveTests.deserialiseNewerSetToUnknown | Bin 818 -> 0 bytes ...volveTests.deserialiseNewerSetToUnknown2.C | Bin 873 -> 0 bytes ...volveTests.deserialiseNewerSetToUnknown2.D | Bin 873 -> 0 bytes ...volveTests.deserialiseNewerSetToUnknown2.E | Bin 873 -> 0 bytes .../EnumEvolveTests.deserializeWithRename.1.C | Bin 762 -> 0 bytes .../EnumEvolveTests.deserializeWithRename.2.C | Bin 791 -> 0 bytes .../EnumEvolveTests.deserializeWithRename.3.C | Bin 820 -> 0 bytes .../amqp/EnumEvolveTests.multiOperations.1.C | Bin 760 -> 0 bytes .../amqp/EnumEvolveTests.multiOperations.2.C | Bin 811 -> 0 bytes .../amqp/EnumEvolveTests.multiOperations.3.C | Bin 857 -> 0 bytes ...bilityTests.addAdditionalParamNotMandatory | Bin 292 -> 0 bytes .../EvolvabilityTests.addAndRemoveParameters | Bin 403 -> 0 bytes ...yTests.addMandatoryFieldWithAltConstructor | Bin 298 -> 0 bytes ...dMandatoryFieldWithAltReorderedConstructor | Bin 400 -> 0 bytes ...FieldWithAltReorderedConstructorAndRemoval | Bin 416 -> 0 bytes .../amqp/EvolvabilityTests.changeSubType | Bin 629 -> 0 bytes .../EvolvabilityTests.getterSetterEvolver1 | Bin 420 -> 0 bytes .../amqp/EvolvabilityTests.multiVersion.1 | Bin 307 -> 0 bytes .../amqp/EvolvabilityTests.multiVersion.2 | Bin 340 -> 0 bytes .../amqp/EvolvabilityTests.multiVersion.3 | Bin 385 -> 0 bytes ...volvabilityTests.multiVersionWithRemoval.1 | Bin 351 -> 0 bytes ...volvabilityTests.multiVersionWithRemoval.2 | Bin 405 -> 0 bytes ...volvabilityTests.multiVersionWithRemoval.3 | Bin 438 -> 0 bytes .../amqp/EvolvabilityTests.removeParameters | Bin 391 -> 0 bytes ...vabilityTests.simpleOrderSwapDifferentType | Bin 324 -> 0 bytes .../EvolvabilityTests.simpleOrderSwapSameType | Bin 315 -> 0 bytes .../amqp/GenericsTests.loadGenericFromFile | Bin 265 -> 0 bytes .../kotlin/net/corda/node/internal/Node.kt | 2 +- .../node/internal/cordapp/CordappLoader.kt | 2 +- .../amqp/AMQPServerSerializationScheme.kt | 7 +- .../amqp/RpcServerCordaFutureSerialiser.kt | 4 +- .../amqp/RpcServerObservableSerializer.kt | 4 +- .../kryo/KryoServerSerializationScheme.kt | 6 +- .../node/services/network/NodeInfoWatcher.kt | 4 +- .../SingleThreadedStateMachineManager.kt | 4 +- .../transactions/RaftTransactionCommitLog.kt | 2 +- .../internal/cordapp/CordappLoaderTest.kt | 2 +- .../RoundTripObservableSerializerTests.kt | 17 +- .../RpcServerObservableSerializerTests.kt | 10 +- .../testutils/AMQPTestSerialiationScheme.kt | 10 +- .../testutils/TestSerializationContext.kt | 6 +- .../net/corda/vega/SimmValuationTest.kt | 2 +- serialization/build.gradle | 58 +++++++ .../internal}/AllButBlacklisted.kt | 4 +- .../internal/AttachmentsClassLoader.kt | 2 +- .../internal}/ByteBufferStreams.kt | 2 +- .../serialization/internal/ClassWhitelists.kt | 11 ++ .../serialization/internal}/ClientContexts.kt | 8 +- .../internal}/DefaultWhitelist.kt | 2 +- .../internal}/GeneratedAttachment.kt | 2 +- .../serialization/internal}/OrdinalIO.kt | 2 +- .../internal}/SerializationFormat.kt | 4 +- .../internal}/SerializationScheme.kt | 7 +- .../internal}/SerializeAsTokenContextImpl.kt | 2 +- .../serialization/internal}/ServerContexts.kt | 8 +- .../serialization/internal}/SharedContexts.kt | 8 +- .../internal}/UseCaseAwareness.kt | 2 +- .../internal}/amqp/AMQPDescriptorRegistry.kt | 2 +- .../internal}/amqp/AMQPExceptions.kt | 2 +- .../internal}/amqp/AMQPPrimitiveSerializer.kt | 2 +- .../internal}/amqp/AMQPSerializationScheme.kt | 70 ++++---- .../internal}/amqp/AMQPSerializer.kt | 2 +- .../internal}/amqp/AMQPSerializerFactories.kt | 2 +- .../internal}/amqp/AMQPStreams.kt | 8 +- .../internal}/amqp/ArraySerializer.kt | 2 +- .../internal}/amqp/CollectionSerializer.kt | 2 +- .../internal}/amqp/CorDappCustomSerializer.kt | 4 +- .../internal}/amqp/CustomSerializer.kt | 4 +- .../internal}/amqp/DeserializationInput.kt | 4 +- .../amqp/DeserializedGenericArrayType.kt | 2 +- .../amqp/DeserializedParameterizedType.kt | 2 +- .../internal}/amqp/EnumEvolutionSerializer.kt | 2 +- .../internal}/amqp/EnumSerializer.kt | 2 +- .../serialization/internal}/amqp/Envelope.kt | 2 +- .../internal}/amqp/EvolutionSerializer.kt | 4 +- .../internal}/amqp/FingerPrinter.kt | 2 +- .../internal}/amqp/MapSerializer.kt | 2 +- .../internal}/amqp/ObjectSerializer.kt | 4 +- .../internal}/amqp/PropertySerializer.kt | 2 +- .../internal}/amqp/PropertySerializers.kt | 2 +- .../serialization/internal}/amqp/Schema.kt | 8 +- .../internal}/amqp/SerializationHelper.kt | 2 +- .../internal}/amqp/SerializationOutput.kt | 8 +- .../internal}/amqp/SerializerFactory.kt | 4 +- .../internal}/amqp/SingletonSerializer.kt | 2 +- .../internal}/amqp/SupportedTransforms.kt | 2 +- .../internal}/amqp/TransformTypes.kt | 3 +- .../internal}/amqp/TransformsSchema.kt | 2 +- .../amqp/custom/BigDecimalSerializer.kt | 4 +- .../amqp/custom/BigIntegerSerializer.kt | 4 +- .../internal}/amqp/custom/BitSetSerializer.kt | 6 +- .../amqp/custom/CertPathSerializer.kt | 6 +- .../internal}/amqp/custom/ClassSerializer.kt | 7 +- .../custom/ContractAttachmentSerializer.kt | 8 +- .../amqp/custom/CurrencySerializer.kt | 4 +- .../amqp/custom/DurationSerializer.kt | 6 +- .../amqp/custom/EnumSetSerializer.kt | 8 +- .../amqp/custom/InputStreamSerializer.kt | 4 +- .../amqp/custom/InstantSerializer.kt | 6 +- .../amqp/custom/LocalDateSerializer.kt | 6 +- .../amqp/custom/LocalDateTimeSerializer.kt | 6 +- .../amqp/custom/LocalTimeSerializer.kt | 6 +- .../amqp/custom/MonthDaySerializer.kt | 6 +- .../amqp/custom/OffsetDateTimeSerializer.kt | 6 +- .../amqp/custom/OffsetTimeSerializer.kt | 6 +- .../OpaqueBytesSubSequenceSerializer.kt | 6 +- .../internal}/amqp/custom/PeriodSerializer.kt | 6 +- .../amqp/custom/PrivateKeySerializer.kt | 6 +- .../amqp/custom/PublicKeySerializer.kt | 4 +- .../amqp/custom/SimpleStringSerializer.kt | 4 +- .../amqp/custom/StringBufferSerializer.kt | 8 + .../amqp/custom/ThrowableSerializer.kt | 4 +- .../amqp/custom/X509CRLSerializer.kt | 16 +- .../amqp/custom/X509CertificateSerializer.kt | 14 +- .../amqp/custom/YearMonthSerializer.kt | 6 +- .../internal}/amqp/custom/YearSerializer.kt | 6 +- .../internal}/amqp/custom/ZoneIdSerializer.kt | 6 +- .../amqp/custom/ZonedDateTimeSerializer.kt | 6 +- .../carpenter/AMQPSchemaExtensions.kt | 10 +- .../internal}/carpenter/ClassCarpenter.kt | 2 +- .../internal}/carpenter/Exceptions.kt | 2 +- .../internal}/carpenter/MetaCarpenter.kt | 8 +- .../internal}/carpenter/Schema.kt | 2 +- .../internal}/carpenter/SchemaFields.kt | 2 +- .../internal/kryo}/CordaClassResolver.kt | 20 +-- .../internal}/kryo/CordaClosureSerializer.kt | 2 +- .../internal}/kryo/DefaultKryoCustomizer.kt | 9 +- .../serialization/internal}/kryo/Kryo.kt | 10 +- .../internal}/kryo/KryoSerializationScheme.kt | 6 +- .../internal}/kryo/KryoStreams.kt | 4 +- .../kryo/SerializeAsTokenSerializer.kt | 2 +- .../ForbiddenLambdaSerializationTests.java | 4 +- .../LambdaCheckpointSerializationTest.java | 6 +- .../internal}/amqp/ErrorMessageTests.java | 6 +- .../internal}/amqp/JavaGenericsTest.java | 6 +- .../amqp/JavaNestedClassesTests.java | 6 +- .../amqp/JavaNestedInheritenceTests.java | 6 +- .../amqp/JavaPrivatePropertyTests.java | 6 +- .../amqp/JavaSerialiseEnumTests.java | 6 +- .../amqp/JavaSerializationOutputTests.java | 6 +- .../amqp/ListsSerializationJavaTest.java | 6 +- .../amqp/SetterConstructorTests.java | 6 +- .../testutils/TestSerializationContext.java | 6 +- .../corda/nodeapi/DummyContractBackdoor.kt | 0 .../internal/AttachmentsClassLoaderTests.kt | 17 +- .../ContractAttachmentSerializerTest.kt | 2 +- .../internal}/CordaClassResolverTests.kt | 34 ++-- .../internal}/ListsSerializationTest.kt | 10 +- .../internal}/MapsSerializationTest.kt | 4 +- .../internal}/PrivateKeySerializationTest.kt | 2 +- .../internal}/SerializationTokenTest.kt | 9 +- .../internal}/SetsSerializationTest.kt | 4 +- .../internal}/amqp/CorDappSerializerTests.kt | 12 +- .../amqp/DeserializeAndReturnEnvelopeTests.kt | 12 +- .../internal}/amqp/DeserializeMapTests.kt | 10 +- .../DeserializeNeedingCarpentryOfEnumsTest.kt | 8 +- ...erializeNeedingCarpentrySimpleTypesTest.kt | 14 +- .../amqp/DeserializeNeedingCarpentryTests.kt | 16 +- .../amqp/DeserializeSimpleTypesTests.kt | 10 +- .../DeserializedParameterizedTypeTests.kt | 2 +- .../internal}/amqp/EnumEvolvabilityTests.kt | 32 ++-- .../internal}/amqp/EnumEvolveTests.kt | 23 +-- .../serialization/internal}/amqp/EnumTests.kt | 22 +-- .../internal}/amqp/ErrorMessagesTests.kt | 12 +- .../amqp/EvolutionSerializerGetterTesting.kt | 2 +- .../internal}/amqp/EvolvabilityTests.kt | 20 +-- .../internal}/amqp/FingerPrinterTesting.kt | 8 +- .../internal}/amqp/GenericsTests.kt | 33 ++-- .../amqp/OverridePKSerializerTest.kt | 6 +- .../internal}/amqp/PrivatePropertyTests.kt | 10 +- .../internal}/amqp/RoundTripTests.kt | 8 +- .../amqp/SerializationOutputTests.kt | 162 +++++++++--------- .../amqp/SerializationPropertyOrdering.kt | 10 +- .../amqp/SerializationSchemaTests.kt | 6 +- .../amqp/SerializeAndReturnSchemaTest.kt | 8 +- ...ticInitialisationOfSerializedObjectTest.kt | 12 +- .../internal}/amqp/testutils/AMQPTestUtils.kt | 8 +- .../testutils/TestSerializationContext.kt | 8 +- .../carpenter/CarpenterExceptionTests.kt | 14 +- .../internal}/carpenter/ClassCarpenterTest.kt | 4 +- .../carpenter/ClassCarpenterTestUtils.kt | 10 +- .../carpenter/ClassCarpenterWhitelistTest.kt | 2 +- ...berCompositeSchemaToClassCarpenterTests.kt | 10 +- .../internal}/carpenter/EnumClassTests.kt | 4 +- .../InheritanceSchemaToClassCarpenterTests.kt | 8 +- ...berCompositeSchemaToClassCarpenterTests.kt | 10 +- ...berCompositeSchemaToClassCarpenterTests.kt | 10 +- .../internal}/kryo/KryoStreamsTest.kt | 4 +- .../serialization/internal}/kryo/KryoTests.kt | 4 +- ...EnumEvolvabilityTests.testUnknownTransform | Bin 0 -> 753 bytes .../amqp/EnumEvolveTests.changedOrdinality | Bin ...umEvolveTests.deserialiseNewerSetToUnknown | Bin 0 -> 780 bytes ...volveTests.deserialiseNewerSetToUnknown2.C | Bin 0 -> 835 bytes ...volveTests.deserialiseNewerSetToUnknown2.D | Bin 0 -> 835 bytes ...volveTests.deserialiseNewerSetToUnknown2.E | Bin 0 -> 835 bytes ...EnumEvolveTests.deserialiseNewerWithNoRule | Bin ...EnumEvolveTests.deserializeWithRename.1.AA | Bin .../EnumEvolveTests.deserializeWithRename.1.B | Bin .../EnumEvolveTests.deserializeWithRename.1.C | Bin 0 -> 872 bytes ...EnumEvolveTests.deserializeWithRename.2.AA | Bin ...EnumEvolveTests.deserializeWithRename.2.BB | Bin .../EnumEvolveTests.deserializeWithRename.2.C | Bin 0 -> 911 bytes ...EnumEvolveTests.deserializeWithRename.3.AA | Bin .../EnumEvolveTests.deserializeWithRename.3.C | Bin 0 -> 952 bytes ...EnumEvolveTests.deserializeWithRename.3.XX | Bin .../amqp/EnumEvolveTests.multiOperations.1.A | Bin .../amqp/EnumEvolveTests.multiOperations.1.B | Bin .../amqp/EnumEvolveTests.multiOperations.1.C | Bin 0 -> 880 bytes .../amqp/EnumEvolveTests.multiOperations.1.D | Bin .../amqp/EnumEvolveTests.multiOperations.2.A | Bin .../amqp/EnumEvolveTests.multiOperations.2.B | Bin .../amqp/EnumEvolveTests.multiOperations.2.C | Bin 0 -> 951 bytes .../amqp/EnumEvolveTests.multiOperations.2.D | Bin .../amqp/EnumEvolveTests.multiOperations.2.E | Bin .../amqp/EnumEvolveTests.multiOperations.3.A | Bin .../amqp/EnumEvolveTests.multiOperations.3.B | Bin .../EnumEvolveTests.multiOperations.3.BOB | Bin .../amqp/EnumEvolveTests.multiOperations.3.C | Bin 0 -> 1013 bytes .../amqp/EnumEvolveTests.multiOperations.3.D | Bin .../amqp/EnumEvolveTests.multiOperations.4.A | Bin .../amqp/EnumEvolveTests.multiOperations.4.B | Bin .../EnumEvolveTests.multiOperations.4.BOB | Bin .../EnumEvolveTests.multiOperations.4.CAT | Bin .../amqp/EnumEvolveTests.multiOperations.4.D | Bin .../amqp/EnumEvolveTests.multiOperations.4.F | Bin .../amqp/EnumEvolveTests.multiOperations.4.G | Bin .../EnumEvolveTests.multiOperations.5.APPLE | Bin .../amqp/EnumEvolveTests.multiOperations.5.B | Bin .../EnumEvolveTests.multiOperations.5.BBB | Bin .../EnumEvolveTests.multiOperations.5.CAT | Bin .../amqp/EnumEvolveTests.multiOperations.5.D | Bin .../EnumEvolveTests.multiOperations.5.FLUMP | Bin .../amqp/EnumEvolveTests.multiOperations.5.G | Bin .../internal}/amqp/EnumTests.changedEnum1 | Bin .../internal}/amqp/EnumTests.changedEnum2 | Bin .../amqp/EvolvabilityTests.addAdditionalParam | Bin ...bilityTests.addAdditionalParamNotMandatory | Bin 0 -> 284 bytes .../EvolvabilityTests.addAndRemoveParameters | Bin 0 -> 389 bytes ...yTests.addMandatoryFieldWithAltConstructor | Bin 0 -> 290 bytes ...andatoryFieldWithAltConstructorUnAnnotated | Bin ...dMandatoryFieldWithAltReorderedConstructor | Bin 0 -> 392 bytes ...FieldWithAltReorderedConstructorAndRemoval | Bin 0 -> 408 bytes .../amqp/EvolvabilityTests.changeSubType | Bin 0 -> 605 bytes .../EvolvabilityTests.getterSetterEvolver1 | Bin 0 -> 412 bytes .../amqp/EvolvabilityTests.multiVersion.1 | Bin 0 -> 299 bytes .../amqp/EvolvabilityTests.multiVersion.2 | Bin 0 -> 332 bytes .../amqp/EvolvabilityTests.multiVersion.3 | Bin 0 -> 371 bytes ...volvabilityTests.multiVersionWithRemoval.1 | Bin 0 -> 343 bytes ...volvabilityTests.multiVersionWithRemoval.2 | Bin 0 -> 391 bytes ...volvabilityTests.multiVersionWithRemoval.3 | Bin 0 -> 430 bytes .../amqp/EvolvabilityTests.removeParameters | Bin 0 -> 383 bytes ...vabilityTests.simpleOrderSwapDifferentType | Bin 0 -> 316 bytes .../EvolvabilityTests.simpleOrderSwapSameType | Bin 0 -> 307 bytes .../amqp/GenericsTests.loadGenericFromFile | Bin 0 -> 257 bytes ...tionOfSerializedObjectTest.deserializeTest | Bin ...ionOfSerializedObjectTest.deserializeTest2 | Bin .../amqp/networkParams.r3corda.6a6b6f256 | Bin .../serialization}/internal/isolated.jar | Bin settings.gradle | 2 + .../testing/node/internal/DriverDSLImpl.kt | 2 +- .../corda/testing/node/internal/RPCDriver.kt | 4 +- .../InternalSerializationTestHelpers.kt | 4 +- .../testing/internal/InternalTestUtils.kt | 2 +- .../kotlin/net/corda/demobench/DemoBench.kt | 4 +- 280 files changed, 759 insertions(+), 709 deletions(-) delete mode 100644 node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/StringBufferSerializer.kt delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolvabilityTests.testUnknownTransform delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.C delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.D delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.E delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.1.C delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.2.C delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.3.C delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.1.C delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.2.C delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.3.C delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addAdditionalParamNotMandatory delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addAndRemoveParameters delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addMandatoryFieldWithAltConstructor delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructor delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructorAndRemoval delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.changeSubType delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.getterSetterEvolver1 delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersion.1 delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersion.2 delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersion.3 delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersionWithRemoval.1 delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersionWithRemoval.2 delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersionWithRemoval.3 delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.removeParameters delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.simpleOrderSwapDifferentType delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.simpleOrderSwapSameType delete mode 100644 node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/GenericsTests.loadGenericFromFile create mode 100644 serialization/build.gradle rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/AllButBlacklisted.kt (97%) rename {node-api/src/main/kotlin/net/corda/nodeapi => serialization/src/main/kotlin/net/corda/serialization}/internal/AttachmentsClassLoader.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/ByteBufferStreams.kt (97%) create mode 100644 serialization/src/main/kotlin/net/corda/serialization/internal/ClassWhitelists.kt rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/ClientContexts.kt (66%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/DefaultWhitelist.kt (98%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/GeneratedAttachment.kt (81%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/OrdinalIO.kt (95%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/SerializationFormat.kt (94%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/SerializationScheme.kt (97%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/SerializeAsTokenContextImpl.kt (98%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/ServerContexts.kt (77%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/SharedContexts.kt (78%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/UseCaseAwareness.kt (91%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/AMQPDescriptorRegistry.kt (94%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/AMQPExceptions.kt (70%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/AMQPPrimitiveSerializer.kt (95%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/AMQPSerializationScheme.kt (65%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/AMQPSerializer.kt (96%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/AMQPSerializerFactories.kt (88%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/AMQPStreams.kt (74%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/ArraySerializer.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/CollectionSerializer.kt (98%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/CorDappCustomSerializer.kt (96%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/CustomSerializer.kt (98%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/DeserializationInput.kt (98%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/DeserializedGenericArrayType.kt (92%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/DeserializedParameterizedType.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/EnumEvolutionSerializer.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/EnumSerializer.kt (97%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/Envelope.kt (98%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/EvolutionSerializer.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/FingerPrinter.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/MapSerializer.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/ObjectSerializer.kt (97%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/PropertySerializer.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/PropertySerializers.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/Schema.kt (97%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/SerializationHelper.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/SerializationOutput.kt (95%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/SerializerFactory.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/SingletonSerializer.kt (96%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/SupportedTransforms.kt (98%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/TransformTypes.kt (97%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/TransformsSchema.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/BigDecimalSerializer.kt (70%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/BigIntegerSerializer.kt (70%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/BitSetSerializer.kt (73%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/CertPathSerializer.kt (82%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/ClassSerializer.kt (65%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/ContractAttachmentSerializer.kt (83%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/CurrencySerializer.kt (71%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/DurationSerializer.kt (74%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/EnumSetSerializer.kt (82%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/InputStreamSerializer.kt (94%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/InstantSerializer.kt (75%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/LocalDateSerializer.kt (76%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/LocalDateTimeSerializer.kt (80%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/LocalTimeSerializer.kt (78%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/MonthDaySerializer.kt (75%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/OffsetDateTimeSerializer.kt (81%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/OffsetTimeSerializer.kt (80%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/OpaqueBytesSubSequenceSerializer.kt (80%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/PeriodSerializer.kt (73%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/PrivateKeySerializer.kt (88%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/PublicKeySerializer.kt (91%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/SimpleStringSerializer.kt (50%) create mode 100644 serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/StringBufferSerializer.kt rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/ThrowableSerializer.kt (97%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/X509CRLSerializer.kt (72%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/X509CertificateSerializer.kt (74%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/YearMonthSerializer.kt (74%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/YearSerializer.kt (69%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/ZoneIdSerializer.kt (72%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/amqp/custom/ZonedDateTimeSerializer.kt (87%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/carpenter/AMQPSchemaExtensions.kt (94%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/carpenter/ClassCarpenter.kt (99%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/carpenter/Exceptions.kt (96%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/carpenter/MetaCarpenter.kt (95%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/carpenter/Schema.kt (98%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/carpenter/SchemaFields.kt (98%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal/kryo}/CordaClassResolver.kt (94%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/kryo/CordaClosureSerializer.kt (94%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/kryo/DefaultKryoCustomizer.kt (97%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/kryo/Kryo.kt (97%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/kryo/KryoSerializationScheme.kt (97%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/kryo/KryoStreams.kt (91%) rename {node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/main/kotlin/net/corda/serialization/internal}/kryo/SerializeAsTokenSerializer.kt (96%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/ForbiddenLambdaSerializationTests.java (96%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/LambdaCheckpointSerializationTest.java (91%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/amqp/ErrorMessageTests.java (88%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/amqp/JavaGenericsTest.java (94%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/amqp/JavaNestedClassesTests.java (97%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/amqp/JavaNestedInheritenceTests.java (93%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/amqp/JavaPrivatePropertyTests.java (97%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/amqp/JavaSerialiseEnumTests.java (83%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/amqp/JavaSerializationOutputTests.java (97%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/amqp/ListsSerializationJavaTest.java (95%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/amqp/SetterConstructorTests.java (98%) rename {node-api/src/test/java/net/corda/nodeapi/internal/serialization => serialization/src/test/java/net/corda/serialization/internal}/amqp/testutils/TestSerializationContext.java (76%) rename {node-api => serialization}/src/test/kotlin/net/corda/nodeapi/DummyContractBackdoor.kt (100%) rename {node-api/src/test/kotlin/net/corda/nodeapi => serialization/src/test/kotlin/net/corda/serialization}/internal/AttachmentsClassLoaderTests.kt (96%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/ContractAttachmentSerializerTest.kt (98%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/CordaClassResolverTests.kt (91%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/ListsSerializationTest.kt (93%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/MapsSerializationTest.kt (96%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/PrivateKeySerializationTest.kt (97%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/SerializationTokenTest.kt (94%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/SetsSerializationTest.kt (95%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/CorDappSerializerTests.kt (92%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/DeserializeAndReturnEnvelopeTests.kt (83%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/DeserializeMapTests.kt (92%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/DeserializeNeedingCarpentryOfEnumsTest.kt (95%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/DeserializeNeedingCarpentrySimpleTypesTest.kt (97%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/DeserializeNeedingCarpentryTests.kt (95%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/DeserializeSimpleTypesTests.kt (97%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/DeserializedParameterizedTypeTests.kt (98%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/EnumEvolvabilityTests.kt (95%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/EnumEvolveTests.kt (96%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/EnumTests.kt (90%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/ErrorMessagesTests.kt (87%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/EvolutionSerializerGetterTesting.kt (95%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/EvolvabilityTests.kt (96%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/FingerPrinterTesting.kt (84%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/GenericsTests.kt (95%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/OverridePKSerializerTest.kt (93%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/PrivatePropertyTests.kt (95%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/RoundTripTests.kt (86%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/SerializationOutputTests.kt (84%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/SerializationPropertyOrdering.kt (92%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/SerializationSchemaTests.kt (94%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/SerializeAndReturnSchemaTest.kt (81%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/StaticInitialisationOfSerializedObjectTest.kt (91%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/testutils/AMQPTestUtils.kt (90%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/amqp/testutils/TestSerializationContext.kt (62%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/carpenter/CarpenterExceptionTests.kt (87%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/carpenter/ClassCarpenterTest.kt (99%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/carpenter/ClassCarpenterTestUtils.kt (85%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/carpenter/ClassCarpenterWhitelistTest.kt (98%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/carpenter/CompositeMemberCompositeSchemaToClassCarpenterTests.kt (96%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/carpenter/EnumClassTests.kt (96%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/carpenter/InheritanceSchemaToClassCarpenterTests.kt (98%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/carpenter/MultiMemberCompositeSchemaToClassCarpenterTests.kt (90%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/carpenter/SingleMemberCompositeSchemaToClassCarpenterTests.kt (95%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/kryo/KryoStreamsTest.kt (96%) rename {node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization => serialization/src/test/kotlin/net/corda/serialization/internal}/kryo/KryoTests.kt (99%) create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolvabilityTests.testUnknownTransform rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.changedOrdinality (100%) create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.C create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.D create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.E rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.deserialiseNewerWithNoRule (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.deserializeWithRename.1.AA (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.deserializeWithRename.1.B (100%) create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.1.C rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.deserializeWithRename.2.AA (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.deserializeWithRename.2.BB (100%) create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.2.C rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.deserializeWithRename.3.AA (100%) create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.3.C rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.deserializeWithRename.3.XX (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.1.A (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.1.B (100%) create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.1.C rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.1.D (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.2.A (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.2.B (100%) create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.2.C rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.2.D (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.2.E (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.3.A (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.3.B (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.3.BOB (100%) create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.3.C rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.3.D (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.4.A (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.4.B (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.4.BOB (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.4.CAT (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.4.D (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.4.F (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.4.G (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.5.APPLE (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.5.B (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.5.BBB (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.5.CAT (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.5.D (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.5.FLUMP (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumEvolveTests.multiOperations.5.G (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumTests.changedEnum1 (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EnumTests.changedEnum2 (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EvolvabilityTests.addAdditionalParam (100%) create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addAdditionalParamNotMandatory create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addAndRemoveParameters create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltConstructor rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/EvolvabilityTests.addMandatoryFieldWithAltConstructorUnAnnotated (100%) create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructor create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructorAndRemoval create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.changeSubType create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.getterSetterEvolver1 create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersion.1 create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersion.2 create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersion.3 create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersionWithRemoval.1 create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersionWithRemoval.2 create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersionWithRemoval.3 create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.removeParameters create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.simpleOrderSwapDifferentType create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.simpleOrderSwapSameType create mode 100644 serialization/src/test/resources/net/corda/serialization/internal/amqp/GenericsTests.loadGenericFromFile rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/StaticInitialisationOfSerializedObjectTest.deserializeTest (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/StaticInitialisationOfSerializedObjectTest.deserializeTest2 (100%) rename {node-api/src/test/resources/net/corda/nodeapi/internal/serialization => serialization/src/test/resources/net/corda/serialization/internal}/amqp/networkParams.r3corda.6a6b6f256 (100%) rename {node-api/src/test/resources/net/corda/nodeapi => serialization/src/test/resources/net/corda/serialization}/internal/isolated.jar (100%) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 6891e6e828..d963b15607 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -131,6 +131,8 @@ + + diff --git a/build.gradle b/build.gradle index abe44c9b9d..623f2bfd04 100644 --- a/build.gradle +++ b/build.gradle @@ -322,7 +322,7 @@ bintrayConfig { projectUrl = 'https://github.com/corda/corda' gpgSign = true gpgPassphrase = System.getenv('CORDA_BINTRAY_GPG_PASSPHRASE') - publications = ['corda-jfx', 'corda-mock', 'corda-rpc', 'corda-core', 'corda', 'corda-finance', 'corda-node', 'corda-node-api', 'corda-test-common', 'corda-test-utils', 'corda-jackson', 'corda-verifier', 'corda-webserver-impl', 'corda-webserver', 'corda-node-driver', 'corda-confidential-identities', 'corda-shell'] + publications = ['corda-jfx', 'corda-mock', 'corda-rpc', 'corda-core', 'corda', 'corda-finance', 'corda-node', 'corda-node-api', 'corda-test-common', 'corda-test-utils', 'corda-jackson', 'corda-verifier', 'corda-webserver-impl', 'corda-webserver', 'corda-node-driver', 'corda-confidential-identities', 'corda-shell', 'corda-serialization'] license { name = 'Apache-2.0' url = 'https://www.apache.org/licenses/LICENSE-2.0' diff --git a/client/rpc/src/main/kotlin/net/corda/client/rpc/CordaRPCClient.kt b/client/rpc/src/main/kotlin/net/corda/client/rpc/CordaRPCClient.kt index 4eb3dc4d83..79be8de924 100644 --- a/client/rpc/src/main/kotlin/net/corda/client/rpc/CordaRPCClient.kt +++ b/client/rpc/src/main/kotlin/net/corda/client/rpc/CordaRPCClient.kt @@ -1,8 +1,8 @@ package net.corda.client.rpc -import net.corda.client.rpc.internal.serialization.amqp.AMQPClientSerializationScheme -import net.corda.client.rpc.internal.RPCClient import net.corda.client.rpc.internal.CordaRPCClientConfigurationImpl +import net.corda.client.rpc.internal.RPCClient +import net.corda.client.rpc.internal.serialization.amqp.AMQPClientSerializationScheme import net.corda.core.context.Actor import net.corda.core.context.Trace import net.corda.core.messaging.CordaRPCOps @@ -11,7 +11,7 @@ import net.corda.core.utilities.NetworkHostAndPort import net.corda.nodeapi.ArtemisTcpTransport.Companion.tcpTransport import net.corda.nodeapi.ConnectionDirection import net.corda.nodeapi.internal.config.SSLConfiguration -import net.corda.nodeapi.internal.serialization.AMQP_RPC_CLIENT_CONTEXT +import net.corda.serialization.internal.AMQP_RPC_CLIENT_CONTEXT import java.time.Duration /** diff --git a/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/AMQPClientSerializationScheme.kt b/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/AMQPClientSerializationScheme.kt index c82779fc03..472a43dd82 100644 --- a/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/AMQPClientSerializationScheme.kt +++ b/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/AMQPClientSerializationScheme.kt @@ -7,12 +7,12 @@ import net.corda.core.serialization.SerializationCustomSerializer import net.corda.core.serialization.internal.SerializationEnvironment import net.corda.core.serialization.internal.SerializationEnvironmentImpl import net.corda.core.serialization.internal.nodeSerializationEnv -import net.corda.nodeapi.internal.serialization.* -import net.corda.nodeapi.internal.serialization.amqp.AbstractAMQPSerializationScheme -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory -import net.corda.nodeapi.internal.serialization.amqp.amqpMagic -import java.util.concurrent.ConcurrentHashMap import net.corda.nodeapi.internal.serialization.amqp.custom.RxNotificationSerializer +import net.corda.serialization.internal.* +import net.corda.serialization.internal.amqp.AbstractAMQPSerializationScheme +import net.corda.serialization.internal.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.amqpMagic +import java.util.concurrent.ConcurrentHashMap /** * When set as the serialization scheme for a process, sets it to be the Corda AMQP implementation. diff --git a/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/RpcClientCordaFutureSerializer.kt b/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/RpcClientCordaFutureSerializer.kt index 258a2d66ec..44e2a414a0 100644 --- a/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/RpcClientCordaFutureSerializer.kt +++ b/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/RpcClientCordaFutureSerializer.kt @@ -2,9 +2,8 @@ package net.corda.client.rpc.internal.serialization.amqp import net.corda.core.concurrent.CordaFuture import net.corda.core.toFuture -import net.corda.core.toObservable -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import rx.Observable import java.io.NotSerializableException diff --git a/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/RpcClientObservableSerializer.kt b/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/RpcClientObservableSerializer.kt index 18a73afa71..5536e10b4c 100644 --- a/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/RpcClientObservableSerializer.kt +++ b/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/serialization/amqp/RpcClientObservableSerializer.kt @@ -5,7 +5,7 @@ import net.corda.client.rpc.internal.ObservableContext import net.corda.core.context.Trace import net.corda.core.serialization.SerializationContext import net.corda.nodeapi.RPCApi -import net.corda.nodeapi.internal.serialization.amqp.* +import net.corda.serialization.internal.amqp.* import org.apache.qpid.proton.codec.Data import rx.Notification import rx.Observable diff --git a/core/src/test/kotlin/net/corda/core/contracts/TransactionVerificationExceptionSerialisationTests.kt b/core/src/test/kotlin/net/corda/core/contracts/TransactionVerificationExceptionSerialisationTests.kt index 418226cea0..59b2801bb1 100644 --- a/core/src/test/kotlin/net/corda/core/contracts/TransactionVerificationExceptionSerialisationTests.kt +++ b/core/src/test/kotlin/net/corda/core/contracts/TransactionVerificationExceptionSerialisationTests.kt @@ -2,12 +2,12 @@ package net.corda.core.contracts import net.corda.core.crypto.SecureHash import net.corda.core.transactions.LedgerTransaction -import net.corda.nodeapi.internal.serialization.AMQP_RPC_CLIENT_CONTEXT -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput -import net.corda.nodeapi.internal.serialization.amqp.SerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory -import net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer +import net.corda.serialization.internal.AMQP_RPC_CLIENT_CONTEXT +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.DeserializationInput +import net.corda.serialization.internal.amqp.SerializationOutput +import net.corda.serialization.internal.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.custom.PublicKeySerializer import net.corda.testing.core.DUMMY_BANK_A_NAME import net.corda.testing.core.DUMMY_NOTARY_NAME import net.corda.testing.core.TestIdentity diff --git a/core/src/test/kotlin/net/corda/core/utilities/KotlinUtilsTest.kt b/core/src/test/kotlin/net/corda/core/utilities/KotlinUtilsTest.kt index a62ec2333d..983c27b3cf 100644 --- a/core/src/test/kotlin/net/corda/core/utilities/KotlinUtilsTest.kt +++ b/core/src/test/kotlin/net/corda/core/utilities/KotlinUtilsTest.kt @@ -3,9 +3,9 @@ package net.corda.core.utilities import com.esotericsoftware.kryo.KryoException import net.corda.core.crypto.random63BitValue import net.corda.core.serialization.* -import net.corda.nodeapi.internal.serialization.KRYO_CHECKPOINT_CONTEXT -import net.corda.nodeapi.internal.serialization.SerializationContextImpl -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.KRYO_CHECKPOINT_CONTEXT +import net.corda.serialization.internal.SerializationContextImpl +import net.corda.serialization.internal.kryo.kryoMagic import net.corda.testing.core.SerializationEnvironmentRule import org.assertj.core.api.Assertions.assertThat import org.junit.Rule @@ -24,8 +24,8 @@ class KotlinUtilsTest { @Rule val expectedEx: ExpectedException = ExpectedException.none() - val KRYO_CHECKPOINT_NOWHITELIST_CONTEXT = SerializationContextImpl(kryoMagic, - SerializationDefaults.javaClass.classLoader, + private val KRYO_CHECKPOINT_NOWHITELIST_CONTEXT = SerializationContextImpl(kryoMagic, + javaClass.classLoader, EmptyWhitelist, emptyMap(), true, diff --git a/experimental/blobinspector/src/main/kotlin/net/corda/blobinspector/BlobInspector.kt b/experimental/blobinspector/src/main/kotlin/net/corda/blobinspector/BlobInspector.kt index 6bc15cd304..cc4f35aed4 100644 --- a/experimental/blobinspector/src/main/kotlin/net/corda/blobinspector/BlobInspector.kt +++ b/experimental/blobinspector/src/main/kotlin/net/corda/blobinspector/BlobInspector.kt @@ -4,8 +4,8 @@ import net.corda.core.crypto.SecureHash import net.corda.core.serialization.EncodingWhitelist import net.corda.core.serialization.SerializationEncoding import net.corda.core.utilities.ByteSequence -import net.corda.nodeapi.internal.serialization.SerializationFactoryImpl -import net.corda.nodeapi.internal.serialization.amqp.* +import net.corda.serialization.internal.SerializationFactoryImpl +import net.corda.serialization.internal.amqp.* import org.apache.qpid.proton.amqp.Binary import org.apache.qpid.proton.amqp.DescribedType import org.apache.qpid.proton.amqp.Symbol diff --git a/experimental/blobinspector/src/test/kotlin/net/corda/blobinspector/InMemoryTests.kt b/experimental/blobinspector/src/test/kotlin/net/corda/blobinspector/InMemoryTests.kt index 26313b1d3c..4b94bf2eea 100644 --- a/experimental/blobinspector/src/test/kotlin/net/corda/blobinspector/InMemoryTests.kt +++ b/experimental/blobinspector/src/test/kotlin/net/corda/blobinspector/InMemoryTests.kt @@ -1,10 +1,10 @@ package net.corda.blobinspector import net.corda.core.serialization.SerializedBytes -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.SerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory -import net.corda.nodeapi.internal.serialization.AMQP_P2P_CONTEXT +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.SerializationOutput +import net.corda.serialization.internal.amqp.SerializerFactory +import net.corda.serialization.internal.AMQP_P2P_CONTEXT import org.junit.Test diff --git a/node-api/build.gradle b/node-api/build.gradle index e9b1900cd1..c13bafd99f 100644 --- a/node-api/build.gradle +++ b/node-api/build.gradle @@ -7,10 +7,10 @@ description 'Corda node API' dependencies { compile project(":core") + compile project(":serialization") // TODO Remove this once the NetworkBootstrapper class is moved into the tools:bootstrapper module compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" - testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" // TODO: remove the forced update of commons-collections and beanutils when artemis updates them compile "org.apache.commons:commons-collections4:${commons_collections_version}" @@ -27,26 +27,18 @@ dependencies { // TypeSafe Config: for simple and human friendly config files. compile "com.typesafe:config:$typesafe_config_version" - // Kryo: object graph serialization. - compile "com.esotericsoftware:kryo:4.0.0" - compile "de.javakaffee:kryo-serializers:0.41" - compile "org.ow2.asm:asm:$asm_version" - - // For AMQP serialisation. compile "org.apache.qpid:proton-j:$protonj_version" - // FastClasspathScanner: classpath scanning - needed for the NetworkBootstrapper and AMQP. + // FastClasspathScanner: classpath scanning - needed for the NetworkBootstrapper. compile "io.github.lukehutch:fast-classpath-scanner:$fast_classpath_scanner_version" - // Pure-Java Snappy compression - compile "org.iq80.snappy:snappy:$snappy_version" - // For caches rather than guava compile "com.github.ben-manes.caffeine:caffeine:$caffeine_version" // Unit testing helpers. testCompile "junit:junit:$junit_version" testCompile "org.assertj:assertj-core:$assertj_version" + testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" testCompile project(':node-driver') compile ("org.apache.activemq:artemis-amqp-protocol:${artemis_version}") { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt index 30958d8546..e508c78fd0 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt @@ -23,13 +23,13 @@ import net.corda.nodeapi.internal.ContractsJarFile import net.corda.nodeapi.internal.DEV_ROOT_CA import net.corda.nodeapi.internal.SignedNodeInfo import net.corda.nodeapi.internal.network.NodeInfoFilesCopier.Companion.NODE_INFO_FILE_NAME_PREFIX -import net.corda.nodeapi.internal.serialization.CordaSerializationMagic -import net.corda.nodeapi.internal.serialization.AMQP_P2P_CONTEXT -import net.corda.nodeapi.internal.serialization.SerializationFactoryImpl -import net.corda.nodeapi.internal.serialization.amqp.AbstractAMQPSerializationScheme -import net.corda.nodeapi.internal.serialization.amqp.amqpMagic -import net.corda.nodeapi.internal.serialization.kryo.AbstractKryoSerializationScheme -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.AMQP_P2P_CONTEXT +import net.corda.serialization.internal.CordaSerializationMagic +import net.corda.serialization.internal.SerializationFactoryImpl +import net.corda.serialization.internal.amqp.AbstractAMQPSerializationScheme +import net.corda.serialization.internal.amqp.amqpMagic +import net.corda.serialization.internal.kryo.AbstractKryoSerializationScheme +import net.corda.serialization.internal.kryo.kryoMagic import java.nio.file.Path import java.nio.file.Paths import java.nio.file.StandardCopyOption.REPLACE_EXISTING diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/RxNotificationSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/RxNotificationSerializer.kt index 07dcd561a8..36250827f3 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/RxNotificationSerializer.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/RxNotificationSerializer.kt @@ -1,7 +1,7 @@ package net.corda.nodeapi.internal.serialization.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import rx.Notification class RxNotificationSerializer( diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/StringBufferSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/StringBufferSerializer.kt deleted file mode 100644 index 2c738b4d76..0000000000 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/StringBufferSerializer.kt +++ /dev/null @@ -1,8 +0,0 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom - -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer - -/** - * A serializer for [StringBuffer]. - */ -object StringBufferSerializer : CustomSerializer.ToString(StringBuffer::class.java) \ No newline at end of file diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/crypto/X509UtilitiesTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/crypto/X509UtilitiesTest.kt index ed9345c00e..b599d2e50a 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/crypto/X509UtilitiesTest.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/crypto/X509UtilitiesTest.kt @@ -11,10 +11,10 @@ import net.corda.core.serialization.serialize import net.corda.node.serialization.amqp.AMQPServerSerializationScheme import net.corda.nodeapi.internal.config.SSLConfiguration import net.corda.nodeapi.internal.createDevKeyStores -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.SerializationContextImpl -import net.corda.nodeapi.internal.serialization.SerializationFactoryImpl -import net.corda.nodeapi.internal.serialization.amqp.amqpMagic +import net.corda.serialization.internal.SerializationContextImpl +import net.corda.serialization.internal.SerializationFactoryImpl +import net.corda.serialization.internal.amqp.amqpMagic +import net.corda.serialization.internal.AllWhitelist import net.corda.testing.core.ALICE_NAME import net.corda.testing.core.BOB_NAME import net.corda.testing.core.TestIdentity diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolvabilityTests.testUnknownTransform b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolvabilityTests.testUnknownTransform deleted file mode 100644 index 2916621d548edd3e0443ad168e191bc6391e2800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 785 zcmYe!FG@*dWME)uIGO|`85kHZFfcIv0y3Bx7AxhYmgpseR9KlMyQYUZdbw6aWrT;9 zIXYJvnP;Q~+S(q_V?ki8UQ*ur3{I4`p#1L``EdtDtI9G&3yu^qV2MiXlsToIW1%~L=$pe$Y_Kn_7%s$lu!D&vUOi}lNLAb+ Z%m)+^(aCi{gk>Q&Qs{?pg@}a60RSWN{xARl diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown deleted file mode 100644 index f559d20e26356aba7052a81459b5f7a12a5ba6b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818 zcmcIi%SyvQ6rD->z;@xrh2TmlZiJz>T0|(MZBi(xMNFU+HD;xePqna`IKBRHcX)etFl^N80>N)Q|1oNs9XDvZM~*vkDqZiU*1MFvoW`MP>q%dnKBF7~y*>}!Y^s-cV^c@7Eh|IeiPWpeh@ zq-7Y5rV`AFkK8)d42x$1KVeER{Vl)6Yl!oV8p?~j47+(UW1yv= zv9E$vF0FEKM?q9$YU|(jQA*`+#|j>Be54UM1s)}VKxr%B=jfLrBNK^ z`*cZ)Xp>GUzoM}lcGwdOr>vB(TUh%s<$>{+hAkOEU6hi8tbkP9{LiKH?Q*upCAKWP zrWG^tGqX`S3yYNRMX^>)4(7KFTkGT6)H8SHzJL&)oCeS1_@|8hSot!2jQh4 z+E)S6xwOi`9R;Put+s%9&}Ve$VwcA(Y|h!WCdj6=6^2jZUEG$yK7sXmJIhfxzY{|Q{F3QTR+P5v>VFIcNc$9$Z0+texBVaiJVF8ad sv^9S-Hadm*cU{kT<3z#b*>H$j!tl!*bba!qlq;Rt_xXmGK)*#HlYUut~hi!V9gBI z#D0K-X(5xN<3dIQBr$eiEITb^G(;0}UdU(!7venF!bB5~9n?W2A?^^S1G0!{<2oR~ PypRo&2o^Frf*cM2=aKcL diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.2.C b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.2.C deleted file mode 100644 index 62448e369e44fda10d488c8c744b10b80c29fa51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 791 zcmYe!FG@*dWME)uIGO|`85kHZFfcHK7|aZdmGV+c^pZg;tW1+#EIpEqGyI~`y`#!q zQ+<;2%8dhUZ4c-%qNoch2ujwkFsjO}^vMqKP4Ns5uCR0ksbgbW$mkrx1hw%xF3q#?S>*eLAq$U<*>SgAYq!#5R=I9lt7G);pWL71XWaj7TCFT|u z=(*;V=DL>U=ai*}q!yPHtE8mD6s3k|mShB_<|XE)syI8i!d<|8K#hqQFFG8^W`t{E zIS|LbkTG>(FlDZD!R9(w2M0$dxJ_&a&au(N8VA>fEIFCQC2*V20|HkZIvlWJhHGL! zz`?YT$@LYnJ4G5GOBnw1AAU2L>4tHS0z&BFxuaf$-~}P$O$9mhv=*=wcc+eni__N5 zy%pE`C!Kxj`Rz-aob_+(b%|ll$FKJ`#^)q*;%ImCXmsct-?iL^@)ZpMP1n#ILvi5a z2MF&fnB@xcvmn|Uj)SnrXv8rOQWgi)!wHKy_4t^kJPa`P2N5R0&?lqN8!?w9X;Sfr zUdr1Mi@!ZdrD+n)&dGJ-FT*k3pb^IQM` diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.2.C b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.2.C deleted file mode 100644 index 864da60e34209b6ce8bcd2f4fd9753386e9d6430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 811 zcmb`F%}&BV5XW~~KB8QC0z*7*{2(EkkhH*FGzcX~IJ%TYHndx83kOfW%Ib?O2k$~Ql2t7QH^otO@AY_+yV56r4!BXt6E6#`Ea5nR& zZY>_QyJy~j$F=E&SFbA!TXnq&n_Ml!-sN@dkE)_4JQfUYbzQ-d(Ck}=V`&b2d;{TK z2b)}8z2#-cz_EzNjLtdcB4x3l0Zv%VX~6Gk$|HekcsIvHEJCu3f+g#-Buy&eB1m~> z&f>3{q|$VVVcY7^`inV7F)&RzH7rVCvi-lg+S_vx$8j5mQBbdi9RnO9a{*6M!^oQd zZDWqQ$(yF4D(d~Y5{@!bL&9-JYDzfCNG%Dc8Hq@!8fkC!Xzkeds=K+TQXiDN`R=Q- YElcZzX|V~_`_Pvup=GA|A+HUPPfmdYUH||9 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.3.C b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.3.C deleted file mode 100644 index d66d7746405b5d01161dc0f7382cbe11e350ed81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 857 zcmb_a%SyvQ6rGv0DQ#DRYZp@76k>g#K`7+WY>KsFqqvtEwOc!p& zAJMH_rv)cACr3tHz^# zZmRj|aHE(&MybHelm;>2a;zXZ4xkY0!brF+ zdU^RNsfh)ddYO48sYQ8-IeNvZMVW~?nN^7;nfZBoiMfRZdah;pIc14SnK_vyl_9Cc zCB-UnAb6v=2 O;Na*4H<0rnBLe_pPhF@0 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructor b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructor deleted file mode 100644 index 584aef76d73795a61ea36fa961ca83a4b598122d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 zcma)1O-sZu5KXqO;zbk$4_=Ba9)o(=gRs!GR76qOr79k$P1qgCCN+tLdh)LX|42P} z_ZNxj!6Jen^TEKI_vTHh4F^gHd3i5FCxm{4YQhka*8?RSE4z);)%fy(+wl#a)C+z) z7qhF2<7zgUwEIy`bMANZCE7To(k_O$02QJa9dx35-|Ac4&||~)bLe${i7CwmRLD>{ zVH8Mag+Y+`3=XwouzIXmR%=;9ff8Ml3+wC%IKKwP!D-W+qmcX_-Eu13Tm<{V2%c(X zop~z5!YECXtiK<%hlBronzVOOPg-lYH#`L&1(%tpN6GZ;7gqd%?F3%w*Mk>Si!Av` I+%MJt2{7!7J5(n51c(4SB-ubo8Ii<8B!aqOER!#|7X*pEq;CG*0Hfu;LHw!0Sr4 Q?NgzA$l{;E-S>ce0cMAMAOHXW diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.changeSubType b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.changeSubType deleted file mode 100644 index b323a3acb35f8844ac2ed4893d65d758da6a8a85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 629 zcmYe!FG@*dWME)uIGO|`85kHZFfcI10U68;ixNWMeD@8hZk66BE!T z#^+Eg8SeoZOmI0?kenD$h;?Bw+!1P^i8+~7i6xo& zd3uStg#~)9W%)T}iAk9`nI)AWsl_G5D#;m%dFiRarAZ-`1*t0jr9iz7u5g=}52!H_ z<57nL?Fi?w91vh%$e6g08R!z%g^UIcj!tj`Sq{Vj<&voFZqK~D)FM|0WSdwItfYGI ZfUUt3Jh)=l;eae7QV`${9?pY|3;^1g$P54g diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.getterSetterEvolver1 b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.getterSetterEvolver1 deleted file mode 100644 index c544432e6d33b7a2ff606f99b0702636cf8477d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmYe!FG@*dWME)uIGO|`85kHZ0C6vn!OXB&DKE7|FBzo5Dl%9ZVS%1&S$-iN_uJu zP{^!OXB&DKE7|FBzo5O55D2Aic86%)QLL#J4ij zxv1EvqBPys_5cS{NJ=44`3blQOb0G79yrSg=d&I-z`D>6Zj@eLeoAU$L8e}2UP)?E zUSf`3acWU!VoqjNVo7Fxo?c>ZVS%1&S$-iN^WURNoH7TQ87@B zinD_&+<4{#YD~nq)Zu_76I>I^0Ri@fjEM`GfsSxp$Y|i;=!7PhgjJ67AR_|+1U_B< diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersion.2 b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersion.2 deleted file mode 100644 index b00abdaeabeeb00dc4cd83b67b8b93382bff34d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmYe!FG@*dWME)uIGO|`85kHZ0I@BQ!OXB&DKE7|FBzo5DyJ&kEhsB3q%bR_)Ze@~ zGs4ZOD9_Q>_5d$)Ay9)3kYG3wk^(n|>A)Mt11}ljeAWYZSQq-i&C|=vPf1NI$kfZs zD@iTNOU%(LPA$qz%*m`uEXmBz(@V@PEYNc;%g-rGOv=p3EU64hEiNfm$t}$($qY*^ zDh8@iadvQp8_#?|jfoiNIvfaPhHGLuAi%zmF?k^~&=IZ+84Vm9ozUcx@W>@%mE%0f G$N&Ixe`b;Z diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersion.3 b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersion.3 deleted file mode 100644 index 40ea9d91f68e914290a4a9e85765d9bdf18505bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmYe!FG@*dWME)uIGO|`85kHZ0C5(O!OXB&DKE7|FBzo5DyhuX&>+LW$T!z1%2V4V z+%L)1sVd#p_J9yeAyDxNAi<~uA|`~Sz|CR;nI#A_lmoB2eoAU$ zL8e}2UP)?EUSf`3acWU!VoqjNVo7Fxo?c>ZVS%1&S$-iN^WUR zNoH7TQ87@BinD_&+<4{#YD~nq-{C+Z3tSV+0Ri@fj7bZbfsSxp$Y|i;=!7Phj7Kg7 Nk6a>FInINO3;;{$Ye4`2 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersionWithRemoval.1 b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersionWithRemoval.1 deleted file mode 100644 index 69a5365b7631f7fa49c4fde0b25612434067e2e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmYe!FG@*dWME)uIGO|`85kHZ0I>&A-i!178^7eAWZcSr%vI5O?r9x zDXEDCnR=OdC8B?U0O?zCd;kCd diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersionWithRemoval.3 b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.multiVersionWithRemoval.3 deleted file mode 100644 index c00a28213633119c60fb277f46a022fe507f7a9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcmYe!FG@*dWME)uIGO|`85kHZ0P%bvgPCEmQeJ9_UNT69l}V9TK~ZUNj*n52OJR7q zr&C&CNKUz}?Exv)LZIRkK!Q;RL`(n?Uw{Nt1l&v}kePNc!%aa9xEw1;P6;T)x-b%M zonBskN@`+3re0=VNorAEVvb&MYEfolPG(hNNoIbYUSe)xfu3tweok3pQf5wONo7cC zaY?aCZfQ{)bF;Go-W=Td+YHog6VvdTlgDc!V<^yU>#CXi%Krbs?6UzYs_Jxc| i3z>oLab3u0;Na+lCYOvyE(MQVDjvBsta6+O85scHPuQc7(_JANu2;)NLlJfk8tR)#msi`3>aHE(&MoGZTSd^HX3e;Du;_U3;3b%v#fEp7qesDNYjBqr|0Ri@fjEM`Gfi7`f$Y|i; n=ma;A<$xeiE@>fKaY<2TUb?FTrercMNsy^2SWV?T$jATy=qhnc diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.simpleOrderSwapDifferentType b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.simpleOrderSwapDifferentType deleted file mode 100644 index cc726a13fd0728a971e5e1e3d13ab3428b19690d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmYe!FG@*dWME)uIGO|`85kHZ0I@ER!OXB&DKE7|FBzo5%FH<{+`S}O-_gv{JUiJi z+|W4HJ3rml_5cS{2;)NLlJb1G2}}nbG9I|c2UU6zsW@1ieRbokIex6=pZef9*Ygv9ySz=OVPG(7ENNRCOu}X1fZb43}e^E+m zQE+);flFpuT53^hUP(x0L8^+ggDc!R<^yU>#JJqyfE5#56UzYs_Jxdz3z>nAa$U%1 e;Na+lBqs=zOIpZQTvC*om+tC-EXjG0kpTc#N@FGf diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.simpleOrderSwapSameType b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.simpleOrderSwapSameType deleted file mode 100644 index dc9fae7152dcf5d7e8a9b33918cad39be6c2a4ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmYe!FG@*dWME)uIGO|`85kHZ0I>>?!OXB&DKE7|FBzo5sv^Y8GN{-!%OX|3*dWTH z!ptHsGq>E<_5dqW2xABnTszZ&+l&WpFv9t)2TrptjD(w`mzSTCnplvjmzh_RT9lWV zqgR|-l$n^5S(R9lnV+YZm|Iw&=USGZQR*(SS`=KK zSP-0;n;KGCkgDSB;0m{i`G6V|F)nsEV2N-p%K-uQg^Y;{nSt(cUC3zQ;OGQ55F(d^ KRgUu@BLe`h;$Qgy diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/GenericsTests.loadGenericFromFile b/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/GenericsTests.loadGenericFromFile deleted file mode 100644 index 5c467153f860402ddf0ce2b596ee7869a97d8a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmYe!FG@*dWME)uIGO|`85kH3d}U@>tdy5pqL&PkvvM&>ba4vJb;-#KOxG?c%5?Ou zaMupBwLQSexR9+pGbt%26|R}-z-q<=D;VK?)&sLy7ka|Y(#y+FNlh%s)XU5(NiE7t z%+V`OEy_&H$*f8&$;{8wOUx}S&~s1C0}3V=holyl6sx%97bT~LXXd0NCl;kRxWY|l lKA^@#j4K@uNFtoWa)5_@A!ErxMlDwd2S+EkVVnmU82~ZBQoH~F diff --git a/node/src/main/kotlin/net/corda/node/internal/Node.kt b/node/src/main/kotlin/net/corda/node/internal/Node.kt index 944faf6579..570712dfc3 100644 --- a/node/src/main/kotlin/net/corda/node/internal/Node.kt +++ b/node/src/main/kotlin/net/corda/node/internal/Node.kt @@ -42,7 +42,7 @@ import net.corda.nodeapi.internal.ShutdownHook import net.corda.nodeapi.internal.addShutdownHook import net.corda.nodeapi.internal.bridging.BridgeControlListener import net.corda.nodeapi.internal.persistence.CordaPersistence -import net.corda.nodeapi.internal.serialization.* +import net.corda.serialization.internal.* import org.slf4j.Logger import org.slf4j.LoggerFactory import rx.Scheduler diff --git a/node/src/main/kotlin/net/corda/node/internal/cordapp/CordappLoader.kt b/node/src/main/kotlin/net/corda/node/internal/cordapp/CordappLoader.kt index f13feaf32d..c70c168266 100644 --- a/node/src/main/kotlin/net/corda/node/internal/cordapp/CordappLoader.kt +++ b/node/src/main/kotlin/net/corda/node/internal/cordapp/CordappLoader.kt @@ -16,7 +16,7 @@ import net.corda.core.utilities.contextLogger import net.corda.node.internal.classloading.requireAnnotation import net.corda.node.services.config.NodeConfiguration import net.corda.nodeapi.internal.coreContractClasses -import net.corda.nodeapi.internal.serialization.DefaultWhitelist +import net.corda.serialization.internal.DefaultWhitelist import org.apache.commons.collections4.map.LRUMap import java.lang.reflect.Modifier import java.net.JarURLConnection diff --git a/node/src/main/kotlin/net/corda/node/serialization/amqp/AMQPServerSerializationScheme.kt b/node/src/main/kotlin/net/corda/node/serialization/amqp/AMQPServerSerializationScheme.kt index dc9ea63428..7f74b7b190 100644 --- a/node/src/main/kotlin/net/corda/node/serialization/amqp/AMQPServerSerializationScheme.kt +++ b/node/src/main/kotlin/net/corda/node/serialization/amqp/AMQPServerSerializationScheme.kt @@ -4,11 +4,10 @@ import net.corda.core.cordapp.Cordapp import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializationCustomSerializer -import net.corda.nodeapi.internal.serialization.CordaSerializationMagic -import net.corda.nodeapi.internal.serialization.amqp.AbstractAMQPSerializationScheme -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory import net.corda.nodeapi.internal.serialization.amqp.custom.RxNotificationSerializer - +import net.corda.serialization.internal.CordaSerializationMagic +import net.corda.serialization.internal.amqp.AbstractAMQPSerializationScheme +import net.corda.serialization.internal.amqp.SerializerFactory import java.util.concurrent.ConcurrentHashMap /** diff --git a/node/src/main/kotlin/net/corda/node/serialization/amqp/RpcServerCordaFutureSerialiser.kt b/node/src/main/kotlin/net/corda/node/serialization/amqp/RpcServerCordaFutureSerialiser.kt index f66e3c5daf..63430637d3 100644 --- a/node/src/main/kotlin/net/corda/node/serialization/amqp/RpcServerCordaFutureSerialiser.kt +++ b/node/src/main/kotlin/net/corda/node/serialization/amqp/RpcServerCordaFutureSerialiser.kt @@ -2,8 +2,8 @@ package net.corda.node.serialization.amqp import net.corda.core.concurrent.CordaFuture import net.corda.core.toObservable -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import rx.Observable import java.io.NotSerializableException diff --git a/node/src/main/kotlin/net/corda/node/serialization/amqp/RpcServerObservableSerializer.kt b/node/src/main/kotlin/net/corda/node/serialization/amqp/RpcServerObservableSerializer.kt index 312a4906cc..bb952e9788 100644 --- a/node/src/main/kotlin/net/corda/node/serialization/amqp/RpcServerObservableSerializer.kt +++ b/node/src/main/kotlin/net/corda/node/serialization/amqp/RpcServerObservableSerializer.kt @@ -6,14 +6,12 @@ import net.corda.core.utilities.loggerFor import net.corda.node.services.messaging.ObservableContextInterface import net.corda.node.services.messaging.ObservableSubscription import net.corda.nodeapi.RPCApi -import net.corda.nodeapi.internal.serialization.amqp.* +import net.corda.serialization.internal.amqp.* import org.apache.qpid.proton.codec.Data - import rx.Notification import rx.Observable import rx.Subscriber import java.io.NotSerializableException - import java.lang.reflect.Type /** diff --git a/node/src/main/kotlin/net/corda/node/serialization/kryo/KryoServerSerializationScheme.kt b/node/src/main/kotlin/net/corda/node/serialization/kryo/KryoServerSerializationScheme.kt index 83eec03995..bf8c16a97e 100644 --- a/node/src/main/kotlin/net/corda/node/serialization/kryo/KryoServerSerializationScheme.kt +++ b/node/src/main/kotlin/net/corda/node/serialization/kryo/KryoServerSerializationScheme.kt @@ -2,9 +2,9 @@ package net.corda.node.serialization.kryo import com.esotericsoftware.kryo.pool.KryoPool import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.serialization.CordaSerializationMagic -import net.corda.nodeapi.internal.serialization.kryo.AbstractKryoSerializationScheme -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.CordaSerializationMagic +import net.corda.serialization.internal.kryo.AbstractKryoSerializationScheme +import net.corda.serialization.internal.kryo.kryoMagic class KryoServerSerializationScheme : AbstractKryoSerializationScheme() { override fun canDeserializeVersion(magic: CordaSerializationMagic, target: SerializationContext.UseCase): Boolean { diff --git a/node/src/main/kotlin/net/corda/node/services/network/NodeInfoWatcher.kt b/node/src/main/kotlin/net/corda/node/services/network/NodeInfoWatcher.kt index 2f54a90cea..4c08bc8ee7 100644 --- a/node/src/main/kotlin/net/corda/node/services/network/NodeInfoWatcher.kt +++ b/node/src/main/kotlin/net/corda/node/services/network/NodeInfoWatcher.kt @@ -14,8 +14,8 @@ import net.corda.node.serialization.amqp.AMQPServerSerializationScheme import net.corda.nodeapi.internal.NodeInfoAndSigned import net.corda.nodeapi.internal.SignedNodeInfo import net.corda.nodeapi.internal.network.NodeInfoFilesCopier -import net.corda.nodeapi.internal.serialization.AMQP_P2P_CONTEXT -import net.corda.nodeapi.internal.serialization.SerializationFactoryImpl +import net.corda.serialization.internal.AMQP_P2P_CONTEXT +import net.corda.serialization.internal.SerializationFactoryImpl import rx.Observable import rx.Scheduler import java.nio.file.Path diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt index f0613cbc87..1fca4d4501 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt @@ -37,8 +37,8 @@ import net.corda.node.services.statemachine.transitions.StateMachine import net.corda.node.services.statemachine.transitions.StateMachineConfiguration import net.corda.node.utilities.AffinityExecutor import net.corda.nodeapi.internal.persistence.CordaPersistence -import net.corda.nodeapi.internal.serialization.SerializeAsTokenContextImpl -import net.corda.nodeapi.internal.serialization.withTokenContext +import net.corda.serialization.internal.SerializeAsTokenContextImpl +import net.corda.serialization.internal.withTokenContext import org.apache.activemq.artemis.utils.ReusableLatch import rx.Observable import rx.subjects.PublishSubject diff --git a/node/src/main/kotlin/net/corda/node/services/transactions/RaftTransactionCommitLog.kt b/node/src/main/kotlin/net/corda/node/services/transactions/RaftTransactionCommitLog.kt index ebb1bc0586..f72e33015c 100644 --- a/node/src/main/kotlin/net/corda/node/services/transactions/RaftTransactionCommitLog.kt +++ b/node/src/main/kotlin/net/corda/node/services/transactions/RaftTransactionCommitLog.kt @@ -30,7 +30,7 @@ import net.corda.core.utilities.debug import net.corda.node.utilities.AppendOnlyPersistentMap import net.corda.nodeapi.internal.persistence.CordaPersistence import net.corda.nodeapi.internal.persistence.currentDBSession -import net.corda.nodeapi.internal.serialization.CordaSerializationEncoding +import net.corda.serialization.internal.CordaSerializationEncoding import java.time.Clock /** diff --git a/node/src/test/kotlin/net/corda/node/internal/cordapp/CordappLoaderTest.kt b/node/src/test/kotlin/net/corda/node/internal/cordapp/CordappLoaderTest.kt index f90516e8b7..2474a436d2 100644 --- a/node/src/test/kotlin/net/corda/node/internal/cordapp/CordappLoaderTest.kt +++ b/node/src/test/kotlin/net/corda/node/internal/cordapp/CordappLoaderTest.kt @@ -59,7 +59,7 @@ class CordappLoaderTest { assertThat(actualCordapp.schedulableFlows).isEmpty() assertThat(actualCordapp.services).isEmpty() assertThat(actualCordapp.serializationWhitelists).hasSize(1) - assertThat(actualCordapp.serializationWhitelists.first().javaClass.name).isEqualTo("net.corda.nodeapi.internal.serialization.DefaultWhitelist") + assertThat(actualCordapp.serializationWhitelists.first().javaClass.name).isEqualTo("net.corda.serialization.internal.DefaultWhitelist") assertThat(actualCordapp.jarPath).isEqualTo(isolatedJAR) } diff --git a/node/src/test/kotlin/net/corda/node/internal/serialization/RoundTripObservableSerializerTests.kt b/node/src/test/kotlin/net/corda/node/internal/serialization/RoundTripObservableSerializerTests.kt index 4467a271d6..2a16e8febf 100644 --- a/node/src/test/kotlin/net/corda/node/internal/serialization/RoundTripObservableSerializerTests.kt +++ b/node/src/test/kotlin/net/corda/node/internal/serialization/RoundTripObservableSerializerTests.kt @@ -1,23 +1,20 @@ package net.corda.node.internal.serialization -import net.corda.client.rpc.internal.ObservableContext as ClientObservableContext -import net.corda.core.internal.ThreadBox -import net.corda.core.context.Trace -import net.corda.node.internal.serialization.testutils.AMQPRoundTripRPCSerializationScheme -import net.corda.node.internal.serialization.testutils.TestObservableContext as ServerObservableContext -import net.corda.node.services.messaging.ObservableSubscription -import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput -import net.corda.nodeapi.internal.serialization.amqp.SerializationOutput - import co.paralleluniverse.common.util.SameThreadExecutor import com.github.benmanes.caffeine.cache.Cache import com.github.benmanes.caffeine.cache.Caffeine import com.github.benmanes.caffeine.cache.RemovalListener import com.nhaarman.mockito_kotlin.mock import net.corda.client.rpc.internal.serialization.amqp.RpcClientObservableSerializer +import net.corda.core.context.Trace +import net.corda.core.internal.ThreadBox +import net.corda.node.internal.serialization.testutils.AMQPRoundTripRPCSerializationScheme import net.corda.node.internal.serialization.testutils.serializationContext import net.corda.node.serialization.amqp.RpcServerObservableSerializer +import net.corda.node.services.messaging.ObservableSubscription import net.corda.nodeapi.RPCApi +import net.corda.serialization.internal.amqp.DeserializationInput +import net.corda.serialization.internal.amqp.SerializationOutput import org.apache.activemq.artemis.api.core.SimpleString import org.junit.Test import rx.Notification @@ -28,6 +25,8 @@ import java.time.Instant import java.util.* import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit +import net.corda.client.rpc.internal.ObservableContext as ClientObservableContext +import net.corda.node.internal.serialization.testutils.TestObservableContext as ServerObservableContext class RoundTripObservableSerializerTests { private fun getID() = Trace.InvocationId("test1", Instant.now()) diff --git a/node/src/test/kotlin/net/corda/node/internal/serialization/RpcServerObservableSerializerTests.kt b/node/src/test/kotlin/net/corda/node/internal/serialization/RpcServerObservableSerializerTests.kt index 6778a2ef91..8d9e96391b 100644 --- a/node/src/test/kotlin/net/corda/node/internal/serialization/RpcServerObservableSerializerTests.kt +++ b/node/src/test/kotlin/net/corda/node/internal/serialization/RpcServerObservableSerializerTests.kt @@ -4,13 +4,13 @@ import com.github.benmanes.caffeine.cache.Cache import com.github.benmanes.caffeine.cache.Caffeine import com.nhaarman.mockito_kotlin.mock import net.corda.core.context.Trace -import net.corda.node.internal.serialization.testutils.* +import net.corda.node.internal.serialization.testutils.TestObservableContext +import net.corda.node.internal.serialization.testutils.serializationContext import net.corda.node.serialization.amqp.RpcServerObservableSerializer import net.corda.node.services.messaging.ObservableSubscription -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.SerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory - +import net.corda.serialization.internal.amqp.SerializationOutput +import net.corda.serialization.internal.amqp.SerializerFactory +import net.corda.serialization.internal.AllWhitelist import org.apache.activemq.artemis.api.core.SimpleString import org.junit.Test import rx.Observable diff --git a/node/src/test/kotlin/net/corda/node/internal/serialization/testutils/AMQPTestSerialiationScheme.kt b/node/src/test/kotlin/net/corda/node/internal/serialization/testutils/AMQPTestSerialiationScheme.kt index 73a48147ba..82fb3eaa70 100644 --- a/node/src/test/kotlin/net/corda/node/internal/serialization/testutils/AMQPTestSerialiationScheme.kt +++ b/node/src/test/kotlin/net/corda/node/internal/serialization/testutils/AMQPTestSerialiationScheme.kt @@ -2,17 +2,15 @@ package net.corda.node.internal.serialization.testutils import net.corda.client.rpc.internal.serialization.amqp.RpcClientObservableSerializer import net.corda.core.context.Trace -import net.corda.core.cordapp.Cordapp import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializationCustomSerializer import net.corda.node.serialization.amqp.RpcServerObservableSerializer import net.corda.nodeapi.RPCApi -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.CordaSerializationMagic -import net.corda.nodeapi.internal.serialization.amqp.AbstractAMQPSerializationScheme -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory -import java.util.concurrent.ConcurrentHashMap +import net.corda.serialization.internal.CordaSerializationMagic +import net.corda.serialization.internal.amqp.AbstractAMQPSerializationScheme +import net.corda.serialization.internal.amqp.SerializerFactory +import net.corda.serialization.internal.AllWhitelist import net.corda.client.rpc.internal.ObservableContext as ClientObservableContext /** diff --git a/node/src/test/kotlin/net/corda/node/internal/serialization/testutils/TestSerializationContext.kt b/node/src/test/kotlin/net/corda/node/internal/serialization/testutils/TestSerializationContext.kt index 54ad5e55ba..5dbf0fa138 100644 --- a/node/src/test/kotlin/net/corda/node/internal/serialization/testutils/TestSerializationContext.kt +++ b/node/src/test/kotlin/net/corda/node/internal/serialization/testutils/TestSerializationContext.kt @@ -1,9 +1,9 @@ package net.corda.node.internal.serialization.testutils import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.SerializationContextImpl -import net.corda.nodeapi.internal.serialization.amqp.amqpMagic +import net.corda.serialization.internal.SerializationContextImpl +import net.corda.serialization.internal.amqp.amqpMagic +import net.corda.serialization.internal.AllWhitelist val serializationProperties: MutableMap = mutableMapOf() 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 c2fec1b800..368821069d 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 @@ -4,7 +4,7 @@ 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.serialization.internal.amqp.AbstractAMQPSerializationScheme import net.corda.testing.core.DUMMY_BANK_A_NAME import net.corda.testing.core.DUMMY_BANK_B_NAME import net.corda.testing.driver.DriverParameters diff --git a/serialization/build.gradle b/serialization/build.gradle new file mode 100644 index 0000000000..6edf7fc75e --- /dev/null +++ b/serialization/build.gradle @@ -0,0 +1,58 @@ +apply plugin: 'kotlin' +apply plugin: 'net.corda.plugins.publish-utils' +apply plugin: 'com.jfrog.artifactory' + +description 'Corda serialization' + +dependencies { + compile project(":core") + + compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" + + compile "org.apache.activemq:artemis-commons:${artemis_version}" + + // Kryo: object graph serialization. + compile "com.esotericsoftware:kryo:4.0.0" + compile "de.javakaffee:kryo-serializers:0.41" + compile "org.ow2.asm:asm:$asm_version" + + // For AMQP serialisation. + compile "org.apache.qpid:proton-j:$protonj_version" + + // FastClasspathScanner: classpath scanning + compile "io.github.lukehutch:fast-classpath-scanner:$fast_classpath_scanner_version" + + // Pure-Java Snappy compression + compile "org.iq80.snappy:snappy:$snappy_version" + + // For caches rather than guava + compile "com.github.ben-manes.caffeine:caffeine:$caffeine_version" + + // Unit testing helpers. + testCompile "junit:junit:$junit_version" + testCompile "org.assertj:assertj-core:$assertj_version" + testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" + testCompile project(':node-driver') +} + +configurations { + testArtifacts.extendsFrom testRuntime +} + +task testJar(type: Jar) { + classifier "tests" + from sourceSets.test.output +} + +artifacts { + testArtifacts testJar +} + +jar { + baseName 'corda-serialization' +} + +publish { + name jar.baseName +} diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AllButBlacklisted.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/AllButBlacklisted.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AllButBlacklisted.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/AllButBlacklisted.kt index 4bc36e9a8b..36516d7966 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/AllButBlacklisted.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/AllButBlacklisted.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.serialization.ClassWhitelist import sun.misc.Unsafe @@ -32,7 +32,7 @@ import kotlin.collections.LinkedHashSet * Inheritance works for blacklisted items, but one can specifically exclude classes from blacklisting as well. * Note: Custom serializer registration trumps white/black lists. So if a given type has a custom serializer and has its name * in the blacklist - it will still be serialized as specified by custom serializer. - * For more details, see [net.corda.nodeapi.internal.serialization.CordaClassResolver.getRegistration] + * For more details, see [net.corda.serialization.internal.CordaClassResolver.getRegistration] */ object AllButBlacklisted : ClassWhitelist { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/AttachmentsClassLoader.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/AttachmentsClassLoader.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/AttachmentsClassLoader.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/AttachmentsClassLoader.kt index 5b53279f9f..9a7a749e32 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/AttachmentsClassLoader.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/AttachmentsClassLoader.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal +package net.corda.serialization.internal import net.corda.core.contracts.Attachment import net.corda.core.contracts.ContractAttachment diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ByteBufferStreams.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/ByteBufferStreams.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ByteBufferStreams.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/ByteBufferStreams.kt index 071f3e3ec0..4dddcf8c52 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ByteBufferStreams.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/ByteBufferStreams.kt @@ -1,6 +1,6 @@ @file:JvmName("ByteBufferStreams") -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.internal.LazyPool import java.io.ByteArrayOutputStream diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/ClassWhitelists.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/ClassWhitelists.kt new file mode 100644 index 0000000000..fd89209380 --- /dev/null +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/ClassWhitelists.kt @@ -0,0 +1,11 @@ +package net.corda.serialization.internal + +import net.corda.core.serialization.ClassWhitelist + +interface MutableClassWhitelist : ClassWhitelist { + fun add(entry: Class<*>) +} + +object AllWhitelist : ClassWhitelist { + override fun hasListed(type: Class<*>): Boolean = true +} diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ClientContexts.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/ClientContexts.kt similarity index 66% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ClientContexts.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/ClientContexts.kt index 69a3efd3e7..db2ab34736 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ClientContexts.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/ClientContexts.kt @@ -1,11 +1,13 @@ @file:JvmName("ClientContexts") -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializationDefaults -import net.corda.nodeapi.internal.serialization.amqp.amqpMagic -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.amqp.amqpMagic +import net.corda.serialization.internal.kryo.BuiltInExceptionsWhitelist +import net.corda.serialization.internal.kryo.GlobalTransientClassWhiteList +import net.corda.serialization.internal.kryo.kryoMagic /* * Serialisation contexts for the client. diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/DefaultWhitelist.kt similarity index 98% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/DefaultWhitelist.kt index e98cded106..de8e2550ec 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/DefaultWhitelist.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/DefaultWhitelist.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import com.esotericsoftware.kryo.KryoException import net.corda.core.serialization.SerializationWhitelist diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/GeneratedAttachment.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/GeneratedAttachment.kt similarity index 81% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/GeneratedAttachment.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/GeneratedAttachment.kt index 82601202e6..2cf38ce721 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/GeneratedAttachment.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/GeneratedAttachment.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.crypto.sha256 import net.corda.core.internal.AbstractAttachment diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/OrdinalIO.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/OrdinalIO.kt similarity index 95% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/OrdinalIO.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/OrdinalIO.kt index 6e04d490f4..38c9d12976 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/OrdinalIO.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/OrdinalIO.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import java.io.EOFException import java.io.InputStream diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationFormat.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/SerializationFormat.kt similarity index 94% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationFormat.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/SerializationFormat.kt index 84d6aef83b..deceae8653 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationFormat.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/SerializationFormat.kt @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.internal.VisibleForTesting import net.corda.core.serialization.SerializationEncoding import net.corda.core.utilities.ByteSequence import net.corda.core.utilities.OpaqueBytes -import net.corda.nodeapi.internal.serialization.OrdinalBits.OrdinalWriter +import net.corda.serialization.internal.OrdinalBits.OrdinalWriter import org.iq80.snappy.SnappyFramedInputStream import org.iq80.snappy.SnappyFramedOutputStream import java.io.InputStream diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/SerializationScheme.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/SerializationScheme.kt index 7e660ca78e..74dea1c063 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializationScheme.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/SerializationScheme.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import com.github.benmanes.caffeine.cache.Cache import com.github.benmanes.caffeine.cache.Caffeine @@ -7,9 +7,8 @@ import net.corda.core.crypto.SecureHash import net.corda.core.internal.copyBytes import net.corda.core.serialization.* import net.corda.core.utilities.ByteSequence -import net.corda.nodeapi.internal.AttachmentsClassLoader -import net.corda.nodeapi.internal.serialization.amqp.amqpMagic -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.amqp.amqpMagic +import net.corda.serialization.internal.kryo.kryoMagic import org.slf4j.LoggerFactory import java.io.NotSerializableException import java.util.* diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializeAsTokenContextImpl.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/SerializeAsTokenContextImpl.kt similarity index 98% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializeAsTokenContextImpl.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/SerializeAsTokenContextImpl.kt index 390d6b3624..1cffdbb9a1 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SerializeAsTokenContextImpl.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/SerializeAsTokenContextImpl.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.node.ServiceHub import net.corda.core.serialization.SerializationContext diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ServerContexts.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/ServerContexts.kt similarity index 77% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ServerContexts.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/ServerContexts.kt index 2eb7485d6a..f157ec5f2d 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/ServerContexts.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/ServerContexts.kt @@ -1,11 +1,13 @@ @file:JvmName("ServerContexts") -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializationDefaults -import net.corda.nodeapi.internal.serialization.amqp.amqpMagic -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.amqp.amqpMagic +import net.corda.serialization.internal.kryo.BuiltInExceptionsWhitelist +import net.corda.serialization.internal.kryo.GlobalTransientClassWhiteList +import net.corda.serialization.internal.kryo.kryoMagic /* * Serialisation contexts for the server. diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SharedContexts.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/SharedContexts.kt similarity index 78% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SharedContexts.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/SharedContexts.kt index 0880af153c..dc361939d3 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/SharedContexts.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/SharedContexts.kt @@ -1,10 +1,12 @@ @file:JvmName("SharedContexts") -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.serialization.* -import net.corda.nodeapi.internal.serialization.amqp.amqpMagic -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.amqp.amqpMagic +import net.corda.serialization.internal.kryo.BuiltInExceptionsWhitelist +import net.corda.serialization.internal.kryo.GlobalTransientClassWhiteList +import net.corda.serialization.internal.kryo.kryoMagic /* * Serialisation contexts shared by the server and client. diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/UseCaseAwareness.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/UseCaseAwareness.kt similarity index 91% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/UseCaseAwareness.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/UseCaseAwareness.kt index 6a828e8cc0..9dc8c2bdba 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/UseCaseAwareness.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/UseCaseAwareness.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializationFactory diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPDescriptorRegistry.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPDescriptorRegistry.kt similarity index 94% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPDescriptorRegistry.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPDescriptorRegistry.kt index 0f6683202b..3cd721bac4 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPDescriptorRegistry.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPDescriptorRegistry.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import org.apache.qpid.proton.amqp.UnsignedLong diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPExceptions.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPExceptions.kt similarity index 70% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPExceptions.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPExceptions.kt index 0f93f0947e..dbc0cad4f0 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPExceptions.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPExceptions.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import java.io.NotSerializableException import java.lang.reflect.Type diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPPrimitiveSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPPrimitiveSerializer.kt similarity index 95% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPPrimitiveSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPPrimitiveSerializer.kt index e0672e64a3..adccbe0bc7 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPPrimitiveSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPPrimitiveSerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.SerializationContext import org.apache.qpid.proton.amqp.Binary diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializationScheme.kt similarity index 65% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializationScheme.kt index edba2095ed..320037308d 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializationScheme.kt @@ -1,6 +1,6 @@ @file:JvmName("AMQPSerializationScheme") -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import io.github.lukehutch.fastclasspathscanner.FastClasspathScanner import net.corda.core.cordapp.Cordapp @@ -8,10 +8,10 @@ import net.corda.core.internal.objectOrNewInstance import net.corda.core.internal.uncheckedCast import net.corda.core.serialization.* import net.corda.core.utilities.ByteSequence -import net.corda.nodeapi.internal.serialization.CordaSerializationMagic -import net.corda.nodeapi.internal.serialization.DefaultWhitelist -import net.corda.nodeapi.internal.serialization.MutableClassWhitelist -import net.corda.nodeapi.internal.serialization.SerializationScheme +import net.corda.serialization.internal.CordaSerializationMagic +import net.corda.serialization.internal.DefaultWhitelist +import net.corda.serialization.internal.MutableClassWhitelist +import net.corda.serialization.internal.SerializationScheme import java.lang.reflect.Modifier import java.util.* import java.util.concurrent.ConcurrentHashMap @@ -73,34 +73,34 @@ abstract class AbstractAMQPSerializationScheme( private fun registerCustomSerializers(context: SerializationContext, factory: SerializerFactory) { with(factory) { register(publicKeySerializer) - register(net.corda.nodeapi.internal.serialization.amqp.custom.PrivateKeySerializer) - register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) - register(net.corda.nodeapi.internal.serialization.amqp.custom.BigIntegerSerializer) - register(net.corda.nodeapi.internal.serialization.amqp.custom.CurrencySerializer) - register(net.corda.nodeapi.internal.serialization.amqp.custom.OpaqueBytesSubSequenceSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.InstantSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.DurationSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.LocalDateSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.LocalDateTimeSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.LocalTimeSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.ZonedDateTimeSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.ZoneIdSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.OffsetTimeSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.OffsetDateTimeSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.YearSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.YearMonthSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.MonthDaySerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.PeriodSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.ClassSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.X509CertificateSerializer) - register(net.corda.nodeapi.internal.serialization.amqp.custom.X509CRLSerializer) - register(net.corda.nodeapi.internal.serialization.amqp.custom.CertPathSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.StringBufferSerializer) - register(net.corda.nodeapi.internal.serialization.amqp.custom.InputStreamSerializer) - register(net.corda.nodeapi.internal.serialization.amqp.custom.BitSetSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.EnumSetSerializer(this)) - register(net.corda.nodeapi.internal.serialization.amqp.custom.ContractAttachmentSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.PrivateKeySerializer) + register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.BigDecimalSerializer) + register(net.corda.serialization.internal.amqp.custom.BigIntegerSerializer) + register(net.corda.serialization.internal.amqp.custom.CurrencySerializer) + register(net.corda.serialization.internal.amqp.custom.OpaqueBytesSubSequenceSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.InstantSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.DurationSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.LocalDateSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.LocalDateTimeSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.LocalTimeSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.ZonedDateTimeSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.ZoneIdSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.OffsetTimeSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.OffsetDateTimeSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.YearSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.YearMonthSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.MonthDaySerializer(this)) + register(net.corda.serialization.internal.amqp.custom.PeriodSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.ClassSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.X509CertificateSerializer) + register(net.corda.serialization.internal.amqp.custom.X509CRLSerializer) + register(net.corda.serialization.internal.amqp.custom.CertPathSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.StringBufferSerializer) + register(net.corda.serialization.internal.amqp.custom.InputStreamSerializer) + register(net.corda.serialization.internal.amqp.custom.BitSetSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.EnumSetSerializer(this)) + register(net.corda.serialization.internal.amqp.custom.ContractAttachmentSerializer(this)) registerNonDeterministicSerializers(factory) } for (whitelistProvider in serializationWhitelists) { @@ -131,7 +131,7 @@ abstract class AbstractAMQPSerializationScheme( */ private fun registerNonDeterministicSerializers(factory: SerializerFactory) { with(factory) { - register(net.corda.nodeapi.internal.serialization.amqp.custom.SimpleStringSerializer) + register(net.corda.serialization.internal.amqp.custom.SimpleStringSerializer) } } @@ -139,7 +139,7 @@ abstract class AbstractAMQPSerializationScheme( protected abstract fun rpcServerSerializerFactory(context: SerializationContext): SerializerFactory // Not used as a simple direct import to facilitate testing - open val publicKeySerializer : CustomSerializer<*> = net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer + open val publicKeySerializer : CustomSerializer<*> = net.corda.serialization.internal.amqp.custom.PublicKeySerializer private fun getSerializerFactory(context: SerializationContext): SerializerFactory { return serializerFactoriesForContexts.computeIfAbsent(Pair(context.whitelist, context.deserializationClassLoader)) { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializer.kt similarity index 96% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializer.kt index e06412e4bb..d169d27da3 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.SerializationContext import org.apache.qpid.proton.amqp.Symbol diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializerFactories.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializerFactories.kt similarity index 88% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializerFactories.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializerFactories.kt index 884c6b057e..ac5aab1ed8 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializerFactories.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializerFactories.kt @@ -1,6 +1,6 @@ @file:JvmName("AMQPSerializerFactories") -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.SerializationContext diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPStreams.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPStreams.kt similarity index 74% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPStreams.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPStreams.kt index 41cae57a92..c861e22f42 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPStreams.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPStreams.kt @@ -1,10 +1,10 @@ @file:JvmName("AMQPStreams") -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp -import net.corda.nodeapi.internal.serialization.ByteBufferInputStream -import net.corda.nodeapi.internal.serialization.ByteBufferOutputStream -import net.corda.nodeapi.internal.serialization.serializeOutputStreamPool +import net.corda.serialization.internal.ByteBufferInputStream +import net.corda.serialization.internal.ByteBufferOutputStream +import net.corda.serialization.internal.serializeOutputStreamPool import java.io.InputStream import java.io.OutputStream import java.nio.ByteBuffer diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ArraySerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/ArraySerializer.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ArraySerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/ArraySerializer.kt index a6be5082a9..b9f1588341 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ArraySerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/ArraySerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.SerializationContext import org.apache.qpid.proton.amqp.Symbol diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CollectionSerializer.kt similarity index 98% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CollectionSerializer.kt index 2c2604710e..9318da28f4 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CollectionSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CollectionSerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.internal.uncheckedCast import net.corda.core.serialization.SerializationContext diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CorDappCustomSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CorDappCustomSerializer.kt similarity index 96% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CorDappCustomSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CorDappCustomSerializer.kt index 4f0b6f065f..b96c808c6e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CorDappCustomSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CorDappCustomSerializer.kt @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.internal.uncheckedCast import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializationCustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.nameForType +import net.corda.serialization.internal.amqp.SerializerFactory.Companion.nameForType import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CustomSerializer.kt similarity index 98% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CustomSerializer.kt index 46de47d12a..c46c5c16de 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/CustomSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CustomSerializer.kt @@ -1,8 +1,8 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.internal.uncheckedCast import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.nameForType +import net.corda.serialization.internal.amqp.SerializerFactory.Companion.nameForType import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/DeserializationInput.kt similarity index 98% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/DeserializationInput.kt index 20d577ee1d..ac1fa6eb15 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/DeserializationInput.kt @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.internal.VisibleForTesting import net.corda.core.serialization.EncodingWhitelist import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializedBytes import net.corda.core.utilities.ByteSequence -import net.corda.nodeapi.internal.serialization.* +import net.corda.serialization.internal.* import org.apache.qpid.proton.amqp.Binary import org.apache.qpid.proton.amqp.DescribedType import org.apache.qpid.proton.amqp.UnsignedInteger diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedGenericArrayType.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/DeserializedGenericArrayType.kt similarity index 92% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedGenericArrayType.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/DeserializedGenericArrayType.kt index 4cfaa17e8e..364b5afa6e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedGenericArrayType.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/DeserializedGenericArrayType.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import java.lang.reflect.GenericArrayType import java.lang.reflect.Type diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedParameterizedType.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/DeserializedParameterizedType.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedParameterizedType.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/DeserializedParameterizedType.kt index 1a9b05a9c1..74531364a6 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedParameterizedType.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/DeserializedParameterizedType.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import com.google.common.primitives.Primitives import java.io.NotSerializableException diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumEvolutionSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EnumEvolutionSerializer.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumEvolutionSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EnumEvolutionSerializer.kt index ee49ae6e69..4609878578 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumEvolutionSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EnumEvolutionSerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.internal.uncheckedCast import net.corda.core.serialization.SerializationContext diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EnumSerializer.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EnumSerializer.kt index 8cc39e6079..13ea0d815b 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EnumSerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.SerializationContext import org.apache.qpid.proton.amqp.Symbol diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Envelope.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/Envelope.kt similarity index 98% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Envelope.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/Envelope.kt index 10fcc8966b..a74bd82675 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Envelope.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/Envelope.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import org.apache.qpid.proton.amqp.DescribedType import org.apache.qpid.proton.codec.Data diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolutionSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolutionSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt index 691921bc8c..6020b9a265 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolutionSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt @@ -1,8 +1,8 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.DeprecatedConstructorForDeserialization import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.serialization.carpenter.getTypeAsClass +import net.corda.serialization.internal.carpenter.getTypeAsClass import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException import java.lang.reflect.Type diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/FingerPrinter.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/FingerPrinter.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/FingerPrinter.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/FingerPrinter.kt index 086b8b1d27..70802d818a 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/FingerPrinter.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/FingerPrinter.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import com.google.common.hash.Hasher import com.google.common.hash.Hashing diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/MapSerializer.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/MapSerializer.kt index d71aec7085..062848d718 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/MapSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/MapSerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.internal.uncheckedCast import net.corda.core.serialization.SerializationContext diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/ObjectSerializer.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/ObjectSerializer.kt index 59d2d7f2d0..ff04495c6f 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/ObjectSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/ObjectSerializer.kt @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.SerializationContext import net.corda.core.utilities.contextLogger import net.corda.core.utilities.trace -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.nameForType +import net.corda.serialization.internal.amqp.SerializerFactory.Companion.nameForType import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/PropertySerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/PropertySerializer.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/PropertySerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/PropertySerializer.kt index f97955a8ca..fe052c5b3d 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/PropertySerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/PropertySerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.SerializationContext import org.apache.qpid.proton.amqp.Binary diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/PropertySerializers.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/PropertySerializers.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/PropertySerializers.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/PropertySerializers.kt index 0b6dd5cb0f..de9e6582dc 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/PropertySerializers.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/PropertySerializers.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.utilities.loggerFor import java.io.NotSerializableException diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/Schema.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/Schema.kt index 1318d066fe..009268c5e3 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/Schema.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/Schema.kt @@ -1,15 +1,15 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.internal.uncheckedCast -import net.corda.nodeapi.internal.serialization.CordaSerializationMagic +import net.corda.serialization.internal.CordaSerializationMagic import org.apache.qpid.proton.amqp.DescribedType import org.apache.qpid.proton.amqp.Symbol import org.apache.qpid.proton.amqp.UnsignedInteger import org.apache.qpid.proton.amqp.UnsignedLong import org.apache.qpid.proton.codec.DescribedTypeConstructor import java.io.NotSerializableException -import net.corda.nodeapi.internal.serialization.carpenter.Field as CarpenterField -import net.corda.nodeapi.internal.serialization.carpenter.Schema as CarpenterSchema +import net.corda.serialization.internal.carpenter.Field as CarpenterField +import net.corda.serialization.internal.carpenter.Schema as CarpenterSchema const val DESCRIPTOR_DOMAIN: String = "net.corda" val amqpMagic = CordaSerializationMagic("corda".toByteArray() + byteArrayOf(1, 0)) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializationHelper.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializationHelper.kt index fe4af5d4bf..24c2d33420 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializationHelper.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import com.google.common.primitives.Primitives import com.google.common.reflect.TypeToken diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializationOutput.kt similarity index 95% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializationOutput.kt index ad47301f28..531c025a3b 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializationOutput.kt @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializationEncoding import net.corda.core.serialization.SerializedBytes -import net.corda.nodeapi.internal.serialization.CordaSerializationEncoding -import net.corda.nodeapi.internal.serialization.SectionId -import net.corda.nodeapi.internal.serialization.byteArrayOutput +import net.corda.serialization.internal.CordaSerializationEncoding +import net.corda.serialization.internal.SectionId +import net.corda.serialization.internal.byteArrayOutput import org.apache.qpid.proton.codec.Data import java.io.NotSerializableException import java.io.OutputStream diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializerFactory.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializerFactory.kt index 1ea7daf020..7162f27afb 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializerFactory.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializerFactory.kt @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import com.google.common.primitives.Primitives import com.google.common.reflect.TypeResolver import net.corda.core.internal.uncheckedCast import net.corda.core.serialization.ClassWhitelist import net.corda.core.utilities.loggerFor -import net.corda.nodeapi.internal.serialization.carpenter.* +import net.corda.serialization.internal.carpenter.* import org.apache.qpid.proton.amqp.* import java.io.NotSerializableException import java.lang.reflect.* diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SingletonSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SingletonSerializer.kt similarity index 96% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SingletonSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SingletonSerializer.kt index 59bd371a33..584501a877 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SingletonSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SingletonSerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.SerializationContext import org.apache.qpid.proton.amqp.Symbol diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SupportedTransforms.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SupportedTransforms.kt similarity index 98% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SupportedTransforms.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SupportedTransforms.kt index b785d0e8c6..e93a519133 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SupportedTransforms.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SupportedTransforms.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.CordaSerializationTransformEnumDefault import net.corda.core.serialization.CordaSerializationTransformEnumDefaults diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/TransformTypes.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/TransformTypes.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/TransformTypes.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/TransformTypes.kt index 09c9be7746..8714d49206 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/TransformTypes.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/TransformTypes.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.internal.uncheckedCast import net.corda.core.serialization.CordaSerializationTransformEnumDefault @@ -102,6 +102,7 @@ enum class TransformTypes(val build: (Annotation) -> Transform) : DescribedType //,UnknownTest({ a -> UnknownTestTransform((a as UnknownTransformAnnotation).a, a.b, a.c)}) { // override fun getDescriptor(): Any = DESCRIPTOR // override fun getDescribed(): Any = ordinal + // override fun validate(list: List, constants: Map) = Unit //} ; diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/TransformsSchema.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/TransformsSchema.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/TransformsSchema.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/TransformsSchema.kt index ee695fd7bb..e922136ee1 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/TransformsSchema.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/TransformsSchema.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.CordaSerializationTransformEnumDefault import net.corda.core.serialization.CordaSerializationTransformRename diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BigDecimalSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/BigDecimalSerializer.kt similarity index 70% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BigDecimalSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/BigDecimalSerializer.kt index f1bd3874b5..2fa2aaee4d 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BigDecimalSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/BigDecimalSerializer.kt @@ -1,6 +1,6 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.CustomSerializer import java.math.BigDecimal /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BigIntegerSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/BigIntegerSerializer.kt similarity index 70% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BigIntegerSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/BigIntegerSerializer.kt index 268676c312..a36c04044c 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BigIntegerSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/BigIntegerSerializer.kt @@ -1,6 +1,6 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.CustomSerializer import java.math.BigInteger /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BitSetSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/BitSetSerializer.kt similarity index 73% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BitSetSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/BitSetSerializer.kt index cf62d48d5c..6a0f2af34a 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BitSetSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/BitSetSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.util.* /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/CertPathSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/CertPathSerializer.kt similarity index 82% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/CertPathSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/CertPathSerializer.kt index b6ed889190..a1d2aa8efc 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/CertPathSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/CertPathSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.io.NotSerializableException import java.security.cert.CertPath import java.security.cert.CertificateException diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ClassSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ClassSerializer.kt similarity index 65% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ClassSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ClassSerializer.kt index 7c399d5a68..78e5d9f5ad 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ClassSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ClassSerializer.kt @@ -1,7 +1,8 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.custom.ClassSerializer.ClassProxy /** * A serializer for [Class] that uses [ClassProxy] proxy object to write out diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ContractAttachmentSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ContractAttachmentSerializer.kt similarity index 83% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ContractAttachmentSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ContractAttachmentSerializer.kt index 2faa5b4abf..ece4cf29ac 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ContractAttachmentSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ContractAttachmentSerializer.kt @@ -1,13 +1,13 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom import net.corda.core.contracts.Attachment import net.corda.core.contracts.ContractAttachment import net.corda.core.contracts.ContractClassName import net.corda.core.internal.readFully import net.corda.core.serialization.MissingAttachmentsException -import net.corda.nodeapi.internal.serialization.GeneratedAttachment -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.GeneratedAttachment +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory /** * A serializer for [ContractAttachment] that uses a proxy object to write out the full attachment eagerly. diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/CurrencySerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/CurrencySerializer.kt similarity index 71% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/CurrencySerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/CurrencySerializer.kt index c0a970b1cb..91b8c40641 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/CurrencySerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/CurrencySerializer.kt @@ -1,6 +1,6 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.CustomSerializer import java.util.* /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/DurationSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/DurationSerializer.kt similarity index 74% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/DurationSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/DurationSerializer.kt index 27ef747e79..e7c9d76147 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/DurationSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/DurationSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.Duration /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/EnumSetSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/EnumSetSerializer.kt similarity index 82% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/EnumSetSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/EnumSetSerializer.kt index 5f86857ffe..d11449d839 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/EnumSetSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/EnumSetSerializer.kt @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom import net.corda.core.internal.uncheckedCast -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.MapSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.MapSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.util.* /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/InputStreamSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/InputStreamSerializer.kt similarity index 94% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/InputStreamSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/InputStreamSerializer.kt index 0ab61b41c8..cc100d551e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/InputStreamSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/InputStreamSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.serialization.amqp.* +import net.corda.serialization.internal.amqp.* import org.apache.qpid.proton.amqp.Binary import org.apache.qpid.proton.codec.Data import java.io.ByteArrayInputStream diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/InstantSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/InstantSerializer.kt similarity index 75% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/InstantSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/InstantSerializer.kt index 9e3c10d5ec..236c3d01be 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/InstantSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/InstantSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.Instant /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/LocalDateSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/LocalDateSerializer.kt similarity index 76% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/LocalDateSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/LocalDateSerializer.kt index 7222924e86..0c467478e1 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/LocalDateSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/LocalDateSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.LocalDate /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/LocalDateTimeSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/LocalDateTimeSerializer.kt similarity index 80% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/LocalDateTimeSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/LocalDateTimeSerializer.kt index bfe68ceaa4..53f8f1fb36 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/LocalDateTimeSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/LocalDateTimeSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/LocalTimeSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/LocalTimeSerializer.kt similarity index 78% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/LocalTimeSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/LocalTimeSerializer.kt index a355c44a71..c3163f4050 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/LocalTimeSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/LocalTimeSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.LocalTime /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/MonthDaySerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/MonthDaySerializer.kt similarity index 75% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/MonthDaySerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/MonthDaySerializer.kt index ba267f468c..4e7b101d40 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/MonthDaySerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/MonthDaySerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.MonthDay /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/OffsetDateTimeSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/OffsetDateTimeSerializer.kt similarity index 81% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/OffsetDateTimeSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/OffsetDateTimeSerializer.kt index e0faf66299..5539e57fef 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/OffsetDateTimeSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/OffsetDateTimeSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.LocalDateTime import java.time.OffsetDateTime import java.time.ZoneOffset diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/OffsetTimeSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/OffsetTimeSerializer.kt similarity index 80% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/OffsetTimeSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/OffsetTimeSerializer.kt index 7f155c090b..dcf47f7aa8 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/OffsetTimeSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/OffsetTimeSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.LocalTime import java.time.OffsetTime import java.time.ZoneOffset diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/OpaqueBytesSubSequenceSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/OpaqueBytesSubSequenceSerializer.kt similarity index 80% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/OpaqueBytesSubSequenceSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/OpaqueBytesSubSequenceSerializer.kt index ec10ee72f8..d649d1a0e9 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/OpaqueBytesSubSequenceSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/OpaqueBytesSubSequenceSerializer.kt @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.OpaqueBytesSubSequence -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory /** * A serializer for [OpaqueBytesSubSequence] that uses a proxy object to write out only content included into sequence diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/PeriodSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/PeriodSerializer.kt similarity index 73% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/PeriodSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/PeriodSerializer.kt index 3eca9063c6..efef4766e5 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/PeriodSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/PeriodSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.Period /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/PrivateKeySerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/PrivateKeySerializer.kt similarity index 88% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/PrivateKeySerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/PrivateKeySerializer.kt index e1310745bc..e87c679570 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/PrivateKeySerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/PrivateKeySerializer.kt @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom import net.corda.core.crypto.Crypto import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializationContext.UseCase.Checkpoint import net.corda.core.serialization.SerializationContext.UseCase.Storage -import net.corda.nodeapi.internal.serialization.amqp.* -import net.corda.nodeapi.internal.serialization.checkUseCase +import net.corda.serialization.internal.amqp.* +import net.corda.serialization.internal.checkUseCase import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type import java.security.PrivateKey diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/PublicKeySerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/PublicKeySerializer.kt similarity index 91% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/PublicKeySerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/PublicKeySerializer.kt index 3a9ac67fef..bf6025360d 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/PublicKeySerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/PublicKeySerializer.kt @@ -1,8 +1,8 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom import net.corda.core.crypto.Crypto import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.serialization.amqp.* +import net.corda.serialization.internal.amqp.* import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type import java.security.PublicKey diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/SimpleStringSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/SimpleStringSerializer.kt similarity index 50% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/SimpleStringSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/SimpleStringSerializer.kt index 0243558332..083c280835 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/SimpleStringSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/SimpleStringSerializer.kt @@ -1,6 +1,6 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.CustomSerializer import org.apache.activemq.artemis.api.core.SimpleString /** diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/StringBufferSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/StringBufferSerializer.kt new file mode 100644 index 0000000000..615a3a6f79 --- /dev/null +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/StringBufferSerializer.kt @@ -0,0 +1,8 @@ +package net.corda.serialization.internal.amqp.custom + +import net.corda.serialization.internal.amqp.CustomSerializer + +/** + * A serializer for [StringBuffer]. + */ +object StringBufferSerializer : CustomSerializer.ToString(StringBuffer::class.java) \ No newline at end of file diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ThrowableSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ThrowableSerializer.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ThrowableSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ThrowableSerializer.kt index c4214394f3..d2161344f3 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ThrowableSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ThrowableSerializer.kt @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom import net.corda.core.CordaRuntimeException import net.corda.core.CordaThrowable import net.corda.core.serialization.SerializationFactory import net.corda.core.utilities.contextLogger -import net.corda.nodeapi.internal.serialization.amqp.* +import net.corda.serialization.internal.amqp.* import java.io.NotSerializableException class ThrowableSerializer(factory: SerializerFactory) : CustomSerializer.Proxy(Throwable::class.java, ThrowableProxy::class.java, factory) { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/X509CRLSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/X509CRLSerializer.kt similarity index 72% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/X509CRLSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/X509CRLSerializer.kt index c0cf66a631..9a5a06b62e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/X509CRLSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/X509CRLSerializer.kt @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.crypto.X509CertificateFactory -import net.corda.nodeapi.internal.serialization.amqp.* +import net.corda.serialization.internal.amqp.* import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type +import java.security.cert.CertificateFactory import java.security.cert.X509CRL object X509CRLSerializer : CustomSerializer.Implements(X509CRL::class.java) { @@ -18,15 +18,13 @@ object X509CRLSerializer : CustomSerializer.Implements(X509CRL::class.j ))) override fun writeDescribedObject(obj: X509CRL, data: Data, type: Type, output: SerializationOutput, - context: SerializationContext - ) { + context: SerializationContext) { output.writeObject(obj.encoded, data, clazz, context) } override fun readObject(obj: Any, schemas: SerializationSchemas, input: DeserializationInput, - context: SerializationContext - ): X509CRL { + context: SerializationContext): X509CRL { val bytes = input.readObject(obj, schemas, ByteArray::class.java, context) as ByteArray - return X509CertificateFactory().delegate.generateCRL(bytes.inputStream()) as X509CRL + return CertificateFactory.getInstance("X.509").generateCRL(bytes.inputStream()) as X509CRL } -} \ No newline at end of file +} diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/X509CertificateSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/X509CertificateSerializer.kt similarity index 74% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/X509CertificateSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/X509CertificateSerializer.kt index 353f3acacf..5d00cef9b0 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/X509CertificateSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/X509CertificateSerializer.kt @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.crypto.X509CertificateFactory -import net.corda.nodeapi.internal.serialization.amqp.* +import net.corda.serialization.internal.amqp.* import org.apache.qpid.proton.codec.Data import java.lang.reflect.Type +import java.security.cert.CertificateFactory import java.security.cert.X509Certificate object X509CertificateSerializer : CustomSerializer.Implements(X509Certificate::class.java) { @@ -18,15 +18,13 @@ object X509CertificateSerializer : CustomSerializer.Implements( ))) override fun writeDescribedObject(obj: X509Certificate, data: Data, type: Type, output: SerializationOutput, - context: SerializationContext - ) { + context: SerializationContext) { output.writeObject(obj.encoded, data, clazz, context) } override fun readObject(obj: Any, schemas: SerializationSchemas, input: DeserializationInput, - context: SerializationContext - ): X509Certificate { + context: SerializationContext): X509Certificate { val bits = input.readObject(obj, schemas, ByteArray::class.java, context) as ByteArray - return X509CertificateFactory().generateCertificate(bits.inputStream()) + return CertificateFactory.getInstance("X.509").generateCertificate(bits.inputStream()) as X509Certificate } } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/YearMonthSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/YearMonthSerializer.kt similarity index 74% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/YearMonthSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/YearMonthSerializer.kt index 8bb5458e82..4fbc1a7ddf 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/YearMonthSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/YearMonthSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.YearMonth /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/YearSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/YearSerializer.kt similarity index 69% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/YearSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/YearSerializer.kt index 2d2948c172..ab7a4c32ee 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/YearSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/YearSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.Year /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ZoneIdSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ZoneIdSerializer.kt similarity index 72% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ZoneIdSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ZoneIdSerializer.kt index 1d590a61da..3b6b033275 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ZoneIdSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ZoneIdSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.time.ZoneId /** diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ZonedDateTimeSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ZonedDateTimeSerializer.kt similarity index 87% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ZonedDateTimeSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ZonedDateTimeSerializer.kt index 27475ba224..562b65aeb2 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/ZonedDateTimeSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ZonedDateTimeSerializer.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp.custom +package net.corda.serialization.internal.amqp.custom -import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.CustomSerializer +import net.corda.serialization.internal.amqp.SerializerFactory import java.lang.reflect.Method import java.time.LocalDateTime import java.time.ZoneId diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/AMQPSchemaExtensions.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/AMQPSchemaExtensions.kt similarity index 94% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/AMQPSchemaExtensions.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/AMQPSchemaExtensions.kt index 6631ec0a3e..6d9e847739 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/AMQPSchemaExtensions.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/AMQPSchemaExtensions.kt @@ -1,12 +1,12 @@ @file:JvmName("AMQPSchemaExtensions") -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.serialization.amqp.CompositeType -import net.corda.nodeapi.internal.serialization.amqp.RestrictedType -import net.corda.nodeapi.internal.serialization.amqp.Field as AMQPField -import net.corda.nodeapi.internal.serialization.amqp.Schema as AMQPSchema +import net.corda.serialization.internal.amqp.CompositeType +import net.corda.serialization.internal.amqp.RestrictedType +import net.corda.serialization.internal.amqp.Field as AMQPField +import net.corda.serialization.internal.amqp.Schema as AMQPSchema fun AMQPSchema.carpenterSchema(classloader: ClassLoader): CarpenterMetaSchema { val rtn = CarpenterMetaSchema.newInstance() diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenter.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenter.kt similarity index 99% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenter.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenter.kt index f828041a36..679a198f86 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenter.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenter.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import com.google.common.base.MoreObjects import net.corda.core.serialization.ClassWhitelist diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/Exceptions.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/Exceptions.kt similarity index 96% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/Exceptions.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/Exceptions.kt index 20710e12c5..4d5ccfb864 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/Exceptions.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/Exceptions.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import net.corda.core.CordaRuntimeException import org.objectweb.asm.Type diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/MetaCarpenter.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/MetaCarpenter.kt similarity index 95% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/MetaCarpenter.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/MetaCarpenter.kt index 819b8a79da..0d82f75006 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/MetaCarpenter.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/MetaCarpenter.kt @@ -1,8 +1,8 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter -import net.corda.nodeapi.internal.serialization.amqp.CompositeType -import net.corda.nodeapi.internal.serialization.amqp.RestrictedType -import net.corda.nodeapi.internal.serialization.amqp.TypeNotation +import net.corda.serialization.internal.amqp.CompositeType +import net.corda.serialization.internal.amqp.RestrictedType +import net.corda.serialization.internal.amqp.TypeNotation /** * Generated from an AMQP schema this class represents the classes unknown to the deserializer and that thusly diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/Schema.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/Schema.kt similarity index 98% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/Schema.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/Schema.kt index a5de6bf2b0..3685cacf8c 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/Schema.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/Schema.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import org.objectweb.asm.ClassWriter import org.objectweb.asm.Opcodes.* diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/SchemaFields.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/SchemaFields.kt similarity index 98% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/SchemaFields.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/SchemaFields.kt index 351aaecb70..e6cd9cf58e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/carpenter/SchemaFields.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/carpenter/SchemaFields.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import jdk.internal.org.objectweb.asm.Opcodes.* import org.objectweb.asm.ClassWriter diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/CordaClassResolver.kt similarity index 94% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/kryo/CordaClassResolver.kt index fe94544a35..3214776302 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolver.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/CordaClassResolver.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal.kryo import com.esotericsoftware.kryo.* import com.esotericsoftware.kryo.io.Input @@ -11,9 +11,9 @@ import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.CordaSerializable import net.corda.core.serialization.SerializationContext import net.corda.core.utilities.contextLogger -import net.corda.nodeapi.internal.AttachmentsClassLoader -import net.corda.nodeapi.internal.serialization.amqp.hasAnnotationInHierarchy -import net.corda.nodeapi.internal.serialization.kryo.ThrowableSerializer +import net.corda.serialization.internal.AttachmentsClassLoader +import net.corda.serialization.internal.MutableClassWhitelist +import net.corda.serialization.internal.amqp.hasAnnotationInHierarchy import java.io.PrintWriter import java.lang.reflect.Modifier import java.lang.reflect.Modifier.isAbstract @@ -146,10 +146,6 @@ class CordaClassResolver(serializationContext: SerializationContext) : DefaultCl } } -interface MutableClassWhitelist : ClassWhitelist { - fun add(entry: Class<*>) -} - class BuiltInExceptionsWhitelist : ClassWhitelist { companion object { private val packageName = "^(?:java|kotlin)(?:[.]|$)".toRegex() @@ -158,15 +154,11 @@ class BuiltInExceptionsWhitelist : ClassWhitelist { override fun hasListed(type: Class<*>) = Throwable::class.java.isAssignableFrom(type) && packageName.containsMatchIn(type.`package`.name) } -object AllWhitelist : ClassWhitelist { - override fun hasListed(type: Class<*>): Boolean = true -} - sealed class AbstractMutableClassWhitelist(private val whitelist: MutableSet, private val delegate: ClassWhitelist) : MutableClassWhitelist { override fun hasListed(type: Class<*>): Boolean { /** - * There are certain delegates like [net.corda.nodeapi.internal.serialization.AllButBlacklisted] + * There are certain delegates like [net.corda.serialization.internal.AllButBlacklisted] * which may throw when asked whether the type is listed. * In such situations - it may be a good idea to ask [delegate] first before making a check against own [whitelist]. */ @@ -179,7 +171,7 @@ sealed class AbstractMutableClassWhitelist(private val whitelist: MutableSet = Collections.synchronizedSet(mutableSetOf()) } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/CordaClosureSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/CordaClosureSerializer.kt similarity index 94% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/CordaClosureSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/kryo/CordaClosureSerializer.kt index 13ecd2682c..ccba5bc571 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/CordaClosureSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/CordaClosureSerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.kryo +package net.corda.serialization.internal.kryo import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.io.Output diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/DefaultKryoCustomizer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/DefaultKryoCustomizer.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/DefaultKryoCustomizer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/kryo/DefaultKryoCustomizer.kt index bf400d9e36..ea95c03908 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/DefaultKryoCustomizer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/DefaultKryoCustomizer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.kryo +package net.corda.serialization.internal.kryo import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.Serializer @@ -26,10 +26,9 @@ import net.corda.core.serialization.SerializedBytes import net.corda.core.transactions.* import net.corda.core.utilities.NonEmptySet import net.corda.core.utilities.toNonEmptySet -import net.corda.nodeapi.internal.serialization.CordaClassResolver -import net.corda.nodeapi.internal.serialization.DefaultWhitelist -import net.corda.nodeapi.internal.serialization.GeneratedAttachment -import net.corda.nodeapi.internal.serialization.MutableClassWhitelist +import net.corda.serialization.internal.DefaultWhitelist +import net.corda.serialization.internal.GeneratedAttachment +import net.corda.serialization.internal.MutableClassWhitelist import net.i2p.crypto.eddsa.EdDSAPrivateKey import net.i2p.crypto.eddsa.EdDSAPublicKey import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/Kryo.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/Kryo.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/Kryo.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/kryo/Kryo.kt index df8c3814ac..c8ff5cc6e4 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/Kryo.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/Kryo.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.kryo +package net.corda.serialization.internal.kryo import com.esotericsoftware.kryo.* import com.esotericsoftware.kryo.factories.ReflectionSerializerFactory @@ -19,9 +19,7 @@ import net.corda.core.serialization.SerializeAsTokenContext import net.corda.core.serialization.SerializedBytes import net.corda.core.transactions.* import net.corda.core.utilities.OpaqueBytes -import net.corda.nodeapi.internal.crypto.X509CertificateFactory -import net.corda.nodeapi.internal.serialization.CordaClassResolver -import net.corda.nodeapi.internal.serialization.serializationContextKey +import net.corda.serialization.internal.serializationContextKey import org.slf4j.Logger import org.slf4j.LoggerFactory import java.io.InputStream @@ -278,7 +276,7 @@ object SignedTransactionSerializer : Serializer() { sealed class UseCaseSerializer(private val allowedUseCases: EnumSet) : Serializer() { protected fun checkUseCase() { - net.corda.nodeapi.internal.serialization.checkUseCase(allowedUseCases) + net.corda.serialization.internal.checkUseCase(allowedUseCases) } } @@ -445,7 +443,7 @@ object CertPathSerializer : Serializer() { @ThreadSafe object X509CertificateSerializer : Serializer() { override fun read(kryo: Kryo, input: Input, type: Class): X509Certificate { - return X509CertificateFactory().generateCertificate(input.readBytesWithLength().inputStream()) + return CertificateFactory.getInstance("X.509").generateCertificate(input.readBytesWithLength().inputStream()) as X509Certificate } override fun write(kryo: Kryo, output: Output, obj: X509Certificate) { diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoSerializationScheme.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/KryoSerializationScheme.kt similarity index 97% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoSerializationScheme.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/kryo/KryoSerializationScheme.kt index 405ae1b72c..2800539959 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoSerializationScheme.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/KryoSerializationScheme.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.kryo +package net.corda.serialization.internal.kryo import co.paralleluniverse.fibers.Fiber import co.paralleluniverse.io.serialization.kryo.KryoSerializer @@ -14,8 +14,8 @@ import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializedBytes import net.corda.core.utilities.ByteSequence -import net.corda.nodeapi.internal.serialization.* -import net.corda.nodeapi.internal.serialization.SectionId +import net.corda.serialization.internal.* +import net.corda.serialization.internal.SectionId import java.security.PublicKey import java.util.concurrent.ConcurrentHashMap diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoStreams.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/KryoStreams.kt similarity index 91% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoStreams.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/kryo/KryoStreams.kt index bd29023e63..8dd9d044a8 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoStreams.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/KryoStreams.kt @@ -1,11 +1,11 @@ @file:JvmName("KryoStreams") -package net.corda.nodeapi.internal.serialization.kryo +package net.corda.serialization.internal.kryo import com.esotericsoftware.kryo.io.Input import com.esotericsoftware.kryo.io.Output import net.corda.core.internal.LazyPool -import net.corda.nodeapi.internal.serialization.byteArrayOutput +import net.corda.serialization.internal.byteArrayOutput import java.io.InputStream import java.io.OutputStream import java.io.SequenceInputStream diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/SerializeAsTokenSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/SerializeAsTokenSerializer.kt similarity index 96% rename from node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/SerializeAsTokenSerializer.kt rename to serialization/src/main/kotlin/net/corda/serialization/internal/kryo/SerializeAsTokenSerializer.kt index 142e9fe35e..0d7f429167 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/kryo/SerializeAsTokenSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/kryo/SerializeAsTokenSerializer.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.kryo +package net.corda.serialization.internal.kryo import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.KryoException diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/ForbiddenLambdaSerializationTests.java b/serialization/src/test/java/net/corda/serialization/internal/ForbiddenLambdaSerializationTests.java similarity index 96% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/ForbiddenLambdaSerializationTests.java rename to serialization/src/test/java/net/corda/serialization/internal/ForbiddenLambdaSerializationTests.java index 8ae47ea391..4a6299a3d5 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/ForbiddenLambdaSerializationTests.java +++ b/serialization/src/test/java/net/corda/serialization/internal/ForbiddenLambdaSerializationTests.java @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization; +package net.corda.serialization.internal; import com.google.common.collect.Maps; import net.corda.core.serialization.SerializationContext; import net.corda.core.serialization.SerializationFactory; import net.corda.core.serialization.SerializedBytes; -import net.corda.nodeapi.internal.serialization.amqp.SchemaKt; +import net.corda.serialization.internal.amqp.SchemaKt; import net.corda.testing.core.SerializationEnvironmentRule; import org.junit.Before; import org.junit.Rule; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/LambdaCheckpointSerializationTest.java b/serialization/src/test/java/net/corda/serialization/internal/LambdaCheckpointSerializationTest.java similarity index 91% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/LambdaCheckpointSerializationTest.java rename to serialization/src/test/java/net/corda/serialization/internal/LambdaCheckpointSerializationTest.java index 4da40c0239..15fbeb838d 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/LambdaCheckpointSerializationTest.java +++ b/serialization/src/test/java/net/corda/serialization/internal/LambdaCheckpointSerializationTest.java @@ -1,12 +1,12 @@ -package net.corda.nodeapi.internal.serialization; +package net.corda.serialization.internal; import com.google.common.collect.Maps; import net.corda.core.serialization.SerializationContext; import net.corda.core.serialization.SerializationFactory; import net.corda.core.serialization.SerializedBytes; import net.corda.testing.core.SerializationEnvironmentRule; -import net.corda.nodeapi.internal.serialization.kryo.CordaClosureSerializer; -import net.corda.nodeapi.internal.serialization.kryo.KryoSerializationSchemeKt; +import net.corda.serialization.internal.kryo.CordaClosureSerializer; +import net.corda.serialization.internal.kryo.KryoSerializationSchemeKt; import org.junit.Before; import org.junit.Rule; import org.junit.Test; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/ErrorMessageTests.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/ErrorMessageTests.java similarity index 88% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/ErrorMessageTests.java rename to serialization/src/test/java/net/corda/serialization/internal/amqp/ErrorMessageTests.java index 985abc619d..24a64ff8fb 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/ErrorMessageTests.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/ErrorMessageTests.java @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp; +package net.corda.serialization.internal.amqp; -import net.corda.nodeapi.internal.serialization.AllWhitelist; -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationContext; +import net.corda.serialization.internal.AllWhitelist; +import net.corda.serialization.internal.amqp.testutils.TestSerializationContext; import org.assertj.core.api.Assertions; import org.junit.Ignore; import org.junit.Test; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaGenericsTest.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaGenericsTest.java similarity index 94% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaGenericsTest.java rename to serialization/src/test/java/net/corda/serialization/internal/amqp/JavaGenericsTest.java index b595195f01..d3ab33fbc0 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaGenericsTest.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaGenericsTest.java @@ -1,8 +1,8 @@ -package net.corda.nodeapi.internal.serialization.amqp; +package net.corda.serialization.internal.amqp; import net.corda.core.serialization.SerializedBytes; -import net.corda.nodeapi.internal.serialization.AllWhitelist; -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationContext; +import net.corda.serialization.internal.AllWhitelist; +import net.corda.serialization.internal.amqp.testutils.TestSerializationContext; import org.junit.Test; import java.io.NotSerializableException; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaNestedClassesTests.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaNestedClassesTests.java similarity index 97% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaNestedClassesTests.java rename to serialization/src/test/java/net/corda/serialization/internal/amqp/JavaNestedClassesTests.java index 9a0162422a..40fdc40cfe 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaNestedClassesTests.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaNestedClassesTests.java @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization.amqp; +package net.corda.serialization.internal.amqp; import com.google.common.collect.ImmutableList; import net.corda.core.contracts.ContractState; import net.corda.core.identity.AbstractParty; import net.corda.core.serialization.SerializedBytes; -import net.corda.nodeapi.internal.serialization.AllWhitelist; -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationContext; +import net.corda.serialization.internal.AllWhitelist; +import net.corda.serialization.internal.amqp.testutils.TestSerializationContext; import org.assertj.core.api.Assertions; import org.jetbrains.annotations.NotNull; import org.junit.Test; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaNestedInheritenceTests.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaNestedInheritenceTests.java similarity index 93% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaNestedInheritenceTests.java rename to serialization/src/test/java/net/corda/serialization/internal/amqp/JavaNestedInheritenceTests.java index 8097fe9530..039dacd688 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaNestedInheritenceTests.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaNestedInheritenceTests.java @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization.amqp; +package net.corda.serialization.internal.amqp; import com.google.common.collect.ImmutableList; import net.corda.core.contracts.ContractState; import net.corda.core.identity.AbstractParty; -import net.corda.nodeapi.internal.serialization.AllWhitelist; -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationContext; +import net.corda.serialization.internal.AllWhitelist; +import net.corda.serialization.internal.amqp.testutils.TestSerializationContext; import org.assertj.core.api.Assertions; import org.jetbrains.annotations.NotNull; import org.junit.Test; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaPrivatePropertyTests.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaPrivatePropertyTests.java similarity index 97% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaPrivatePropertyTests.java rename to serialization/src/test/java/net/corda/serialization/internal/amqp/JavaPrivatePropertyTests.java index 2c0fe80a9e..ef726dafdd 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaPrivatePropertyTests.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaPrivatePropertyTests.java @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.amqp; +package net.corda.serialization.internal.amqp; -import net.corda.nodeapi.internal.serialization.AllWhitelist; -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationContext; +import net.corda.serialization.internal.AllWhitelist; +import net.corda.serialization.internal.amqp.testutils.TestSerializationContext; import org.junit.Test; import static org.junit.Assert.*; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerialiseEnumTests.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaSerialiseEnumTests.java similarity index 83% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerialiseEnumTests.java rename to serialization/src/test/java/net/corda/serialization/internal/amqp/JavaSerialiseEnumTests.java index e55fe7caed..6037440a0c 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerialiseEnumTests.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaSerialiseEnumTests.java @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp; +package net.corda.serialization.internal.amqp; -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationContext; +import net.corda.serialization.internal.amqp.testutils.TestSerializationContext; import org.junit.Test; -import net.corda.nodeapi.internal.serialization.AllWhitelist; +import net.corda.serialization.internal.AllWhitelist; import net.corda.core.serialization.SerializedBytes; import java.io.NotSerializableException; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerializationOutputTests.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaSerializationOutputTests.java similarity index 97% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerializationOutputTests.java rename to serialization/src/test/java/net/corda/serialization/internal/amqp/JavaSerializationOutputTests.java index 66819afa99..375e894d2c 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/JavaSerializationOutputTests.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaSerializationOutputTests.java @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp; +package net.corda.serialization.internal.amqp; import net.corda.core.serialization.ConstructorForDeserialization; -import net.corda.nodeapi.internal.serialization.AllWhitelist; +import net.corda.serialization.internal.AllWhitelist; import net.corda.core.serialization.SerializedBytes; -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationContext; +import net.corda.serialization.internal.amqp.testutils.TestSerializationContext; import org.apache.qpid.proton.codec.DecoderImpl; import org.apache.qpid.proton.codec.EncoderImpl; import org.junit.Test; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/ListsSerializationJavaTest.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/ListsSerializationJavaTest.java similarity index 95% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/ListsSerializationJavaTest.java rename to serialization/src/test/java/net/corda/serialization/internal/amqp/ListsSerializationJavaTest.java index 8397f5a9f8..a521960e55 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/ListsSerializationJavaTest.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/ListsSerializationJavaTest.java @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp; +package net.corda.serialization.internal.amqp; import net.corda.core.serialization.CordaSerializable; import net.corda.core.serialization.SerializedBytes; -import net.corda.nodeapi.internal.serialization.AllWhitelist; -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationContext; +import net.corda.serialization.internal.AllWhitelist; +import net.corda.serialization.internal.amqp.testutils.TestSerializationContext; import org.junit.Assert; import org.junit.Test; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/SetterConstructorTests.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/SetterConstructorTests.java similarity index 98% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/SetterConstructorTests.java rename to serialization/src/test/java/net/corda/serialization/internal/amqp/SetterConstructorTests.java index e68e4c9b85..66df2726b8 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/SetterConstructorTests.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/SetterConstructorTests.java @@ -1,8 +1,8 @@ -package net.corda.nodeapi.internal.serialization.amqp; +package net.corda.serialization.internal.amqp; import net.corda.core.serialization.SerializedBytes; -import net.corda.nodeapi.internal.serialization.AllWhitelist; -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationContext; +import net.corda.serialization.internal.AllWhitelist; +import net.corda.serialization.internal.amqp.testutils.TestSerializationContext; import org.assertj.core.api.Assertions; import org.junit.Test; import static org.junit.Assert.*; diff --git a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/testutils/TestSerializationContext.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/testutils/TestSerializationContext.java similarity index 76% rename from node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/testutils/TestSerializationContext.java rename to serialization/src/test/java/net/corda/serialization/internal/amqp/testutils/TestSerializationContext.java index 30402c3ea0..abf61c74db 100644 --- a/node-api/src/test/java/net/corda/nodeapi/internal/serialization/amqp/testutils/TestSerializationContext.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/testutils/TestSerializationContext.java @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp.testutils; +package net.corda.serialization.internal.amqp.testutils; import net.corda.core.serialization.SerializationContext; import net.corda.core.utilities.ByteSequence; -import net.corda.nodeapi.internal.serialization.AllWhitelist; -import net.corda.nodeapi.internal.serialization.SerializationContextImpl; +import net.corda.serialization.internal.AllWhitelist; +import net.corda.serialization.internal.SerializationContextImpl; import java.util.HashMap; diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/DummyContractBackdoor.kt b/serialization/src/test/kotlin/net/corda/nodeapi/DummyContractBackdoor.kt similarity index 100% rename from node-api/src/test/kotlin/net/corda/nodeapi/DummyContractBackdoor.kt rename to serialization/src/test/kotlin/net/corda/nodeapi/DummyContractBackdoor.kt diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/AttachmentsClassLoaderTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/AttachmentsClassLoaderTests.kt similarity index 96% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/AttachmentsClassLoaderTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/AttachmentsClassLoaderTests.kt index ad5ce974dd..4a3694fbd4 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/AttachmentsClassLoaderTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/AttachmentsClassLoaderTests.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal +package net.corda.serialization.internal import com.nhaarman.mockito_kotlin.doReturn import com.nhaarman.mockito_kotlin.whenever @@ -10,20 +10,12 @@ import net.corda.core.internal.declaredField import net.corda.core.internal.toWireTransaction import net.corda.core.node.ServiceHub import net.corda.core.node.services.AttachmentStorage -import net.corda.core.serialization.CordaSerializable -import net.corda.core.serialization.MissingAttachmentsException -import net.corda.core.serialization.SerializationContext -import net.corda.core.serialization.SerializationFactory -import net.corda.core.serialization.deserialize -import net.corda.core.serialization.serialize +import net.corda.core.serialization.* import net.corda.core.utilities.ByteSequence import net.corda.core.utilities.OpaqueBytes import net.corda.node.internal.cordapp.CordappLoader import net.corda.node.internal.cordapp.CordappProviderImpl import net.corda.nodeapi.DummyContractBackdoor -import net.corda.nodeapi.internal.serialization.SerializeAsTokenContextImpl -import net.corda.nodeapi.internal.serialization.attachmentsClassLoaderEnabledPropertyName -import net.corda.nodeapi.internal.serialization.withTokenContext import net.corda.testing.common.internal.testNetworkParameters import net.corda.testing.core.DUMMY_NOTARY_NAME import net.corda.testing.core.SerializationEnvironmentRule @@ -33,10 +25,7 @@ import net.corda.testing.internal.kryoSpecific import net.corda.testing.internal.rigorousMock import net.corda.testing.services.MockAttachmentStorage import org.apache.commons.io.IOUtils -import org.junit.Assert.assertArrayEquals -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotNull -import org.junit.Assert.assertTrue +import org.junit.Assert.* import org.junit.Rule import org.junit.Test import java.io.ByteArrayOutputStream diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ContractAttachmentSerializerTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/ContractAttachmentSerializerTest.kt similarity index 98% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ContractAttachmentSerializerTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/ContractAttachmentSerializerTest.kt index 3745da55d8..9bef17e21c 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ContractAttachmentSerializerTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/ContractAttachmentSerializerTest.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.contracts.ContractAttachment import net.corda.core.identity.CordaX500Name diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolverTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/CordaClassResolverTests.kt similarity index 91% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolverTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/CordaClassResolverTests.kt index 90523d6f0e..cb346c9236 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/CordaClassResolverTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/CordaClassResolverTests.kt @@ -1,27 +1,33 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import com.esotericsoftware.kryo.* import com.esotericsoftware.kryo.io.Input import com.esotericsoftware.kryo.io.Output import com.esotericsoftware.kryo.util.DefaultClassResolver import com.esotericsoftware.kryo.util.MapReferenceResolver -import com.nhaarman.mockito_kotlin.* +import com.nhaarman.mockito_kotlin.any +import com.nhaarman.mockito_kotlin.doReturn +import com.nhaarman.mockito_kotlin.verify +import com.nhaarman.mockito_kotlin.whenever import net.corda.core.internal.DEPLOYED_CORDAPP_UPLOADER import net.corda.core.node.services.AttachmentStorage -import net.corda.core.serialization.* -import net.corda.nodeapi.internal.AttachmentsClassLoader -import net.corda.nodeapi.internal.AttachmentsClassLoaderTests -import net.corda.nodeapi.internal.serialization.kryo.CordaKryo -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic -import net.corda.testing.services.MockAttachmentStorage +import net.corda.core.serialization.ClassWhitelist +import net.corda.core.serialization.CordaSerializable +import net.corda.core.serialization.SerializationContext +import net.corda.serialization.internal.kryo.CordaClassResolver +import net.corda.serialization.internal.kryo.CordaKryo +import net.corda.serialization.internal.kryo.kryoMagic import net.corda.testing.internal.rigorousMock +import net.corda.testing.services.MockAttachmentStorage import org.junit.Rule import org.junit.Test import org.junit.rules.ExpectedException import java.lang.IllegalStateException import java.sql.Connection import java.util.* -import kotlin.test.* +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertNull @CordaSerializable enum class Foo { @@ -313,7 +319,7 @@ class CordaClassResolverTests { @Test fun `Check blacklisted subclass`() { expectedEx.expect(IllegalStateException::class.java) - expectedEx.expectMessage("The superclass java.util.HashSet of net.corda.nodeapi.internal.serialization.CordaClassResolverTests\$SubHashSet is blacklisted, so it cannot be used in serialization.") + expectedEx.expectMessage("The superclass java.util.HashSet of net.corda.serialization.internal.CordaClassResolverTests\$SubHashSet is blacklisted, so it cannot be used in serialization.") val resolver = CordaClassResolver(allButBlacklistedContext) // SubHashSet extends the blacklisted HashSet. resolver.getRegistration(SubHashSet::class.java) @@ -324,7 +330,7 @@ class CordaClassResolverTests { @Test fun `Check blacklisted subsubclass`() { expectedEx.expect(IllegalStateException::class.java) - expectedEx.expectMessage("The superclass java.util.HashSet of net.corda.nodeapi.internal.serialization.CordaClassResolverTests\$SubSubHashSet is blacklisted, so it cannot be used in serialization.") + expectedEx.expectMessage("The superclass java.util.HashSet of net.corda.serialization.internal.CordaClassResolverTests\$SubSubHashSet is blacklisted, so it cannot be used in serialization.") val resolver = CordaClassResolver(allButBlacklistedContext) // SubSubHashSet extends SubHashSet, which extends the blacklisted HashSet. resolver.getRegistration(SubSubHashSet::class.java) @@ -335,7 +341,7 @@ class CordaClassResolverTests { @Test fun `Check blacklisted interface impl`() { expectedEx.expect(IllegalStateException::class.java) - expectedEx.expectMessage("The superinterface java.sql.Connection of net.corda.nodeapi.internal.serialization.CordaClassResolverTests\$ConnectionImpl is blacklisted, so it cannot be used in serialization.") + expectedEx.expectMessage("The superinterface java.sql.Connection of net.corda.serialization.internal.CordaClassResolverTests\$ConnectionImpl is blacklisted, so it cannot be used in serialization.") val resolver = CordaClassResolver(allButBlacklistedContext) // ConnectionImpl implements blacklisted Connection. resolver.getRegistration(ConnectionImpl::class.java) @@ -347,7 +353,7 @@ class CordaClassResolverTests { @Test fun `Check blacklisted super-interface impl`() { expectedEx.expect(IllegalStateException::class.java) - expectedEx.expectMessage("The superinterface java.sql.Connection of net.corda.nodeapi.internal.serialization.CordaClassResolverTests\$SubConnectionImpl is blacklisted, so it cannot be used in serialization.") + expectedEx.expectMessage("The superinterface java.sql.Connection of net.corda.serialization.internal.CordaClassResolverTests\$SubConnectionImpl is blacklisted, so it cannot be used in serialization.") val resolver = CordaClassResolver(allButBlacklistedContext) // SubConnectionImpl implements SubConnection, which extends the blacklisted Connection. resolver.getRegistration(SubConnectionImpl::class.java) @@ -366,7 +372,7 @@ class CordaClassResolverTests { @Test fun `Check blacklist precedes CordaSerializable`() { expectedEx.expect(IllegalStateException::class.java) - expectedEx.expectMessage("The superclass java.util.HashSet of net.corda.nodeapi.internal.serialization.CordaClassResolverTests\$CordaSerializableHashSet is blacklisted, so it cannot be used in serialization.") + expectedEx.expectMessage("The superclass java.util.HashSet of net.corda.serialization.internal.CordaClassResolverTests\$CordaSerializableHashSet is blacklisted, so it cannot be used in serialization.") val resolver = CordaClassResolver(allButBlacklistedContext) // CordaSerializableHashSet is @CordaSerializable, but extends the blacklisted HashSet. resolver.getRegistration(CordaSerializableHashSet::class.java) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/ListsSerializationTest.kt similarity index 93% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/ListsSerializationTest.kt index 7e1ffac95a..7261843389 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/ListsSerializationTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/ListsSerializationTest.kt @@ -1,13 +1,13 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.util.DefaultClassResolver import net.corda.core.serialization.* import net.corda.node.services.statemachine.DataSessionMessage -import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput -import net.corda.nodeapi.internal.serialization.amqp.Envelope -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.amqp.DeserializationInput +import net.corda.serialization.internal.amqp.Envelope +import net.corda.serialization.internal.amqp.SerializerFactory +import net.corda.serialization.internal.kryo.kryoMagic import net.corda.testing.internal.amqpSpecific import net.corda.testing.internal.kryoSpecific import net.corda.testing.core.SerializationEnvironmentRule diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/MapsSerializationTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/MapsSerializationTest.kt similarity index 96% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/MapsSerializationTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/MapsSerializationTest.kt index 1a5f283bd2..3f81310716 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/MapsSerializationTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/MapsSerializationTest.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.util.DefaultClassResolver @@ -7,7 +7,7 @@ import net.corda.core.serialization.CordaSerializable import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import net.corda.node.services.statemachine.DataSessionMessage -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.kryo.kryoMagic import net.corda.testing.core.SerializationEnvironmentRule import net.corda.testing.internal.amqpSpecific import net.corda.testing.internal.kryoSpecific diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/PrivateKeySerializationTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/PrivateKeySerializationTest.kt similarity index 97% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/PrivateKeySerializationTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/PrivateKeySerializationTest.kt index bfefdde7e5..3b1d46f342 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/PrivateKeySerializationTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/PrivateKeySerializationTest.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import net.corda.core.crypto.Crypto import net.corda.core.serialization.SerializationContext.UseCase.* diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/SerializationTokenTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/SerializationTokenTest.kt similarity index 94% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/SerializationTokenTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/SerializationTokenTest.kt index 06a0f86d35..acf148da23 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/SerializationTokenTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/SerializationTokenTest.kt @@ -1,13 +1,14 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.KryoException import com.esotericsoftware.kryo.io.Output import net.corda.core.serialization.* import net.corda.core.utilities.OpaqueBytes -import net.corda.nodeapi.internal.serialization.kryo.CordaKryo -import net.corda.nodeapi.internal.serialization.kryo.DefaultKryoCustomizer -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.kryo.CordaClassResolver +import net.corda.serialization.internal.kryo.CordaKryo +import net.corda.serialization.internal.kryo.DefaultKryoCustomizer +import net.corda.serialization.internal.kryo.kryoMagic import net.corda.testing.internal.rigorousMock import net.corda.testing.core.SerializationEnvironmentRule import org.assertj.core.api.Assertions.assertThat diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/SetsSerializationTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/SetsSerializationTest.kt similarity index 95% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/SetsSerializationTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/SetsSerializationTest.kt index 7d4a352323..6b840a9fcc 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/SetsSerializationTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/SetsSerializationTest.kt @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization +package net.corda.serialization.internal import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.util.DefaultClassResolver import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import net.corda.node.services.statemachine.DataSessionMessage -import net.corda.nodeapi.internal.serialization.kryo.kryoMagic +import net.corda.serialization.internal.kryo.kryoMagic import net.corda.testing.core.SerializationEnvironmentRule import net.corda.testing.internal.kryoSpecific import org.junit.Assert.assertArrayEquals diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/CorDappSerializerTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/CorDappSerializerTests.kt similarity index 92% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/CorDappSerializerTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/CorDappSerializerTests.kt index e5792e6944..d8dba29ead 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/CorDappSerializerTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/CorDappSerializerTests.kt @@ -1,13 +1,13 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import org.junit.Test import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.SerializationCustomSerializer -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserializeAndReturnEnvelope -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serializeAndReturnSchema -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactory +import net.corda.serialization.internal.amqp.testutils.deserializeAndReturnEnvelope +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serializeAndReturnSchema +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactory import org.assertj.core.api.Assertions import java.io.NotSerializableException import kotlin.test.assertEquals diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeAndReturnEnvelopeTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeAndReturnEnvelopeTests.kt similarity index 83% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeAndReturnEnvelopeTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeAndReturnEnvelopeTests.kt index 1400bf4400..e14aede81e 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeAndReturnEnvelopeTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeAndReturnEnvelopeTests.kt @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.CordaSerializable -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserializeAndReturnEnvelope -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryWithWhitelist -import net.corda.nodeapi.internal.serialization.amqp.testutils.testName +import net.corda.serialization.internal.amqp.testutils.deserializeAndReturnEnvelope +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryWithWhitelist +import net.corda.serialization.internal.amqp.testutils.testName import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertNotEquals diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeMapTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeMapTests.kt similarity index 92% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeMapTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeMapTests.kt index 48b5e39922..2bc81707c3 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeMapTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeMapTests.kt @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.amqp.testutils.TestSerializationOutput +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution import org.assertj.core.api.Assertions import org.junit.Test import java.util.* diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeNeedingCarpentryOfEnumsTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeNeedingCarpentryOfEnumsTest.kt similarity index 95% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeNeedingCarpentryOfEnumsTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeNeedingCarpentryOfEnumsTest.kt index 8e35adc132..5520d3ea6c 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeNeedingCarpentryOfEnumsTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeNeedingCarpentryOfEnumsTest.kt @@ -1,8 +1,8 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.testutils.* -import net.corda.nodeapi.internal.serialization.carpenter.* +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.testutils.* +import net.corda.serialization.internal.carpenter.* import org.junit.Test import kotlin.test.* diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeNeedingCarpentrySimpleTypesTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeNeedingCarpentrySimpleTypesTest.kt similarity index 97% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeNeedingCarpentrySimpleTypesTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeNeedingCarpentrySimpleTypesTest.kt index 9d062df136..67c6cf25d5 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeNeedingCarpentrySimpleTypesTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeNeedingCarpentrySimpleTypesTest.kt @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.carpenter.* -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.carpenter.* +import net.corda.serialization.internal.amqp.testutils.TestSerializationOutput +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution import org.junit.Test import kotlin.test.* diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeNeedingCarpentryTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeNeedingCarpentryTests.kt similarity index 95% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeNeedingCarpentryTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeNeedingCarpentryTests.kt index 5e011662f5..d2f8947bcf 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeNeedingCarpentryTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeNeedingCarpentryTests.kt @@ -1,13 +1,13 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.CordaSerializable -import net.corda.nodeapi.internal.serialization.carpenter.* -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryWithWhitelist -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize +import net.corda.serialization.internal.carpenter.* +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.testutils.TestSerializationOutput +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryWithWhitelist +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.deserialize import org.junit.Test import kotlin.test.* diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeSimpleTypesTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeSimpleTypesTests.kt similarity index 97% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeSimpleTypesTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeSimpleTypesTests.kt index 100cd63ff0..bac1cc9db6 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializeSimpleTypesTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializeSimpleTypesTests.kt @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.amqp.testutils.TestSerializationOutput +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution import org.junit.Test import kotlin.test.assertEquals diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedParameterizedTypeTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializedParameterizedTypeTests.kt similarity index 98% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedParameterizedTypeTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializedParameterizedTypeTests.kt index 5be8f67d57..e2e718cc8d 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializedParameterizedTypeTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/DeserializedParameterizedTypeTests.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import org.junit.Test import java.io.NotSerializableException diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumEvolvabilityTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EnumEvolvabilityTests.kt similarity index 95% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumEvolvabilityTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EnumEvolvabilityTests.kt index b4f3f7f6d5..e56d4a93c6 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumEvolvabilityTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EnumEvolvabilityTests.kt @@ -1,13 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.* -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserializeAndReturnEnvelope -import net.corda.nodeapi.internal.serialization.amqp.testutils.serializeAndReturnSchema -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactory +import net.corda.serialization.internal.amqp.testutils.* import net.corda.testing.common.internal.ProjectStructure.projectRootDir -import org.assertj.core.api.Assertions +import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.Test import java.io.NotSerializableException import java.net.URI @@ -18,8 +14,8 @@ import kotlin.test.assertTrue class EnumEvolvabilityTests { @Suppress("UNUSED") - var localPath: URI = projectRootDir.toUri().resolve( - "node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp") + val localPath: URI = projectRootDir.toUri().resolve( + "serialization/src/test/resources/net/corda/serialization/internal/amqp") companion object { const val VERBOSE = false @@ -326,7 +322,7 @@ class EnumEvolvabilityTests { val sf = testDefaultFactory() - Assertions.assertThatThrownBy { + assertThatThrownBy { TestSerializationOutput(VERBOSE, sf).serializeAndReturnSchema(C(RepeatedAnnotation.A)) }.isInstanceOf(NotSerializableException::class.java) } @@ -420,15 +416,15 @@ class EnumEvolvabilityTests { } - //@UnknownTransformAnnotation (10, 20, 30) + //@UnknownTransformAnnotation(10, 20, 30) enum class WithUnknownTest { A, B, C, D } data class WrapsUnknown(val unknown: WithUnknownTest) - // To regenerate the types for this test uncomment the UnknownTransformAnnotation from - // TransformTypes.kt and SupportedTransforms.kt + // To regenerate the types for this test uncomment UnknownTransformAnnotation from SupportedTransforms.kt and it's + // entry in the supportedTransforms list and the UnknownTest enum value in TransformTypes.kt // ALSO: remember to re-annotate the enum WithUnkownTest above @Test fun testUnknownTransform() { @@ -468,7 +464,7 @@ class EnumEvolvabilityTests { data class C(val e: RejectCyclicRename) val sf = testDefaultFactory() - Assertions.assertThatThrownBy { + assertThatThrownBy { SerializationOutput(sf).serialize(C(RejectCyclicRename.A)) }.isInstanceOf(NotSerializableException::class.java) } @@ -489,7 +485,7 @@ class EnumEvolvabilityTests { data class C(val e: RejectCyclicRenameAlt) val sf = testDefaultFactory() - Assertions.assertThatThrownBy { + assertThatThrownBy { SerializationOutput(sf).serialize(C(RejectCyclicRenameAlt.A)) }.isInstanceOf(NotSerializableException::class.java) } @@ -508,7 +504,7 @@ class EnumEvolvabilityTests { data class C(val e: RejectCyclicRenameRedux) val sf = testDefaultFactory() - Assertions.assertThatThrownBy { + assertThatThrownBy { SerializationOutput(sf).serialize(C(RejectCyclicRenameRedux.A)) }.isInstanceOf(NotSerializableException::class.java) } @@ -521,7 +517,7 @@ class EnumEvolvabilityTests { data class C(val e: RejectBadDefault) val sf = testDefaultFactory() - Assertions.assertThatThrownBy { + assertThatThrownBy { SerializationOutput(sf).serialize(C(RejectBadDefault.D)) }.isInstanceOf(NotSerializableException::class.java) } @@ -534,7 +530,7 @@ class EnumEvolvabilityTests { data class C(val e: RejectBadDefaultToSelf) val sf = testDefaultFactory() - Assertions.assertThatThrownBy { + assertThatThrownBy { SerializationOutput(sf).serialize(C(RejectBadDefaultToSelf.D)) }.isInstanceOf(NotSerializableException::class.java) } diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EnumEvolveTests.kt similarity index 96% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EnumEvolveTests.kt index 4cbf0fae37..90032a0c59 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EnumEvolveTests.kt @@ -1,16 +1,17 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.internal.toPath import net.corda.core.serialization.CordaSerializationTransformEnumDefault import net.corda.core.serialization.CordaSerializationTransformEnumDefaults import net.corda.core.serialization.SerializedBytes -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactory -import net.corda.nodeapi.internal.serialization.amqp.testutils.testName +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactory +import net.corda.serialization.internal.amqp.testutils.testName import net.corda.testing.common.internal.ProjectStructure.projectRootDir import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatThrownBy +import org.junit.Ignore import org.junit.Test import java.io.NotSerializableException import java.net.URI @@ -23,7 +24,7 @@ import kotlin.test.assertNotNull class EnumEvolveTests { @Suppress("UNUSED") var localPath: URI = projectRootDir.toUri().resolve( - "node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp") + "serialization/src/test/resources/net/corda/serialization/internal/amqp") // Version of the class as it was serialised // @@ -44,7 +45,7 @@ class EnumEvolveTests { // File(URI("$localPath/$resource")).writeBytes( // SerializationOutput(sf).serialize(C(DeserializeNewerSetToUnknown.D)).bytes) - val url = EvolvabilityTests::class.java.getResource(resource) + val url = javaClass.getResource(resource) val obj = DeserializationInput(sf).deserialize(SerializedBytes(url.readBytes())) @@ -74,9 +75,9 @@ class EnumEvolveTests { // File(URI("$localPath/$resource.D")).writeBytes(so.serialize(C(DeserializeNewerSetToUnknown2.D)).bytes) // File(URI("$localPath/$resource.E")).writeBytes(so.serialize(C(DeserializeNewerSetToUnknown2.E)).bytes) - val url1 = EvolvabilityTests::class.java.getResource("$resource.C") - val url2 = EvolvabilityTests::class.java.getResource("$resource.D") - val url3 = EvolvabilityTests::class.java.getResource("$resource.E") + val url1 = javaClass.getResource("$resource.C") + val url2 = javaClass.getResource("$resource.D") + val url3 = javaClass.getResource("$resource.E") // C will just work val obj1 = DeserializationInput(sf).deserialize(SerializedBytes(url1.readBytes())) @@ -149,6 +150,7 @@ class EnumEvolveTests { // Finally, the version we're using to test with enum class DeserializeWithRename { A, B, C } + @Ignore("https://r3-cev.atlassian.net/browse/CORDA-1498") @Test fun deserializeWithRename() { val resource = "${javaClass.simpleName}.${testName()}" @@ -271,6 +273,7 @@ class EnumEvolveTests { // Finally, the original version of teh class that we're going to be testing with enum class MultiOperations { A, B, C } + @Ignore("https://r3-cev.atlassian.net/browse/CORDA-1497") @Test fun multiOperations() { val resource = "${javaClass.simpleName}.${testName()}" diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EnumTests.kt similarity index 90% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EnumTests.kt index 09ed8041a3..48941ad5cf 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EnumTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EnumTests.kt @@ -1,15 +1,15 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.CordaSerializable import net.corda.core.serialization.SerializedBytes -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserializeAndReturnEnvelope -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serializeAndReturnSchema -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution -import net.corda.nodeapi.internal.serialization.amqp.testutils.testName +import net.corda.serialization.internal.amqp.testutils.TestSerializationOutput +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.deserializeAndReturnEnvelope +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.serializeAndReturnSchema +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.amqp.testutils.testName import org.assertj.core.api.Assertions import org.junit.Test import java.io.NotSerializableException @@ -219,8 +219,8 @@ class EnumTests { class WL : ClassWhitelist { override fun hasListed(type: Class<*>): Boolean { - return type.name == "net.corda.nodeapi.internal.serialization.amqp.EnumTests\$enumWhitelisted\$C" || - type.name == "net.corda.nodeapi.internal.serialization.amqp.EnumTests\$Bras" + return type.name == "net.corda.serialization.internal.amqp.EnumTests\$enumWhitelisted\$C" || + type.name == "net.corda.serialization.internal.amqp.EnumTests\$Bras" } } @@ -254,7 +254,7 @@ class EnumTests { // first serialise the class using a context in which Bras are whitelisted val factory = SerializerFactory(WL(listOf(classTestName("C"), - "net.corda.nodeapi.internal.serialization.amqp.EnumTests\$Bras")), + "net.corda.serialization.internal.amqp.EnumTests\$Bras")), ClassLoader.getSystemClassLoader()) val bytes = TestSerializationOutput(VERBOSE, factory).serialize(C(Bras.UNDERWIRE)) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/ErrorMessagesTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/ErrorMessagesTests.kt similarity index 87% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/ErrorMessagesTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/ErrorMessagesTests.kt index b3e3a5622b..0d87de40a8 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/ErrorMessagesTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/ErrorMessagesTests.kt @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactory -import net.corda.nodeapi.internal.serialization.amqp.testutils.testName +import net.corda.serialization.internal.amqp.testutils.TestSerializationOutput +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactory +import net.corda.serialization.internal.amqp.testutils.testName import org.assertj.core.api.Assertions import org.junit.Ignore import org.junit.Test diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolutionSerializerGetterTesting.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializerGetterTesting.kt similarity index 95% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolutionSerializerGetterTesting.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializerGetterTesting.kt index fc0d636c21..74ab702687 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolutionSerializerGetterTesting.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializerGetterTesting.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import java.io.NotSerializableException diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EvolvabilityTests.kt similarity index 96% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EvolvabilityTests.kt index 6a6e10c591..4476987c29 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/EvolvabilityTests.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.crypto.Crypto.generateKeyPair import net.corda.core.crypto.SignedData @@ -8,10 +8,10 @@ import net.corda.core.node.NotaryInfo import net.corda.core.serialization.ConstructorForDeserialization import net.corda.core.serialization.DeprecatedConstructorForDeserialization import net.corda.core.serialization.SerializedBytes -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactory +import net.corda.serialization.internal.amqp.testutils.TestSerializationOutput +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactory import net.corda.testing.common.internal.ProjectStructure.projectRootDir import net.corda.testing.core.DUMMY_NOTARY_NAME import net.corda.testing.core.TestIdentity @@ -35,7 +35,7 @@ class EvolvabilityTests { // When regenerating the test files this needs to be set to the file system location of the resource files @Suppress("UNUSED") var localPath: URI = projectRootDir.toUri().resolve( - "node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp") + "serialization/src/test/resources/net/corda/serialization/internal/amqp") @Test fun simpleOrderSwapSameType() { @@ -481,8 +481,8 @@ class EvolvabilityTests { @Ignore("Test fails after moving NetworkParameters and NotaryInfo into core from node-api") fun readBrokenNetworkParameters(){ val sf = testDefaultFactory() - sf.register(net.corda.nodeapi.internal.serialization.amqp.custom.InstantSerializer(sf)) - sf.register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) + sf.register(net.corda.serialization.internal.amqp.custom.InstantSerializer(sf)) + sf.register(net.corda.serialization.internal.amqp.custom.PublicKeySerializer) // // filename breakdown @@ -518,8 +518,8 @@ class EvolvabilityTests { 3, listOf(NotaryInfo(DUMMY_NOTARY, false)),1000, 1000, Instant.EPOCH, 1, emptyMap()) val sf = testDefaultFactory() - sf.register(net.corda.nodeapi.internal.serialization.amqp.custom.InstantSerializer(sf)) - sf.register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) + sf.register(net.corda.serialization.internal.amqp.custom.InstantSerializer(sf)) + sf.register(net.corda.serialization.internal.amqp.custom.PublicKeySerializer) val testOutput = TestSerializationOutput(true, sf) val serialized = testOutput.serialize(networkParameters) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/FingerPrinterTesting.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/FingerPrinterTesting.kt similarity index 84% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/FingerPrinterTesting.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/FingerPrinterTesting.kt index 46573d8ab4..288b95e912 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/FingerPrinterTesting.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/FingerPrinterTesting.kt @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import org.junit.Test import java.lang.reflect.Type import kotlin.test.assertEquals -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.serializeAndReturnSchema +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.testutils.TestSerializationOutput +import net.corda.serialization.internal.amqp.testutils.serializeAndReturnSchema class FingerPrinterTesting : FingerPrinter { private var index = 0 diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/GenericsTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/GenericsTests.kt similarity index 95% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/GenericsTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/GenericsTests.kt index 3dd237b89e..e7c24304c6 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/GenericsTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/GenericsTests.kt @@ -1,14 +1,17 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp -import net.corda.core.contracts.* -import net.corda.core.serialization.SerializedBytes -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.testing.common.internal.ProjectStructure.projectRootDir -import org.junit.Test +import net.corda.core.contracts.Attachment +import net.corda.core.contracts.AttachmentConstraint +import net.corda.core.contracts.ContractState +import net.corda.core.contracts.TransactionState import net.corda.core.identity.AbstractParty import net.corda.core.identity.CordaX500Name -import net.corda.nodeapi.internal.serialization.amqp.testutils.* +import net.corda.core.serialization.SerializedBytes +import net.corda.serialization.internal.amqp.testutils.* +import net.corda.serialization.internal.AllWhitelist +import net.corda.testing.common.internal.ProjectStructure.projectRootDir import net.corda.testing.core.TestIdentity +import org.junit.Test import java.util.* import kotlin.test.assertEquals @@ -26,7 +29,7 @@ class GenericsTests { @Suppress("UNUSED") var localPath = projectRootDir.toUri().resolve( - "node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp") + "serialization/src/test/resources/net/corda/serialization/internal/amqp") val miniCorp = TestIdentity(CordaX500Name("MiniCorp", "London", "GB")) } @@ -257,7 +260,7 @@ class GenericsTests { val resource = "${javaClass.simpleName}.${testName()}" val sf = testDefaultFactory() - // Uncomment to re-generate test files, needs to be done in three stages + // Uncomment to re-generate test files // File(URI("$localPath/$resource")).writeBytes(forceWildcardSerialize(ForceWildcard("wibble")).bytes) assertEquals("wibble", @@ -277,7 +280,7 @@ class GenericsTests { m.isAccessible = true val factory1 = testDefaultFactory() - factory1.register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) + factory1.register(net.corda.serialization.internal.amqp.custom.PublicKeySerializer) val ser1 = TestSerializationOutput(VERBOSE, factory1).serializeAndReturnSchema(state) // attempt at having a class loader without some of the derived non core types loaded and thus @@ -285,16 +288,16 @@ class GenericsTests { val altClassLoader = cl() val factory2 = SerializerFactory(AllWhitelist, altClassLoader) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.PublicKeySerializer) val ser2 = TestSerializationOutput(VERBOSE, factory2).serializeAndReturnSchema(state) // now deserialise those objects val factory3 = testDefaultFactory() - factory3.register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) + factory3.register(net.corda.serialization.internal.amqp.custom.PublicKeySerializer) val des1 = DeserializationInput(factory3).deserializeAndReturnEnvelope(ser1.obj) val factory4 = SerializerFactory(AllWhitelist, cl()) - factory4.register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) + factory4.register(net.corda.serialization.internal.amqp.custom.PublicKeySerializer) val des2 = DeserializationInput(factory4).deserializeAndReturnEnvelope(ser2.obj) } @@ -347,8 +350,8 @@ class GenericsTests { val factory1 = testDefaultFactoryNoEvolution() val factory2 = testDefaultFactory() - factory1.register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) + factory1.register(net.corda.serialization.internal.amqp.custom.PublicKeySerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.PublicKeySerializer) val ser1 = TestSerializationOutput(VERBOSE, factory1).serializeAndReturnSchema( TransactionStateWrapper(Collections.singletonList(sas))) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/OverridePKSerializerTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/OverridePKSerializerTest.kt similarity index 93% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/OverridePKSerializerTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/OverridePKSerializerTest.kt index 8bf29c3f6c..202e9fef40 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/OverridePKSerializerTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/OverridePKSerializerTest.kt @@ -1,8 +1,8 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.serialization.CordaSerializationMagic -import net.corda.nodeapi.internal.serialization.AMQP_P2P_CONTEXT +import net.corda.serialization.internal.CordaSerializationMagic +import net.corda.serialization.internal.AMQP_P2P_CONTEXT import org.apache.qpid.proton.codec.Data import org.assertj.core.api.Assertions import org.junit.Test diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/PrivatePropertyTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/PrivatePropertyTests.kt similarity index 95% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/PrivatePropertyTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/PrivatePropertyTests.kt index 1e23816011..4baa5c95ed 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/PrivatePropertyTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/PrivatePropertyTests.kt @@ -1,12 +1,12 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import junit.framework.TestCase.assertTrue import junit.framework.TestCase.assertEquals import net.corda.core.serialization.ConstructorForDeserialization -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serializeAndReturnSchema -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serializeAndReturnSchema +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution import org.junit.Test import org.apache.qpid.proton.amqp.Symbol import org.assertj.core.api.Assertions diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/RoundTripTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/RoundTripTests.kt similarity index 86% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/RoundTripTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/RoundTripTests.kt index eba38ccb6d..575794be83 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/RoundTripTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/RoundTripTests.kt @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.ConstructorForDeserialization -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution import org.assertj.core.api.Assertions import org.junit.Test diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializationOutputTests.kt similarity index 84% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializationOutputTests.kt index 468a46a465..536c29eaef 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializationOutputTests.kt @@ -1,6 +1,6 @@ @file:Suppress("unused", "MemberVisibilityCanPrivate") -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import com.nhaarman.mockito_kotlin.doReturn import com.nhaarman.mockito_kotlin.whenever @@ -33,17 +33,17 @@ import net.corda.core.utilities.OpaqueBytes import net.corda.node.serialization.amqp.AMQPServerSerializationScheme import net.corda.nodeapi.internal.DEV_INTERMEDIATE_CA import net.corda.nodeapi.internal.crypto.ContentSignerBuilder -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.CordaSerializationEncoding -import net.corda.nodeapi.internal.serialization.EmptyWhitelist -import net.corda.nodeapi.internal.serialization.GeneratedAttachment -import net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.Companion.isPrimitive -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactory -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution -import net.corda.nodeapi.internal.serialization.amqp.testutils.testSerializationContext -import net.corda.nodeapi.internal.serialization.encodingNotPermittedFormat +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.CordaSerializationEncoding +import net.corda.serialization.internal.EmptyWhitelist +import net.corda.serialization.internal.GeneratedAttachment +import net.corda.serialization.internal.amqp.SerializerFactory.Companion.isPrimitive +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactory +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.amqp.testutils.testSerializationContext +import net.corda.serialization.internal.encodingNotPermittedFormat import net.corda.testing.contracts.DummyContract import net.corda.testing.core.BOB_NAME import net.corda.testing.core.SerializationEnvironmentRule @@ -536,9 +536,9 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test custom serializers on public key`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) + factory.register(net.corda.serialization.internal.amqp.custom.PublicKeySerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.PublicKeySerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.PublicKeySerializer) val obj = MEGA_CORP_PUBKEY serdes(obj, factory, factory2) } @@ -552,10 +552,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test throwables serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(factory2)) val t = IllegalAccessException("message").fillInStackTrace() @@ -571,10 +571,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test complex throwables serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(factory2)) try { try { @@ -601,10 +601,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test suppressed throwables serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(factory2)) try { try { @@ -623,10 +623,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test flow corda exception subclasses serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(factory2)) val obj = FlowException("message").fillInStackTrace() serdesThrowableWithInternalInfo(obj, factory, factory2) @@ -635,10 +635,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test RPC corda exception subclasses serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.ThrowableSerializer(factory2)) val obj = RPCException("message").fillInStackTrace() serdesThrowableWithInternalInfo(obj, factory, factory2) @@ -682,7 +682,7 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi serdes(anonymous) } - private val FOO_PROGRAM_ID = "net.corda.nodeapi.internal.serialization.amqp.SerializationOutputTests.FooContract" + private val FOO_PROGRAM_ID = "net.corda.serialization.internal.amqp.SerializationOutputTests.FooContract" class FooState : ContractState { override val participants: List = emptyList() @@ -714,10 +714,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test currencies serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.CurrencySerializer) + factory.register(net.corda.serialization.internal.amqp.custom.CurrencySerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.CurrencySerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.CurrencySerializer) val obj = Currency.getInstance("USD") serdes(obj, factory, factory2) @@ -726,10 +726,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test big decimals serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + factory.register(net.corda.serialization.internal.amqp.custom.BigDecimalSerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.BigDecimalSerializer) val obj = BigDecimal("100000000000000000000000000000.00") serdes(obj, factory, factory2) @@ -738,10 +738,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test instants serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.InstantSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.InstantSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.InstantSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.InstantSerializer(factory2)) val obj = Instant.now() serdes(obj, factory, factory2) @@ -750,10 +750,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test durations serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.DurationSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.DurationSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.DurationSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.DurationSerializer(factory2)) val obj = Duration.of(1000000L, ChronoUnit.MILLIS) serdes(obj, factory, factory2) @@ -762,10 +762,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test local date serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.LocalDateSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.LocalDateSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.LocalDateSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.LocalDateSerializer(factory2)) val obj = LocalDate.now() serdes(obj, factory, factory2) @@ -774,10 +774,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test local time serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.LocalTimeSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.LocalTimeSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.LocalTimeSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.LocalTimeSerializer(factory2)) val obj = LocalTime.now() serdes(obj, factory, factory2) @@ -786,10 +786,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test local date time serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.LocalDateTimeSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.LocalDateTimeSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.LocalDateTimeSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.LocalDateTimeSerializer(factory2)) val obj = LocalDateTime.now() serdes(obj, factory, factory2) @@ -798,10 +798,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test zoned date time serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.ZonedDateTimeSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.ZonedDateTimeSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.ZonedDateTimeSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.ZonedDateTimeSerializer(factory2)) val obj = ZonedDateTime.now() serdes(obj, factory, factory2) @@ -810,10 +810,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test offset time serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.OffsetTimeSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.OffsetTimeSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.OffsetTimeSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.OffsetTimeSerializer(factory2)) val obj = OffsetTime.now() serdes(obj, factory, factory2) @@ -822,10 +822,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test offset date time serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.OffsetDateTimeSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.OffsetDateTimeSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.OffsetDateTimeSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.OffsetDateTimeSerializer(factory2)) val obj = OffsetDateTime.now() serdes(obj, factory, factory2) @@ -834,10 +834,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test year serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.YearSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.YearSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.YearSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.YearSerializer(factory2)) val obj = Year.now() serdes(obj, factory, factory2) @@ -846,10 +846,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test year month serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.YearMonthSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.YearMonthSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.YearMonthSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.YearMonthSerializer(factory2)) val obj = YearMonth.now() serdes(obj, factory, factory2) @@ -858,10 +858,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test month day serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.MonthDaySerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.MonthDaySerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.MonthDaySerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.MonthDaySerializer(factory2)) val obj = MonthDay.now() serdes(obj, factory, factory2) @@ -870,10 +870,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test period serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.PeriodSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.PeriodSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.PeriodSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.PeriodSerializer(factory2)) val obj = Period.of(99, 98, 97) serdes(obj, factory, factory2) @@ -900,10 +900,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test X509 certificate serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.X509CertificateSerializer) + factory.register(net.corda.serialization.internal.amqp.custom.X509CertificateSerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.X509CertificateSerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.X509CertificateSerializer) val obj = BOB_IDENTITY.certificate serdes(obj, factory, factory2) @@ -912,10 +912,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test cert path serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.CertPathSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.CertPathSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.CertPathSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.CertPathSerializer(factory2)) val obj = BOB_IDENTITY.certPath serdes(obj, factory, factory2) @@ -1023,10 +1023,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test toString custom serializer`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + factory.register(net.corda.serialization.internal.amqp.custom.BigDecimalSerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.BigDecimalSerializer) val obj = BigDecimals(BigDecimal.TEN, BigDecimal.TEN) val objCopy = serdes(obj, factory, factory2) @@ -1038,10 +1038,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test BigInteger custom serializer`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigIntegerSerializer) + factory.register(net.corda.serialization.internal.amqp.custom.BigIntegerSerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigIntegerSerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.BigIntegerSerializer) val obj = BigIntegers(BigInteger.TEN, BigInteger.TEN) val objCopy = serdes(obj, factory, factory2) @@ -1058,10 +1058,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test X509CRL custom serializer`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.X509CRLSerializer) + factory.register(net.corda.serialization.internal.amqp.custom.X509CRLSerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.X509CRLSerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.X509CRLSerializer) val obj = emptyCrl() serdes(obj, factory, factory2) @@ -1072,10 +1072,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test byte arrays not reference counted`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + factory.register(net.corda.serialization.internal.amqp.custom.BigDecimalSerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.BigDecimalSerializer) val bytes = ByteArray(1) val obj = ByteArrays(bytes, bytes) @@ -1086,10 +1086,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test StringBuffer serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.StringBufferSerializer) + factory.register(net.corda.serialization.internal.amqp.custom.StringBufferSerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.StringBufferSerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.StringBufferSerializer) val obj = StringBuffer("Bob") val obj2 = serdes(obj, factory, factory2, false, false) @@ -1099,10 +1099,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test SimpleString serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.SimpleStringSerializer) + factory.register(net.corda.serialization.internal.amqp.custom.SimpleStringSerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.SimpleStringSerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.SimpleStringSerializer) val obj = SimpleString("Bob") serdes(obj, factory, factory2) @@ -1123,10 +1123,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test InputStream serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.InputStreamSerializer) + factory.register(net.corda.serialization.internal.amqp.custom.InputStreamSerializer) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.InputStreamSerializer) + factory2.register(net.corda.serialization.internal.amqp.custom.InputStreamSerializer) val bytes = ByteArray(10) { it.toByte() } val obj = bytes.inputStream() val obj2 = serdes(obj, factory, factory2, expectedEqual = false, expectDeserializedEqual = false) @@ -1138,10 +1138,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test EnumSet serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.EnumSetSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.EnumSetSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.EnumSetSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.EnumSetSerializer(factory2)) val obj = EnumSet.of(Month.APRIL, Month.AUGUST) serdes(obj, factory, factory2) @@ -1150,10 +1150,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test BitSet serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.BitSetSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.BitSetSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.BitSetSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.BitSetSerializer(factory2)) val obj = BitSet.valueOf(kotlin.ByteArray(16) { it.toByte() }).get(0, 123) serdes(obj, factory, factory2) @@ -1170,10 +1170,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test contract attachment serialize`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.ContractAttachmentSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.ContractAttachmentSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.ContractAttachmentSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.ContractAttachmentSerializer(factory2)) val obj = ContractAttachment(GeneratedAttachment("test".toByteArray()), DummyContract.PROGRAM_ID) val obj2 = serdes(obj, factory, factory2, expectedEqual = false, expectDeserializedEqual = false) @@ -1186,10 +1186,10 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi @Test fun `test contract attachment throws if missing attachment`() { val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.ContractAttachmentSerializer(factory)) + factory.register(net.corda.serialization.internal.amqp.custom.ContractAttachmentSerializer(factory)) val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) - factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.ContractAttachmentSerializer(factory2)) + factory2.register(net.corda.serialization.internal.amqp.custom.ContractAttachmentSerializer(factory2)) val obj = ContractAttachment(object : AbstractAttachment({ throw Exception() }) { override val id = SecureHash.zeroHash @@ -1225,8 +1225,8 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi data class C(val a: Amount) val factory = testDefaultFactoryNoEvolution() - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) - factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.CurrencySerializer) + factory.register(net.corda.serialization.internal.amqp.custom.BigDecimalSerializer) + factory.register(net.corda.serialization.internal.amqp.custom.CurrencySerializer) val c = C(Amount(100, BigDecimal("1.5"), Currency.getInstance("USD"))) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationPropertyOrdering.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializationPropertyOrdering.kt similarity index 92% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationPropertyOrdering.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializationPropertyOrdering.kt index 2c0f7890c8..59f4f8fc1d 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationPropertyOrdering.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializationPropertyOrdering.kt @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.ConstructorForDeserialization -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serializeAndReturnSchema -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.amqp.testutils.TestSerializationOutput +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serializeAndReturnSchema +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution import org.junit.Test import java.util.concurrent.ConcurrentHashMap import kotlin.test.assertEquals diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationSchemaTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializationSchemaTests.kt similarity index 94% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationSchemaTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializationSchemaTests.kt index cd49520e42..6d3e5398a5 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationSchemaTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializationSchemaTests.kt @@ -1,8 +1,10 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.* import net.corda.core.utilities.ByteSequence -import net.corda.nodeapi.internal.serialization.* +import net.corda.serialization.internal.* +import net.corda.serialization.internal.kryo.BuiltInExceptionsWhitelist +import net.corda.serialization.internal.kryo.GlobalTransientClassWhiteList import org.junit.Test import java.util.concurrent.ConcurrentHashMap import kotlin.test.assertEquals diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializeAndReturnSchemaTest.kt similarity index 81% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializeAndReturnSchemaTest.kt index e8831a48e5..adf8e53d4d 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializeAndReturnSchemaTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/SerializeAndReturnSchemaTest.kt @@ -1,8 +1,8 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp -import net.corda.nodeapi.internal.serialization.amqp.testutils.serializeAndReturnSchema -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactoryNoEvolution -import net.corda.nodeapi.internal.serialization.amqp.testutils.testName +import net.corda.serialization.internal.amqp.testutils.serializeAndReturnSchema +import net.corda.serialization.internal.amqp.testutils.testDefaultFactoryNoEvolution +import net.corda.serialization.internal.amqp.testutils.testName import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertNotNull diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/StaticInitialisationOfSerializedObjectTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/StaticInitialisationOfSerializedObjectTest.kt similarity index 91% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/StaticInitialisationOfSerializedObjectTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/StaticInitialisationOfSerializedObjectTest.kt index 398c647a25..fa324ea34c 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/StaticInitialisationOfSerializedObjectTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/StaticInitialisationOfSerializedObjectTest.kt @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization.amqp +package net.corda.serialization.internal.amqp import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.SerializedBytes -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.carpenter.ClassCarpenterImpl +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.carpenter.ClassCarpenterImpl import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.Test import java.io.NotSerializableException @@ -83,7 +83,7 @@ class StaticInitialisationOfSerializedObjectTest { class WL : ClassWhitelist { override fun hasListed(type: Class<*>) = - type.name == "net.corda.nodeapi.internal.serialization.amqp" + + type.name == "net.corda.serialization.internal.amqp" + ".StaticInitialisationOfSerializedObjectTest\$deserializeTest\$D" } @@ -117,7 +117,7 @@ class StaticInitialisationOfSerializedObjectTest { // whitelist to be used by the serialisation factory class WL1 : ClassWhitelist { override fun hasListed(type: Class<*>) = - type.name == "net.corda.nodeapi.internal.serialization.amqp" + + type.name == "net.corda.serialization.internal.amqp" + ".StaticInitialisationOfSerializedObjectTest\$deserializeTest\$D" } diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/testutils/AMQPTestUtils.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/testutils/AMQPTestUtils.kt similarity index 90% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/testutils/AMQPTestUtils.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/testutils/AMQPTestUtils.kt index e8a02a80b4..68e4227172 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/testutils/AMQPTestUtils.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/testutils/AMQPTestUtils.kt @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization.amqp.testutils +package net.corda.serialization.internal.amqp.testutils import net.corda.core.serialization.SerializationContext import net.corda.core.serialization.SerializedBytes import org.apache.qpid.proton.codec.Data -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.EmptyWhitelist -import net.corda.nodeapi.internal.serialization.amqp.* +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.EmptyWhitelist +import net.corda.serialization.internal.amqp.* import java.io.NotSerializableException fun testDefaultFactory() = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/testutils/TestSerializationContext.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/testutils/TestSerializationContext.kt similarity index 62% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/testutils/TestSerializationContext.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/amqp/testutils/TestSerializationContext.kt index 237640a59a..bf121f25cd 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/testutils/TestSerializationContext.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/testutils/TestSerializationContext.kt @@ -1,9 +1,9 @@ -package net.corda.nodeapi.internal.serialization.amqp.testutils +package net.corda.serialization.internal.amqp.testutils import net.corda.core.serialization.SerializationContext -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.SerializationContextImpl -import net.corda.nodeapi.internal.serialization.amqp.amqpMagic +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.SerializationContextImpl +import net.corda.serialization.internal.amqp.amqpMagic val serializationProperties: MutableMap = mutableMapOf() diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/CarpenterExceptionTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/CarpenterExceptionTests.kt similarity index 87% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/CarpenterExceptionTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/CarpenterExceptionTests.kt index 1079766bed..a3f936b4d9 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/CarpenterExceptionTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/CarpenterExceptionTests.kt @@ -1,12 +1,12 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import com.google.common.reflect.TypeToken -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.* -import net.corda.nodeapi.internal.serialization.amqp.testutils.TestSerializationOutput -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize -import net.corda.nodeapi.internal.serialization.amqp.testutils.testDefaultFactory +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.* +import net.corda.serialization.internal.amqp.testutils.TestSerializationOutput +import net.corda.serialization.internal.amqp.testutils.deserialize +import net.corda.serialization.internal.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.testutils.testDefaultFactory import org.assertj.core.api.Assertions import org.junit.Test import java.io.NotSerializableException diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenterTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenterTest.kt similarity index 99% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenterTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenterTest.kt index a8ba3157da..57f69e094c 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenterTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenterTest.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import net.corda.core.internal.uncheckedCast -import net.corda.nodeapi.internal.serialization.AllWhitelist +import net.corda.serialization.internal.AllWhitelist import org.junit.Test import java.beans.Introspector import java.lang.reflect.Field diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenterTestUtils.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenterTestUtils.kt similarity index 85% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenterTestUtils.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenterTestUtils.kt index 4c8e37bcdf..bb52d4c4e6 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenterTestUtils.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenterTestUtils.kt @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import net.corda.core.serialization.ClassWhitelist -import net.corda.nodeapi.internal.serialization.amqp.* -import net.corda.nodeapi.internal.serialization.amqp.Field -import net.corda.nodeapi.internal.serialization.amqp.Schema -import net.corda.nodeapi.internal.serialization.amqp.testutils.serialize +import net.corda.serialization.internal.amqp.* +import net.corda.serialization.internal.amqp.Field +import net.corda.serialization.internal.amqp.Schema +import net.corda.serialization.internal.amqp.testutils.serialize fun mangleName(name: String) = "${name}__carpenter" diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenterWhitelistTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenterWhitelistTest.kt similarity index 98% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenterWhitelistTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenterWhitelistTest.kt index 8199cab18b..756e4790c5 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/ClassCarpenterWhitelistTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/ClassCarpenterWhitelistTest.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.CordaSerializable diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/CompositeMemberCompositeSchemaToClassCarpenterTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/CompositeMemberCompositeSchemaToClassCarpenterTests.kt similarity index 96% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/CompositeMemberCompositeSchemaToClassCarpenterTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/CompositeMemberCompositeSchemaToClassCarpenterTests.kt index b4c4d3f228..36bc4ad4fe 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/CompositeMemberCompositeSchemaToClassCarpenterTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/CompositeMemberCompositeSchemaToClassCarpenterTests.kt @@ -1,10 +1,10 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import net.corda.core.serialization.CordaSerializable -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.CompositeType -import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserializeAndReturnEnvelope +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.CompositeType +import net.corda.serialization.internal.amqp.DeserializationInput +import net.corda.serialization.internal.amqp.testutils.deserializeAndReturnEnvelope import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertFalse diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/EnumClassTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/EnumClassTests.kt similarity index 96% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/EnumClassTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/EnumClassTests.kt index ab87b4870a..be1ba6fb7b 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/EnumClassTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/EnumClassTests.kt @@ -1,6 +1,6 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter -import net.corda.nodeapi.internal.serialization.AllWhitelist +import net.corda.serialization.internal.AllWhitelist import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertTrue diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/InheritanceSchemaToClassCarpenterTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/InheritanceSchemaToClassCarpenterTests.kt similarity index 98% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/InheritanceSchemaToClassCarpenterTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/InheritanceSchemaToClassCarpenterTests.kt index ebfcc3cac5..b7e09664f6 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/InheritanceSchemaToClassCarpenterTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/InheritanceSchemaToClassCarpenterTests.kt @@ -1,11 +1,11 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import net.corda.core.serialization.CordaSerializable -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.DeserializationInput import org.junit.Test import kotlin.test.* -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserializeAndReturnEnvelope +import net.corda.serialization.internal.amqp.testutils.deserializeAndReturnEnvelope @CordaSerializable interface J { diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/MultiMemberCompositeSchemaToClassCarpenterTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/MultiMemberCompositeSchemaToClassCarpenterTests.kt similarity index 90% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/MultiMemberCompositeSchemaToClassCarpenterTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/MultiMemberCompositeSchemaToClassCarpenterTests.kt index 59d5c379a8..d4ec3c4b98 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/MultiMemberCompositeSchemaToClassCarpenterTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/MultiMemberCompositeSchemaToClassCarpenterTests.kt @@ -1,13 +1,13 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import net.corda.core.serialization.CordaSerializable -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.CompositeType -import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.CompositeType +import net.corda.serialization.internal.amqp.DeserializationInput import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertNotEquals -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserializeAndReturnEnvelope +import net.corda.serialization.internal.amqp.testutils.deserializeAndReturnEnvelope class MultiMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase(AllWhitelist) { diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/SingleMemberCompositeSchemaToClassCarpenterTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/SingleMemberCompositeSchemaToClassCarpenterTests.kt similarity index 95% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/SingleMemberCompositeSchemaToClassCarpenterTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/SingleMemberCompositeSchemaToClassCarpenterTests.kt index af1ad26bc1..32b5334cf2 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/carpenter/SingleMemberCompositeSchemaToClassCarpenterTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/carpenter/SingleMemberCompositeSchemaToClassCarpenterTests.kt @@ -1,12 +1,12 @@ -package net.corda.nodeapi.internal.serialization.carpenter +package net.corda.serialization.internal.carpenter import net.corda.core.serialization.CordaSerializable -import net.corda.nodeapi.internal.serialization.AllWhitelist -import net.corda.nodeapi.internal.serialization.amqp.CompositeType -import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.CompositeType +import net.corda.serialization.internal.amqp.DeserializationInput import org.junit.Test import kotlin.test.assertEquals -import net.corda.nodeapi.internal.serialization.amqp.testutils.deserializeAndReturnEnvelope +import net.corda.serialization.internal.amqp.testutils.deserializeAndReturnEnvelope class SingleMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase(AllWhitelist) { @Test diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoStreamsTest.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/kryo/KryoStreamsTest.kt similarity index 96% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoStreamsTest.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/kryo/KryoStreamsTest.kt index 881d304c41..f248818adf 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoStreamsTest.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/kryo/KryoStreamsTest.kt @@ -1,7 +1,7 @@ -package net.corda.nodeapi.internal.serialization.kryo +package net.corda.serialization.internal.kryo import net.corda.core.internal.declaredField -import net.corda.nodeapi.internal.serialization.ByteBufferOutputStream +import net.corda.serialization.internal.ByteBufferOutputStream import org.assertj.core.api.Assertions.catchThrowable import org.junit.Assert.assertArrayEquals import org.junit.Test diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/kryo/KryoTests.kt similarity index 99% rename from node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoTests.kt rename to serialization/src/test/kotlin/net/corda/serialization/internal/kryo/KryoTests.kt index 8607d04d8c..dcec6e0697 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/kryo/KryoTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/kryo/KryoTests.kt @@ -1,4 +1,4 @@ -package net.corda.nodeapi.internal.serialization.kryo +package net.corda.serialization.internal.kryo import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.KryoException @@ -17,7 +17,7 @@ import net.corda.core.utilities.ByteSequence import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.sequence import net.corda.node.services.persistence.NodeAttachmentService -import net.corda.nodeapi.internal.serialization.* +import net.corda.serialization.internal.* import net.corda.testing.core.ALICE_NAME import net.corda.testing.core.TestIdentity import net.corda.testing.internal.rigorousMock diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolvabilityTests.testUnknownTransform b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolvabilityTests.testUnknownTransform new file mode 100644 index 0000000000000000000000000000000000000000..8d381f083f8f284fc53e846e8dac740eed7ea419 GIT binary patch literal 753 zcmYe!FG@*dWME)uIGO|`85kHZFfcIP0y3Bx7AxhYmgpseR9G2gdKFce_@swvM@E&H z=vRhDh9w7;+u9z`V?grkHnU!ah0#e7uw2;vygc)uR6VM*U zXHW|n?*bW2a5>fkuUHp)z%AD+PA$qz%*m`uEXmBz)62{&NiE7t%+X8CEiBM;%`44y zEz8d-OH9hl$t&{K253S~3mFa3gq#;L8leffEMzo>3vnK7V4|uQ4;mm+4R;9h0YyZ#aUBq0 PS;&nP+96yaA|Y}Bq$KhZ literal 0 HcmV?d00001 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.changedOrdinality b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.changedOrdinality similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.changedOrdinality rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.changedOrdinality diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown new file mode 100644 index 0000000000000000000000000000000000000000..624381c34f273633c7f6c9d2ce0a67da4507b9fd GIT binary patch literal 780 zcmYe!FG@*dWME)uIGO|`85kHZFfcHE1u~c!7AxhYmgpseR9F>zRah3d<|aBinuP~g zxcY>7S9qkS+u9z`V?Ev+Sr%e$VP@(S3R1_$w2;vygc)uR6VM*U zUr-AfKLQy{a5>fk-&q%iz%AD+PA$qz%*m`uEXmBz)62{&NiE7t%+X8CEiBM;%`44y zEz8d-OASdaE-6+?NrkE|PW4MIPb~^gEeXjF&CAZqFV9nPc5sDT!hArDi5MR`9LQpX zYhpPN%f65?bzu;Bj&p%It_ss}t_}{4PH>CZ4%}m-g)I)Q3t4h9i%Z}Zp$7x52y{5$ z%L3QLet;bqosJ6`4bX&~7BU*52{|uhG(r<{S;%M%7venF&O{5J9yCBCDDDu(1B!@P ah;JX8gGT literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.C b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.C new file mode 100644 index 0000000000000000000000000000000000000000..8c12e67cf3e90c088060ffe0313596c43d0fd9c3 GIT binary patch literal 835 zcmcIi%TB^T6rGs@jk0m!7Z~Hp6osIcn|>a{MM5%0Pr0E?N|mHcsZbi8T}>Wtk$bM z%+jhoDU~}%xFPc+R}qG5a^>?4r`?)`s0QG4c6O@(PHyZn zWGu{cfgdxalpVxxJG8`IUKQy=mm9S?Jjp-}4o@>slf!ZbayYDHAk3kupq<4l+Di9} ktM#1~T`27JcUSCdytq6lhunM9fXR#H&{3W?V!Z literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.D b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.D new file mode 100644 index 0000000000000000000000000000000000000000..5c997bc50fe2069125008b63567d5d0e544fefb8 GIT binary patch literal 835 zcmcJNK~KUk6vx{QSd@zgKY=lx%upByOh`6ZRcl z?|v3<-Yf~0xL{&TxHPZ-_g;Sg*S>xj4KM@%Jiqni2>^TtKtGm&4qgr@VP=0>aaQY9 z9%gCPnUu<%r&7-eqU!{w^|~9)%A|D6-95X+prcW7(C=N_Ko;;d}PRA$-gM@e_X7S;Gtg2&j zNm3HE2=l@=9nmnQ<-?|p6h#+D+FwSr#R#gVoVYbOB)s)MckZ{l`385$ww;C|6~sqj zD;OK`T;Rt{k+Ki*+aKEEF0YylVaOkKI6TQn4GvE;Qj^1SMshi+7!A*LiWdP%gR0(|~a(ox94@hP)gDeF39r2+sfj literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.E b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerSetToUnknown2.E new file mode 100644 index 0000000000000000000000000000000000000000..bd6d8755f47a91688a8f69fb54bec26904822e6e GIT binary patch literal 835 zcmcJNK~KUk6vx{RSd@zgKY=lx%upByOh`6ZRcl z?|v3<-Yf~0xL{&TxHPZ-_g;Sg*S>xj4Lk?{cz)~269D)QfOaec4ZIvs!i@g1;;h!I zJj~LnJt>ttPocX_n042!>5cy)C&x6Jb5%QosMx51_^OV%;LiVSyjj6 zlB6VR5$1+%I-+4p%ZE)1D~cwL&|gNh#0aXUoVe9FB)s)Mch0xF`385`vh0Q;6~sqj zD;Nv&T;Rt{k+Ki*+aFruF0Yz&q01k&IXuZo4GvE;Qj^1SMshf;WF*X?sid97E85ER li>vjX6tV5YrMEzD2Lp8(|~a(ojc0YhP)gDe*viy2+;rl literal 0 HcmV?d00001 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserialiseNewerWithNoRule b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerWithNoRule similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserialiseNewerWithNoRule rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserialiseNewerWithNoRule diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.1.AA b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.1.AA similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.1.AA rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.1.AA diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.1.B b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.1.B similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.1.B rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.1.B diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.1.C b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.1.C new file mode 100644 index 0000000000000000000000000000000000000000..ef16d41cf7171872a2462d584a1695b7e17867aa GIT binary patch literal 872 zcmb_a+e*Vg5Zz5{>gB~B@I{I*%F+m0suXhRf;UiNMDRg~=^CTSMw2ww{+swo{(>_} z6;@ghDGal-JF|1no}D1ghCU^Pe15!x-9bbMg@_QX@}z;OO(_Z%VC}(#TfIRLZg)>c zJT~0){Nl_t!hRpB82wdyydRd%+tF$F#^`m%cJOGA_wHY-S{>U{$I}$#8necq(wJ`4 zx+S;_hRf9tHI|Dk^5baY7f~u%Bny#AKW2XN^31p#CA>`IQg|XS^7c@CSBvYYcyNXE z6VY}|uJCC9z!sAFg8(L!Jyi-oPz%|F=(Yup3UHVIV>+0{l$)kyD^ztr0K;XGKqiNV z%{a;n1#Olv^L`tJIjqJAf?62VWEpkUEDJpCD9th3s^-JSq%kMyU~*SUuD}r(-d&^! e&~8T^z%>ssHq`H4g`;&;Mz6;SB8tz0M}7f+Xk?%O literal 0 HcmV?d00001 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.2.AA b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.2.AA similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.2.AA rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.2.AA diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.2.BB b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.2.BB similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.2.BB rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.2.BB diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.2.C b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.2.C new file mode 100644 index 0000000000000000000000000000000000000000..bdf755c4ee0b2cb756639c6e4f061da936b6432f GIT binary patch literal 911 zcmb_a+e*Vg5Zz5`>*d97kmBR2Ej~mniA z3R8J&;34Sq@F`7?W#l@ZJ982@40Jb0WE41_?)amjE`qTyCZRWxO&KR~p(ht?*>;ou zoeUgb7V3sj^kgt#pG5t^00Xqa+yQ{p#w^fd9*Ik&`~N9DTc%VPhG{8MbC`gj&ngEQ z0u8gC8z;)NWybvW+GNb>e2oB7W5|MfUWPYGD|Ek(HRS$nu^Xc|bv7{6?aD<@p xDqTQ3sczs_lV-HkYi;6ao2<#D`vk--B+XLaig-IJ4-_KWwsM_i4aqRr_71rQhsFQ^ literal 0 HcmV?d00001 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.3.XX b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.3.XX similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.deserializeWithRename.3.XX rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.deserializeWithRename.3.XX diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.1.A b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.1.A similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.1.A rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.1.A diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.1.B b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.1.B similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.1.B rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.1.B diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.1.C b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.1.C new file mode 100644 index 0000000000000000000000000000000000000000..14b41b550660b3186af340d6647e2a750a127445 GIT binary patch literal 880 zcmb_a+e!m55KY>(Mf>UxD8(0HtyUC;!rr13T^D8X@|e~rse3cKU8Mgeev-f7%x)1P zE{GI{WRi0-b22m2R6TM^2>JYY2b+LL2nCOjR<)8gLfeTb%qenDZ?DFOZ;l$yE+;2E zii10kUC*9JBVd{I2Uk8E?=Egw=Bw;z@4P(oFJ8u>U2!`Yp1NU6%UtKI^DkvA4?1rR z9)sZ)d`mNPp(Kywf)_GPOqmoyB|I{D{F<38na8Y5qf&$-FYl&G5*^VZ%1F^wyTTKd!K`0}Vd7?)M+Xg{gW!Gx=puN~0D1@xHEdj*TZBZPuSh&BROL*PWPN>7k^9p>R?ldR3DjNRpx zx8icTzVT)=VCnP+*H2k`SLgoiy-ebX@P)^+)ldk23xeRlE>77ZsBt%Je9I-s+CnH49i-mE(MuReZ5!vLTma%WxDW z8l*l&Ie%!~02*t02WLOPE_mSp7Rq38|EJMaH9Cf2&J~e;$PI?uVM-Vdr0Qn8tdu&x z4WsRCaTpIhb9cFHjXsQ0t jVSpdkRD;J58sRX9_#JJQM)1OLq)m6WqOq0RH0yi-BxQ`H literal 0 HcmV?d00001 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.2.D b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.2.D similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.2.D rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.2.D diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.2.E b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.2.E similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.2.E rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.2.E diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.3.A b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.3.A similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.3.A rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.3.A diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.3.B b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.3.B similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.3.B rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.3.B diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.3.BOB b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.3.BOB similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EnumEvolveTests.multiOperations.3.BOB rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.3.BOB diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.3.C b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EnumEvolveTests.multiOperations.3.C new file mode 100644 index 0000000000000000000000000000000000000000..7762efa86718c6e5569fb4602490755eb0a76980 GIT binary patch literal 1013 zcmb_a+e*Vg5Zz7Ml-ei3XCI{aQi%0}2BDDaOR-jL6kj*(N~4=glQf9BSf{qRT0>Wd7;mdd49Gq(%HCljPh#v zxJ<`S!Nc0HMk8S9^cy$0m|aGv2mY-i#9-kW!$EX2ueq8652)iSQeM0yMER0X3xOK| zz-o2v`heT?Q<$FfEMy{lW<{99dKecxicZ_Q}>S!_nomY!oDI@NDm;L%|NXd`&o06GXBHGnRH$3MU>=2Y!z75GGgyMTZp zVKbeBKrbyRMbF34wdBFwf~y^DXAcL`<@XH!7>=~6&y@l+a;tLXaqan7%C0aHE(&Mv1}9n3oci znwwvi8jx6&n41bzU##Nn?BEKwf%$+M6EQw;I8cmmGRpx0_Jxdz3z>l~a9zk~;Na*4 lH<0CkAW$x8AzN`tQD$Dcs{^KFGA>DwsVP`ZsaUuW! literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltConstructor b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltConstructor new file mode 100644 index 0000000000000000000000000000000000000000..d291feca42c053c4749a35d5bebd3dc1d20ccb94 GIT binary patch literal 290 zcmYe!FG@*dWME)uIGO|`85kHZ05La^!OXB&DKE7|FBzo5D$Kaly~^J_DY3FVJKfUD zFE?GkIH26t_5d?u2qRoG(}5$52M!|mtOvHRE{ublqF0<+l$n^5S(R9lnV+YZnOBlp zl$V&JmzY~vpyyhapHr5Yl$n!RQW=t3TvDu(n3Cd~n3s}Rl3!HmmYJH95}sL-;h0n6 zoS#=*QdF7@6jyO}c5sDT&wN0Qi5N#a9FRr0k>!8@`$ERVh0H+bxGrQgaBy^j8^{Ut F3jj&|TFd|d literal 0 HcmV?d00001 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addMandatoryFieldWithAltConstructorUnAnnotated b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltConstructorUnAnnotated similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/EvolvabilityTests.addMandatoryFieldWithAltConstructorUnAnnotated rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltConstructorUnAnnotated diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructor b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructor new file mode 100644 index 0000000000000000000000000000000000000000..f733dac29bb2e6bb8fabfc209778842339682ca3 GIT binary patch literal 392 zcma)1O-lnY5KS6e@uY$`FN+k9i+B>Du*uuGYPp3*Na5O=TW80>*gYr)PMfw8T(U>umbr8@9&K~OS)rA6W<%q` zxG1u+ze~dT;6EQ`VNQC|UO3wK7(9u-N{=tH{N@+d{DB=u9`&Q>MW{uY{Ujc|Ve|z} Cd3Bip literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructorAndRemoval b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.addMandatoryFieldWithAltReorderedConstructorAndRemoval new file mode 100644 index 0000000000000000000000000000000000000000..539a5dce3999ec0745ac9d64a4a5e68d90715f1d GIT binary patch literal 408 zcma)1PfNov6i*hXcvBEB9xO7v2u0>W6b7v&yNP2K_4?X`HIOAXiN)=tA0_xj>cP7o z$@E|mL6Da`9{K&r@0HpxzzCt2k0Nx0@MpNMVIb)3NO2dJ9pkb%qvM&0Z!9*`X8%ve~GKOXS7}G|}1_~jCTjkt3I|9b8K{0UJtfqoXb}w9&N;l^rJU5(WT3KhF z%0NgJoAae^K#sC3p?wb09uNMranjzAUbNBfY6M*H{20=#i>P^i8+~7i6xo&d3u?7C8q15Y2S+Ekfh-5YfO1LHa<6AzUTTr61F{XQ2NqH-IKal^2@YJb S=x{)m5y{KAgM;%RBLe_HRKDf_ literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.getterSetterEvolver1 b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.getterSetterEvolver1 new file mode 100644 index 0000000000000000000000000000000000000000..0a8bd12af5d0e421aa3b6d8b4e2b55cac30a9b45 GIT binary patch literal 412 zcmYe!FG@*dWME)uIGO|`85kHZ0C6jj!OXB&DKE7|FBzo5%G4s&!#T^(H!{+-iN_uJuP(d)51k0ut z8LButxWX-AKA^@#jPo51^del%azKE6A!Fh~W}x-13mFX@9G&0>LgbS0$R*>EOTi*=!OXB&DKE7|FBzo5DnB(U)GNg_!nG*OC%r5= z-y<;3Gbqs3_5cS{NJ=44`3blQOb1Rd9yrPf=d&Kz!Me~5Zj@eeYEfolPG(hNNoIbY zUS?iNYEfQdj$UGJVS%1&S$-iN^WURNoH7TQ87@linD_&+*sxV rYD~nq(BXh36I>I^0Ri@fjEM`Gf!4Y%WHfMabV8F$!YapkkdXlZQtDbr literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersion.2 b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersion.2 new file mode 100644 index 0000000000000000000000000000000000000000..24c5ca540c63d1a0cda562aebbdc135a027b08c1 GIT binary patch literal 332 zcmYe!FG@*dWME)uIGO|`85kHZ0I?~M!OXB&DKE7|FBzo5$|KynBFELzGpfWaIJd|r zt+X&DFTdQ@_5d$)NJ=44`3WGwr~@~K>A(}l0}mPDeAWY3SQom%&C@GREy_&H$*f8& z$;{8w%gifDEy_#G(M!xNEYNc;%g-rGOv=p3EU64hEiNfm$t}$($qY*^Dh4W6advQp y8_Rq^jfog%IvfaPhHGLuAi%zmF>xU?&|24pj0O&lPH1vTc;u3?%5ffKWB>rht7DP? literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersion.3 b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersion.3 new file mode 100644 index 0000000000000000000000000000000000000000..fc50e153e6d958fcd1b32ae995e76d31a68d32bc GIT binary patch literal 371 zcmYe!FG@*dWME)uIGO|`85kHZ0C5bE!OXB&DKE7|FBzo5D#1F1Xq!#5R=IABn78dBamgVP^B_?I&WR_Hhq!yPHtK^pElw^jb78L^( zt2jHj!i{Aq%?`i=6 literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersionWithRemoval.1 b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.multiVersionWithRemoval.1 new file mode 100644 index 0000000000000000000000000000000000000000..e80696ee6e85131420ef00411ed2fe39ef4e5824 GIT binary patch literal 343 zcmYe!FG@*dWME)uIGO|`85kHZ0I>s*!OXB&DKE7|FBzo5%CEf4A~nm$+110+AlTA1 zEwVDSAkWd(_5d$)NJ=44`3WGwr~@~K>A-u&18*4NeAWZ^Sr-Pv&C@GREy_&H$*f8& z$;{8w%gifDEy_#G(M!xNEYNc;%g-rGOv=p3EU64hEiNfm$t}$($qY*^Dh4VJ&n(FZ zO3lqLOUzMmc5sE;zsQIW`3StW?o5ZQC?z>USe)xfu3tweok3pQf5wONo7cCaY?aCZfQ{)bF;H=MW=Td+YHog6VvdTlgDcz~<^yU>#CXWzKrbs?6UzYs_Jxc|3z>l~a9zk~ a;Na+lCYOvyE(MQVDjvBsta6+O85sZws&vc% literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.removeParameters b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.removeParameters new file mode 100644 index 0000000000000000000000000000000000000000..3b66205cf6497f68faf7ee4acf80bb0ffeb18fae GIT binary patch literal 383 zcma)$!Ab)$5QdZPuEksX3Z-}vQt?l*{Z+BNk~?4SLn++d1ry$TI(xx!dSx2DN}%bYO*&Oh}7bLd~E# z>=|!W-9jm9VP6U~)=V`vs>OTI&|pZK>3W^>=uZ5_;6L4SZ+^TAvFwxP?vot)| z+r&N8+a%D|_5cS{2;)NLlJb1G2}}oWG9I|b2#JJeufE5#56UzYs_Jxdz3z>n=a9zk~;Na+lBqs=z WOIpZQTvC*om+tC-EXjG0kpTd|uwU)~ literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.simpleOrderSwapSameType b/serialization/src/test/resources/net/corda/serialization/internal/amqp/EvolvabilityTests.simpleOrderSwapSameType new file mode 100644 index 0000000000000000000000000000000000000000..f9d2888e137917d4a87d9ecaaf473f35c913e598 GIT binary patch literal 307 zcmYe!FG@*dWME)uIGO|`85kHZ0I>{^!OXB&DKE7|FBzo5D!ec|+~29ty~MaYDk-U` z%F8{>OS|0G_5dqW2xABnTszZ&%ZvvuFv9t)2M)6?41}AbSDadunV6GVl~|IQpQo3Z zSCU$kmzblMm|Iw&=USGZQR*(SS`=KKSP-0;n;KGC zkgDSB;0m{a`G6V|F)npDV2N-h%K-uQg^Y;{nSm~FUC3zQ;OGQ55F(d^RgUu@BLe`$ C_g$3$ literal 0 HcmV?d00001 diff --git a/serialization/src/test/resources/net/corda/serialization/internal/amqp/GenericsTests.loadGenericFromFile b/serialization/src/test/resources/net/corda/serialization/internal/amqp/GenericsTests.loadGenericFromFile new file mode 100644 index 0000000000000000000000000000000000000000..8e8150526f222685c0984ae849c6ebc2c37e0515 GIT binary patch literal 257 zcmYe!FG@*dWME)uIGO|`85kH3yk%xstdy5pqL&Pkv$D*u^hndT@D9xNDReDPcF!*> z4s$HGwLQSexR9+pGbt%26|R}-z+%P&3mD;i)&rAS7dpbt(ko6a%1q43tV%4&%+J%y z%qvMP%1g}AOUx}S&~s1C1Ii{Bholyl6sx%97bT~LXXd0NCl;kRxWY|jKA^@#jO!c@ dNFtoUa)5_@A!ErxMlDwd2S+EkVVnmU834kWP?i7y literal 0 HcmV?d00001 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/StaticInitialisationOfSerializedObjectTest.deserializeTest b/serialization/src/test/resources/net/corda/serialization/internal/amqp/StaticInitialisationOfSerializedObjectTest.deserializeTest similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/StaticInitialisationOfSerializedObjectTest.deserializeTest rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/StaticInitialisationOfSerializedObjectTest.deserializeTest diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/StaticInitialisationOfSerializedObjectTest.deserializeTest2 b/serialization/src/test/resources/net/corda/serialization/internal/amqp/StaticInitialisationOfSerializedObjectTest.deserializeTest2 similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/StaticInitialisationOfSerializedObjectTest.deserializeTest2 rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/StaticInitialisationOfSerializedObjectTest.deserializeTest2 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/networkParams.r3corda.6a6b6f256 b/serialization/src/test/resources/net/corda/serialization/internal/amqp/networkParams.r3corda.6a6b6f256 similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/serialization/amqp/networkParams.r3corda.6a6b6f256 rename to serialization/src/test/resources/net/corda/serialization/internal/amqp/networkParams.r3corda.6a6b6f256 diff --git a/node-api/src/test/resources/net/corda/nodeapi/internal/isolated.jar b/serialization/src/test/resources/net/corda/serialization/internal/isolated.jar similarity index 100% rename from node-api/src/test/resources/net/corda/nodeapi/internal/isolated.jar rename to serialization/src/test/resources/net/corda/serialization/internal/isolated.jar diff --git a/settings.gradle b/settings.gradle index 222ab5a59c..93f0c3aced 100644 --- a/settings.gradle +++ b/settings.gradle @@ -50,3 +50,5 @@ include 'samples:simm-valuation-demo:contracts-states' include 'samples:notary-demo' include 'samples:bank-of-corda-demo' include 'samples:cordapp-configuration' +include 'serialization' + 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 ade6f236f0..bbd970de14 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 @@ -39,7 +39,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.serialization.internal.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 diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/RPCDriver.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/RPCDriver.kt index 13abc74202..cdb05223dc 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/RPCDriver.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/RPCDriver.kt @@ -1,8 +1,8 @@ package net.corda.testing.node.internal import net.corda.client.mock.Generator -import net.corda.client.rpc.internal.RPCClient import net.corda.client.rpc.internal.CordaRPCClientConfigurationImpl +import net.corda.client.rpc.internal.RPCClient import net.corda.client.rpc.internal.serialization.amqp.AMQPClientSerializationScheme import net.corda.core.concurrent.CordaFuture import net.corda.core.context.AuthServiceId @@ -23,7 +23,7 @@ import net.corda.node.services.messaging.RPCServerConfiguration import net.corda.nodeapi.ArtemisTcpTransport import net.corda.nodeapi.ConnectionDirection import net.corda.nodeapi.RPCApi -import net.corda.nodeapi.internal.serialization.AMQP_RPC_CLIENT_CONTEXT +import net.corda.serialization.internal.AMQP_RPC_CLIENT_CONTEXT import net.corda.testing.common.internal.testNetworkParameters import net.corda.testing.core.MAX_MESSAGE_SIZE import net.corda.testing.driver.JmxPolicy diff --git a/testing/test-utils/src/main/kotlin/net/corda/testing/internal/InternalSerializationTestHelpers.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/internal/InternalSerializationTestHelpers.kt index abc75b4eba..d380b03573 100644 --- a/testing/test-utils/src/main/kotlin/net/corda/testing/internal/InternalSerializationTestHelpers.kt +++ b/testing/test-utils/src/main/kotlin/net/corda/testing/internal/InternalSerializationTestHelpers.kt @@ -2,12 +2,12 @@ package net.corda.testing.internal import com.nhaarman.mockito_kotlin.doNothing import com.nhaarman.mockito_kotlin.whenever -import net.corda.core.DoNotImplement import net.corda.client.rpc.internal.serialization.amqp.AMQPClientSerializationScheme +import net.corda.core.DoNotImplement import net.corda.core.serialization.internal.* import net.corda.node.serialization.amqp.AMQPServerSerializationScheme import net.corda.node.serialization.kryo.KryoServerSerializationScheme -import net.corda.nodeapi.internal.serialization.* +import net.corda.serialization.internal.* import net.corda.testing.core.SerializationEnvironmentRule import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ExecutorService diff --git a/testing/test-utils/src/main/kotlin/net/corda/testing/internal/InternalTestUtils.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/internal/InternalTestUtils.kt index 4f80f6992d..ee933c0eb4 100644 --- a/testing/test-utils/src/main/kotlin/net/corda/testing/internal/InternalTestUtils.kt +++ b/testing/test-utils/src/main/kotlin/net/corda/testing/internal/InternalTestUtils.kt @@ -15,7 +15,7 @@ import net.corda.nodeapi.internal.createDevNodeCa import net.corda.nodeapi.internal.crypto.CertificateAndKeyPair import net.corda.nodeapi.internal.crypto.CertificateType import net.corda.nodeapi.internal.crypto.X509Utilities -import net.corda.nodeapi.internal.serialization.amqp.AMQP_ENABLED +import net.corda.serialization.internal.amqp.AMQP_ENABLED import java.nio.file.Files import java.security.KeyPair import javax.security.auth.x500.X500Principal diff --git a/tools/demobench/src/main/kotlin/net/corda/demobench/DemoBench.kt b/tools/demobench/src/main/kotlin/net/corda/demobench/DemoBench.kt index 4b909ed4f6..86430dadf3 100644 --- a/tools/demobench/src/main/kotlin/net/corda/demobench/DemoBench.kt +++ b/tools/demobench/src/main/kotlin/net/corda/demobench/DemoBench.kt @@ -5,8 +5,8 @@ import net.corda.client.rpc.internal.serialization.amqp.AMQPClientSerializationS import net.corda.core.serialization.internal.SerializationEnvironmentImpl import net.corda.core.serialization.internal.nodeSerializationEnv import net.corda.demobench.views.DemoBenchView -import net.corda.nodeapi.internal.serialization.AMQP_P2P_CONTEXT -import net.corda.nodeapi.internal.serialization.SerializationFactoryImpl +import net.corda.serialization.internal.AMQP_P2P_CONTEXT +import net.corda.serialization.internal.SerializationFactoryImpl import tornadofx.* import java.io.InputStreamReader import java.nio.charset.StandardCharsets.UTF_8 From 824adca6c023c754feae93f433521614f32dc28e Mon Sep 17 00:00:00 2001 From: Shams Asari Date: Thu, 17 May 2018 18:34:12 +0100 Subject: [PATCH 02/12] CORDA-1238: Updated JacksonSupport to serialise pojos annotated with @CordaSerializable with the same properties as the AMQP serialisation framework. (#3162) This fixes an issue for pojos with getters that aren't c'tor-based properties. Jackson serialises these out but is then unable to deserialise the pojo back. --- client/jackson/build.gradle | 2 +- .../corda/client/jackson/JacksonSupport.kt | 176 ++-------------- .../client/jackson/internal/CordaModule.kt | 194 ++++++++++++++++++ .../client/jackson/internal/JacksonUtils.kt | 15 +- .../client/jackson/JacksonSupportTest.kt | 15 ++ .../internal/amqp/CorDappCustomSerializer.kt | 2 +- .../internal/amqp/CustomSerializer.kt | 2 +- .../internal/amqp/EvolutionSerializer.kt | 5 +- .../internal/amqp/FingerPrinter.kt | 6 +- .../internal/amqp/ObjectSerializer.kt | 14 +- .../internal/amqp/PropertySerializers.kt | 10 +- .../internal/amqp/SerializationHelper.kt | 29 +-- .../amqp/custom/ThrowableSerializer.kt | 2 +- .../amqp/JavaPrivatePropertyTests.java | 4 +- .../internal/amqp/PrivatePropertyTests.kt | 6 +- 15 files changed, 277 insertions(+), 205 deletions(-) create mode 100644 client/jackson/src/main/kotlin/net/corda/client/jackson/internal/CordaModule.kt diff --git a/client/jackson/build.gradle b/client/jackson/build.gradle index 2fd7eb9dc7..9c59b0ee99 100644 --- a/client/jackson/build.gradle +++ b/client/jackson/build.gradle @@ -5,7 +5,7 @@ apply plugin: 'net.corda.plugins.api-scanner' apply plugin: 'com.jfrog.artifactory' dependencies { - compile project(':core') + compile project(':serialization') testCompile project(':test-utils') compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" diff --git a/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt b/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt index 52fb4e141d..701092ef03 100644 --- a/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt +++ b/client/jackson/src/main/kotlin/net/corda/client/jackson/JacksonSupport.kt @@ -1,16 +1,17 @@ package net.corda.client.jackson -import com.fasterxml.jackson.annotation.* +import com.fasterxml.jackson.annotation.JsonIgnore +import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.core.* import com.fasterxml.jackson.databind.* import com.fasterxml.jackson.databind.annotation.JsonDeserialize import com.fasterxml.jackson.databind.annotation.JsonSerialize import com.fasterxml.jackson.databind.deser.std.NumberDeserializers -import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.node.ObjectNode import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.module.kotlin.KotlinModule -import com.fasterxml.jackson.module.kotlin.convertValue +import net.corda.client.jackson.internal.CordaModule +import net.corda.client.jackson.internal.ToStringSerialize import net.corda.client.jackson.internal.jsonObject import net.corda.client.jackson.internal.readValueAs import net.corda.core.CordaInternal @@ -20,23 +21,24 @@ import net.corda.core.contracts.Amount import net.corda.core.contracts.ContractState import net.corda.core.contracts.StateRef import net.corda.core.crypto.* -import net.corda.core.crypto.TransactionSignature -import net.corda.core.identity.* +import net.corda.core.identity.AbstractParty +import net.corda.core.identity.AnonymousParty +import net.corda.core.identity.CordaX500Name +import net.corda.core.identity.Party import net.corda.core.internal.CertRole -import net.corda.core.internal.DigitalSignatureWithCert import net.corda.core.internal.VisibleForTesting import net.corda.core.internal.uncheckedCast import net.corda.core.messaging.CordaRPCOps import net.corda.core.node.NodeInfo import net.corda.core.node.services.IdentityService import net.corda.core.serialization.SerializedBytes -import net.corda.core.serialization.deserialize import net.corda.core.serialization.serialize import net.corda.core.transactions.CoreTransaction import net.corda.core.transactions.NotaryChangeWireTransaction -import net.corda.core.transactions.SignedTransaction import net.corda.core.transactions.WireTransaction -import net.corda.core.utilities.* +import net.corda.core.utilities.OpaqueBytes +import net.corda.core.utilities.parsePublicKeyBase58 +import net.corda.core.utilities.toBase58String import org.bouncycastle.asn1.x509.KeyPurposeId import java.lang.reflect.Modifier import java.math.BigDecimal @@ -93,31 +95,9 @@ object JacksonSupport { override fun nodeInfoFromParty(party: AbstractParty): NodeInfo? = null } - val cordaModule: Module by lazy { - SimpleModule("core").apply { - setMixInAnnotation(BigDecimal::class.java, BigDecimalMixin::class.java) - setMixInAnnotation(X500Principal::class.java, X500PrincipalMixin::class.java) - setMixInAnnotation(X509Certificate::class.java, X509CertificateMixin::class.java) - setMixInAnnotation(PartyAndCertificate::class.java, PartyAndCertificateSerializerMixin::class.java) - setMixInAnnotation(NetworkHostAndPort::class.java, NetworkHostAndPortMixin::class.java) - setMixInAnnotation(CordaX500Name::class.java, CordaX500NameMixin::class.java) - setMixInAnnotation(Amount::class.java, AmountMixin::class.java) - setMixInAnnotation(AbstractParty::class.java, AbstractPartyMixin::class.java) - setMixInAnnotation(AnonymousParty::class.java, AnonymousPartyMixin::class.java) - setMixInAnnotation(Party::class.java, PartyMixin::class.java) - setMixInAnnotation(PublicKey::class.java, PublicKeyMixin::class.java) - setMixInAnnotation(ByteSequence::class.java, ByteSequenceMixin::class.java) - setMixInAnnotation(SecureHash.SHA256::class.java, SecureHashSHA256Mixin::class.java) - setMixInAnnotation(SerializedBytes::class.java, SerializedBytesMixin::class.java) - setMixInAnnotation(DigitalSignature.WithKey::class.java, ByteSequenceWithPropertiesMixin::class.java) - setMixInAnnotation(DigitalSignatureWithCert::class.java, ByteSequenceWithPropertiesMixin::class.java) - setMixInAnnotation(TransactionSignature::class.java, ByteSequenceWithPropertiesMixin::class.java) - setMixInAnnotation(SignedTransaction::class.java, SignedTransactionMixin2::class.java) - setMixInAnnotation(WireTransaction::class.java, WireTransactionMixin::class.java) - setMixInAnnotation(CertPath::class.java, CertPathMixin::class.java) - setMixInAnnotation(NodeInfo::class.java, NodeInfoMixin::class.java) - } - } + @Suppress("unused") + @Deprecated("Do not use this as it's not thread safe. Instead get a ObjectMapper instance with one of the create*Mapper methods.") + val cordaModule: Module by lazy(::CordaModule) /** * Creates a Jackson ObjectMapper that uses RPC to deserialise parties from string names. @@ -172,15 +152,16 @@ object JacksonSupport { registerModule(JavaTimeModule().apply { addSerializer(Date::class.java, DateSerializer) }) - registerModule(cordaModule) + registerModule(CordaModule()) registerModule(KotlinModule()) + + addMixIn(BigDecimal::class.java, BigDecimalMixin::class.java) + addMixIn(X500Principal::class.java, X500PrincipalMixin::class.java) + addMixIn(X509Certificate::class.java, X509CertificateMixin::class.java) + addMixIn(CertPath::class.java, CertPathMixin::class.java) } } - @JacksonAnnotationsInside - @JsonSerialize(using = com.fasterxml.jackson.databind.ser.std.ToStringSerializer::class) - private annotation class ToStringSerialize - @ToStringSerialize @JsonDeserialize(using = NumberDeserializers.BigDecimalDeserializer::class) private interface BigDecimalMixin @@ -191,77 +172,6 @@ object JacksonSupport { } } - @ToStringSerialize - @JsonDeserialize(using = NetworkHostAndPortDeserializer::class) - private interface NetworkHostAndPortMixin - - private class NetworkHostAndPortDeserializer : JsonDeserializer() { - override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): NetworkHostAndPort { - return NetworkHostAndPort.parse(parser.text) - } - } - - @JsonSerialize(using = PartyAndCertificateSerializer::class) - // TODO Add deserialization which follows the same lookup logic as Party - private interface PartyAndCertificateSerializerMixin - - private class PartyAndCertificateSerializer : JsonSerializer() { - override fun serialize(value: PartyAndCertificate, gen: JsonGenerator, serializers: SerializerProvider) { - gen.jsonObject { - writeObjectField("name", value.name) - writeObjectField("owningKey", value.owningKey) - // TODO Add configurable option to output the certPath - } - } - } - - @JsonSerialize(using = SignedTransactionSerializer::class) - @JsonDeserialize(using = SignedTransactionDeserializer::class) - private interface SignedTransactionMixin2 - - private class SignedTransactionSerializer : JsonSerializer() { - override fun serialize(value: SignedTransaction, gen: JsonGenerator, serializers: SerializerProvider) { - gen.writeObject(SignedTransactionWrapper(value.txBits.bytes, value.sigs)) - } - } - - private class SignedTransactionDeserializer : JsonDeserializer() { - override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): SignedTransaction { - val wrapper = parser.readValueAs() - return SignedTransaction(SerializedBytes(wrapper.txBits), wrapper.signatures) - } - } - - private class SignedTransactionWrapper(val txBits: ByteArray, val signatures: List) - - @JsonSerialize(using = SerializedBytesSerializer::class) - @JsonDeserialize(using = SerializedBytesDeserializer::class) - private class SerializedBytesMixin - - private class SerializedBytesSerializer : JsonSerializer>() { - override fun serialize(value: SerializedBytes<*>, gen: JsonGenerator, serializers: SerializerProvider) { - val deserialized = value.deserialize() - gen.jsonObject { - writeStringField("class", deserialized.javaClass.name) - writeObjectField("deserialized", deserialized) - } - } - } - - private class SerializedBytesDeserializer : JsonDeserializer>() { - override fun deserialize(parser: JsonParser, context: DeserializationContext): SerializedBytes { - return if (parser.currentToken == JsonToken.START_OBJECT) { - val mapper = parser.codec as ObjectMapper - val json = parser.readValueAsTree() - val clazz = context.findClass(json["class"].textValue()) - val pojo = mapper.convertValue(json["deserialized"], clazz) - pojo.serialize() - } else { - SerializedBytes(parser.binaryValue) - } - } - } - @ToStringSerialize private interface X500PrincipalMixin @@ -348,13 +258,6 @@ object JacksonSupport { } } - @JsonDeserialize(using = PartyDeserializer::class) - private interface AbstractPartyMixin - - @JsonSerialize(using = AnonymousPartySerializer::class) - @JsonDeserialize(using = AnonymousPartyDeserializer::class) - private interface AnonymousPartyMixin - @Deprecated("This is an internal class, do not use") object AnonymousPartySerializer : JsonSerializer() { override fun serialize(value: AnonymousParty, generator: JsonGenerator, provider: SerializerProvider) { @@ -369,9 +272,6 @@ object JacksonSupport { } } - @JsonSerialize(using = PartySerializer::class) - private interface PartyMixin - @Deprecated("This is an internal class, do not use") object PartySerializer : JsonSerializer() { override fun serialize(value: Party, generator: JsonGenerator, provider: SerializerProvider) { @@ -406,10 +306,6 @@ object JacksonSupport { } } - @ToStringSerialize - @JsonDeserialize(using = CordaX500NameDeserializer::class) - private interface CordaX500NameMixin - @Deprecated("This is an internal class, do not use") object CordaX500NameDeserializer : JsonDeserializer() { override fun deserialize(parser: JsonParser, context: DeserializationContext): CordaX500Name { @@ -421,10 +317,6 @@ object JacksonSupport { } } - @JsonIgnoreProperties("legalIdentities") // This is already covered by legalIdentitiesAndCerts - @JsonDeserialize(using = NodeInfoDeserializer::class) - private interface NodeInfoMixin - @Deprecated("This is an internal class, do not use") object NodeInfoDeserializer : JsonDeserializer() { override fun deserialize(parser: JsonParser, context: DeserializationContext): NodeInfo { @@ -434,10 +326,6 @@ object JacksonSupport { } } - @ToStringSerialize - @JsonDeserialize(using = SecureHashDeserializer::class) - private interface SecureHashSHA256Mixin - @Deprecated("This is an internal class, do not use") class SecureHashDeserializer : JsonDeserializer() { override fun deserialize(parser: JsonParser, context: DeserializationContext): T { @@ -449,10 +337,6 @@ object JacksonSupport { } } - @JsonSerialize(using = PublicKeySerializer::class) - @JsonDeserialize(using = PublicKeyDeserializer::class) - private interface PublicKeyMixin - @Deprecated("This is an internal class, do not use") object PublicKeySerializer : JsonSerializer() { override fun serialize(value: PublicKey, generator: JsonGenerator, provider: SerializerProvider) { @@ -471,10 +355,6 @@ object JacksonSupport { } } - @ToStringSerialize - @JsonDeserialize(using = AmountDeserializer::class) - private interface AmountMixin - @Deprecated("This is an internal class, do not use") object AmountDeserializer : JsonDeserializer>() { override fun deserialize(parser: JsonParser, context: DeserializationContext): Amount<*> { @@ -489,22 +369,6 @@ object JacksonSupport { private data class CurrencyAmountWrapper(val quantity: Long, val token: Currency) - @JsonDeserialize(using = OpaqueBytesDeserializer::class) - private interface ByteSequenceMixin { - @Suppress("unused") - @JsonValue - fun copyBytes(): ByteArray - } - - @JsonIgnoreProperties("offset", "size") - @JsonSerialize - @JsonDeserialize - private interface ByteSequenceWithPropertiesMixin { - @Suppress("unused") - @JsonValue(false) - fun copyBytes(): ByteArray - } - @Deprecated("This is an internal class, do not use") object OpaqueBytesDeserializer : JsonDeserializer() { override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): OpaqueBytes { diff --git a/client/jackson/src/main/kotlin/net/corda/client/jackson/internal/CordaModule.kt b/client/jackson/src/main/kotlin/net/corda/client/jackson/internal/CordaModule.kt new file mode 100644 index 0000000000..640dbf3a4a --- /dev/null +++ b/client/jackson/src/main/kotlin/net/corda/client/jackson/internal/CordaModule.kt @@ -0,0 +1,194 @@ +@file:Suppress("DEPRECATION") + +package net.corda.client.jackson.internal + +import com.fasterxml.jackson.annotation.JsonValue +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.core.JsonToken +import com.fasterxml.jackson.databind.* +import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.databind.node.ObjectNode +import com.fasterxml.jackson.databind.ser.BeanPropertyWriter +import com.fasterxml.jackson.databind.ser.BeanSerializerModifier +import net.corda.client.jackson.JacksonSupport +import net.corda.core.contracts.Amount +import net.corda.core.crypto.DigitalSignature +import net.corda.core.crypto.SecureHash +import net.corda.core.crypto.TransactionSignature +import net.corda.core.identity.* +import net.corda.core.internal.DigitalSignatureWithCert +import net.corda.core.node.NodeInfo +import net.corda.core.serialization.* +import net.corda.core.transactions.SignedTransaction +import net.corda.core.transactions.WireTransaction +import net.corda.core.utilities.ByteSequence +import net.corda.core.utilities.NetworkHostAndPort +import net.corda.serialization.internal.AllWhitelist +import net.corda.serialization.internal.amqp.SerializerFactory +import net.corda.serialization.internal.amqp.constructorForDeserialization +import net.corda.serialization.internal.amqp.createSerializerFactoryFactory +import net.corda.serialization.internal.amqp.propertiesForSerialization +import java.security.PublicKey + +class CordaModule : SimpleModule("corda-core") { + override fun setupModule(context: SetupContext) { + super.setupModule(context) + + context.addBeanSerializerModifier(CordaSerializableBeanSerializerModifier()) + + context.setMixInAnnotations(PartyAndCertificate::class.java, PartyAndCertificateSerializerMixin::class.java) + context.setMixInAnnotations(NetworkHostAndPort::class.java, NetworkHostAndPortMixin::class.java) + context.setMixInAnnotations(CordaX500Name::class.java, CordaX500NameMixin::class.java) + context.setMixInAnnotations(Amount::class.java, AmountMixin::class.java) + context.setMixInAnnotations(AbstractParty::class.java, AbstractPartyMixin::class.java) + context.setMixInAnnotations(AnonymousParty::class.java, AnonymousPartyMixin::class.java) + context.setMixInAnnotations(Party::class.java, PartyMixin::class.java) + context.setMixInAnnotations(PublicKey::class.java, PublicKeyMixin::class.java) + context.setMixInAnnotations(ByteSequence::class.java, ByteSequenceMixin::class.java) + context.setMixInAnnotations(SecureHash.SHA256::class.java, SecureHashSHA256Mixin::class.java) + context.setMixInAnnotations(SerializedBytes::class.java, SerializedBytesMixin::class.java) + context.setMixInAnnotations(DigitalSignature.WithKey::class.java, ByteSequenceWithPropertiesMixin::class.java) + context.setMixInAnnotations(DigitalSignatureWithCert::class.java, ByteSequenceWithPropertiesMixin::class.java) + context.setMixInAnnotations(TransactionSignature::class.java, ByteSequenceWithPropertiesMixin::class.java) + context.setMixInAnnotations(SignedTransaction::class.java, SignedTransactionMixin2::class.java) + context.setMixInAnnotations(WireTransaction::class.java, JacksonSupport.WireTransactionMixin::class.java) + context.setMixInAnnotations(NodeInfo::class.java, NodeInfoMixin::class.java) + } +} + +/** + * Use the same properties that AMQP serialization uses if the POJO is @CordaSerializable + */ +private class CordaSerializableBeanSerializerModifier : BeanSerializerModifier() { + // We need a SerializerFactory when scanning for properties but don't actually use it so any will do + private val serializerFactory = SerializerFactory(AllWhitelist, Thread.currentThread().contextClassLoader) + + override fun changeProperties(config: SerializationConfig, + beanDesc: BeanDescription, + beanProperties: MutableList): MutableList { + // TODO We're assuming here that Jackson gives us a superset of all the properties. Either confirm this or + // make sure the returned beanProperties are exactly the AMQP properties + if (beanDesc.beanClass.isAnnotationPresent(CordaSerializable::class.java)) { + val ctor = constructorForDeserialization(beanDesc.beanClass) + val amqpProperties = propertiesForSerialization(ctor, beanDesc.beanClass, serializerFactory).serializationOrder + beanProperties.removeIf { bean -> amqpProperties.none { amqp -> amqp.serializer.name == bean.name } } + } + return beanProperties + } +} + +@ToStringSerialize +@JsonDeserialize(using = NetworkHostAndPortDeserializer::class) +private interface NetworkHostAndPortMixin + +private class NetworkHostAndPortDeserializer : JsonDeserializer() { + override fun deserialize(parser: JsonParser, ctxt: DeserializationContext) = NetworkHostAndPort.parse(parser.text) +} + +@JsonSerialize(using = PartyAndCertificateSerializer::class) +// TODO Add deserialization which follows the same lookup logic as Party +private interface PartyAndCertificateSerializerMixin + +private class PartyAndCertificateSerializer : JsonSerializer() { + override fun serialize(value: PartyAndCertificate, gen: JsonGenerator, serializers: SerializerProvider) { + gen.jsonObject { + writeObjectField("name", value.name) + writeObjectField("owningKey", value.owningKey) + // TODO Add configurable option to output the certPath + } + } +} + +@JsonSerialize(using = SignedTransactionSerializer::class) +@JsonDeserialize(using = SignedTransactionDeserializer::class) +private interface SignedTransactionMixin2 + +private class SignedTransactionSerializer : JsonSerializer() { + override fun serialize(value: SignedTransaction, gen: JsonGenerator, serializers: SerializerProvider) { + gen.writeObject(SignedTransactionWrapper(value.txBits.bytes, value.sigs)) + } +} + +private class SignedTransactionDeserializer : JsonDeserializer() { + override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): SignedTransaction { + val wrapper = parser.readValueAs() + return SignedTransaction(SerializedBytes(wrapper.txBits), wrapper.signatures) + } +} + +private class SignedTransactionWrapper(val txBits: ByteArray, val signatures: List) + +@JsonSerialize(using = SerializedBytesSerializer::class) +@JsonDeserialize(using = SerializedBytesDeserializer::class) +private class SerializedBytesMixin + +private class SerializedBytesSerializer : JsonSerializer>() { + override fun serialize(value: SerializedBytes<*>, gen: JsonGenerator, serializers: SerializerProvider) { + val deserialized = value.deserialize() + gen.jsonObject { + writeStringField("class", deserialized.javaClass.name) + writeObjectField("deserialized", deserialized) + } + } +} + +private class SerializedBytesDeserializer : JsonDeserializer>() { + override fun deserialize(parser: JsonParser, context: DeserializationContext): SerializedBytes { + return if (parser.currentToken == JsonToken.START_OBJECT) { + val mapper = parser.codec as ObjectMapper + val json = parser.readValueAsTree() + val clazz = context.findClass(json["class"].textValue()) + val pojo = mapper.convertValue(json["deserialized"], clazz) + pojo.serialize() + } else { + SerializedBytes(parser.binaryValue) + } + } +} + +@JsonDeserialize(using = JacksonSupport.PartyDeserializer::class) +private interface AbstractPartyMixin + +@JsonSerialize(using = JacksonSupport.AnonymousPartySerializer::class) +@JsonDeserialize(using = JacksonSupport.AnonymousPartyDeserializer::class) +private interface AnonymousPartyMixin + +@JsonSerialize(using = JacksonSupport.PartySerializer::class) +private interface PartyMixin + +@ToStringSerialize +@JsonDeserialize(using = JacksonSupport.CordaX500NameDeserializer::class) +private interface CordaX500NameMixin + +@JsonDeserialize(using = JacksonSupport.NodeInfoDeserializer::class) +private interface NodeInfoMixin + +@ToStringSerialize +@JsonDeserialize(using = JacksonSupport.SecureHashDeserializer::class) +private interface SecureHashSHA256Mixin + +@JsonSerialize(using = JacksonSupport.PublicKeySerializer::class) +@JsonDeserialize(using = JacksonSupport.PublicKeyDeserializer::class) +private interface PublicKeyMixin + +@ToStringSerialize +@JsonDeserialize(using = JacksonSupport.AmountDeserializer::class) +private interface AmountMixin + +@JsonDeserialize(using = JacksonSupport.OpaqueBytesDeserializer::class) +private interface ByteSequenceMixin { + @Suppress("unused") + @JsonValue + fun copyBytes(): ByteArray +} + +@JsonSerialize +@JsonDeserialize +private interface ByteSequenceWithPropertiesMixin { + @Suppress("unused") + @JsonValue(false) + fun copyBytes(): ByteArray +} diff --git a/client/jackson/src/main/kotlin/net/corda/client/jackson/internal/JacksonUtils.kt b/client/jackson/src/main/kotlin/net/corda/client/jackson/internal/JacksonUtils.kt index a1d718193a..948b18f956 100644 --- a/client/jackson/src/main/kotlin/net/corda/client/jackson/internal/JacksonUtils.kt +++ b/client/jackson/src/main/kotlin/net/corda/client/jackson/internal/JacksonUtils.kt @@ -1,19 +1,14 @@ package net.corda.client.jackson.internal +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.databind.JsonDeserializer import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.JsonSerializer import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer import com.fasterxml.jackson.module.kotlin.convertValue -inline fun SimpleModule.addSerAndDeser(serializer: JsonSerializer, deserializer: JsonDeserializer) { - addSerializer(T::class.java, serializer) - addDeserializer(T::class.java, deserializer) -} - inline fun JsonGenerator.jsonObject(fieldName: String? = null, gen: JsonGenerator.() -> Unit) { fieldName?.let { writeFieldName(it) } writeStartObject() @@ -24,3 +19,7 @@ inline fun JsonGenerator.jsonObject(fieldName: String? = null, gen: JsonGenerato inline fun JsonParser.readValueAs(): T = readValueAs(T::class.java) inline fun JsonNode.valueAs(mapper: ObjectMapper): T = mapper.convertValue(this) + +@JacksonAnnotationsInside +@JsonSerialize(using = ToStringSerializer::class) +annotation class ToStringSerialize \ No newline at end of file diff --git a/client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt b/client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt index 7c1eda8cce..5847e52c10 100644 --- a/client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt +++ b/client/jackson/src/test/kotlin/net/corda/client/jackson/JacksonSupportTest.kt @@ -405,6 +405,15 @@ class JacksonSupportTest(@Suppress("unused") private val name: String, factory: testToStringSerialisation(X500Principal("CN=Common,L=London,O=Org,C=UK")) } + @Test + fun `@CordaSerializable class which has non-c'tor properties`() { + val data = NonCtorPropertiesData(4434) + val json = mapper.valueToTree(data) + val (value) = json.assertHasOnlyFields("value") + assertThat(value.intValue()).isEqualTo(4434) + assertThat(mapper.convertValue(json)).isEqualTo(data) + } + private fun makeDummyStx(): SignedTransaction { val wtx = DummyContract.generateInitial(1, DUMMY_NOTARY, MINI_CORP.ref(1)) .toWireTransaction(services) @@ -432,6 +441,12 @@ class JacksonSupportTest(@Suppress("unused") private val name: String, factory: @CordaSerializable private data class SubTestData(val value: Int) + @CordaSerializable + private data class NonCtorPropertiesData(val value: Int) { + @Suppress("unused") + val nonCtor: Int get() = value + } + private class TestPartyObjectMapper : JacksonSupport.PartyObjectMapper { val identities = ArrayList() val nodes = ArrayList() diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CorDappCustomSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CorDappCustomSerializer.kt index b96c808c6e..a6a1b1722e 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CorDappCustomSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CorDappCustomSerializer.kt @@ -74,7 +74,7 @@ class CorDappCustomSerializer( data.withDescribed(descriptor) { data.withList { proxySerializer.propertySerializers.serializationOrder.forEach { - it.getter.writeProperty(proxy, this, output, context) + it.serializer.writeProperty(proxy, this, output, context) } } } diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CustomSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CustomSerializer.kt index c46c5c16de..f920b6e792 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CustomSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/CustomSerializer.kt @@ -157,7 +157,7 @@ abstract class CustomSerializer : AMQPSerializer, SerializerFor { val proxy = toProxy(obj) data.withList { proxySerializer.propertySerializers.serializationOrder.forEach { - it.getter.writeProperty(proxy, this, output, context) + it.serializer.writeProperty(proxy, this, output, context) } } } diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt index 6020b9a265..14913b8882 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/EvolutionSerializer.kt @@ -1,5 +1,6 @@ package net.corda.serialization.internal.amqp +import net.corda.core.internal.isConcreteClass import net.corda.core.serialization.DeprecatedConstructorForDeserialization import net.corda.core.serialization.SerializationContext import net.corda.serialization.internal.carpenter.getTypeAsClass @@ -63,7 +64,7 @@ abstract class EvolutionSerializer( private fun getEvolverConstructor(type: Type, oldArgs: Map): KFunction? { val clazz: Class<*> = type.asClass()!! - if (!isConcrete(clazz)) return null + if (!clazz.isConcreteClass) return null val oldArgumentSet = oldArgs.map { Pair(it.key as String?, it.value.property.resolvedType) } @@ -109,7 +110,7 @@ abstract class EvolutionSerializer( classProperties: Map): AMQPSerializer { val setters = propertiesForSerializationFromSetters(classProperties, new.type, - factory).associateBy({ it.getter.name }, { it }) + factory).associateBy({ it.serializer.name }, { it }) return EvolutionSerializerViaSetters(new.type, factory, readersAsSerialized, constructor, setters) } diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/FingerPrinter.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/FingerPrinter.kt index 70802d818a..36c63ace7b 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/FingerPrinter.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/FingerPrinter.kt @@ -192,9 +192,9 @@ class SerializerFingerPrinter : FingerPrinter { propertiesForSerialization(constructorForDeserialization(type), contextType ?: type, factory) .serializationOrder .fold(hasher.putUnencodedChars(name)) { orig, prop -> - fingerprintForType(prop.getter.resolvedType, type, alreadySeen, orig, debugIndent + 1) - .putUnencodedChars(prop.getter.name) - .putUnencodedChars(if (prop.getter.mandatory) NOT_NULLABLE_HASH else NULLABLE_HASH) + fingerprintForType(prop.serializer.resolvedType, type, alreadySeen, orig, debugIndent + 1) + .putUnencodedChars(prop.serializer.name) + .putUnencodedChars(if (prop.serializer.mandatory) NOT_NULLABLE_HASH else NULLABLE_HASH) } interfacesForSerialization(type, factory).map { fingerprintForType(it, type, alreadySeen, hasher, debugIndent + 1) } return hasher diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/ObjectSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/ObjectSerializer.kt index ff04495c6f..97ff897798 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/ObjectSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/ObjectSerializer.kt @@ -23,12 +23,10 @@ open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPS private val logger = contextLogger() } - internal open val propertySerializers: PropertySerializers by lazy { + open val propertySerializers: PropertySerializers by lazy { propertiesForSerialization(kotlinConstructor, clazz, factory) } - fun getPropertySerializers() = propertySerializers - private val typeName = nameForType(clazz) override val typeDescriptor = Symbol.valueOf( @@ -48,7 +46,7 @@ open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPS } propertySerializers.serializationOrder.forEach { property -> - property.getter.writeClassInfo(output) + property.serializer.writeClassInfo(output) } } } @@ -74,7 +72,7 @@ open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPS // Write list withList { propertySerializers.serializationOrder.forEach { property -> - property.getter.writeProperty(obj, this, output, context, debugIndent + 1) + property.serializer.writeProperty(obj, this, output, context, debugIndent + 1) } } } @@ -109,7 +107,7 @@ open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPS return construct(propertySerializers.serializationOrder .zip(obj) - .map { Pair(it.first.initialPosition, it.first.getter.readProperty(it.second, schemas, input, context)) } + .map { Pair(it.first.initialPosition, it.first.serializer.readProperty(it.second, schemas, input, context)) } .sortedWith(compareBy({ it.first })) .map { it.second }) } @@ -128,7 +126,7 @@ open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPS // do it in doesn't matter val propertiesFromBlob = obj .zip(propertySerializers.serializationOrder) - .map { it.second.getter.readProperty(it.first, schemas, input, context) } + .map { it.second.serializer.readProperty(it.first, schemas, input, context) } // one by one take a property and invoke the setter on the class propertySerializers.serializationOrder.zip(propertiesFromBlob).forEach { @@ -140,7 +138,7 @@ open class ObjectSerializer(val clazz: Type, factory: SerializerFactory) : AMQPS private fun generateFields(): List { return propertySerializers.serializationOrder.map { - Field(it.getter.name, it.getter.type, it.getter.requires, it.getter.default, null, it.getter.mandatory, false) + Field(it.serializer.name, it.serializer.type, it.serializer.requires, it.serializer.default, null, it.serializer.mandatory, false) } } diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/PropertySerializers.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/PropertySerializers.kt index de9e6582dc..a89b1d0880 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/PropertySerializers.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/PropertySerializers.kt @@ -104,16 +104,16 @@ class EvolutionPropertyReader : PropertyReader() { * Represents a generic interface to a serializable property of an object. * * @property initialPosition where in the constructor used for serialization the property occurs. - * @property getter a [PropertySerializer] wrapping access to the property. This will either be a + * @property serializer a [PropertySerializer] wrapping access to the property. This will either be a * method invocation on the getter or, if not publicly accessible, reflection based by temporally * making the property accessible. */ abstract class PropertyAccessor( val initialPosition: Int, - open val getter: PropertySerializer) { + open val serializer: PropertySerializer) { companion object : Comparator { override fun compare(p0: PropertyAccessor?, p1: PropertyAccessor?): Int { - return p0?.getter?.name?.compareTo(p1?.getter?.name ?: "") ?: 0 + return p0?.serializer?.name?.compareTo(p1?.serializer?.name ?: "") ?: 0 } } @@ -123,7 +123,7 @@ abstract class PropertyAccessor( abstract fun set(instance: Any, obj: Any?) override fun toString(): String { - return "${getter.name}($initialPosition)" + return "${serializer.name}($initialPosition)" } } @@ -157,7 +157,7 @@ class PropertyAccessorGetterSetter( */ class PropertyAccessorConstructor( initialPosition: Int, - override val getter: PropertySerializer) : PropertyAccessor(initialPosition, getter) { + override val serializer: PropertySerializer) : PropertyAccessor(initialPosition, serializer) { /** * Because the property should be being set on the obejct through the constructor any * calls to the explicit setter should be an error. diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializationHelper.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializationHelper.kt index 24c2d33420..9a929e9df3 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializationHelper.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/SerializationHelper.kt @@ -2,6 +2,7 @@ package net.corda.serialization.internal.amqp import com.google.common.primitives.Primitives import com.google.common.reflect.TypeToken +import net.corda.core.internal.isConcreteClass import net.corda.core.serialization.ClassWhitelist import net.corda.core.serialization.ConstructorForDeserialization import net.corda.core.serialization.CordaSerializable @@ -25,11 +26,11 @@ import kotlin.reflect.jvm.javaType * * If there's only one constructor, it selects that. If there are two and one is the default, it selects the other. * Otherwise it starts with the primary constructor in kotlin, if there is one, and then will override this with any that is - * annotated with [@CordaConstructor]. It will report an error if more than one constructor is annotated. + * annotated with [@ConstructorForDeserialization]. It will report an error if more than one constructor is annotated. */ -internal fun constructorForDeserialization(type: Type): KFunction? { +fun constructorForDeserialization(type: Type): KFunction? { val clazz: Class<*> = type.asClass()!! - if (isConcrete(clazz)) { + if (clazz.isConcreteClass) { var preferredCandidate: KFunction? = clazz.kotlin.primaryConstructor var annotatedCount = 0 val kotlinConstructors = clazz.kotlin.constructors @@ -42,7 +43,7 @@ internal fun constructorForDeserialization(type: Type): KFunction? { preferredCandidate = kotlinConstructor } else if (kotlinConstructor.findAnnotation() != null) { if (annotatedCount++ > 0) { - throw NotSerializableException("More than one constructor for $clazz is annotated with @CordaConstructor.") + throw NotSerializableException("More than one constructor for $clazz is annotated with @ConstructorForDeserialization.") } preferredCandidate = kotlinConstructor } @@ -63,18 +64,18 @@ internal fun constructorForDeserialization(type: Type): KFunction? { * Note, you will need any Java classes to be compiled with the `-parameters` option to ensure constructor parameters * have names accessible via reflection. */ -internal fun propertiesForSerialization( +fun propertiesForSerialization( kotlinConstructor: KFunction?, type: Type, - factory: SerializerFactory) = PropertySerializers.make( - if (kotlinConstructor != null) { - propertiesForSerializationFromConstructor(kotlinConstructor, type, factory) - } else { - propertiesForSerializationFromAbstract(type.asClass()!!, type, factory) - }.sortedWith(PropertyAccessor)) - - -fun isConcrete(clazz: Class<*>): Boolean = !(clazz.isInterface || Modifier.isAbstract(clazz.modifiers)) + factory: SerializerFactory): PropertySerializers { + return PropertySerializers.make( + if (kotlinConstructor != null) { + propertiesForSerializationFromConstructor(kotlinConstructor, type, factory) + } else { + propertiesForSerializationFromAbstract(type.asClass()!!, type, factory) + }.sortedWith(PropertyAccessor) + ) +} /** * Encapsulates the property of a class and its potential getter and setter methods. diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ThrowableSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ThrowableSerializer.kt index d2161344f3..4a71edf700 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ThrowableSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/custom/ThrowableSerializer.kt @@ -24,7 +24,7 @@ class ThrowableSerializer(factory: SerializerFactory) : CustomSerializer.Proxy - extraProperties[property.getter.name] = property.getter.propertyReader.read(obj) + extraProperties[property.serializer.name] = property.serializer.propertyReader.read(obj) } } catch (e: NotSerializableException) { logger.warn("Unexpected exception", e) diff --git a/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaPrivatePropertyTests.java b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaPrivatePropertyTests.java index ef726dafdd..656b2224d7 100644 --- a/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaPrivatePropertyTests.java +++ b/serialization/src/test/java/net/corda/serialization/internal/amqp/JavaPrivatePropertyTests.java @@ -160,7 +160,7 @@ public class JavaPrivatePropertyTests { ObjectSerializer cSerializer = ((ObjectSerializer)serializersByDescriptor.values().toArray()[0]); assertEquals(1, cSerializer.getPropertySerializers().getSerializationOrder().size()); Object[] propertyReaders = cSerializer.getPropertySerializers().getSerializationOrder().toArray(); - assertTrue (((PropertyAccessor)propertyReaders[0]).getGetter().getPropertyReader() instanceof PrivatePropertyReader); + assertTrue (((PropertyAccessor)propertyReaders[0]).getSerializer().getPropertyReader() instanceof PrivatePropertyReader); } @Test @@ -190,6 +190,6 @@ public class JavaPrivatePropertyTests { ObjectSerializer cSerializer = ((ObjectSerializer)serializersByDescriptor.values().toArray()[0]); assertEquals(1, cSerializer.getPropertySerializers().getSerializationOrder().size()); Object[] propertyReaders = cSerializer.getPropertySerializers().getSerializationOrder().toArray(); - assertTrue (((PropertyAccessor)propertyReaders[0]).getGetter().getPropertyReader() instanceof PublicPropertyReader); + assertTrue (((PropertyAccessor)propertyReaders[0]).getSerializer().getPropertyReader() instanceof PublicPropertyReader); } } diff --git a/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/PrivatePropertyTests.kt b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/PrivatePropertyTests.kt index 4baa5c95ed..ce6a0e9084 100644 --- a/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/PrivatePropertyTests.kt +++ b/serialization/src/test/kotlin/net/corda/serialization/internal/amqp/PrivatePropertyTests.kt @@ -141,7 +141,7 @@ class PrivatePropertyTests { serializersByDescriptor.filterKeys { (it as Symbol) == schemaDescriptor }.values.apply { assertEquals(1, this.size) assertTrue(this.first() is ObjectSerializer) - val propertySerializers = (this.first() as ObjectSerializer).propertySerializers.serializationOrder.map { it.getter } + val propertySerializers = (this.first() as ObjectSerializer).propertySerializers.serializationOrder.map { it.serializer } assertEquals(2, propertySerializers.size) // a was public so should have a synthesised getter assertTrue(propertySerializers[0].propertyReader is PublicPropertyReader) @@ -170,7 +170,7 @@ class PrivatePropertyTests { serializersByDescriptor.filterKeys { (it as Symbol) == schemaDescriptor }.values.apply { assertEquals(1, this.size) assertTrue(this.first() is ObjectSerializer) - val propertySerializers = (this.first() as ObjectSerializer).propertySerializers.serializationOrder.map { it.getter } + val propertySerializers = (this.first() as ObjectSerializer).propertySerializers.serializationOrder.map { it.serializer } assertEquals(2, propertySerializers.size) // as before, a is public so we'll use the getter method @@ -219,7 +219,7 @@ class PrivatePropertyTests { assertEquals(1, size) assertTrue(this.first() is ObjectSerializer) - val propertySerializers = (this.first() as ObjectSerializer).propertySerializers.serializationOrder.map { it.getter } + val propertySerializers = (this.first() as ObjectSerializer).propertySerializers.serializationOrder.map { it.serializer } // CCC is the only property to be serialised assertEquals(1, propertySerializers.size) From 24b43117dc4dab90f34ad83f1590785f0c15f2ff Mon Sep 17 00:00:00 2001 From: Andrius Dagys Date: Thu, 10 May 2018 11:46:24 +0100 Subject: [PATCH 03/12] Increase the number of log files retained per day Currently the node will keep up to 10 compressed log files during rollover, and discard old ones. This limit seems too low for production use and might lead to valuable log data loss. --- config/dev/log4j2.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/dev/log4j2.xml b/config/dev/log4j2.xml index f0ec5b615d..a5c1bc306a 100644 --- a/config/dev/log4j2.xml +++ b/config/dev/log4j2.xml @@ -21,7 +21,7 @@ - - + From ae5bacb4b496deb83de45194f6e8b9ca39cacbfa Mon Sep 17 00:00:00 2001 From: Stanly Johnson Date: Fri, 18 May 2018 15:01:24 +0530 Subject: [PATCH 04/12] Network bootstrapper check for duplicate node names (#3182) --- CONTRIBUTORS.md | 15 +++++++------ .../internal/network/NetworkBootstrapper.kt | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 3be2d6bd9e..a27727f797 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,11 +1,11 @@ # List of Contributors -We'd like to thank the following people for contributing to Corda, either by -contributing to the design of Corda during the architecture review sessions of the -R3 Architecture Working Group and during design reviews since Corda has been -open-sourced, or by contributing code via pull requests. Some people have -moved to a different organisation since their contribution. Please forgive any -omissions, and create a pull request, or email , if you wish to +We'd like to thank the following people for contributing to Corda, either by +contributing to the design of Corda during the architecture review sessions of the +R3 Architecture Working Group and during design reviews since Corda has been +open-sourced, or by contributing code via pull requests. Some people have +moved to a different organisation since their contribution. Please forgive any +omissions, and create a pull request, or email , if you wish to see changes to this list. * acetheultimate @@ -164,6 +164,7 @@ see changes to this list. * Simon Taylor (Barclays) * Sofus Mortensen (Digital Asset Holdings) * stevenroose +* Stanly Johnson (Servntire Global) * Szymon Sztuka (R3) * tb-pq * Thiago Rafael Ferreira (Scorpius IT Solutions) @@ -175,7 +176,7 @@ see changes to this list. * tomconte * Tommy Lillehagen (R3) * tomtau -* Tudor Malene (R3) +* Tudor Malene (R3) * Tushar Singh Bora * varunkm * verymahler diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt index e508c78fd0..ea3919323e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt @@ -37,6 +37,10 @@ import java.time.Instant import java.util.concurrent.Executors import java.util.concurrent.TimeoutException import kotlin.streams.toList +import kotlin.collections.HashSet +import kotlin.collections.component1 +import kotlin.collections.component2 +import kotlin.collections.set /** * Class to bootstrap a local network of Corda nodes on the same filesystem. @@ -74,6 +78,8 @@ class NetworkBootstrapper { try { println("Waiting for all nodes to generate their node-info files...") val nodeInfoFiles = gatherNodeInfoFiles(processes, nodeDirs) + println("Checking for duplicate nodes") + checkForDuplicateLegalNames(nodeInfoFiles) println("Distributing all node-info files to all nodes") distributeNodeInfos(nodeDirs, nodeInfoFiles) print("Loading existing network parameters... ") @@ -160,6 +166,22 @@ class NetworkBootstrapper { } } + /*the function checks for duplicate myLegalName in the all the *_node.conf files + All the myLegalName values are added to a HashSet - this helps detect duplicate values. + If a duplicate name is found the process is aborted with an error message + */ + private fun checkForDuplicateLegalNames(nodeInfoFiles: List) { + val legalNames = HashSet() + for (nodeInfoFile in nodeInfoFiles) { + val nodeConfig = ConfigFactory.parseFile((nodeInfoFile.parent / "node.conf").toFile()) + val legalName = nodeConfig.getString("myLegalName") + if(!legalNames.add(legalName)){ + println("Duplicate Node Found - ensure every node has a unique legal name"); + throw IllegalArgumentException("Duplicate Node Found - $legalName"); + } + } + } + private fun gatherNotaryInfos(nodeInfoFiles: List): List { return nodeInfoFiles.mapNotNull { nodeInfoFile -> // The config contains the notary type From 215e54f1abfe36d594e69b8ac336f1ad01b70568 Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko Date: Fri, 18 May 2018 11:09:02 +0100 Subject: [PATCH 05/12] ENT-1902: If we are already in the JavaFX thread - perform direct invocation without postponing it. (#3177) Or else if we are operating in JavaFX thread the sequence of invocations will change. --- .../main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt index a49785a101..f69e12e272 100644 --- a/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt +++ b/client/jfx/src/main/kotlin/net/corda/client/jfx/model/NodeMonitorModel.kt @@ -70,7 +70,8 @@ class NodeMonitorModel { // Only execute using "runLater()" if JavaFX been initialized. // It may not be initialized in the unit test. - if(initialized.value.get()) { + // Also if we are already in the JavaFX thread - perform direct invocation without postponing it. + if(initialized.value.get() && !Platform.isFxApplicationThread()) { Platform.runLater(op) } else { op() From a38250c10096175e687fef0a1bcd936aa1dadf69 Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Fri, 18 May 2018 12:31:01 +0100 Subject: [PATCH 06/12] Declare serialisation default interface methods as Java8-style defaults. (#3086) --- build.gradle | 1 + .../kotlin/net/corda/serialization/internal/OrdinalIO.kt | 6 +++--- .../net/corda/serialization/internal/amqp/AMQPSerializer.kt | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 623f2bfd04..bcd3f867d7 100644 --- a/build.gradle +++ b/build.gradle @@ -173,6 +173,7 @@ allprojects { apiVersion = "1.2" jvmTarget = "1.8" javaParameters = true // Useful for reflection. + freeCompilerArgs = ['-Xenable-jvm-default'] } } diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/OrdinalIO.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/OrdinalIO.kt index 38c9d12976..a1d4e5e04b 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/OrdinalIO.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/OrdinalIO.kt @@ -8,9 +8,9 @@ import java.nio.ByteBuffer class OrdinalBits(private val ordinal: Int) { interface OrdinalWriter { val bits: OrdinalBits - val encodedSize get() = 1 - fun writeTo(stream: OutputStream) = stream.write(bits.ordinal) - fun putTo(buffer: ByteBuffer) = buffer.put(bits.ordinal.toByte())!! + @JvmDefault val encodedSize get() = 1 + @JvmDefault fun writeTo(stream: OutputStream) = stream.write(bits.ordinal) + @JvmDefault fun putTo(buffer: ByteBuffer) = buffer.put(bits.ordinal.toByte())!! } init { diff --git a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializer.kt b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializer.kt index d169d27da3..283b997a84 100644 --- a/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializer.kt +++ b/serialization/src/main/kotlin/net/corda/serialization/internal/amqp/AMQPSerializer.kt @@ -31,6 +31,7 @@ interface AMQPSerializer { /** * Write the given object, with declared type, to the output. */ + @JvmDefault fun writeObject(obj: Any, data: Data, type: Type, output: SerializationOutput, context: SerializationContext, debugIndent: Int = 0) @@ -38,4 +39,4 @@ interface AMQPSerializer { * Read the given object from the input. The envelope is provided in case the schema is required. */ fun readObject(obj: Any, schemas: SerializationSchemas, input: DeserializationInput, context: SerializationContext): T -} \ No newline at end of file +} From 013eb33d7cb73fb55d3d41f80a5613b7e18c0cf1 Mon Sep 17 00:00:00 2001 From: szymonsztuka Date: Fri, 18 May 2018 16:39:55 +0100 Subject: [PATCH 07/12] ENT-1574 Progress tracker distinguishes steps which were not processed (#3173) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Progress Tracker doesn't mark as "green tick" a step which hasn't been set in the flow. Steps behind the current step, which were not processed ('an optional step') are now marked distingishly as green crossed sign for shell and as minus sign for ssh.
 * Finality Flow sets the current step to NOTARISING only if the actual notarization is performed. --- .../net/corda/core/flows/FinalityFlow.kt | 2 +- .../kotlin/net/corda/core/internal/Emoji.kt | 3 ++ .../corda/core/utilities/ProgressTracker.kt | 9 ++++- .../core/utilities/ProgressTrackerTest.kt | 35 +++++++++++++++++++ .../shell/utlities/ANSIProgressRenderer.kt | 7 +++- 5 files changed, 53 insertions(+), 3 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/flows/FinalityFlow.kt b/core/src/main/kotlin/net/corda/core/flows/FinalityFlow.kt index a08654acb9..a958ef6a91 100644 --- a/core/src/main/kotlin/net/corda/core/flows/FinalityFlow.kt +++ b/core/src/main/kotlin/net/corda/core/flows/FinalityFlow.kt @@ -52,7 +52,6 @@ class FinalityFlow(val transaction: SignedTransaction, // Lookup the resolved transactions and use them to map each signed transaction to the list of participants. // Then send to the notary if needed, record locally and distribute. val parties = getPartiesToSend(verifyTx()) - progressTracker.currentStep = NOTARISING val notarised = notariseAndRecord() // Each transaction has its own set of recipients, but extra recipients get them all. @@ -70,6 +69,7 @@ class FinalityFlow(val transaction: SignedTransaction, @Suspendable private fun notariseAndRecord(): SignedTransaction { val notarised = if (needsNotarySignature(transaction)) { + progressTracker.currentStep = NOTARISING val notarySignatures = subFlow(NotaryFlow.Client(transaction)) transaction + notarySignatures } else { diff --git a/core/src/main/kotlin/net/corda/core/internal/Emoji.kt b/core/src/main/kotlin/net/corda/core/internal/Emoji.kt index 27b780ece0..4d7d8b9dcd 100644 --- a/core/src/main/kotlin/net/corda/core/internal/Emoji.kt +++ b/core/src/main/kotlin/net/corda/core/internal/Emoji.kt @@ -49,6 +49,8 @@ object Emoji { val CODE_DEVELOPER: String = codePointsString(0x1F469, 0x200D, 0x1F4BB) @JvmStatic val CODE_WARNING_SIGN: String = codePointsString(0x26A0, 0xFE0F) + @JvmStatic + val CROSS_MARK_BUTTON: String = codePointsString(0x274E) /** * When non-null, toString() methods are allowed to use emoji in the output as we're going to render them to a @@ -76,6 +78,7 @@ object Emoji { val rightArrow: String get() = if (emojiMode.get() != null) "$CODE_RIGHT_ARROW " else "▶︎" val skullAndCrossbones: String get() = if (emojiMode.get() != null) "$CODE_SKULL_AND_CROSSBONES " else "☂" val noEntry: String get() = if (emojiMode.get() != null) "$CODE_NO_ENTRY " else "✘" + val notRun: String get() = if (emojiMode.get() != null) "$CROSS_MARK_BUTTON " else "-" inline fun renderIfSupported(body: () -> T): T { if (hasEmojiTerminal) diff --git a/core/src/main/kotlin/net/corda/core/utilities/ProgressTracker.kt b/core/src/main/kotlin/net/corda/core/utilities/ProgressTracker.kt index 4fa4797a29..f646f0569a 100644 --- a/core/src/main/kotlin/net/corda/core/utilities/ProgressTracker.kt +++ b/core/src/main/kotlin/net/corda/core/utilities/ProgressTracker.kt @@ -148,8 +148,15 @@ class ProgressTracker(vararg steps: Step) { val currentStepRecursive: Step get() = getChildProgressTracker(currentStep)?.currentStepRecursive ?: currentStep + /** Returns the current step, descending into children to find the deepest started step we are up to. */ + private val currentStartedStepRecursive: Step + get() { + val step = getChildProgressTracker(currentStep)?.currentStartedStepRecursive ?: currentStep + return if (step == UNSTARTED) currentStep else step + } + private fun currentStepRecursiveWithoutUnstarted(): Step { - val stepRecursive = getChildProgressTracker(currentStep)?.currentStepRecursive + val stepRecursive = getChildProgressTracker(currentStep)?.currentStartedStepRecursive return if (stepRecursive == null || stepRecursive == UNSTARTED) currentStep else stepRecursive } diff --git a/core/src/test/kotlin/net/corda/core/utilities/ProgressTrackerTest.kt b/core/src/test/kotlin/net/corda/core/utilities/ProgressTrackerTest.kt index 4e15f122d9..7ee985e05b 100644 --- a/core/src/test/kotlin/net/corda/core/utilities/ProgressTrackerTest.kt +++ b/core/src/test/kotlin/net/corda/core/utilities/ProgressTrackerTest.kt @@ -131,6 +131,41 @@ class ProgressTrackerTest { assertThat(stepsTreeNotification).isEmpty() } + @Test + fun `steps tree index counts two levels of children steps`() { + pt.setChildProgressTracker(SimpleSteps.FOUR, pt2) + pt2.setChildProgressTracker(ChildSteps.SEA, pt3) + val allSteps = pt.allSteps + + // Capture notifications. + val stepsIndexNotifications = LinkedList() + pt.stepsTreeIndexChanges.subscribe { + stepsIndexNotifications += it + } + val stepsTreeNotification = LinkedList>>() + pt.stepsTreeChanges.subscribe { + stepsTreeNotification += it + } + + fun assertCurrentStepsTree(index: Int, step: ProgressTracker.Step) { + assertEquals(index, pt.stepsTreeIndex) + assertEquals(step, allSteps[pt.stepsTreeIndex].second) + } + + pt.currentStep = SimpleSteps.ONE + assertCurrentStepsTree(0, SimpleSteps.ONE) + + pt.currentStep = SimpleSteps.FOUR + assertCurrentStepsTree(3, SimpleSteps.FOUR) + + pt2.currentStep = ChildSteps.SEA + assertCurrentStepsTree(6, ChildSteps.SEA) + + // Assert no structure changes and proper steps propagation. + assertThat(stepsIndexNotifications).containsExactlyElementsOf(listOf(0, 3, 6)) + assertThat(stepsTreeNotification).isEmpty() + } + @Test fun `structure changes are pushed down when progress trackers are added`() { pt.setChildProgressTracker(SimpleSteps.TWO, pt2) diff --git a/tools/shell/src/main/kotlin/net/corda/tools/shell/utlities/ANSIProgressRenderer.kt b/tools/shell/src/main/kotlin/net/corda/tools/shell/utlities/ANSIProgressRenderer.kt index 4848ff5d47..aef5b4ca70 100644 --- a/tools/shell/src/main/kotlin/net/corda/tools/shell/utlities/ANSIProgressRenderer.kt +++ b/tools/shell/src/main/kotlin/net/corda/tools/shell/utlities/ANSIProgressRenderer.kt @@ -23,6 +23,7 @@ abstract class ANSIProgressRenderer { protected var checkEmoji = false protected var treeIndex: Int = 0 + protected var treeIndexProcessed: MutableSet = mutableSetOf() protected var tree: List> = listOf() private var installedYet = false @@ -55,6 +56,7 @@ abstract class ANSIProgressRenderer { subscriptionIndex?.unsubscribe() subscriptionTree?.unsubscribe() treeIndex = 0 + treeIndexProcessed.clear() tree = listOf() if (!installedYet) { @@ -70,8 +72,10 @@ abstract class ANSIProgressRenderer { flowProgressHandle?.apply { stepsTreeIndexFeed?.apply { treeIndex = snapshot + treeIndexProcessed.add(snapshot) subscriptionIndex = updates.subscribe({ treeIndex = it + treeIndexProcessed.add(it) draw(true) }, { done(it) }, { done(null) }) } @@ -144,7 +148,8 @@ abstract class ANSIProgressRenderer { for ((index, step) in tree.withIndex()) { val marker = when { - index < treeIndex -> "${Emoji.greenTick} " + treeIndexProcessed.contains(index) -> " ${Emoji.greenTick} " + index < treeIndex -> " ${Emoji.notRun} " treeIndex == tree.lastIndex -> "${Emoji.greenTick} " index == treeIndex -> "${Emoji.rightArrow} " error -> "${Emoji.noEntry} " From fa090eb865f411d3cfe890b8d22611c1e709bd29 Mon Sep 17 00:00:00 2001 From: Viktor Kolomeyko Date: Fri, 18 May 2018 17:16:41 +0100 Subject: [PATCH 08/12] CORDA-1506: Cash selection logic fails when selection with a change from more that 2 different issuer groups (#3187) * Expose a flaw in cash selection logic * Minimal test exposing the bug. * Remaining unspent cash overwrites the cash of the first issuer, not the current issuer - the problem emerged when at least three different groups were selected, for 2 different issuers the last one in selection process was always the first remaining one. * Addressing PR comments + more precise test name * Addressing PR comments. --- .../finance/contracts/asset/OnLedgerAsset.kt | 2 +- .../cash/selection/CashSelectionH2ImplTest.kt | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/OnLedgerAsset.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/OnLedgerAsset.kt index 28c1751be4..046de76ee0 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/OnLedgerAsset.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/OnLedgerAsset.kt @@ -152,7 +152,7 @@ abstract class OnLedgerAsset> delta > 0 -> { // The states from the current issuer more than covers this payment. outputStates += deriveState(templateState, Amount(remainingToPay, token), party) - remainingFromEachIssuer[0] = Pair(token, Amount(delta, token)) + remainingFromEachIssuer[remainingFromEachIssuer.lastIndex] = Pair(token, Amount(delta, token)) remainingToPay = 0 } delta == 0L -> { diff --git a/finance/src/test/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2ImplTest.kt b/finance/src/test/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2ImplTest.kt index 435ee7d4a5..c259e3a10d 100644 --- a/finance/src/test/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2ImplTest.kt +++ b/finance/src/test/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionH2ImplTest.kt @@ -14,6 +14,7 @@ import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.After import org.junit.Test import java.util.Collections.nCopies +import kotlin.test.assertNotNull class CashSelectionH2ImplTest { private val mockNet = MockNetwork(threadPerNode = true, cordappPackages = listOf("net.corda.finance")) @@ -53,4 +54,19 @@ class CashSelectionH2ImplTest { assertThatThrownBy { flow2.getOrThrow() }.isInstanceOf(CashException::class.java) assertThatThrownBy { flow3.getOrThrow() }.isInstanceOf(CashException::class.java) } + + @Test + fun `select pennies amount from cash states with more than two different issuers and expect change`() { + val node = mockNet.createNode() + val notary = mockNet.defaultNotaryIdentity + + // Issue some cash + node.startFlow(CashIssueFlow(1.POUNDS, OpaqueBytes.of(1), notary)).getOrThrow() + node.startFlow(CashIssueFlow(1.POUNDS, OpaqueBytes.of(2), notary)).getOrThrow() + node.startFlow(CashIssueFlow(1000.POUNDS, OpaqueBytes.of(3), notary)).getOrThrow() + + // Make a payment + val paymentResult = node.startFlow(CashPaymentFlow(999.POUNDS, node.info.legalIdentities[0], false)).getOrThrow() + assertNotNull(paymentResult.recipient) + } } \ No newline at end of file From eecb210a352b2a14cd63e6e1d8a0d3d467fd95da Mon Sep 17 00:00:00 2001 From: Shams Asari Date: Fri, 18 May 2018 17:28:40 +0100 Subject: [PATCH 09/12] Clarifying the ident width in the code style guide (#3190) --- docs/source/codestyle.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/codestyle.rst b/docs/source/codestyle.rst index 71388c5e0d..b51520ae21 100644 --- a/docs/source/codestyle.rst +++ b/docs/source/codestyle.rst @@ -50,7 +50,7 @@ be structured one parameter per line. Code is vertically dense, blank lines in methods are used sparingly. This is so more code can fit on screen at once. -We use spaces and not tabs. +We use spaces and not tabs, with indents being 4 spaces wide. 1.2 Naming ---------- From acefe4261c281313e1bf5f620d155477a3d46a40 Mon Sep 17 00:00:00 2001 From: Thomas Schroeter Date: Wed, 16 May 2018 20:53:09 +0100 Subject: [PATCH 10/12] Bootstrap HA and BFT notaries --- .../internal/network/NetworkBootstrapper.kt | 54 ++++++++++++++++--- .../net/corda/notarydemo/BFTNotaryCordform.kt | 5 -- .../corda/notarydemo/RaftNotaryCordform.kt | 4 -- 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt index ea3919323e..54c05f72bc 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt @@ -1,8 +1,10 @@ package net.corda.nodeapi.internal.network +import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import net.corda.cordform.CordformNode import net.corda.core.contracts.ContractClassName +import net.corda.core.identity.CordaX500Name import net.corda.core.identity.Party import net.corda.core.internal.* import net.corda.core.internal.concurrent.fork @@ -18,10 +20,7 @@ import net.corda.core.serialization.internal._contextSerializationEnv import net.corda.core.utilities.days import net.corda.core.utilities.getOrThrow import net.corda.core.utilities.seconds -import net.corda.nodeapi.internal.ContractsJar -import net.corda.nodeapi.internal.ContractsJarFile -import net.corda.nodeapi.internal.DEV_ROOT_CA -import net.corda.nodeapi.internal.SignedNodeInfo +import net.corda.nodeapi.internal.* import net.corda.nodeapi.internal.network.NodeInfoFilesCopier.Companion.NODE_INFO_FILE_NAME_PREFIX import net.corda.serialization.internal.AMQP_P2P_CONTEXT import net.corda.serialization.internal.CordaSerializationMagic @@ -66,6 +65,43 @@ class NetworkBootstrapper { } } + sealed class NotaryCluster { + data class BFT(val name: CordaX500Name) : NotaryCluster() + data class CFT(val name: CordaX500Name) : NotaryCluster() + } + + data class DirectoryAndConfig(val directory: Path, val config: Config) + + private fun notaryClusters(configs: Map): Map> { + val clusteredNotaries = configs.flatMap { (path, config) -> + if (config.hasPath("notary.serviceLegalName")) { + listOf(CordaX500Name.parse(config.getString("notary.serviceLegalName")) to DirectoryAndConfig(path, config)) + } else { + emptyList() + } + } + return clusteredNotaries.groupBy { it.first }.map { (k, vs) -> + val cs = vs.map { it.second.config } + if (cs.any { it.hasPath("notary.bftSMaRt") }) { + require(cs.all { it.hasPath("notary.bftSMaRt") }) { "Mix of BFT and non-BFT notaries with service name $k" } + NotaryCluster.BFT(k) to vs.map { it.second.directory } + } else { + NotaryCluster.CFT(k) to vs.map { it.second.directory } + } + }.toMap() + } + + private fun generateServiceIdentitiesForNotaryClusters(configs: Map) { + notaryClusters(configs).forEach { (cluster, directories) -> + when (cluster) { + is NotaryCluster.BFT -> + DevIdentityGenerator.generateDistributedNotaryCompositeIdentity(directories, cluster.name, threshold = 1 + 2 * directories.size / 3) + is NotaryCluster.CFT -> + DevIdentityGenerator.generateDistributedNotarySingularIdentity(directories, cluster.name) + } + } + } + fun bootstrap(directory: Path, cordappJars: List) { directory.createDirectories() println("Bootstrapping local network in $directory") @@ -73,6 +109,8 @@ class NetworkBootstrapper { val nodeDirs = directory.list { paths -> paths.filter { (it / "corda.jar").exists() }.toList() } require(nodeDirs.isNotEmpty()) { "No nodes found" } println("Nodes found in the following sub-directories: ${nodeDirs.map { it.fileName }}") + val configs = nodeDirs.associateBy({ it }, { ConfigFactory.parseFile((it / "node.conf").toFile()) }) + generateServiceIdentitiesForNotaryClusters(configs) val processes = startNodeInfoGeneration(nodeDirs) initialiseSerialization() try { @@ -86,7 +124,7 @@ class NetworkBootstrapper { val existingNetParams = loadNetworkParameters(nodeDirs) println(existingNetParams ?: "none found") println("Gathering notary identities") - val notaryInfos = gatherNotaryInfos(nodeInfoFiles) + val notaryInfos = gatherNotaryInfos(nodeInfoFiles, configs) println("Generating contract implementations whitelist") val newWhitelist = generateWhitelist(existingNetParams, readExcludeWhitelist(directory), cordappJars.map(::ContractsJarFile)) val netParams = installNetworkParameters(notaryInfos, newWhitelist, existingNetParams, nodeDirs) @@ -182,12 +220,12 @@ class NetworkBootstrapper { } } - private fun gatherNotaryInfos(nodeInfoFiles: List): List { + private fun gatherNotaryInfos(nodeInfoFiles: List, configs: Map): List { return nodeInfoFiles.mapNotNull { nodeInfoFile -> // The config contains the notary type - val nodeConfig = ConfigFactory.parseFile((nodeInfoFile.parent / "node.conf").toFile()) + val nodeConfig = configs[nodeInfoFile.parent]!! if (nodeConfig.hasPath("notary")) { - val validating = nodeConfig.getConfig("notary").getBoolean("validating") + val validating = nodeConfig.getBoolean("notary.validating") // And the node-info file contains the notary's identity val nodeInfo = nodeInfoFile.readObject().verified() NotaryInfo(nodeInfo.notaryIdentity(), validating) diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt index 2891c662e4..0e5df1260d 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt @@ -86,10 +86,5 @@ class BFTNotaryCordform : CordformDefinition() { } override fun setup(context: CordformContext) { - DevIdentityGenerator.generateDistributedNotaryCompositeIdentity( - notaryNames.map { context.baseDirectory(it.toString()) }, - clusterName, - minCorrectReplicas(clusterSize) - ) } } diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt index 09d7fc603e..d6083c42e6 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt @@ -79,9 +79,5 @@ class RaftNotaryCordform : CordformDefinition() { } override fun setup(context: CordformContext) { - DevIdentityGenerator.generateDistributedNotarySingularIdentity( - notaryNames.map { context.baseDirectory(it.toString()) }, - clusterName - ) } } From 3a9fa50799806c3c5ea9199e2fa09a5a7d96af5c Mon Sep 17 00:00:00 2001 From: Tomas Tauber Date: Fri, 18 May 2018 18:35:00 +0800 Subject: [PATCH 11/12] Added the additional Corda utility code with FSM-like transition contract checking --- experimental/corda-utils/README.md | 121 +++++++ experimental/corda-utils/build.gradle | 27 ++ .../io/cryptoblk/core/StatusTransitions.kt | 105 ++++++ .../main/kotlin/io/cryptoblk/core/Utils.kt | 75 +++++ .../cryptoblk/core/StatusTransitionsTest.kt | 301 ++++++++++++++++++ settings.gradle | 1 + 6 files changed, 630 insertions(+) create mode 100644 experimental/corda-utils/README.md create mode 100644 experimental/corda-utils/build.gradle create mode 100644 experimental/corda-utils/src/main/kotlin/io/cryptoblk/core/StatusTransitions.kt create mode 100644 experimental/corda-utils/src/main/kotlin/io/cryptoblk/core/Utils.kt create mode 100644 experimental/corda-utils/src/test/kotlin/io/cryptoblk/core/StatusTransitionsTest.kt diff --git a/experimental/corda-utils/README.md b/experimental/corda-utils/README.md new file mode 100644 index 0000000000..3ba2153003 --- /dev/null +++ b/experimental/corda-utils/README.md @@ -0,0 +1,121 @@ +# Introduction +This project holds different Corda-related utility code. + +## Utils +Utils.kt contains various extension functions and other short utility code that aid +development on Corda. The code is mostly self-explanatory -- the only exception may +be `StateRefHere` which can be used in situations where multiple states are produced +in one transaction, and one state needs to refer to the others, e.g. something like this: +``` + val tx = TransactionBuilder(//... + // ... + tx.addOutputState(innerState, contractClassName) + val innerStateRef = StateRefHere(null, tx.outputStates().count() - 1) + tx.addOutputState(OuterState(innerStateRef = innerStateRef), contractClassName) + // ... + +``` + +## StatusTransitions +StatusTransitions.kt contains utility code related to FSM-style defining possible transactions that can happen +with the respect to the contained status and roles of participants. Here's a simple example for illustration. +We are going to track package delivery status, so we first define all roles of participants and possible statuses +each package could have: +``` +enum class PackageDeliveryRole { + Sender, + Receiver, + Courier +} + +enum class DeliveryStatus { + InTransit, + Delivered, + Returned +} +``` + +The information about each package is held in PackageState: it contains its involved parties, status, linearId, +current location, and information related to delivery attempts: +``` +import net.corda.core.contracts.CommandData +import net.corda.core.contracts.Contract +import net.corda.core.contracts.LinearState +import net.corda.core.contracts.UniqueIdentifier +import net.corda.core.identity.AbstractParty +import net.corda.core.identity.Party +import net.corda.core.transactions.LedgerTransaction +import java.time.Instant + +data class PackageState(val sender: Party, + val receiver: Party, + val deliveryCompany: Party, + val currentLocation: String, + override val status: DeliveryStatus, + val deliveryAttempts: Int = 0, + val lastDeliveryAttempt: Instant? = null, + override val linearId: UniqueIdentifier): LinearState, StatusTrackingContractState { + + override fun roleToParty(role: PackageDeliveryRole): Party { + return when (role) { + PackageDeliveryRole.Sender -> sender + PackageDeliveryRole.Receiver -> receiver + PackageDeliveryRole.Courier -> deliveryCompany + } + } + + override val participants: List = listOf(sender, receiver, deliveryCompany) +} +``` +We can then define operations one can do with this state, who can do them and under what circumstances (i.e. from what status): +``` +sealed class DeliveryCommand: CommandData { + object Send: DeliveryCommand() + object Transport: DeliveryCommand() + object ConfirmReceipt: DeliveryCommand() + object AttemptedDelivery: DeliveryCommand() + object Return: DeliveryCommand() +} + +class PackageDelivery: Contract { + companion object { + val transitions = StatusTransitions(PackageState::class, + DeliveryCommand.Send.txDef(PackageDeliveryRole.Sender, null, listOf(DeliveryStatus.InTransit)), + DeliveryCommand.Transport.txDef(PackageDeliveryRole.Courier, DeliveryStatus.InTransit, listOf(DeliveryStatus.InTransit)), + DeliveryCommand.AttemptedDelivery.txDef(PackageDeliveryRole.Courier, DeliveryStatus.InTransit, listOf(DeliveryStatus.InTransit)), + DeliveryCommand.ConfirmReceipt.txDef(PackageDeliveryRole.Receiver, DeliveryStatus.InTransit, listOf(DeliveryStatus.Delivered)), + DeliveryCommand.Return.txDef(PackageDeliveryRole.Courier, DeliveryStatus.InTransit, listOf(DeliveryStatus.Returned))) + } + override fun verify(tx: LedgerTransaction) { + transitions.verify(tx) + // ... + // other checks -- linearId is preserved, attributes are updated correctly for given commands, return is only allowed after 3 attempts, etc. + } +} +``` +This definition gives us some basic generic verification -- e.g. that package receipt confirmations need to be signed by package receivers. +In addition that, we could visualize the defined transitions in a PUML diagram: + +``` +PackageDelivery.transitions.printGraph().printedPUML +``` + +Which will result in: +``` +@startuml +title PackageState +[*] --> InTransit : Send (by Sender) +InTransit --> InTransit : Transport (by Courier) +InTransit --> InTransit : AttemptedDelivery (by Courier) +InTransit --> Delivered : ConfirmReceipt (by Receiver) +InTransit --> Returned : Return (by Courier) +@enduml +``` +![Generated PlantUML model](http://www.plantuml.com:80/plantuml/png/VSsn2i8m58NXlK-HKOM-W8DKwk8chPiunEOemIGDjoU5lhqIHP12jn_k-RZLG2rCtXMqT50dtJtr0oqrKLmsLrMMEtKCPz5Xi5HRrI8OjRfDEI3hudUSJNF5NfZtTP_4BeCz2Hy9Su2p8sHQWjyDp1lMVRXRyGqwsCYiSezpre19GbQV_FzH8PZatGi0) + +## Future plans +Depending on particular use cases, this utility library may be enhanced in different ways. Here are a few ideas: + +* More generic verification (e.g. verifying numbers of produced and consumed states of a particular type) +* More convenient syntax, not abusing nulls so much, etc. +* ... \ No newline at end of file diff --git a/experimental/corda-utils/build.gradle b/experimental/corda-utils/build.gradle new file mode 100644 index 0000000000..5241311783 --- /dev/null +++ b/experimental/corda-utils/build.gradle @@ -0,0 +1,27 @@ +apply plugin: 'kotlin' +apply plugin: 'idea' + +sourceSets { + integrationTest { + kotlin { + compileClasspath += main.output + test.output + runtimeClasspath += main.output + test.output + srcDir file('src/integration-test/kotlin') + } + } +} + +configurations { + integrationTestCompile.extendsFrom testCompile + integrationTestRuntime.extendsFrom testRuntime +} + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + compile project(':core') + compile project(':node-api') + testCompile project(':test-utils') + testCompile project(':node-driver') + + testCompile "junit:junit:$junit_version" +} diff --git a/experimental/corda-utils/src/main/kotlin/io/cryptoblk/core/StatusTransitions.kt b/experimental/corda-utils/src/main/kotlin/io/cryptoblk/core/StatusTransitions.kt new file mode 100644 index 0000000000..f469e52a48 --- /dev/null +++ b/experimental/corda-utils/src/main/kotlin/io/cryptoblk/core/StatusTransitions.kt @@ -0,0 +1,105 @@ +package io.cryptoblk.core + +import net.corda.core.contracts.CommandData +import net.corda.core.contracts.ContractState +import net.corda.core.identity.Party +import net.corda.core.transactions.LedgerTransaction +import kotlin.reflect.KClass + +/** + * Contract state that records changes of some [status] on the ledger and roles of parties that are participants + * in that state using [roleToParty]. + */ +interface StatusTrackingContractState : ContractState { + val status: S + fun roleToParty(role: R): Party +} + +/** + * Definition of finite state transition: for a particular command in a TX, it defines what transitions can be done + * [from] what status [to] what statuses, and who needs to sign them ([signer]). + * If [from] is null, it means there doesn't need to be any input; if [to] is null, it mean there doesn't need to be any output. + * If [signer] is null, it means anyone can sign it. + */ +data class TransitionDef(val cmd: Class<*>, val signer: R?, val from: S?, val to: List) + +/** + * Holds visualized PUML graph in [printedPUML] and the relevant state class name in [stateClassName]. + */ +data class PrintedTransitionGraph(val stateClassName: String, val printedPUML: String) + +/** + * Shorthand for defining transitions directly from the command class + */ +fun CommandData.txDef(signer: R? = null, from: S?, to: List): + TransitionDef = TransitionDef(this::class.java, signer, from, to) + +/** + * For a given [stateClass] that tracks a status, it holds all possible transitions in [ts]. + * This can be used for generic [verify] in contract code as well as for visualizing the state transition graph in PUML ([printGraph]). + */ +class StatusTransitions>(private val stateClass: KClass, + private vararg val ts: TransitionDef) { + + private val allowedCmds = ts.map { it.cmd }.toSet() + + private fun matchingTransitions(input: S?, output: S?, command: CommandData): List> { + val options = ts.filter { + (it.from == input) && (output in it.to) && (it.cmd == command.javaClass) + } + if (options.isEmpty()) throw IllegalStateException("Transition [$input -(${command.javaClass.simpleName})-> $output] not allowed") + return options + } + + /** + * Generic verification based on provided [TransitionDef]s + */ + fun verify(tx: LedgerTransaction) { + val relevantCmds = tx.commands.filter { allowedCmds.contains(it.value.javaClass) } + require(relevantCmds.isNotEmpty()) { "Transaction must have at least one Command relevant to its defined transitions" } + + relevantCmds.forEach { cmd -> + val ins = tx.inputsOfType(stateClass.java) + val inputStates = if (ins.isEmpty()) listOf(null) else ins + val outs = tx.outputsOfType(stateClass.java) + val outputStates = if (outs.isEmpty()) listOf(null) else outs + + // for each combination of in x out which should normally be at most 1... + inputStates.forEach { inp -> + outputStates.forEach { outp -> + assert((inp != null) || (outp != null)) + val options = matchingTransitions(inp?.status, outp?.status, cmd.value) + + val signerGroup = options.groupBy { it.signer }.entries.singleOrNull() + ?: throw IllegalStateException("Cannot have different signers in StatusTransitions for the same command.") + val signer = signerGroup.key + if (signer != null) { + // which state determines who is the signer? by default the input, unless it's the initial transition + val state = (inp ?: outp)!! + val signerParty = state.roleToParty(signer) + if (!cmd.signers.contains(signerParty.owningKey)) + throw IllegalStateException("Command ${cmd.value.javaClass} must be signed by $signer") + } + } + } + } + } + + fun printGraph(): PrintedTransitionGraph { + val sb = StringBuilder() + sb.append("@startuml\n") + if (stateClass.simpleName != null) sb.append("title ${stateClass.simpleName}\n") + ts.forEach { txDef -> + val fromStatus = txDef.from?.toString() ?: "[*]" + txDef.to.forEach { to -> + val toStatus = (to ?: "[*]").toString() + val cmd = txDef.cmd.simpleName + val signer = txDef.signer?.toString() ?: "anyone involved" + + sb.append("$fromStatus --> $toStatus : $cmd (by $signer)\n") + } + } + sb.append("@enduml") + return PrintedTransitionGraph(stateClass.simpleName ?: "", sb.toString()) + } +} \ No newline at end of file diff --git a/experimental/corda-utils/src/main/kotlin/io/cryptoblk/core/Utils.kt b/experimental/corda-utils/src/main/kotlin/io/cryptoblk/core/Utils.kt new file mode 100644 index 0000000000..0c3ab7a203 --- /dev/null +++ b/experimental/corda-utils/src/main/kotlin/io/cryptoblk/core/Utils.kt @@ -0,0 +1,75 @@ +package io.cryptoblk.core + +import co.paralleluniverse.fibers.Suspendable +import net.corda.core.contracts.ContractState +import net.corda.core.contracts.StateAndRef +import net.corda.core.contracts.StateRef +import net.corda.core.crypto.SecureHash +import net.corda.core.flows.FinalityFlow +import net.corda.core.flows.FlowLogic +import net.corda.core.node.ServiceHub +import net.corda.core.node.services.queryBy +import net.corda.core.node.services.vault.QueryCriteria +import net.corda.core.serialization.CordaSerializable +import net.corda.core.transactions.SignedTransaction +import net.corda.core.transactions.TransactionBuilder + +inline fun ServiceHub.queryStateByRef(ref: StateRef): StateAndRef { + val results = vaultService.queryBy(QueryCriteria.VaultQueryCriteria(stateRefs = kotlin.collections.listOf(ref))) + return results.states.firstOrNull() ?: throw IllegalArgumentException("State (type=${T::class}) corresponding to the reference $ref not found (or is spent).") +} + +/** + * Shorthand when a single party signs a TX and then returns a result that uses the signed TX (e.g. includes the TX id) + */ +@Suspendable +fun FlowLogic.finalize(tx: TransactionBuilder, returnWithSignedTx: (stx: SignedTransaction) -> R): R { + val stx = serviceHub.signInitialTransaction(tx) + subFlow(FinalityFlow(stx)) // it'll send to all participants in the state by default + return returnWithSignedTx(stx) +} + +/** + * Corda fails when it tries to store the same attachment hash twice. And it's convenient to also do nothing if no attachment is provided. + * This doesn't fix the same-attachment problem completely but should at least help in testing with the same file. + */ +fun TransactionBuilder.addAttachmentOnce(att: SecureHash?): TransactionBuilder { + if (att == null) return this + if (att !in this.attachments()) + this.addAttachment(att) + return this +} + +// checks the instance type, so the cast is safe +@Suppress("UNCHECKED_CAST") +inline fun List>.entriesOfType(): List> = this.mapNotNull { + if (T::class.java.isInstance(it.state.data)) it as StateAndRef else null +} + +/** + * Used when multiple objects may be created in the same transaction and need to refer to each other. If a state + * contains this object as a reference to another object and txhash is null, the same txhash as of the containing/outer state + * should be used. If txhash is not null, then this works exactly like StateRef. + * + * WARNING: + * - if the outer state gets updated but its referenced state does not (in the same tx) then + * - this reference in parent state must be updated with the real txhash: [StateRefHere.copyWith] + * - otherwise it will be unresolvable (could be solved by disallowing copy on this) + */ +// do not make it a data class +@CordaSerializable +class StateRefHere(val txhash: SecureHash?, val index: Int) { + constructor(ref: StateRef) : this(ref.txhash, ref.index) + + fun toStateRef(parent: SecureHash) = StateRef(txhash ?: parent, index) + + // not standard copy + fun copyWith(parent: SecureHash): StateRefHere { + return StateRefHere(txhash ?: parent, index) + } + + override fun equals(other: Any?): Boolean { + if (other !is StateRefHere) return false + return (this.txhash == other.txhash) && (this.index == other.index) + } +} \ No newline at end of file diff --git a/experimental/corda-utils/src/test/kotlin/io/cryptoblk/core/StatusTransitionsTest.kt b/experimental/corda-utils/src/test/kotlin/io/cryptoblk/core/StatusTransitionsTest.kt new file mode 100644 index 0000000000..aef2debc58 --- /dev/null +++ b/experimental/corda-utils/src/test/kotlin/io/cryptoblk/core/StatusTransitionsTest.kt @@ -0,0 +1,301 @@ +package io.cryptoblk.core + +import net.corda.core.contracts.Contract +import net.corda.core.contracts.TypeOnlyCommandData +import net.corda.core.identity.AbstractParty +import net.corda.core.identity.CordaX500Name +import net.corda.core.identity.Party +import net.corda.core.transactions.LedgerTransaction +import net.corda.testing.core.TestIdentity +import net.corda.testing.node.MockServices +import net.corda.testing.node.ledger +import org.junit.Test + +private val ALICE_ID = TestIdentity(CordaX500Name.parse("L=London,O=Alice Ltd,OU=Trade,C=GB")) +private val BOB_ID = TestIdentity(CordaX500Name.parse("L=London,O=Bob Ltd,OU=Trade,C=GB")) +private val BIGCORP_ID = TestIdentity(CordaX500Name.parse("L=New York,O=Bigcorp Ltd,OU=Trade,C=US")) +private val ALICE = ALICE_ID.party +private val BOB = BOB_ID.party +private val BIG_CORP = BIGCORP_ID.party +private val ALICE_PUBKEY = ALICE_ID.publicKey +private val BOB_PUBKEY = BOB_ID.publicKey +private val BIG_CORP_PUBKEY = BIGCORP_ID.publicKey + +private enum class PartyRole { + Adder, + MultiplierAndRandomiser, + Randomiser +} + +private class IntegerTestState(override val status: String) : StatusTrackingContractState { + override fun roleToParty(role: PartyRole): Party { + return when (role) { + PartyRole.Adder -> BIG_CORP + PartyRole.MultiplierAndRandomiser -> BOB + PartyRole.Randomiser -> ALICE + } + } + + override val participants: List + get() = listOf(ALICE, BOB, BIG_CORP) +} + +private sealed class Operations: TypeOnlyCommandData() { + object Add1 : Operations() + object Add10 : Operations() + object Multiply2 : Operations() + object Randomise : Operations() + object Close : Operations() + object AnotherCommand : Operations() +} + +class TestIntegerContract: Contract { + companion object { + private val fsTransitions = StatusTransitions(IntegerTestState::class, + Operations.Add1.txDef(PartyRole.Adder, null, listOf("1")), + Operations.Add1.txDef(PartyRole.Adder, "1", listOf("2")), + Operations.Add10.txDef(PartyRole.Adder, "1", listOf("11")), + Operations.Multiply2.txDef(PartyRole.MultiplierAndRandomiser, "2", listOf("4")), + Operations.Multiply2.txDef(PartyRole.MultiplierAndRandomiser, "11", listOf("22")), + Operations.Randomise.txDef(PartyRole.Randomiser, "2", listOf("8", "9", "1", "11")), + Operations.Randomise.txDef(PartyRole.Randomiser, "11", listOf("2", "11", "4")), + Operations.Randomise.txDef(PartyRole.MultiplierAndRandomiser, "11", listOf("22")), + Operations.Close.txDef(PartyRole.Randomiser, "9", listOf(null)) + ) + } + + override fun verify(tx: LedgerTransaction) { + fsTransitions.verify(tx) + } +} + +private class TestOwnedIntegerState(override val status: String): StatusTrackingContractState { + override val participants: List + get() = listOf(ALICE, BOB) + + override fun roleToParty(role: PartyRole): Party { + return if (status == "0") ALICE else BOB + } +} + +class TestOwnedIntegerContract: Contract { + companion object { + private val fsTransitions = StatusTransitions(TestOwnedIntegerState::class, + Operations.Add1.txDef(PartyRole.Adder, null, listOf("0")), + Operations.Add1.txDef(PartyRole.Adder, "0", listOf("1")), + Operations.Add1.txDef(PartyRole.Adder, "1", listOf("2")), + Operations.Multiply2.txDef(PartyRole.MultiplierAndRandomiser, "10", listOf("20")), + Operations.Multiply2.txDef(PartyRole.Adder, "10", listOf("20")) // bug for the test + ) + } + + override fun verify(tx: LedgerTransaction) { + fsTransitions.verify(tx) + } +} + +class StatusTransitionsTest { + + companion object { + private val integerContract = TestIntegerContract::class.qualifiedName!! + private val ownedIntegerContract = TestOwnedIntegerContract::class.qualifiedName!! + private val ledgerServices = MockServices(ALICE_ID, BOB_ID, BIGCORP_ID) + } + + @Test + fun `basic correct cases`() { + ledgerServices.ledger { + transaction { + output(integerContract, IntegerTestState("1")) + command(BIG_CORP_PUBKEY, Operations.Add1) + + verifies() + } + transaction { + input(integerContract, IntegerTestState("1")) + output(integerContract, IntegerTestState("2")) + command(BIG_CORP_PUBKEY, Operations.Add1) + + verifies() + } + transaction { + input(integerContract, IntegerTestState("2")) + output(integerContract, IntegerTestState("9")) + command(ALICE_PUBKEY, Operations.Randomise) + + verifies() + } + transaction { + input(integerContract, IntegerTestState("9")) + command(ALICE_PUBKEY, Operations.Close) + + verifies() + } + } + } + + @Test + fun `disallowed output`() { + ledgerServices.ledger { + transaction { + input(integerContract, IntegerTestState("1")) + output(integerContract, IntegerTestState("3")) + command(BIG_CORP_PUBKEY, Operations.Add1) + + fails() + } + } + } + + @Test + fun `disallowed command`() { + ledgerServices.ledger { + transaction { + input(integerContract, IntegerTestState("1")) + output(integerContract, IntegerTestState("2")) + command(BIG_CORP_PUBKEY, Operations.Multiply2) + + fails() + } + } + } + + @Test + fun `disallowed signer`() { + ledgerServices.ledger { + transaction { + input(integerContract, IntegerTestState("1")) + output(integerContract, IntegerTestState("2")) + command(ALICE_PUBKEY, Operations.Add1) + + fails() + } + } + } + + @Test + fun `irrelevant commands fail`() { + ledgerServices.ledger { + transaction { + output(integerContract, IntegerTestState("8")) + command(ALICE_PUBKEY, Operations.AnotherCommand) + + failsWith("at least one Command relevant") + } + } + } + + @Test + fun `multiple relevant commands accepted`() { + ledgerServices.ledger { + transaction { + input(integerContract, IntegerTestState("11")) + output(integerContract, IntegerTestState("22")) + command(BOB_PUBKEY, Operations.Randomise) + command(BOB_PUBKEY, Operations.Multiply2) + + verifies() + } + } + } + + @Test + fun `multiple relevant commands failed`() { + ledgerServices.ledger { + transaction { + input(integerContract, IntegerTestState("2")) + output(integerContract, IntegerTestState("4")) + command(BOB_PUBKEY, Operations.Randomise) + command(BOB_PUBKEY, Operations.Multiply2) + + fails() + } + } + } + + @Test + fun `multiple inputs failed`() { + ledgerServices.ledger { + transaction { + input(integerContract, IntegerTestState("1")) + input(integerContract, IntegerTestState("2")) + output(integerContract, IntegerTestState("11")) + command(BIG_CORP_PUBKEY, Operations.Add10) + + fails() + } + } + } + + @Test + fun `multiple outputs failed`() { + ledgerServices.ledger { + transaction { + input(integerContract, IntegerTestState("1")) + output(integerContract, IntegerTestState("2")) + output(integerContract, IntegerTestState("11")) + command(BIG_CORP_PUBKEY, Operations.Add10) + + fails() + } + } + } + + @Test + fun `role change signer correct`() { + ledgerServices.ledger { + transaction { + output(ownedIntegerContract, TestOwnedIntegerState("0")) + command(ALICE_PUBKEY, Operations.Add1) + + verifies() + } + transaction { + input(ownedIntegerContract, TestOwnedIntegerState("0")) + output(ownedIntegerContract, TestOwnedIntegerState("1")) + command(ALICE_PUBKEY, Operations.Add1) + + verifies() + } + transaction { + input(ownedIntegerContract, TestOwnedIntegerState("1")) + output(ownedIntegerContract, TestOwnedIntegerState("2")) + command(ALICE_PUBKEY, Operations.Add1) + + fails() + } + transaction { + input(ownedIntegerContract, TestOwnedIntegerState("1")) + output(ownedIntegerContract, TestOwnedIntegerState("2")) + command(BOB_PUBKEY, Operations.Add1) + + verifies() + } + } + } + + @Test + fun `multiple signers disallowed`() { + ledgerServices.ledger { + transaction { + input(ownedIntegerContract, TestOwnedIntegerState("10")) + output(ownedIntegerContract, TestOwnedIntegerState("20")) + command(ALICE_PUBKEY, Operations.Multiply2) + + failsWith("Cannot have different signers") + } + } + } + + @Test + fun `spend disallowed`() { + ledgerServices.ledger { + transaction { + input(integerContract, IntegerTestState("1")) + command(ALICE_PUBKEY, Operations.Close) + + fails() + } + } + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 93f0c3aced..313696cd0b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -21,6 +21,7 @@ include 'experimental:sandbox' include 'experimental:quasar-hook' include 'experimental:kryo-hook' include 'experimental:blobinspector' +include 'experimental:corda-utils' include 'test-common' include 'test-utils' include 'smoke-test-utils' From 2907250468222e885ef578ef29d707cbdd18fc73 Mon Sep 17 00:00:00 2001 From: Thomas Schroeter Date: Mon, 21 May 2018 09:57:29 +0100 Subject: [PATCH 12/12] Mark HA notary design as deprecated (#3171) This design is superseded by the CFT notary design. * Mark HA notary design as deprecated * Remove outdated HA notary service design --- .../notary-service-ha/decisions/decision.md | 40 ---- .../source/design/notary-service-ha/design.md | 226 ------------------ .../design/notary-service-ha/diskload.png | Bin 128816 -> 0 bytes .../notary-service-ha/galera-cluster.dot | 30 --- .../notary-service-ha/galera-cluster.dot.png | Bin 40965 -> 0 bytes .../notary-service-ha/galera-test-run.png | Bin 113224 -> 0 bytes .../design/notary-service-ha/overview.svg | 1 - docs/source/design/notary-service-ha/txs.png | Bin 550651 -> 0 bytes docs/source/index.rst | 1 - 9 files changed, 298 deletions(-) delete mode 100644 docs/source/design/notary-service-ha/decisions/decision.md delete mode 100644 docs/source/design/notary-service-ha/design.md delete mode 100644 docs/source/design/notary-service-ha/diskload.png delete mode 100644 docs/source/design/notary-service-ha/galera-cluster.dot delete mode 100644 docs/source/design/notary-service-ha/galera-cluster.dot.png delete mode 100644 docs/source/design/notary-service-ha/galera-test-run.png delete mode 100644 docs/source/design/notary-service-ha/overview.svg delete mode 100644 docs/source/design/notary-service-ha/txs.png diff --git a/docs/source/design/notary-service-ha/decisions/decision.md b/docs/source/design/notary-service-ha/decisions/decision.md deleted file mode 100644 index 819d77c10a..0000000000 --- a/docs/source/design/notary-service-ha/decisions/decision.md +++ /dev/null @@ -1,40 +0,0 @@ -# Design Decision: Notary Backend - Galera or Permazen Raft - -## Background / Context - -We have evaluated Galera and Permazen as a possible replacement for Atomix CopyCat for the storage backend of our Notary -Service, more specificalyl the Uniqueness Provider. - -## Options Analysis - -### A. Galera Cluster - -#### Advantages - -1. Wider user base. In a survey of 478 OpenStack deployments, 32% decided to use Galera Cluster in production, see p. 47 - of the [survey](https://www.openstack.org/assets/survey/April2017SurveyReport.pdf). - -2. Very little additional work needed. - -3. Entrerprise support. - -#### Disadvantages - -1. Harder to customize. - -### B. Permazen Raft KV Database - -#### Advantages - -1. ​Customizable. -2. ​Slightly faster in our tests. -3. Simpler to deploy (embedded in the Corda node). - -#### Disadvantages - -1. ​Not ready out of the box, needs rate limiting, follower might run OOM during snapshot transfer. -2. ​No large community behind it. - -## Recommendation and justification - -Proceed with Option A diff --git a/docs/source/design/notary-service-ha/design.md b/docs/source/design/notary-service-ha/design.md deleted file mode 100644 index 620336d375..0000000000 --- a/docs/source/design/notary-service-ha/design.md +++ /dev/null @@ -1,226 +0,0 @@ -# HA Notary Service - -## Overview - -The distributed notary service tracks spent contract states and prevents double spending. For high-availability (HA), -the backing data store is replicated across a cluster of machines in different data centers. In this model, the cluster -is meant to be operated by a single party, and only crash faults are tolerated. - -## Background - -We have an existing HA notary service based on Atomix CopyCat, which an open source state machine replication library -that implemets the Raft consensus algorithm. However, it doesn't scale well with the number of spent input states, since -CopyCat takes periodic snapshots of the state machine and the snapshots have to fit in memory. - -As an alternative, we propose using a more traditional MySQL database-based approach, using Galera Cluster, which -provides synchronous multi-master replication. Galera Cluster is based on a MySQL server with Write-Set replication -(wsrep) API, and the Galera Replication Plugin. Through the wsrep API Galera provides [certification-based replication](http://galeracluster.com/documentation-webpages/certificationbasedreplication.html). It works roughly as -follows: - -1. A single database node executes a transaction optimistically until it reaches the commit point. -2. Changes made by the trasaction are collected into a write-set. -3. The write-set broadcasted to the cluster. -4. Every other node determines whether it can apply the write-set without conflicts. -5. In case of conflict, the initial node rolls back the transaction. - -There are different Galera Cluster implementations, and we chose the Percona XtraDB cluster, as they were historically -more focused on performance than the competition. - -### Decisions - -- We are replacing the Atomix CopyCat Raft service. -- We are using a Percona cluster for Corda Connect. -- We keep investigating a more scalable solution, based on Permazen or a custom implementation. -- In the long term, we are interested in providing a BFT solution, perhaps leveraging SGX. - -.. toctree:: - - decisions/decision.md - -#### Advantages of Percona - -- Production ready -- Works out of the box -- Backed by a company, enterprise and a community support are available -- Running stable at 30 tx/second (with 10 input states / tx), see figure below, in the section about the long running test - -#### Disadvantages of Percona - -- Performance deteriorates over time. This happens because Galera only works with the InnoDB storage engine, internally - backed by a B+ tree. Since we use state references as primary keys, table insterts results in random B+ tree inserts, - which doesn't scale well. - -## Scope - -### Goals - -* We need a stable notary implementation. -* The implementation has to be easy to operate. -* We know that the switching costs to a more scalable solution are minimal. -* We take periodic backups of the consumed states and we test the recovery. -* We remain flexible and open to future requirements. - -### Non-Goals - -* For the time being, we don't need a solution that is shardable (for now, all replicas can hold all the state). -* We don't require a solution that can handle throughput beyond 15 tx/second. -* We don't design and implement a custom solution in the short term. -* We don't need rate limiting and fairness. - -## Design - -![Overview](overview.svg) - -The HA notary service relies on the underlying MySQL uniqueness provider on top of a Percona XtraDB Cluster to prevent -double spending of input states. The exact data center locations are to be determined. Our notary service replicas -connect via JDBC to the replicated MySQL service. - -Percona XtraDB Cluster is based on Percona Server and the Galera replication library that provides a multi master -cluster based on synchronous replication. The cluster is as good as its slowest node. - -## Main Data Structure - -The table below details the data base schema. - -| Field name | Type | Description | -| --------------------- | ------------ | ---------------------------------------- | -| issue_tx_id | Binary(32) | The ID of the transaction that created the state | -| issue_tx_output_id | Int unsigned | Where in the transaction the state was created | -| consuming_tx_id | Binary(32) | The ID of the transaction that consumes the input state | -| consuming_tx_input_id | Int unsigned | Where in the transaction the state is consumed | -| consuming_party | Blob | Who is requesting the notarisation (~1 kByte) | -| commit_time | Timestamp | When this row is committed | - -## Functional - -The notary service relies on the MySQL uniqueness provider to prevent double spending. The MySQL database holds a single -table as described above. For HA, the data is synchronously replicated to several nodes by the Galera replication -plugin. - -During notarisation, the uniqueness provider attempts to commit all input states of the Corda transaction in a single -database transaction. If at least one input state has been previously spent, the entire database transaction fails with -a batch exception. Unspent states can still be spent in a different later transaction. In case of double spend attempts, -the uniqueness provider queries the database for details where the conflicting states have been spent. The consuming -transaction ID, position of the input in the transaction and the requesting party are collected for all conflicting -inputs, wrapped in a uniqueness exception, thrown by the uniqueness provider. This exception is handled by the notary -service and turned into a notary exception. - -We are using the Hikari connection pool to connect the notary services to all nodes of our Percona cluster. The -connection pool can be monitored via JMX. - -### Deployment - -We are planning to run a five node Percona cluster that can tolerate two simultaneous node failures. In case we need to -provide more storage or upgrade to better hardware we can take a single node down for maintenance and still tolerate one -unplanned failure. - -#### Monitoring cluster membership changes - -We setup a [notification command](http://galeracluster.com/documentation-webpages/notificationcmd.html) that gets called -whenever the node registers a change. - -### Management - -#### Disaster Recovery - -Our disaster recovery strategy covers the following risks: -1. **Host Failure**. For the 5 node cluster we can tolerate 2 host failures without interrupting operation. This includes both machine and disk failures. -2. **DC Failure**. The cluster will be distributed across 3 data centers in a 2+2+1 configuration. A loss of one data center can be tolerated without interrupting service operation. -3. **Data Corruption/Loss**. In cases of data corruption or loss that is replicated across the cluster (for example, accidental data deletion or modification by an administrator) backups will be used to restore the cluster state. In this scenario service downtime will be incurred. - -#### Backup and Recovery - -Recovery Point Objective: 0 - -Recovery Time Objective: 1h - -Any data loss incurred by the notary service will lead to a compromised ledger, since participants would be able to -double-spend already notarised states. Note that the backup & recovery procedure is only required for mitigating data -loss that gets replicated to the entire cluster. - -This can be achieved by combining periodic backups of the entire database state, and the MySQL [binary -log](https://dev.mysql.com/doc/refman/5.7/en/binary-log.html). The binary log contains a log of all executed SQL -statements, which can be replayed onto a backup to restore the most up-to-date state. In case of an accidental statement -that removes data (e.g. DROP TABLE), the binary log can be replayed only up to the offending statement. - -Scenarios where data corruption is caused by a malicious administrator selectively modifying or removing table rows are -out of scope. - -See [Galera's backup documentation](http://galeracluster.com/documentation-webpages/backingupthecluster.html) - -#### Monitoring - -See the [Percona Management and Monitoring](https://www.percona.com/doc/percona-monitoring-and-management/index.html) documentation. - -* Throughput in Tx / second -* Throughput in Input states / second -* Double spend attempts / time -* High level statistics, e.g. number of double spend attempts in the last 24 hours by two parties -* Double spend attempts per party -* Latency p50, p99 -* Number of input states in DB -* Size of DB -* Replication Queues, see [monitoring Galera](http://galeracluster.com/documentation-webpages/monitoringthecluster.html) - -#### Alerting - -Alerts are triggered based on relevant metrics, like number of active members in the cluster and size of write queues of -individual nodes. We are configuring PMM to forward alerts to PagerDuty, where we do the routing to the operators who -are on call. We configure email alerting and slack integration as additional channels. - -## Security - -SSL encrypted links between the nodes of the Galera cluster and the notary service and the Galera cluster. See the [SSL -config documentation](http://galeracluster.com/documentation-webpages/sslconfig.html). - -The managed disks on Azure [are encrypted](https://azure.microsoft.com/en-gb/blog/azure-managed-disks-sse/) with keys -managed by Microsoft. We have to trust our cloud provider anyways, so we don't do our own disk encryption. - -## Testing the throughput of the uniqueness provider - -We are using a custom load test flow that includes double spend attempts. The application metrics are forwarded to -Graphite and our Percona cluster is monitored by Percona's metrics and monitoring tool (PMM). - -In our tests, the number of input states is Poisson-distributed with an average four input states per transaction. To -increase throughput in terms of notarised input states per second, we could batch transactions in the future. We tested -batching with batch sizes of up to 1000 input states per batch. And reached a throughput of 2k input states / second for -batch sizes 250-1000. When we detect a double spend attempt, we could send through individual transactions to find the -source of the conflict or bisect the batch. - -## Long running test - -![throughput](txs.png) - -The figure above shows the throughput in transactions per second over four days, while writing to the cluster with up to -three clients. The dips occur while we take nodes off-line to simulate failure and to upgrade the disks. In the last -phase of the test all nodes were equipped with managed 1TB SSDs and and the cluster notarised at more than 300 input -states per second while holding more than 100 M input states in the DB. - -Glitches in throughput can occur when the write queue of a node is filling up. I'm assuming this is due to increased -disk latency when the cloud SAN disk is busy with other operations. When the maximum write queue size is reached, the -slow node isn't accepting writes any more and sends out flow control messages to its peers to stop replicating (I'm -assuming this leads to messages being queued in their send queue). The queue sizes are monitored by the PMM tool and we -can setup alerts based on a configured maximum write queue size or when we see "flow control messages". - -We found that managed SSDs of 1TB in size performed better than a RAID 10 array of four 128GB SSDs. The latency of the -1TB SSDs was stable around 8ms, while we have observed latency spikes up to 64ms on the smaller SSDs. The disk load on -the slowest node in terms of disk latency was around 6-8 outstanding writes during the last phase of the test. Setting -up a RAID 10 was a mistake, for best performance we should have used a RAID 0 configuration, since the Azure disks are -replicated. - -![disk load](diskload.png) - -### Recommended Cloud Server Configuration - -We recommend `Standard DS13 v2 (8 cores, 56 GB memory)` servers with 1 TB managed SSD disks attached. To make the setup -more cost effective, we can run on more affordable cloud instances, when we have lower demands in terms of throughput. -The optimum is yet to be found. It is possible to upgrade or downgrade the nodes of the cluster, one node at a time. - -Be prepared to kill and replace the slowest node of the cluster, especially in the cloud, since the Galera cluster will -not perform better than the slowest node. The same goes for SAN disks. If you are unlucky and your disk has high -latency, try replacing it with a new one. Maybe your get better performance with your new disk. - -### Disk upgrade using LVM - -We recommend using LVM in production for convenience and flexibility. During our long running test we performed a hot -disk upgrade using LVM. diff --git a/docs/source/design/notary-service-ha/diskload.png b/docs/source/design/notary-service-ha/diskload.png deleted file mode 100644 index 995ec1992e9210d804f842c0374bf9dfb6c49fa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128816 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 *uXu^wQH+82n|25tm&um|i2SrH2 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 FCUSxpICA`eB@uKAqY8NZTX5!c~8Q) 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 G=l>6D50NPV diff --git a/docs/source/design/notary-service-ha/galera-cluster.dot b/docs/source/design/notary-service-ha/galera-cluster.dot deleted file mode 100644 index 180983b2d1..0000000000 --- a/docs/source/design/notary-service-ha/galera-cluster.dot +++ /dev/null @@ -1,30 +0,0 @@ - -graph G { - concentrate=true; - graph [dpi=100, fontname="helvetica" ]; - node [fontname="helvetica"]; - edge [fontname="helvetica"]; - - - subgraph cluster0 { - label="Galera Cluster"; - color="lightgrey"; - - GaleraNode1 [label="Node 1\nSouth UK"]; - GaleraNode2 [label="Node 2\nIreland"]; - GaleraNode3 [label="Node 3\nNetherlands"]; - - GaleraNode1 -- GaleraNode2; - GaleraNode2 -- GaleraNode3; - GaleraNode1 -- GaleraNode3; - } - - subgraph cluster1 { - label="Corda"; - color="lightgrey"; - NotaryNode [label="Notary Node\nJDBC Uniqueness Provider"]; - } - - NotaryNode -- GaleraNode1; -} - diff --git a/docs/source/design/notary-service-ha/galera-cluster.dot.png b/docs/source/design/notary-service-ha/galera-cluster.dot.png deleted file mode 100644 index 7d9f725b35fd851a494033a1b27c03085ca5dee8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40965 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%0A?ZwA>Fe=beiAoR2h%gPrzEP}C7+>p^zR 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 z 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 diff --git a/docs/source/design/notary-service-ha/overview.svg b/docs/source/design/notary-service-ha/overview.svg deleted file mode 100644 index a313b536f2..0000000000 --- a/docs/source/design/notary-service-ha/overview.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/source/design/notary-service-ha/txs.png b/docs/source/design/notary-service-ha/txs.png deleted file mode 100644 index 69b216178620f052ded3164f4375e4284ab8912f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550651 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

1lQU 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

FJBJ5*d&$Q?`XP3RiM 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 diff --git a/docs/source/index.rst b/docs/source/index.rst index 324d8c1062..f2e7749a69 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -63,7 +63,6 @@ We look forward to seeing what you can do with Corda! design/hadr/design.md design/kafka-notary/design.md design/monitoring-management/design.md - design/notary-service-ha/design.md .. toctree:: :caption: Participate

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 F7wSERMEZ-?HeYcu* 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