Пример #1
0
class JavaKernel(Kernel):
    implementation = 'Python'
    implementation_version = '1.0'
    language = 'Java'
    language_version = 'Java 9'
    language_info = {'mimetype': 'text/plain', 'name':'Java'}
    banner = "Java kernel for Jupyter"

    def __init__(self, **kwargs):
        super(JavaKernel, self).__init__(**kwargs)
        port = 25222
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        while True:
            result = sock.connect_ex(('127.0.0.1', port))

            if result != 0:
                break
            port += 1

        self.__sp = subprocess.Popen("java -jar " + sys.argv[1] + " " +
                  str(port), shell=True)

        time.sleep(5)

        self.history = deque(maxlen=256)
        self.history_command = re.compile(r'^\s*/history\s*$')

        self.__java_bridge = JavaGateway(
            gateway_parameters=GatewayParameters(port=port)) \
            .jvm.JShellWrapper()

    def __last_word(self, var):
        result = re.findall(r'\w+$', var)
        return '' if not result else result[0]

    def do_execute(self, code, silent, store_history=True,
                   user_expressions=None, allow_stdin=False):
        if not silent:
            self.history.append(code)
            if self.history_command.match(code):
                stream_content = {
                    'name': 'stdout',
                    'text': '\n'.join(self.history)
                }
            elif code == r'/vars':
                stream_content = {
                    'name': 'stdout',
                    'text': self.__java_bridge.getVariables()
                }
            elif code == r'/methods':
                stream_content = {
                    'name': 'stdout',
                    'text': self.__java_bridge.getMethods()
                }
            elif re.search(r'^/env .*', code) is not None:
                path = re.sub(r'^/env *', "", code)
                stream_content = {
                    'name': 'stdout',
                    'text': self.__java_bridge.addLibrary(path)
                }
            else:
                stream_content = {
                    'name': 'stdout',
                    'text': self.__java_bridge.evalSnippet(code)
                }

            self.send_response(self.iopub_socket, 'stream', stream_content)

        return {'status': 'ok',
                'execution_count': self.execution_count,
                'payload': [],
                'user_expressions': {},
                }

    def do_is_complete(self, code):
        if self.__java_bridge.isComplete(code):
            return {"status": "complete"}
        else:
            return {"status": "incomplete", "indent": "  "}

    def do_complete(self, code, cursor_pos):
        mask = self.__last_word(code)
        if not mask:
            v = []
        else:
            v = self.__java_bridge.getSuggestions(code, cursor_pos). \
                    split("\n")[:-1]
        content = {
            'matches': v,
            'cursor_start': cursor_pos - len(mask),
            'cursor_end': cursor_pos,
            'metadata': {},
            'status': 'ok'
        }

        return content

    def do_shutdown(self, restart):
        self.__sp.terminate()