diff --git a/build.gradle b/build.gradle index 0e3a40a..c0ea449 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,10 @@ repositories { } dependencies { - implementation group: 'io.github.spencerpark', name: 'jupyter-jvm-basekernel', version: '2.3.0' + implementation('io.github.spencerpark:jupyter-jvm-basekernel:2.3.0') { + exclude group: 'com.google.code.gson', module: 'gson' + } + implementation 'com.google.code.gson:gson:2.10' // ------ for maven resolve and download ------ // implementation 'org.apache.maven:maven-resolver-provider:4.0.0-alpha-2' @@ -64,6 +67,17 @@ processResources { filter tokens: tokens, ReplaceTokens } +//java { +// withJavadocJar() +// withSourcesJar() +//} + +compileJava { + options.compilerArgs << '-parameters' + // ignore deprecation for jupyter-jvm-basekernel gson JsonParser api +// options.compilerArgs << '-Xlint:all' << '-Xlint:-deprecation' << '-Xlint:-rawtypes' << '-Xlint:-serial' +} + jar { manifest { attributes 'Main-class': 'io.github.spencerpark.ijava.IJava' diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..1e08b9f --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.warning.mode=all +org.gradle.logging.stacktrace=all diff --git a/src/main/java/io/github/spencerpark/ijava/IJava.java b/src/main/java/io/github/spencerpark/ijava/IJava.java index fc99ec3..43a5a86 100644 --- a/src/main/java/io/github/spencerpark/ijava/IJava.java +++ b/src/main/java/io/github/spencerpark/ijava/IJava.java @@ -58,7 +58,7 @@ public static InputStream resource(String path) { InputStream metaStream = resource("ijava-kernel-metadata.json"); Reader metaReader = new InputStreamReader(metaStream); try { - JsonElement meta = new JsonParser().parse(metaReader); + JsonElement meta = JsonParser.parseReader(metaReader); VERSION = meta.getAsJsonObject().get("version").getAsString(); } finally { try { diff --git a/src/main/java/io/github/spencerpark/ijava/JavaKernel.java b/src/main/java/io/github/spencerpark/ijava/JavaKernel.java index 9634555..c100932 100644 --- a/src/main/java/io/github/spencerpark/ijava/JavaKernel.java +++ b/src/main/java/io/github/spencerpark/ijava/JavaKernel.java @@ -23,12 +23,14 @@ */ package io.github.spencerpark.ijava; +import com.google.gson.JsonElement; import io.github.spencerpark.ijava.execution.*; import io.github.spencerpark.ijava.magics.*; import io.github.spencerpark.jupyter.kernel.BaseKernel; import io.github.spencerpark.jupyter.kernel.LanguageInfo; import io.github.spencerpark.jupyter.kernel.ReplacementOptions; import io.github.spencerpark.jupyter.kernel.display.DisplayData; +import io.github.spencerpark.jupyter.kernel.display.mime.MIMEType; import io.github.spencerpark.jupyter.kernel.magic.common.Load; import io.github.spencerpark.jupyter.kernel.magic.registry.Magics; import io.github.spencerpark.jupyter.kernel.util.CharPredicate; @@ -132,6 +134,10 @@ public JavaKernel() { new LanguageInfo.Help("Java tutorial", "https://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html"), new LanguageInfo.Help("IJava homepage", "https://github.com/SpencerPark/IJava") ); + // todo io.github.spencerpark.jupyter.kernel.display.DisplayData putJSON, JsonParser.parseString + this.renderer.createRegistration(JsonElement.class) + .preferring(MIMEType.APPLICATION_JSON) + .register((data, context) -> context.renderIfRequested(MIMEType.APPLICATION_JSON, () -> data)); this.errorStyler = new StringStyler.Builder() .addPrimaryStyle(TextColor.BOLD_BLACK_FG) diff --git a/src/main/java/io/github/spencerpark/ijava/runtime/Display.java b/src/main/java/io/github/spencerpark/ijava/runtime/Display.java index 885674a..2044095 100644 --- a/src/main/java/io/github/spencerpark/ijava/runtime/Display.java +++ b/src/main/java/io/github/spencerpark/ijava/runtime/Display.java @@ -23,12 +23,21 @@ */ package io.github.spencerpark.ijava.runtime; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; import io.github.spencerpark.ijava.JavaKernel; import io.github.spencerpark.jupyter.kernel.display.DisplayData; +import io.github.spencerpark.jupyter.kernel.display.mime.MIMEType; +import java.io.Reader; +import java.util.Arrays; +import java.util.Objects; import java.util.UUID; public class Display { + private static final Gson GSON = new Gson(); + public static DisplayData render(Object o) { JavaKernel kernel = Kernel.getKernelInstance(); @@ -43,7 +52,17 @@ public static DisplayData render(Object o, String... as) { JavaKernel kernel = Kernel.getKernelInstance(); if (kernel != null) { - return kernel.getRenderer().renderAs(o, as); + return kernel.getRenderer().renderAs(parseAsJson(o, as), as); + } else { + throw new RuntimeException("No IJava kernel running"); + } + } + + public static DisplayData renderAsJson(Object o) { + JavaKernel kernel = Kernel.getKernelInstance(); + + if (kernel != null) { + return kernel.getRenderer().renderAs(parseAsJson(o), MIMEType.APPLICATION_JSON.toString()); } else { throw new RuntimeException("No IJava kernel running"); } @@ -73,7 +92,7 @@ public static String display(Object o, String... as) { JavaKernel kernel = Kernel.getKernelInstance(); if (kernel != null) { - DisplayData data = kernel.getRenderer().renderAs(o, as); + DisplayData data = kernel.getRenderer().renderAs(parseAsJson(o, as), as); String id = data.getDisplayId(); if (id == null) { @@ -104,10 +123,21 @@ public static void updateDisplay(String id, Object o, String... as) { JavaKernel kernel = Kernel.getKernelInstance(); if (kernel != null) { - DisplayData data = kernel.getRenderer().renderAs(o, as); + DisplayData data = kernel.getRenderer().renderAs(parseAsJson(o, as), as); kernel.getIO().display.updateDisplay(id, data); } else { throw new RuntimeException("No IJava kernel running"); } } + + private static Object parseAsJson(Object data, String... as) { + if (data instanceof JsonElement jsonElement) return jsonElement; + String jsonMime = MIMEType.APPLICATION_JSON.toString(); + if (Objects.isNull(as) || as.length == 0 || Arrays.stream(as).anyMatch(mime -> mime.contains(jsonMime))) { + if (data instanceof String jsonStr) return JsonParser.parseString(jsonStr); + else if (data instanceof Reader reader) return JsonParser.parseReader(reader); + else return GSON.toJsonTree(data); + } + return data; + } } diff --git a/src/main/java/io/github/spencerpark/ijava/runtime/Magics.java b/src/main/java/io/github/spencerpark/ijava/runtime/Magics.java index c2f9dea..7e8f5e5 100644 --- a/src/main/java/io/github/spencerpark/ijava/runtime/Magics.java +++ b/src/main/java/io/github/spencerpark/ijava/runtime/Magics.java @@ -35,7 +35,7 @@ public static T lineMagic(String name, List args) { if (kernel != null) { try { - return kernel.getMagics().applyLineMagic(name, args); + return JavaKernel.getMagics().applyLineMagic(name, args); } catch (UndefinedMagicException e) { throw e; } catch (Exception e) { @@ -51,7 +51,7 @@ public static T cellMagic(String name, List args, String body) { if (kernel != null) { try { - return kernel.getMagics().applyCellMagic(name, args, body); + return JavaKernel.getMagics().applyCellMagic(name, args, body); } catch (UndefinedMagicException e) { throw e; } catch (Exception e) {