From c5d17b49dcc1c034c541a9c93561c21d34a2d84c Mon Sep 17 00:00:00 2001 From: jcorea Date: Mon, 27 Jan 2020 17:27:29 +0100 Subject: [PATCH] initial Inputhandler --- RestBCAdapter.bbj | 66 ++++++++++++++++++++++++++++++----- RestBridge.bbj | 6 ++-- RestInputHandler.bbj | 83 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+), 11 deletions(-) create mode 100644 RestInputHandler.bbj diff --git a/RestBCAdapter.bbj b/RestBCAdapter.bbj index 17edede..3380cc0 100644 --- a/RestBCAdapter.bbj +++ b/RestBCAdapter.bbj @@ -1,7 +1,8 @@ use java.util.HashMap use com.basiscomponents.db.ResultSet use com.basiscomponents.db.DataRow - +use java.io.File +use org.apache.commons.io.FilenameUtils seterr execerr debug=0 @@ -21,6 +22,8 @@ ses$=stbl("SESSIONID",ses$) servletParams! = new HashMap() servletParams! = BBjAPI().getGlobalNamespace().getValue(ses$+"_SERVLET_PARAMETERS",err=*next) +REM if debug then System.out.println(servletParams!) + if debug then System.out.println("Got auth header: "+authtype$+" "+auth$) authtype$=cvs(authtype$,4) @@ -181,11 +184,27 @@ main_loop: method$ = request!.get("method") + + if servletParams!.containsKey("REST_INPUTHANDLER") then + inputhandlerPath! = servletParams!.get("REST_INPUTHANDLER").toString() + inputhandlerFile! = null() + inputhandlerFile! = new File(inputhandlerPath!,err=*next) + if inputhandlerFile! <> null() then + inputhandlerName! = FilenameUtils.removeExtension(inputhandlerFile!.getName()) + evaluation! = "new ::"+inputhandlerPath!+"::"+inputhandlerName!+"()" + inputhandler! = eval(evaluation!) + endif + endif + switch method$ case "POST" if request!.get("invoke") <> null() then invoke$ = request!.get("invoke") - dr! = DataRow.fromJson(request!.get("body")) + if inputhandler! = null() then + dr! = DataRow.fromJson(request!.get("body")) + else + dr! = inputhandler!.parsePostInvoke(request!.get("body")) + endif if dr! <> null() and dr!.getColumnCount() > 0 then variableNamePrefix! = new String(user$) variableNamePrefix! = variableNamePrefix!.replaceAll("\W", "_") @@ -243,8 +262,11 @@ main_loop: if b1$>"" and b1$(1,1)<>"[" then b1$="["+b1$+"]" fi - System.out.println(b1$) - res! = ResultSet.fromJson(b1$) + if inputhandler! = null() then + res! = ResultSet.fromJson(b1$) + else + res! = inputhandler!.parsePost(b1$) + endif k! = java.util.Arrays.asList(new String(filterf$).split("/")) v! = java.util.Arrays.asList(new String(sel$).split("/",-1)) it! = res!.iterator() @@ -288,12 +310,24 @@ main_loop: case "DELETE" case "PUT" if method$ = "PUT" and cvs(sel$,4) = "IGNOREKEYS" then - dr! = DataRow.fromJson(request!.get("body")) + if inputhandler! = null() then + dr! = DataRow.fromJson(request!.get("body")) + else + dr! = inputhandler!.parsePut(request!.get("body")) + endif else if sel$ = "" or filterf$ = "" then throw "Missing resource ID",999 endif - dr! = DataRow.fromJson(request!.get("body")) + if inputhandler! = null() then + dr! = DataRow.fromJson(request!.get("body")) + else + if method$="PUT" then + dr! = inputhandler!.parsePut(request!.get("body")) + else + dr! = inputhandler!.parseDelete(request!.get("body")) + endif + endif k! = java.util.Arrays.asList(new String(filterf$).split("/")) v! = java.util.Arrays.asList(new String(sel$).split("/",-1)) if v!.size() < k!.size() then @@ -337,9 +371,25 @@ main_loop: response!.put("sel",sel$) response!.put("primarykey",filterf$) break - + +REM case "GET" +REM case "HEAD" +REM case "CONNECT" +REM case "TRACE" +REM case "PATCH" case default - params! = request!.get("params",err=*next) + + if inputhandler! = null() then + params! = request!.get("params",err=*next) + else + paramsParsed = 0 + if method$ = "GET" then params! = inputhandler!.parseGet( request!);paramsParsed=1 + if method$ = "HEAD" then params! = inputhandler!.parseHead(request!);paramsParsed=1 + if method$ = "CONNECT" then params! = inputhandler!.parseConnect(request!);paramsParsed=1 + if method$ = "TRACE" then params! = inputhandler!.parseTrace(request!);paramsParsed=1 + if method$ = "PATCH" then params! = inputhandler!.parsePatch(request!);paramsParsed=1 + if !paramsParsed then params! = inputhandler!.parseDefault(request!) + endif if sel$ = "_meta" then rs! = new ResultSet() diff --git a/RestBridge.bbj b/RestBridge.bbj index 73c1779..d9c7ba1 100644 --- a/RestBridge.bbj +++ b/RestBridge.bbj @@ -183,9 +183,9 @@ class public RestBridge ses_list! = BBjAPI().getGlobalNamespace().getValue(uid$+"_list") endif + servletParams! = #getServletParameters(context!) while 1 if (ses_list!.empty()) - servletParams! = #getServletParameters(context!) if !servletParams!.containsKey("REST_WD") then goto setup_err endif @@ -835,7 +835,6 @@ class public RestBridge System.out.println("REST: invoke "+ses$) requestSemaphore! = BBjAPI().getGlobalNamespace().getValue(ses$+"_REQUEST_SEM",err=noSes) responseSemaphore! = BBjAPI().getGlobalNamespace().getValue(ses$+"_RESPONSE_SEM") - BBjAPI().getGlobalNamespace().setValue(ses$+"_REQUEST",instructions!) requestSemaphore!.release() rem here's the remote session active @@ -850,7 +849,7 @@ class public RestBridge System.out.println("REST: timeout on invoke "+ses$) throw "Timeout occurred",0 fi - + response! = BBjAPI().getGlobalNamespace().getValue(ses$+"_RESPONSE",err=*next) System.out.println("REST: invoke done "+ses$) @@ -1015,6 +1014,7 @@ class public RestBridge parameterNames!.add("REST_AUTHPGM") parameterNames!.add("REST_REQUESTLOG") parameterNames!.add("USE_GET_ALLOWED_FILTER") + parameterNames!.add("REST_INPUTHANDLER") rem the list of parameter names that must be set as STBL declare BBjVector parameterNamesToSetAsSTBL! diff --git a/RestInputHandler.bbj b/RestInputHandler.bbj new file mode 100644 index 0000000..9fae093 --- /dev/null +++ b/RestInputHandler.bbj @@ -0,0 +1,83 @@ +REM /** +REM * RestInputHandler.bbj +REM * @author Jan Corea +REM * In this class, input from HTTP requests will be parsed and validated for each HTTP method +REM * in the RestBridge BBjsp parameter "REST_INPUTHANDLER", the path of this class is set. Change this parameter when implementing +REM * a different class to handle the input +REM * +REM */ + + +use com.basiscomponents.db.ResultSet +use com.basiscomponents.db.DataRow + +class public RestInputHandler + + REM Data structure parsers + + method protected DataRow parseDataRow(String body!) + dr! = DataRow.fromJson(body!,err=errhandler) + methodret dr! + errhandler: + throw errmes(-1), 252 + methodend + + method protected ResultSet parseResultSet(String body!) + rs! = ResultSet.fromJson(body!,err=errhandler) + methodret rs! + errhandler: + throw errmes(-1), 252 + methodend + + method protected java.util.HashMap parseParams(java.util.HashMap request!) + hm! = cast(java.util.HashMap, request!.get("params",err=*next)) + methodret hm! + methodend + + REM HTTP method parsers + + method public java.util.HashMap parseDefault(java.util.HashMap request!) + methodret #parseParams(request!) + methodend + + method public java.util.HashMap parseGet(java.util.HashMap request!) + methodret #parseParams(request!) + methodend + + method public ResultSet parsePost(String body!) + methodret #parseResultSet(body!,err=errhandler) + errhandler: + throw errmes(-1), 252 + methodend + + method public DataRow parsePostInvoke(String body!) + methodret #parseDataRow(body!,err=errhandler) + errhandler: + throw errmes(-1), 252 + methodend + + method public DataRow parsePut(String body!) + methodret #parseDataRow(body!,err=errhandler) + errhandler: + throw errmes(-1), 252 + methodend + + method public DataRow parseDelete(String body!) + methodret #parseDataRow(body!,err=errhandler) + errhandler: + throw errmes(-1), 252 + methodend + + method public java.util.HashMap parseConnect(java.util.HashMap request!) + methodret #parseParams(request!) + methodend + + method public java.util.HashMap parseTrace(java.util.HashMap request!) + methodret #parseParams(request!) + methodend + + method public java.util.HashMap parsePatch(java.util.HashMap request!) + methodret #parseParams(request!) + methodend + +classend