package Ġcom . fa endir . card market . service Ċ Ċ import Ġcom . fa endir . card market . config . Card market Api Configuration Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Feature Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . datatype . js r 3 1 0 . Java Time Module Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson Type Ref Ċ import Ġcom . fasterxml . jackson . module . kotlin . register Kotlin Module Ċ import Ġcom . github . kit tin un f . fuel . Fuel Ċ import Ġcom . github . kit tin un f . fuel . core . Request Ċ import Ġorg . apache . logging . log 4 j . Log Manager Ċ import Ġorg . apache . logging . log 4 j . Logger Ċ import Ġorg . red und ent . kotlin . xml . Node Ċ import Ġorg . red und ent . kotlin . xml . xml Ċ import Ġjava . io . EOF Exception Ċ import Ġjava . net . URL Encoder Ċ import Ġjava . util .* Ċ import Ġjavax . crypto . Mac Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ Ċ /** Ċ Ġ* Ġ@ author Ġl uk as Ċ Ġ* Ġ@ since Ġ 1 5 . 1 0 . 1 9 Ċ Ġ*/ Ċ internal Ġclass ĠRequest ( private Ġval Ġconfig : ĠCard market Api Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmethod : ĠMethod , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġpath : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġparams : ĠMap < String , Ġ*> Ġ= Ġempty Map < String , ĠString >(), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġbody : ĠNode ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġval Ġlogger : ĠLogger Ġ= ĠLog Manager . getLogger ( java Class ) ĊĠĠĠ Ġval Ġmapper : ĠObjectMapper Ġ= ĠObjectMapper (). register Kotlin Module () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure ( Deserialization Feature . FAIL _ ON _ UNKNOWN _ PROPERTIES , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enable ( Deserialization Feature . ACCEPT _ SINGLE _ VALUE _ AS _ ARRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. register Module ( Java Time Module ()) ĊĊĠĠĠ Ġfun Ġparams ( var arg Ġparams : ĠPair < String , Ġ* >) Ġ= Ġapply Ġ{ Ġthis . params Ġ= Ġparams . filter Ġ{ Ġit . second Ġ!= Ġnull Ġ}. toMap () Ġ} ĊĊĠĠĠ Ġfun Ġbody ( body : Ġ( Node . () Ġ-> ĠUnit )? ) Ġ= Ġapply Ġ{ Ġthis . body Ġ= Ġxml (" request ", Ġinit Ġ= Ġbody ) Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġsubmit () Ġ= Ġsubmit Ġ{ Ġmapper , Ġmap Ġ-> Ġmapper . convert Value ( map , Ġj ack son Type Ref < T >()) Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġsubmit ( response Key : ĠString ) Ġ= Ġsubmit Ġ{ Ġmapper , Ġmap Ġ-> Ġmapper . convert Value ( map [ response Key ], Ġj ack son Type Ref < T >()) Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġsubmit ( cross inline Ġresult Extractor : Ġ( ObjectMapper , ĠMap < String , ĠAny >) Ġ-> ĠT ?) Ġ= Ġperform Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap : ĠMap < String , ĠAny > Ġ= Ġmapper . readValue ( it , Ġj ack son Type Ref < Map < String , ĠAny >> ()) ĊĠĠĠĠĠĠĠ Ġif ( map . containsKey (" errors ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" errors : Ġ" Ġ+ Ġmap [" errors "]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( map . containsKey (" result ") Ġ&& Ġmap [" result "]. toString () Ġ!= Ġ" null " Ġ&& Ġmap [" result "]. toString () Ġ!= Ġ" [] ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" result : Ġ" Ġ+ Ġmap [" result "]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult Extractor . invoke ( mapper , Ġmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġperform ( result Extractor : Ġ( String ) Ġ-> ĠT ?): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠbaseUrl Ġ= Ġconfig . url Ġ+ Ġ"/ ws / v 2 . 0 / output . json /" Ġ+ Ġpath ; ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġif Ġ( params . isNotEmpty ()) Ġparams . entries . join ToString ( prefix Ġ= Ġ"$ baseUrl ?", Ġseparator Ġ= Ġ"& ") Ġ{ Ġ"${ it . key } =${ encode ( it . value . toString ()) }" Ġ} Ġelse ĠbaseUrl ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġresult ) Ġ= Ġmethod . fuel . invoke ( url ). also Ġ{ Ġrequest Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody ?. let Ġ{ Ġrequest . body ( to Xml ( it ), ĠChar sets . UTF _ 8 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}. header (" Authorization ", Ġcreate Oauth Header ( baseUrl , Ġmethod , Ġparams )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response String () ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Call : Ġ${ response [" X - Request - Limit - Count "] }/${ response [" X - Request - Limit - Max "] }") ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . fold ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . trace ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Extractor . invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . cause ?. cause Ġ! is ĠEOF Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Xml ( content : ĠNode ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"<? xml Ġversion =\" 1 . 0 \" Ġencoding =\" UTF - 8 \" Ġ?> \ n " Ġ+ Ġcontent . toString ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Oauth Header ( url : ĠString , Ġmethod : ĠMethod , ĠqueryParams : ĠMap < String , Ġ* >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġ"" Ġ+ Ġ( System . currentTimeMillis () Ġ/ Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġheader Params Ġ= Ġmap Of (" oauth _ consumer _ key " Ġto Ġconfig . app Token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" oauth _ token " Ġto Ġconfig . accessToken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" oauth _ nonce " Ġto Ġ"" Ġ+ ĠSystem . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" oauth _ timestamp " Ġto Ġtimestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" oauth _ signature _ method " Ġto Ġ" HMAC - SHA 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" oauth _ version " Ġto Ġ" 1 . 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" realm " Ġto Ġurl ). plus ( queryParams ). to Sorted Map () ĊĠĠĠĠĠĠĠ Ġval Ġparam String Ġ= Ġencode ( header Params . filter Ġ{ Ġit . key Ġ!= Ġ" realm " Ġ}. map Ġ{ Ġ"${ it . key } =${ encode ( it . value . toString ()) }" Ġ}. join ToString ("& ")) ĊĠĠĠĠĠĠĠ Ġval Ġmac Ġ= ĠMac . getInstance (" H mac SHA 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġsignature Key Ġ= Ġencode ( config . app Secret ) Ġ+ Ġ"& " Ġ+ Ġencode ( config . accessToken Secret ) ĊĠĠĠĠĠĠĠ Ġval Ġsecret Ġ= ĠSecret KeySpec ( signature Key . toByteArray (), Ġmac . algorithm ) ĊĠĠĠĠĠĠĠ Ġmac . init ( secret ) ĊĠĠĠĠĠĠĠ Ġheader Params [" oauth _ signature "] Ġ= ĠBase 6 4 . get Encoder (). encode ToString ( mac . do Final ("${ method . name }& ${ encode ( url )} & $ param String ". toByteArray ())) ĊĠĠĠĠĠĠĠ Ġval Ġauth Header Ġ= Ġ" OAuth Ġ" Ġ+ Ġheader Params . map Ġ{ Ġ"${ it . key } =\" ${ it . value }\ "" Ġ}. join ToString ( separator Ġ= Ġ", Ġ") ĊĠĠĠĠĠĠĠ Ġlogger . trace (" auth Header : Ġ$ auth Header ") ĊĠĠĠĠĠĠĠ Ġreturn Ġauth Header ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠMethod ( val Ġfuel : Ġ( String ) Ġ-> ĠRequest ) Ġ{ ĊĠĠĠ ĠGET ({ ĠF uel . get ( it ) Ġ}), ĊĠĠĠ ĠPUT ({ ĠF uel . put ( it ) Ġ}), ĊĠĠĠ ĠPOST ({ ĠF uel . post ( it ) Ġ}), ĊĠĠĠ ĠDELETE ({ ĠF uel . delete ( it ) Ġ}) Ċ } Ċ Ċ fun ĠNode . element ( name : ĠString , Ġvalue : ĠAny ) Ġ= Ġelement ( name , Ġvalue . toString ()) Ċ fun ĠNode . element ( name : ĠString , Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġelement ( name , Ġvalue ) Ċ } Ċ Ċ fun Ġencode ( s : ĠString ): ĠString Ġ= ĠURL Encoder . encode ( s , ĠChar sets . UTF _ 8 . name ()). replace ("+ ", Ġ"% 2 0 "). replace (" '", Ġ"% 2 7 ")