Skip to content
Snippets Groups Projects
Commit 4fe67896 authored by silvergl's avatar silvergl
Browse files

Base Kernel from spencer

parent 18a14108
Branches
No related tags found
No related merge requests found
Showing
with 1079 additions and 0 deletions
.gradle
build/
!gradle-wrapper.jar
out/
.idea/
\ No newline at end of file
LICENSE 0 → 100644
Copyright (c) 2017 Spencer Park
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
\ No newline at end of file
import org.apache.tools.ant.filters.ReplaceTokens
group = 'io.github.spencerpark'
version = '2.3.0'
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'maven-publish'
apply plugin: 'signing'
sourceCompatibility = 1.8
targetCompatibility = 1.8
task wrapper(type: Wrapper) {
gradleVersion = '4.2.1'
}
tasks.withType(JavaCompile) {
options.compilerArgs << '-parameters'
options.compilerArgs << '-Xlint:all' << '-Xlint:-rawtypes' << '-Xlint:-serial'
}
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.zeromq', name: 'jeromq', version: '0.5.1'
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
testCompile group: 'com.google.jimfs', name: 'jimfs', version: '1.1'
}
processResources {
def tokens = [
'version': project.version,
'project': project.name
]
inputs.properties(tokens)
filter ReplaceTokens, tokens: tokens
}
task javadocJar(type: Jar) {
classifier = 'javadoc'
from javadoc
}
task sourcesJar(type: Jar) {
classifier = 'sources'
from sourceSets.main.allSource
}
artifacts {
archives javadocJar, sourcesJar
}
signing {
sign configurations.archives
}
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
// ossrhUsername and ossrhPassword are defined in the global gradle.properties on the
// machine uploading the artifacts (including the keys). If not present only `publish`
// should fail, not `publishToMavenLocal`. Essentially defer the failure as long as possible.
def ossrhUsername = project.findProperty('ossrhUsername')
def ossrhPassword = project.findProperty('ossrhPassword')
repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
authentication(userName: ossrhUsername, password: ossrhPassword)
}
snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
authentication(userName: ossrhUsername, password: ossrhPassword)
}
pom.project {
name = 'Jupyter JVM Base Kernel'
packaging = 'jar'
description = 'An abstract kernel implementation for Jupyter kernels running on the Java virtual machine.'
url = 'https://github.com/SpencerPark/jupyter-jvm-basekernel'
scm {
url = 'https://github.com/SpencerPark/jupyter-jvm-basekernel.git'
connection = 'scm:git:https://github.com/SpencerPark/jupyter-jvm-basekernel.git'
developerConnection = 'scm:git:git@github.com:SpencerPark/jupyter-jvm-basekernel.git'
}
licenses {
license {
name = 'MIT License'
url = 'http://opensource.org/licenses/MIT'
distribution = 'repo'
}
}
developers {
developer {
id = 'SpencerPark'
name = 'Spencer Park'
email = 'spinnr95@gmail.com'
}
}
}
}
}
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
\ No newline at end of file
plugins {
id "java"
id "io.github.spencerpark.jupyter-kernel-installer" version "2.1.0"
}
group 'io.github.spencerpark'
version '1.0.0-SNAPSHOT'
sourceCompatibility = 1.8
wrapper {
gradleVersion = '4.8.1'
distributionType = Wrapper.DistributionType.ALL
}
repositories {
mavenLocal()
mavenCentral()
}
configurations {
shade
shade.transitive = true
compile.extendsFrom(shade)
}
dependencies {
shade group: 'io.github.spencerpark', name: 'jupyter-jvm-basekernel', version: '2.2.4'
}
jar {
//Include all shaded dependencies in the jar
from configurations.shade
.collect { it.isDirectory() ? it : zipTree(it) }
manifest {
attributes('Main-class': 'io.github.spencerpark.jupyter.INashornJS')
}
}
jupyter {
kernelName = 'nashorn-js'
kernelDisplayName = 'NashornJS'
kernelLanguage = 'js'
kernelInterruptMode = 'message'
kernelParameters {
list('engine-arg', 'JS_ENGINE_ARGS') {
separator = ' '
description = 'A comma separated list of arguments to give to the scripting engine.'
}
}
}
zipKernel {
installers {
with 'python'
}
}
\ No newline at end of file
File added
distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
example/kernel/logo-32x32.png

734 B

example/kernel/logo-64x64.png

1.39 KiB

