From ea06a1ce4e33c58b4286c799b5656205f4a812cd Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Fri, 24 Apr 2026 14:26:01 +0300 Subject: [PATCH 1/2] Prevent variable nullification on later imports #119 --- .../dflib/jjava/distro/KernelExecutionIT.java | 25 +++++++++++++++++++ .../test/resources/nullifying_import.jshell | 5 ++++ .../execution/JJavaExecutionControl.java | 5 ++++ 3 files changed, 35 insertions(+) create mode 100644 jjava-distro/src/test/java/org/dflib/jjava/distro/KernelExecutionIT.java create mode 100644 jjava-distro/src/test/resources/nullifying_import.jshell diff --git a/jjava-distro/src/test/java/org/dflib/jjava/distro/KernelExecutionIT.java b/jjava-distro/src/test/java/org/dflib/jjava/distro/KernelExecutionIT.java new file mode 100644 index 0000000..2768ba5 --- /dev/null +++ b/jjava-distro/src/test/java/org/dflib/jjava/distro/KernelExecutionIT.java @@ -0,0 +1,25 @@ +package org.dflib.jjava.distro; + +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.Container; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class KernelExecutionIT extends ContainerizedKernelCase { + + /** + * @see #119 + */ + @Test + public void variableSurvivesLaterImports() throws Exception { + String snippet = "%load " + CONTAINER_RESOURCES + "/nullifying_import.jshell"; + + Container.ExecResult snippetResult = executeInKernel(snippet); + + assertEquals(0, snippetResult.getExitCode(), snippetResult.getStdout()); + assertThat(snippetResult.getStdout(), not(containsString("|"))); + } +} diff --git a/jjava-distro/src/test/resources/nullifying_import.jshell b/jjava-distro/src/test/resources/nullifying_import.jshell new file mode 100644 index 0000000..fe2a6fd --- /dev/null +++ b/jjava-distro/src/test/resources/nullifying_import.jshell @@ -0,0 +1,5 @@ +%maven tools.jackson.core:jackson-databind:3.1.2 +import tools.jackson.databind.*; import tools.jackson.databind.json.*; +var om = JsonMapper.builder().findAndAddModules().build(); +import tools.jackson.databind.node.*; import tools.jackson.databind.type.*; +om.getClass().getName() diff --git a/jjava-kernel/src/main/java/org/dflib/jjava/kernel/execution/JJavaExecutionControl.java b/jjava-kernel/src/main/java/org/dflib/jjava/kernel/execution/JJavaExecutionControl.java index e17e79a..e2e8859 100644 --- a/jjava-kernel/src/main/java/org/dflib/jjava/kernel/execution/JJavaExecutionControl.java +++ b/jjava-kernel/src/main/java/org/dflib/jjava/kernel/execution/JJavaExecutionControl.java @@ -76,6 +76,11 @@ public void stop() { executor.shutdownNow(); } + @Override + public void redefine(ClassBytecodes[] cbcs) { + loaderDelegate.classesRedefined(cbcs); + } + public Object takeResult(String id) { Object result = this.results.remove(id); if (result == null) { From 7aa650d95633d3b03ca702dca30fdb7a066c23d0 Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Fri, 24 Apr 2026 21:46:51 +0300 Subject: [PATCH 2/2] Downgrade test library version --- jjava-distro/src/test/resources/nullifying_import.jshell | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jjava-distro/src/test/resources/nullifying_import.jshell b/jjava-distro/src/test/resources/nullifying_import.jshell index fe2a6fd..56a2ac9 100644 --- a/jjava-distro/src/test/resources/nullifying_import.jshell +++ b/jjava-distro/src/test/resources/nullifying_import.jshell @@ -1,5 +1,5 @@ -%maven tools.jackson.core:jackson-databind:3.1.2 -import tools.jackson.databind.*; import tools.jackson.databind.json.*; -var om = JsonMapper.builder().findAndAddModules().build(); -import tools.jackson.databind.node.*; import tools.jackson.databind.type.*; +%maven com.fasterxml.jackson.core:jackson-databind:2.21.2 +import com.fasterxml.jackson.databind.*; +var om = new ObjectMapper().findAndRegisterModules(); +import com.fasterxml.jackson.databind.node.*; import com.fasterxml.jackson.databind.type.*; om.getClass().getName()