Skip to content

Commit

Permalink
CORDA-2871: Refactor SourceClassLoader to define source classes. (#66)
Browse files Browse the repository at this point in the history
* Rewrite SourceClassLoader to support parent/child relationships.
* Revert catching TypNotPresebtException - it was a symptom of a bigger problem.
* Remove AutoCloseable from AnalysisConfiguration and SourceClassLoader.
* SourceClassLoader.getResource() must delegate to its parent first.
  • Loading branch information
chrisr3 committed Sep 12, 2019
1 parent 1a53f1a commit e0ce1bd
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 12 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Expand Up @@ -5,7 +5,7 @@ plugins {
}

ext {
corda_version = '5.0-SNAPSHOT'
corda_version = '4.3-SNAPSHOT'
}

description 'Serialization support for the DJVM'
Expand Down
Expand Up @@ -10,6 +10,7 @@ import java.lang.Double
import java.lang.Float
import java.lang.Long
import java.lang.Short
import java.util.*
import java.util.Collections.singleton
import java.util.Collections.unmodifiableMap
import java.util.function.Function
Expand All @@ -32,7 +33,11 @@ class SandboxSerializerFactoryFactory(
classLoader.loadClass("sandbox.java.lang.Float") to Float.TYPE,
classLoader.loadClass("sandbox.java.lang.Integer") to Integer.TYPE,
classLoader.loadClass("sandbox.java.lang.Long") to Long.TYPE,
classLoader.loadClass("sandbox.java.lang.Short") to Short.TYPE
classLoader.loadClass("sandbox.java.lang.Short") to Short.TYPE,
classLoader.loadClass("sandbox.java.lang.String") to String::class.java,
classLoader.loadClass("sandbox.java.util.Date") to Date::class.java,
classLoader.loadClass("sandbox.java.util.UUID") to UUID::class.java,
Void::class.java to Void.TYPE
))

val classCarpenter = createClassCarpenter(context)
Expand Down
5 changes: 2 additions & 3 deletions src/main/kotlin/net/corda/djvm/serialization/Serialization.kt
Expand Up @@ -54,11 +54,10 @@ fun createSandboxSerializationEnv(classLoader: SandboxClassLoader): Serializatio

inline fun <reified T : Any> SerializedBytes<T>.deserializeFor(classLoader: SandboxClassLoader): Any {
val clazz = classLoader.toSandboxClass(T::class.java)
return deserializeTo(clazz, classLoader)
return deserializeTo(clazz, classLoader, SerializationFactory.defaultFactory)
}

fun ByteSequence.deserializeTo(clazz: Class<*>, classLoader: SandboxClassLoader): Any {
val factory = SerializationFactory.defaultFactory
fun ByteSequence.deserializeTo(clazz: Class<*>, classLoader: SandboxClassLoader, factory: SerializationFactory): Any {
return deserializeTo(clazz, classLoader, factory, factory.defaultContext)
}

Expand Down
17 changes: 10 additions & 7 deletions src/test/kotlin/net/corda/djvm/serialization/TestBase.kt
Expand Up @@ -39,12 +39,14 @@ abstract class TestBase(type: SandboxType) {
val TESTING_LIBRARIES: List<Path> = (System.getProperty("sandbox-libraries.path") ?: fail("sandbox-libraries.path property not set"))
.split(File.pathSeparator).map { Paths.get(it) }.filter { exists(it) }

private lateinit var bootstrapClassLoader: BootstrapClassLoader
private lateinit var configuration: SandboxConfiguration
private lateinit var classLoader: SandboxClassLoader

@BeforeAll
@JvmStatic
fun setupClassLoader() {
bootstrapClassLoader = BootstrapClassLoader(DETERMINISTIC_RT)
val rootConfiguration = AnalysisConfiguration.createRoot(
userSource = UserPathSource(emptyList()),
whitelist = MINIMAL,
Expand All @@ -53,7 +55,7 @@ abstract class TestBase(type: SandboxType) {
ConstructorForDeserialization::class.java,
DeprecatedConstructorForDeserialization::class.java
),
bootstrapSource = BootstrapClassLoader(DETERMINISTIC_RT)
bootstrapSource = bootstrapClassLoader
)
configuration = SandboxConfiguration.of(
UNLIMITED,
Expand All @@ -69,7 +71,7 @@ abstract class TestBase(type: SandboxType) {
@AfterAll
@JvmStatic
fun destroyRootContext() {
configuration.analysisConfiguration.closeAll()
bootstrapClassLoader.close()
}
}

Expand All @@ -95,11 +97,12 @@ abstract class TestBase(type: SandboxType) {
var thrownException: Throwable? = null
thread {
try {
configuration.analysisConfiguration.createChild(
userSource = UserPathSource(classPaths),
newMinimumSeverityLevel = minimumSeverityLevel,
visibleAnnotations = visibleAnnotations
).use { analysisConfiguration ->
UserPathSource(classPaths).use { userSource ->
val analysisConfiguration = configuration.analysisConfiguration.createChild(
userSource = userSource,
newMinimumSeverityLevel = minimumSeverityLevel,
visibleAnnotations = visibleAnnotations
)
SandboxRuntimeContext(SandboxConfiguration.of(
configuration.executionProfile,
configuration.rules,
Expand Down

0 comments on commit e0ce1bd

Please sign in to comment.