Skip to content
Snippets Groups Projects
Unverified Commit 764a919f authored by Andrea Franchini's avatar Andrea Franchini
Browse files

Fix errors for HTML and JSON

parent e0751675
Branches
No related tags found
No related merge requests found
...@@ -42,31 +42,18 @@ def handleDOMLX(doml_xmi: bytes, callback) -> dict: ...@@ -42,31 +42,18 @@ def handleDOMLX(doml_xmi: bytes, callback) -> dict:
dmc = init_model(doml_xmi, doml_version) dmc = init_model(doml_xmi, doml_version)
return callback(dmc) res = callback(dmc)
return res
except (
BadDOMLException,
UnsupportedDOMLVersionException,
MissingInfrastructureLayerException,
NoActiveConcreteLayerException
) as e:
return JSONResponse(
status_code=400,
content=jsonable_encoder({
"message": e.errors,
"debug_message": traceback.format_exc()
})
)
except (RuntimeError, Exception) as e: except (RuntimeError, Exception) as e:
logging.error(traceback.format_exc()) ERR_MSG = "An error has occurred.\nIt could be an error within your DOML file.\nIf it persist, try specifying DOML version manually."
return JSONResponse( logging.exception(e)
status_code=400, return {
content=jsonable_encoder({ "type": "error",
"message": "An error has occurred. It could be an error within your DOML file. If it persist, try specifying DOML version manually.", "message": e.message or ERR_MSG,
"debug_message": traceback.format_exc() "debug_message": traceback.format_exc()
}) }
)
@app.post("/modelcheck") @app.post("/modelcheck")
async def mc(request: Request): async def mc(request: Request):
...@@ -81,11 +68,20 @@ async def csp(request: Request): ...@@ -81,11 +68,20 @@ async def csp(request: Request):
@app.post("/modelcheck_html") @app.post("/modelcheck_html")
async def mc_html(request: Request): async def mc_html(request: Request):
doml_xmi = await request.body() doml_xmi = await request.body()
res = handleDOMLX(doml_xmi, verify_model) res = handleDOMLX(doml_xmi, verify_model)
return templates.TemplateResponse("mc.html", {"request": request, **res}) print(res)
if res.get("type") == "error":
return templates.TemplateResponse("error.html", {"request": request, **res})
else:
return templates.TemplateResponse("mc.html", {"request": request, **res})
@app.post("/csp_html") @app.post("/csp_html")
async def csp_html(request: Request): async def csp_html(request: Request):
doml_xmi = await request.body() doml_xmi = await request.body()
res = handleDOMLX(doml_xmi, verify_csp_compatibility) res = handleDOMLX(doml_xmi, verify_csp_compatibility)
return templates.TemplateResponse("csp.html", {"request": request, **res}) if res.get("type") == "error":
return templates.TemplateResponse("error.html", {"request": request, **res})
else:
return templates.TemplateResponse("csp.html", {"request": request, **res})
\ No newline at end of file
{% extends "base.html" %}
{% block content %}
<h1 class="title">Error</h1>
<div class="message is-danger">
<div class="message-header">
<p>
An error occurred while validating the DOML
</p>
</div>
<div class="message-body">
<h2 class="title is-6 my-2">Description</h2>
<p>{{message}}</p>
<details>
<summary class="title is-6 my-2">Debug Message</summary>
<pre class="is-family-monospace message-body">
{{debug_message}}
</pre>
</details>
</div>
</div>
{% endblock content %}
\ No newline at end of file
...@@ -18,3 +18,8 @@ class RequirementBadSyntaxException(RequirementException): ...@@ -18,3 +18,8 @@ class RequirementBadSyntaxException(RequirementException):
def __init__(self, line: int, col: int, message: str, *args: object) -> None: def __init__(self, line: int, col: int, message: str, *args: object) -> None:
super().__init__(*args) super().__init__(*args)
self.message = f"Syntax Error at Ln {line}, Col {col}:\n{message}" self.message = f"Syntax Error at Ln {line}, Col {col}:\n{message}"
class ParserException(Exception):
def __init__(self, *args: object) -> None:
super().__init__(*args)
self.errors = "Failed to parse DOMLR."
\ No newline at end of file
...@@ -5,8 +5,7 @@ from doml_synthesis import State ...@@ -5,8 +5,7 @@ from doml_synthesis import State
from lark import Lark, UnexpectedCharacters, UnexpectedEOF from lark import Lark, UnexpectedCharacters, UnexpectedEOF
from z3 import Not from z3 import Not
from mc_openapi.doml_mc.domlr_parser.exceptions import \ from mc_openapi.doml_mc.domlr_parser.exceptions import ParserException, RequirementBadSyntaxException, RequirementMissingKeyException
RequirementBadSyntaxException
from mc_openapi.doml_mc.domlr_parser.utils import StringValuesCache, VarStore from mc_openapi.doml_mc.domlr_parser.utils import StringValuesCache, VarStore
from mc_openapi.doml_mc.imc import RequirementStore from mc_openapi.doml_mc.imc import RequirementStore
...@@ -73,6 +72,7 @@ class Parser: ...@@ -73,6 +72,7 @@ class Parser:
msg = _get_error_desc_for_unexpected_characters(e, input) msg = _get_error_desc_for_unexpected_characters(e, input)
raise RequirementBadSyntaxException(e.line, e.column, msg) raise RequirementBadSyntaxException(e.line, e.column, msg)
def _get_error_desc_for_unexpected_characters(e: UnexpectedCharacters, input: str): def _get_error_desc_for_unexpected_characters(e: UnexpectedCharacters, input: str):
# Error description # Error description
msg = "Syntax Error:\n\n" msg = "Syntax Error:\n\n"
......
...@@ -4,20 +4,20 @@ from mc_openapi.doml_mc.intermediate_model.metamodel import DOMLVersion ...@@ -4,20 +4,20 @@ from mc_openapi.doml_mc.intermediate_model.metamodel import DOMLVersion
class BadDOMLException(Exception): class BadDOMLException(Exception):
def __init__(self, message: str = None, *args: object) -> None: def __init__(self, message: str = None, *args: object) -> None:
super().__init__(*args) super().__init__(*args)
self.errors = message or "The submitted DOML contains some kind of error." self.message = message or "The submitted DOML contains some kind of error."
class UnsupportedDOMLVersionException(Exception): class UnsupportedDOMLVersionException(Exception):
def __init__(self, message: str = None, *args: object) -> None: def __init__(self, message: str = None, *args: object) -> None:
super().__init__(*args) super().__init__(*args)
self.errors = message or "The DOML version is not supported." self.message = message or "The DOML version is not supported."
class MissingInfrastructureLayerException(Exception): class MissingInfrastructureLayerException(Exception):
def __init__(self, message: str = None, *args: object) -> None: def __init__(self, message: str = None, *args: object) -> None:
super().__init__(*args) super().__init__(*args)
self.errors = message or "Abstract infrastructure layer is missing from DOML." self.message = message or "Abstract infrastructure layer is missing from DOML."
class NoActiveConcreteLayerException(Exception): class NoActiveConcreteLayerException(Exception):
def __init__(self, message: str = None, *args: object) -> None: def __init__(self, message: str = None, *args: object) -> None:
super().__init__(*args) super().__init__(*args)
self.errors = message or "No active concrete infrastructure layer has been specified in DOML." self.message = message or "No active concrete infrastructure layer has been specified in DOML."
...@@ -83,13 +83,14 @@ def verify_model( ...@@ -83,13 +83,14 @@ def verify_model(
req_store, req_store,
threads=threads, threads=threads,
user_str_values=user_req_str_consts, user_str_values=user_req_str_consts,
disable_multithreading=(threads == 1) disable_multithreading=True #(threads == 1)
) )
res = results.summarize() res = results.summarize()
res['doml_version'] = dmc.doml_version.name res['doml_version'] = dmc.doml_version.name
res['result'] = res['result'].name res['result'] = res['result'].name
res['type'] = 'message'
# logging.info(res) # logging.info(res)
...@@ -159,5 +160,7 @@ def synthesize_model(dmc: ModelChecker, external_domlr: str, max_tries: int): ...@@ -159,5 +160,7 @@ def synthesize_model(dmc: ModelChecker, external_domlr: str, max_tries: int):
def verify_csp_compatibility(dmc: ModelChecker): def verify_csp_compatibility(dmc: ModelChecker):
return CSPCompatibility.check(dmc.intermediate_model, dmc.doml_version) res = CSPCompatibility.check(dmc.intermediate_model, dmc.doml_version)
res['type'] = 'message'
return res
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment