Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 58 additions & 8 deletions RestBCAdapter.bbj
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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)

Expand Down Expand Up @@ -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", "_")
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down
6 changes: 3 additions & 3 deletions RestBridge.bbj
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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$)
Expand Down Expand Up @@ -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!
Expand Down
83 changes: 83 additions & 0 deletions RestInputHandler.bbj
Original file line number Diff line number Diff line change
@@ -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