/* Ċ Ġ* ĠJ aval in Ġ- Ġhttps :// jav al in . io Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠDavid ĠÃ ħ se Ċ Ġ* ĠLicensed Ġunder ĠApache Ġ 2 . 0 : Ġhttps :// github . com / tip sy / jav al in / blob / master / LICENSE Ċ Ġ*/ Ċ Ċ package Ġio . jav al in Ċ Ċ import Ġio . jav al in . builder . Cookie Builder Ċ import Ġio . jav al in . core . util . Context Util Ċ import Ġio . jav al in . core . util . Upload Util Ċ import Ġio . jav al in . core . util . Util Ċ import Ġio . jav al in . translator . json . Jack son Ċ import Ġio . jav al in . translator . template . F reem ark er Ċ import Ġio . jav al in . translator . template . Must ache Ċ import Ġio . jav al in . translator . template . Th y me leaf Ċ import Ġio . jav al in . translator . template . Velocity Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . URL Decoder Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjavax . servlet . http . Cookie Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ import Ġjavax . servlet . http . HttpServletResponse Ċ Ċ class ĠContext ( private Ġval Ġservlet Response : ĠHttpServletResponse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġservlet Request : ĠHttpServletRequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġvar Ġparam Map : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġvar Ġspl at List : ĠList < String >) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Context :: class . java ) ĊĊĠĠĠ Ġprivate Ġvar Ġpassed To Next Handler : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġresult String : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġresult Stream : ĠInputStream ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġnext () Ġ{ ĊĠĠĠĠĠĠĠ Ġpassed To Next Handler Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext ed (): ĠBoolean Ġ= Ġpassed To Next Handler ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠRequest - ish Ġmethods ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġfun Ġrequest (): ĠHttpServletRequest Ġ= Ġservlet Request ĊĊĠĠĠ Ġfun Ġasync ( async Handler : Ġ() Ġ-> ĠCompletableFuture < Void >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġasync Context Ġ= Ġservlet Request . start Async () ĊĠĠĠĠĠĠĠ Ġasync Handler (). then Accept Ġ{ Ġ_ Ġ-> Ġasync Context . complete () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exception ally Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Context . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbody (): ĠString Ġ= ĠContext Util . byteArray ToString ( body As Bytes (), Ġservlet Request . character Encoding ) ĊĊĠĠĠ Ġfun Ġbody As Bytes (): ĠByteArray Ġ= ĠContext Util . toByteArray ( servlet Request . inputStream ) ĊĊĠĠĠ Ġfun Ġ< T > Ġbody As Class ( clazz : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ ĠUtil . ensure Dependency Present (" Jack son ", Ġ" com . fasterxml . jackson . databind . ObjectMapper ", Ġ" com . fasterxml . jackson . core / jackson - databind ") ĊĠĠĠĠĠĠĠ Ġreturn ĠJack son . toObject ( body (), Ġclazz ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbody Param ( body Param : ĠString ): ĠString ? Ġ= Ġform Param ( body Param ) ĊĊĠĠĠ Ġfun Ġuploaded File ( fileName : ĠString ): ĠU plo aded File ? Ġ= Ġuploaded Files ( fileName ). first OrNull () ĊĊĠĠĠ Ġfun Ġuploaded Files ( fileName : ĠString ): ĠList < Uploaded File > Ġ{ ĊĠĠĠĠĠĠĠ ĠUtil . ensure Dependency Present (" FileUpload ", Ġ" org . apache . commons . file upload . servlet . Servlet FileUpload ", Ġ" commons - file upload / commons - file upload ") ĊĠĠĠĠĠĠĠ Ġreturn ĠUpload Util . get Uploaded Files ( servlet Request , ĠfileName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġform Param ( form Param : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġbody (). split ("& ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split (" =") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . first (). equals ( form Param , Ġignore Case Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . last () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ!= Ġnull ) ĠURL Decoder . decode ( value , Ġ" UTF - 8 ") Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmap Form Params ( var arg Ġkeys : ĠString ): ĠList < String >? Ġ= ĠContext Util . map Keys Or Return Null If Any Null s ( keys ) Ġ{ Ġform Param ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġmap QueryParams ( var arg Ġkeys : ĠString ): ĠList < String >? Ġ= ĠContext Util . map Keys Or Return Null If Any Null s ( keys ) Ġ{ Ġservlet Request . getParameter ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġany Form Param Null ( var arg Ġkeys : ĠString ): ĠBoolean Ġ= Ġkeys . filter Ġ{ Ġform Param ( it ) Ġ== Ġnull Ġ}. isNotEmpty () ĊĊĠĠĠ Ġfun Ġany QueryParam Null ( var arg Ġkeys : ĠString ): ĠBoolean Ġ= Ġkeys . filter Ġ{ Ġservlet Request . getParameter ( it ) Ġ== Ġnull Ġ}. isNotEmpty () ĊĊĠĠĠ Ġfun Ġparam ( param : ĠString ): ĠString ? Ġ= Ġparam Map [ ":" Ġ+ Ġparam . toLowerCase (). replace First (" :", Ġ" ")] ĊĊĠĠĠ Ġfun Ġparam Map (): ĠMap < String , ĠString > Ġ= Ġparam Map . toMap () ĊĊĠĠĠ Ġfun Ġspl at ( sp lat Nr : ĠInt ): ĠString ? Ġ= Ġspl at List [ sp lat Nr ] ĊĊĠĠĠ Ġfun Ġspl ats (): ĠArray < String > Ġ= Ġspl at List . to Typed Array () ĊĊĠĠĠ Ġ// Ġwrapper Ġmethods Ġfor ĠHttpServletRequest ĊĊĠĠĠ Ġfun Ġattribute ( attribute : ĠString , Ġvalue : ĠAny ) Ġ= Ġservlet Request . setAttribute ( attribute , Ġvalue ) ĊĊĠĠĠ Ġfun Ġ< T > Ġattribute ( attribute : ĠString ): ĠT Ġ= Ġservlet Request . getAttribute ( attribute ) Ġas ĠT ĊĊĠĠĠ Ġfun Ġ< T > Ġattribute Map (): ĠMap < String , ĠT > Ġ= Ġservlet Request . attribute Names . as Sequence (). map Ġ{ Ġit Ġto Ġservlet Request . getAttribute ( it ) Ġas ĠT Ġ}. toMap () ĊĊĠĠĠ Ġfun Ġcontent Length (): ĠInt Ġ= Ġservlet Request . content Length ĊĊĠĠĠ Ġfun ĠcontentType (): ĠString Ġ= Ġservlet Request . contentType ĊĊĠĠĠ Ġfun Ġcookie ( name : ĠString ): ĠString ? Ġ= Ġ( servlet Request . cookies Ġ?: ĠarrayOf < Cookie > ()). find Ġ{ Ġit . name Ġ== Ġname Ġ} ?. value ĊĊĠĠĠ Ġfun Ġcookie Map (): ĠMap < String , ĠString > Ġ= Ġ( servlet Request . cookies Ġ?: ĠarrayOf < Cookie > ()). map Ġ{ Ġit . name Ġto Ġit . value Ġ}. toMap () ĊĊĠĠĠ Ġfun Ġheader ( header : ĠString ): ĠString ? Ġ= Ġservlet Request . getHeader ( header ) ĊĊĠĠĠ Ġfun Ġheader Map (): ĠMap < String , ĠString > Ġ= Ġservlet Request . header Names . as Sequence (). map Ġ{ Ġit Ġto Ġservlet Request . getHeader ( it ) Ġ}. toMap () ĊĊĠĠĠ Ġfun Ġhost (): ĠString ? Ġ= Ġservlet Request . getHeader (" host ") ĊĊĠĠĠ Ġfun Ġip (): ĠString Ġ= Ġservlet Request . remote Addr ĊĊĠĠĠ Ġfun Ġpath (): ĠString ? Ġ= Ġservlet Request . path Info ĊĊĠĠĠ Ġfun Ġport (): ĠInt Ġ= Ġservlet Request . server Port ĊĊĠĠĠ Ġfun Ġprotocol (): ĠString Ġ= Ġservlet Request . protocol ĊĊĠĠĠ Ġfun Ġquery Param ( query Param : ĠString ): ĠString ? Ġ= Ġservlet Request . getParameter ( query Param ) ĊĊĠĠĠ Ġfun Ġquery Param OrDefault ( query Param : ĠString , ĠdefaultValue : ĠString ): ĠString Ġ= Ġservlet Request . getParameter ( query Param ) Ġ?: ĠdefaultValue ĊĊĠĠĠ Ġfun ĠqueryParams ( query Param : ĠString ): ĠArray < String >? Ġ= Ġservlet Request . getParameter Values ( query Param ) ĊĊĠĠĠ Ġfun Ġquery Param Map (): ĠMap < String , ĠArray < String >> Ġ= Ġservlet Request . parameter Map ĊĊĠĠĠ Ġfun ĠqueryString (): ĠString ? Ġ= Ġservlet Request . queryString ĊĊĠĠĠ Ġfun Ġmethod (): ĠString Ġ= Ġservlet Request . method ĊĊĠĠĠ Ġfun Ġscheme (): ĠString Ġ= Ġservlet Request . scheme ĊĊĠĠĠ Ġfun Ġuri (): ĠString Ġ= Ġservlet Request . request URI ĊĊĠĠĠ Ġfun Ġurl (): ĠString Ġ= Ġservlet Request . request URL . toString () ĊĊĠĠĠ Ġfun Ġuser Agent (): ĠString ? Ġ= Ġservlet Request . getHeader (" user - agent ") ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠResponse - ish Ġmethods ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġfun Ġresponse (): ĠHttpServletResponse Ġ= Ġservlet Response ĊĊĠĠĠ Ġfun Ġresult ( result String : ĠString ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . result String Ġ= Ġresult String ĊĠĠĠĠĠĠĠ Ġthis . result Stream Ġ= Ġnull Ġ// Ġcan Ġonly Ġhave Ġone Ġor Ġthe Ġother ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresult String (): ĠString ? Ġ= Ġresult String ĊĊĠĠĠ Ġfun Ġresult Stream (): ĠInputStream ? Ġ= Ġresult Stream ĊĊĠĠĠ Ġfun Ġresult ( result Stream : ĠInputStream ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . result String Ġ= Ġnull Ġ// Ġcan Ġonly Ġhave Ġone Ġor Ġthe Ġother ĊĠĠĠĠĠĠĠ Ġthis . result Stream Ġ= Ġresult Stream ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcharset ( charset : ĠString ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġservlet Response . character Encoding Ġ= Ġcharset ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠcontentType ( contentType : ĠString ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġservlet Response . contentType Ġ= ĠcontentType ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġheader ( header Name : ĠString , Ġheader Value : ĠString ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġservlet Response . setHeader ( header Name , Ġheader Value ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhtml ( html : ĠString ): ĠContext Ġ= Ġresult ( html ). contentType (" text / html ") ĊĊĠĠĠ Ġfun Ġredirect ( location : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservlet Response . send Redirect ( location ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Exception Ġwhile Ġtrying Ġto Ġredirect Ġresponse ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġredirect ( location : ĠString , Ġhttp StatusCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġservlet Response . status Ġ= Ġhttp StatusCode ĊĠĠĠĠĠĠĠ Ġredirect ( location ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstatus (): ĠInt Ġ= Ġservlet Response . status ĊĊĠĠĠ Ġfun Ġstatus ( statusCode : ĠInt ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġservlet Response . status Ġ= ĠstatusCode ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcookie Ġmethods ĊĊĠĠĠ Ġfun Ġcookie ( name : ĠString , Ġvalue : ĠString ): ĠContext Ġ= Ġcookie ( Cookie Builder . cookie Builder ( name , Ġvalue )) ĊĊĠĠĠ Ġfun Ġcookie ( name : ĠString , Ġvalue : ĠString , Ġmax Age : ĠInt ): ĠContext Ġ= Ġcookie ( Cookie Builder . cookie Builder ( name , Ġvalue ). max Age ( max Age )) ĊĊĠĠĠ Ġfun Ġcookie ( cookie Builder : ĠCookie Builder ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcookie Ġ= ĠCookie ( cookie Builder . name , Ġcookie Builder . value ) ĊĠĠĠĠĠĠĠ Ġcookie . path Ġ= Ġcookie Builder . path ĊĠĠĠĠĠĠĠ Ġcookie . domain Ġ= Ġcookie Builder . domain ĊĠĠĠĠĠĠĠ Ġcookie . max Age Ġ= Ġcookie Builder . max Age ĊĠĠĠĠĠĠĠ Ġcookie . secure Ġ= Ġcookie Builder . secure ĊĠĠĠĠĠĠĠ Ġcookie . is Http Only Ġ= Ġcookie Builder . http Only ĊĠĠĠĠĠĠĠ Ġservlet Response . add Cookie ( cookie ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Cookie ( name : ĠString ): ĠContext Ġ= Ġremove Cookie ( null , Ġname ) ĊĊĠĠĠ Ġfun Ġremove Cookie ( path : ĠString ?, Ġname : ĠString ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcookie Ġ= ĠCookie ( name , Ġ"") ĊĠĠĠĠĠĠĠ Ġcookie . path Ġ= Ġpath ĊĠĠĠĠĠĠĠ Ġcookie . max Age Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġservlet Response . add Cookie ( cookie ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTrans lator Ġmethods ĊĠĠĠ Ġ// ĠTODO : ĠConsider Ġmoving Ġrendering Ġto ĠJ aval in Servlet , Ġwhere Ġresponse Ġis Ġwritten ĊĠĠĠ Ġfun Ġjson (` object `: ĠAny ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ ĠUtil . ensure Dependency Present (" Jack son ", Ġ" com . fasterxml . jackson . databind . ObjectMapper ", Ġ" com . fasterxml . jackson . core / jackson - databind ") ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ( Jack son . toJson (` object ` )). contentType (" application / json ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender Velocity ( template Path : ĠString , Ġmodel : ĠMap < String , ĠAny >): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ ĠUtil . ensure Dependency Present (" Apache ĠVe locity ", Ġ" org . apache . velocity . Template ", Ġ" org . apache . velocity / velocity ") ĊĠĠĠĠĠĠĠ Ġreturn Ġhtml ( Velocity . render ( template Path , Ġmodel )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender F reem ark er ( template Path : ĠString , Ġmodel : ĠMap < String , ĠAny >): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ ĠUtil . ensure Dependency Present (" Apache ĠF reem ark er ", Ġ" fre emark er . template . Configuration ", Ġ" org . fre emark er / fre emark er ") ĊĠĠĠĠĠĠĠ Ġreturn Ġhtml ( F reem ark er . render ( template Path , Ġmodel )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender Th y me leaf ( template Path : ĠString , Ġmodel : ĠMap < String , ĠAny >): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ ĠUtil . ensure Dependency Present (" Th y me leaf ", Ġ" org . thy me leaf . Template Engine ", Ġ" org . thy me leaf / thy me leaf - spring 3 ") ĊĠĠĠĠĠĠĠ Ġreturn Ġhtml ( Th y me leaf . render ( template Path , Ġmodel )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender Must ache ( template Path : ĠString , Ġmodel : ĠMap < String , ĠAny >): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ ĠUtil . ensure Dependency Present (" Must ache ", Ġ" com . github . must ache java . Must ache ", Ġ" com . github . sp ull ara . must ache . java / compiler ") ĊĠĠĠĠĠĠĠ Ġreturn Ġhtml ( Must ache . render ( template Path , Ġmodel )) ĊĠĠĠ Ġ} Ċ Ċ } Ċ