From 361f8245079b625560449324faf111ed6fcf3b1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ale=C5=A1=20Smodi=C5=A1?= Date: Sun, 4 Oct 2015 19:43:09 +0200 Subject: Unification of language session implementations. Added load_problem and end_problem actions so handlers get appropriately created and destroyed upon loading and unloading the problem solving screen. --- server/handlers.py | 73 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 29 deletions(-) (limited to 'server/handlers.py') diff --git a/server/handlers.py b/server/handlers.py index 6720cae..99b021f 100644 --- a/server/handlers.py +++ b/server/handlers.py @@ -99,9 +99,13 @@ class Query(CodeqService): else: session = request.session trace = js.get('trace') - prolog = session.get_prolog() program = None - if step == 'run': + prolog = session.current_language_session() + if prolog is None: + result = {'code': 6, 'message': 'No language session is active'} + elif not isinstance(prolog, server.prolog_session.PrologSession): + result = {'code': 7, 'message': 'The currently active session is not Prolog'} + elif step == 'run': program = js.get('program') query = js.get('query') if program is None: @@ -115,7 +119,7 @@ class Query(CodeqService): messages, status, have_more = prolog.step() result = {'code': 0, 'message': 'ok', 'terminal': {'messages': messages, 'status': status, 'have_more': have_more}} elif step == 'end': - messages, status, have_more = prolog.end() + messages, status, have_more = prolog.destroy() result = {'code': 0, 'message': 'ok', 'terminal': {'messages': messages, 'status': status, 'have_more': have_more}} else: result = {'code': 5, 'message': 'Unknown prolog step: {0}'.format(step)} @@ -128,10 +132,12 @@ class Query(CodeqService): class PythonExec(CodeqService): def process(self, request): program = request.data.get('program') + python = request.session.current_language_session() if program is None: request.reply({'code': 1, 'message': 'No program specified'}) + elif not isinstance(python, server.python_session.PythonSession): + request.reply({'code': 2, 'message': 'The currently active session is not Python'}) else: - python = request.session.get_python() python.exec(program) request.reply({'code': 0, 'message': 'ok'}) @@ -139,19 +145,24 @@ class PythonExec(CodeqService): # Send an interrupt to the Python interpreter. class PythonStop(CodeqService): def process(self, request): - python = request.session.get_python() - python.stop() - request.reply({'code': 0, 'message': 'ok'}) + python = request.session.current_language_session() + if not isinstance(python, server.python_session.PythonSession): + request.reply({'code': 2, 'message': 'The currently active session is not Python'}) + else: + python.stop() + request.reply({'code': 0, 'message': 'ok'}) # Push stdin to the Python interpreter. class PythonPush(CodeqService): def process(self, request): text = request.data.get('text') + python = request.session.current_language_session() if text is None: request.reply({'code': 1, 'message': 'No input specified'}) + elif not isinstance(python, server.python_session.PythonSession): + request.reply({'code': 2, 'message': 'The currently active session is not Python'}) else: - python = request.session.get_python() python.push(text) request.reply({'code': 0, 'message': 'ok'}) @@ -159,7 +170,7 @@ class PythonPush(CodeqService): class Hint(CodeqService): def process(self, request): js = request.data - language = js.get('language') + language = js.get('language') # TODO: remove problem_id = js.get('problem_id') program = js.get('program') @@ -169,16 +180,9 @@ class Hint(CodeqService): request.reply({'code': 2, 'message': 'No program specified'}) else: session = request.session - lang_session = None - if language == 'prolog': - lang_session = session.get_prolog() - elif language == 'python': - lang_session = session.get_python() - elif language == 'robot': - lang_session = session.get_robot() - + lang_session = session.current_language_session() if lang_session is None: - request.reply({'code': 3, 'message': 'Unknown language specified'}) + request.reply({'code': 3, 'message': 'No active session exists'}) else: hints = lang_session.hint(session.get_sid(), problem_id, program) request.reply({'code': 0, 'message': 'ok', 'hints': hints}) @@ -187,7 +191,7 @@ class Hint(CodeqService): class Test(CodeqService): def process(self, request): js = request.data - language = js.get('language') + language = js.get('language') # TODO: remove problem_id = js.get('problem_id') program = js.get('program') @@ -197,16 +201,9 @@ class Test(CodeqService): request.reply({'code': 2, 'message': 'No program specified'}) else: session = request.session - lang_session = None - if language == 'prolog': - lang_session = session.get_prolog() - elif language == 'python': - lang_session = session.get_python() - elif language == 'robot': - lang_session = session.get_robot() - + lang_session = session.current_language_session() if lang_session is None: - request.reply({'code': 3, 'message': 'Unknown language specified'}) + request.reply({'code': 3, 'message': 'No active session exists'}) else: hints = lang_session.test(session.get_sid(), problem_id, program) request.reply({'code': 0, 'message': 'ok', 'hints': hints}) @@ -227,6 +224,22 @@ class GetProblem(CodeqService): else: request.reply({'code': 0, 'message': 'ok', 'data': request.session.get_problem_data(language, problem_group, problem)}) +class LoadProblem(CodeqService): + def process(self, request): + problem_id = request.data.get('problem_id') + if problem_id is None: + request.reply({'code': 1, 'message': 'There is no active session'}) + else: + session = request.session.load_language_session(problem_id) + if session is None: + request.reply({'code': 2, 'message': 'The session failed to load'}) + else: + request.reply({'code': 0, 'message': 'OK'}) + +class EndProblem(CodeqService): + def process(self, request): + request.session.end_language_session() + request.end() # maps actions to their handlers incoming_handlers = { @@ -241,7 +254,9 @@ incoming_handlers = { 'python_stop': PythonStop(), 'hint': Hint(), 'settings': Settings(), - 'test': Test() + 'test': Test(), + 'load_problem': LoadProblem(), + 'end_problem': EndProblem() } -- cgit v1.2.1