rootProject.name = 'example'
\ No newline at end of file
package io.github.spencerpark.jupyter;
import io.github.spencerpark.jupyter.channels.JupyterConnection;
import io.github.spencerpark.jupyter.channels.JupyterSocket;
import io.github.spencerpark.jupyter.kernel.KernelConnectionProperties;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.logging.Level;
public class INashornJS {
public static void main(String[] args) throws Exception {
if (args.length < 1)
throw new IllegalArgumentException("Missing connection file argument");
Path connectionFile = Paths.get(args[0]);
if (!Files.isRegularFile(connectionFile))
throw new IllegalArgumentException("Connection file '" + connectionFile + "' isn't a file.");
String contents = new String(Files.readAllBytes(connectionFile));
JupyterSocket.JUPYTER_LOGGER.setLevel(Level.WARNING);
KernelConnectionProperties connProps = KernelConnectionProperties.parse(contents);
JupyterConnection connection = new JupyterConnection(connProps);
String envEngineArgs = System.getenv("JS_ENGINE_ARGS");
if (envEngineArgs == null)
envEngineArgs = "-scripting";
String[] engineArgs = envEngineArgs.split(" ");
NashornKernel kernel = new NashornKernel(engineArgs);
kernel.becomeHandlerForConnection(connection);
connection.connect();
connection.waitUntilClose();
}
}
package io.github.spencerpark.jupyter;
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.util.CharPredicate;
import io.github.spencerpark.jupyter.kernel.util.SimpleAutoCompleter;
import io.github.spencerpark.jupyter.kernel.util.StringSearch;
import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class NashornKernel extends BaseKernel {
private static final NashornScriptEngineFactory NASHORN_ENGINE_FACTORY = new NashornScriptEngineFactory();
private static final SimpleAutoCompleter autoCompleter = SimpleAutoCompleter.builder()
.preferLong()
//Keywords from a great poem at https://stackoverflow.com/a/12114140
.withKeywords("let", "this", "long", "package", "float")
.withKeywords("goto", "private", "class", "if", "short")
.withKeywords("while", "protected", "with", "debugger", "case")
.withKeywords("continue", "volatile", "interface")
.withKeywords("instanceof", "super", "synchronized", "throw")
.withKeywords("extends", "final", "export", "throws")
.withKeywords("try", "import", "double", "enum")
.withKeywords("false", "boolean", "abstract", "function")
.withKeywords("implements", "typeof", "transient", "break")
.withKeywords("void", "static", "default", "do")
.withKeywords("switch", "int", "native", "new")
.withKeywords("else", "delete", "null", "public", "var")
.withKeywords("in", "return", "for", "const", "true", "char")
.withKeywords("finally", "catch", "byte")
.build();
private static final CharPredicate idChar = CharPredicate.builder()
.inRange('a', 'z')
.inRange('A', 'Z')
.match('_')
.build();
private final ScriptEngine engine;
private final LanguageInfo languageInfo;
public NashornKernel() {
this("-scripting");
}
public NashornKernel(String... args) {
this(NASHORN_ENGINE_FACTORY.getScriptEngine(args));
}
public NashornKernel(ScriptEngine engine) {
this.engine = engine;
this.languageInfo = new LanguageInfo.Builder(engine.getFactory().getLanguageName())
.version(engine.getFactory().getLanguageVersion())
.mimetype("text/javascript")
.fileExtension(".js")
.pygments("javascript")
.codemirror("javascript")
.build();
}
@Override
public LanguageInfo getLanguageInfo() {
return languageInfo;
}
@Override
public DisplayData eval(String expr) throws Exception {
ScriptContext ctx = engine.getContext();
//Redirect the streams
ctx.setWriter(new OutputStreamWriter(System.out));
ctx.setErrorWriter(new OutputStreamWriter(System.err));
ctx.setReader(new InputStreamReader(System.in));
//Evaluate the code
Object res = engine.eval(expr, ctx);
//If the evaluation returns a non-null value (the code is an expression like
// 'a + b') then the return value should be this result as text. Otherwise
//return null for nothing to be emitted for 'Out[n]'. Side effects may have
//still printed something
return res != null ? new DisplayData(res.toString()) : null;
}
@Override
public DisplayData inspect(String code, int at, boolean extraDetail) throws Exception {
StringSearch.Range match = StringSearch.findLongestMatchingAt(code, at, idChar);
String id = "";
Object val = null;
if (match != null) {
id = match.extractSubString(code);
val = this.engine.getContext().getAttribute(id);
}
return new DisplayData(val == null ? "No memory value for '" + id + "'" : val.toString());
}
@Override
public ReplacementOptions complete(String code, int at) throws Exception {
StringSearch.Range match = StringSearch.findLongestMatchingAt(code, at, idChar);
if (match == null)
return null;
String prefix = match.extractSubString(code);
return new ReplacementOptions(autoCompleter.autocomplete(prefix), match.getLow(), match.getHigh());
}
}
File added
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip
gradlew 0 → 100644
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
rootProject.name = 'jupyter-jvm-basekernel'
package io.github.spencerpark.jupyter.channels;
import io.github.spencerpark.jupyter.messages.ContentType;
import io.github.spencerpark.jupyter.messages.Message;
import io.github.spencerpark.jupyter.messages.MessageContext;
import io.github.spencerpark.jupyter.messages.MessageType;
import io.github.spencerpark.jupyter.messages.publish.PublishStatus;
import io.github.spencerpark.jupyter.messages.reply.ErrorReply;
import java.util.Deque;
import java.util.LinkedList;
public class DefaultReplyEnvironment implements ReplyEnvironment {
private final JupyterSocket shell;
private final JupyterSocket iopub;
private final MessageContext context;
private Deque<Runnable> deferred = new LinkedList<>();
private boolean defer = false;
public DefaultReplyEnvironment(JupyterSocket shell, JupyterSocket iopub, MessageContext context) {
this.shell = shell;
this.iopub = iopub;
this.context = context;
}
public JupyterSocket getShell() {
return shell;
}
public JupyterSocket getIopub() {
return iopub;
}
public MessageContext getContext() {
return context;
}
@Override
public void publish(Message<?> msg) {
if (defer) {
deferred.push(() -> iopub.sendMessage(msg));
this.defer = false;
} else {
iopub.sendMessage(msg);
}
}
@Override
public void reply(Message<?> msg) {
if (defer) {
deferred.push(() -> shell.sendMessage(msg));
this.defer = false;
} else {
shell.sendMessage(msg);
}
}
@Override
public ReplyEnvironment defer() {
this.defer = true;
return this;
}
@Override
public void defer(Runnable action) {
this.deferred.push(action);
}
@Override
public void resolveDeferrals() {
if (this.defer)
throw new IllegalStateException("Reply environment is in defer mode but a resolution was request.");
while (!deferred.isEmpty())
deferred.pop().run();
}
@Override
public <T extends ContentType<T>> void publish(T content) {
publish(new Message<>(context, content.getType(), content));
}
@Override
public <T extends ContentType<T>> void reply(T content) {
reply(new Message<>(context, content.getType(), content));
}
@Override
@SuppressWarnings("unchecked")
public void replyError(MessageType<?> type, ErrorReply error) {
reply(new Message(context, type, error));
}
@Override
public void setStatusBusy() {
publish(PublishStatus.BUSY);
}
@Override
public void setStatusIdle() {
publish(PublishStatus.IDLE);
}
@Override
public void setBusyDeferIdle() {
setStatusBusy();
defer().setStatusIdle();
}
}
package io.github.spencerpark.jupyter.channels;
import io.github.spencerpark.jupyter.kernel.KernelConnectionProperties;
import io.github.spencerpark.jupyter.messages.HMACGenerator;
import org.zeromq.SocketType;
import org.zeromq.ZMQ;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
public class HeartbeatChannel extends JupyterSocket {
private static final long HB_DEFAULT_SLEEP_MS = 500;
private static final AtomicInteger HEARTBEAT_ID = new AtomicInteger();
private final long sleep;
private volatile Loop pulse;
public HeartbeatChannel(ZMQ.Context context, HMACGenerator hmacGenerator, long sleep) {
super(context, SocketType.REP, hmacGenerator, Logger.getLogger("HeartbeatChannel"));
this.sleep = sleep;
}
public HeartbeatChannel(ZMQ.Context context, HMACGenerator hmacGenerator) {
this(context, hmacGenerator, HB_DEFAULT_SLEEP_MS);
}
private boolean isBound() {
return this.pulse != null;
}
@Override
public void bind(KernelConnectionProperties connProps) {
if (this.isBound())
throw new IllegalStateException("Heartbeat channel already bound");
String channelThreadName = "Heartbeat-" + HEARTBEAT_ID.getAndIncrement();
String addr = JupyterSocket.formatAddress(connProps.getTransport(), connProps.getIp(), connProps.getHbPort());
logger.log(Level.INFO, String.format("Binding %s to %s.", channelThreadName, addr));
super.bind(addr);
ZMQ.Poller poller = super.ctx.poller(1);
poller.register(this, ZMQ.Poller.POLLIN);
this.pulse = new Loop(channelThreadName, this.sleep, () -> {
int events = poller.poll(0);
if (events > 0) {
byte[] msg = this.recv();
if (msg == null) {
//Error during receive, just continue
super.logger.log(Level.SEVERE, "Poll returned 1 event but could not read the echo string");
return;
}
if (!this.send(msg)) {
super.logger.log(Level.SEVERE, "Could not send heartbeat reply");
}
super.logger.log(Level.FINEST, "Heartbeat pulse");
}
});
this.pulse.onClose(() -> {
logger.log(Level.INFO, channelThreadName + " shutdown.");
this.pulse = null;
});
this.pulse.start();
logger.log(Level.INFO, "Polling on " + channelThreadName);
}
@Override
public void close() {
if (this.isBound())
this.pulse.shutdown();
super.close();
}
@Override
public void waitUntilClose() {
if (this.pulse != null) {
try {
this.pulse.join();
} catch (InterruptedException ignored) { }
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment