/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠK ouch lin ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . k ouch lin Ċ Ċ import Ġcom . github . kit tin un f . fuel . http Delete Ċ import Ġcom . github . kit tin un f . fuel . http Get Ċ import Ġcom . github . kit tin un f . fuel . http Head Ċ import Ġcom . github . kit tin un f . fuel . http Post Ċ import Ġcom . github . kit tin un f . fuel . http Put Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . k ouch lin . util .* Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ class ĠCouch Database Document ( val Ġdb : ĠCouch Database , Ġval Ġid : ĠString ? Ġ= Ġnull , Ġval Ġrev : ĠString ? Ġ= Ġnull ) Ġ{ ĊĊĠĠĠ Ġval Ġdocument URI Ġ= Ġ"${ db . dbName }/${ id . or Empty () }" ĊĊĠĠĠ Ġfun Ġexists ( etag : ĠString ? Ġ= Ġnull ): ĠTrip le < Int ?, ĠString ?, ĠSTATUS > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġconfigure Headers ( etag Ġ= Ġet ag ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġ_) Ġ= Ġdocument URI . http Head () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure Authentication ( db . server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. header ( headers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response () ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse E tag Ġ= Ġresponse . getHeader Value < String ? >( ET AG _ HEADER ) ĊĠĠĠĠĠĠĠ Ġval Ġcontent L enght Ġ= Ġresponse . getHeader Value < Int ? >( CONTENT _ LEN G HT _ HEADER ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( content L enght , Ġresponse E tag , Ġresponse . to Status ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġget ( attachment : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatt Encoding Info : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat ts Since : ĠList < String >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconflicts : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleted Conflict s : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlatest : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Seq : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Re vs : ĠList < String >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrev : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre vs : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre vs Info : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet ag : ĠString ? Ġ= Ġnull ): ĠTrip le < T ?, ĠString ?, ĠSTATUS > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġconfigure Headers ( etag Ġ= Ġet ag ) ĊĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġconfigure Parameters ( attachment Ġ= Ġattachment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatt Encoding Info Ġ= Ġatt Encoding Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat ts Since Ġ= Ġat ts Since , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconflicts Ġ= Ġconflicts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleted Conflict s Ġ= Ġdeleted Conflict s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlatest Ġ= Ġlatest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Seq Ġ= Ġlocal Seq , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Ġ= Ġmeta , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Re vs Ġ= Ġopen Re vs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrev Ġ= Ġrev , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre vs Ġ= Ġre vs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre vs Info Ġ= Ġre vs Info ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġdocument URI . http Get ( parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure Authentication ( db . server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. header ( headers ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġresult ) Ġ= Ġwhen Ġ( T :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java Ġ-> Ġrequest . response String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġrequest . response Object ( C ouch DB . adapter . deserialize ( T :: class . java )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse E tag Ġ= Ġresponse . getHeader Value < String ? >( ET AG _ HEADER ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( result . component 1 () Ġas ĠT ?, Ġresponse E tag , Ġresponse . to Status ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave With Post ( batch : ĠBoolean ? Ġ= Ġnull , Ġcontent : ĠAny ): ĠTrip le < Save Response ?, ĠString ?, ĠSTATUS > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġconfigure Headers ( contentType Ġ= ĠAP PLICATION _ JSON ) ĊĠĠĠĠĠĠĠ Ġval ĠqueryString Ġ= Ġconfigure Parameters ( batch Ġ= Ġbatch ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. encode QueryString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġif Ġ( it . isNotEmpty ()) Ġ"? $ it " Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdb Uri With Params Ġ= Ġ"${ db . dbName }$ queryString " ĊĠĠĠĠĠĠĠ Ġval Ġ( doc Id , Ġdoc Rev , Ġjson Content ) Ġ= ĠCouch DB . adapter . delete Document Id Rev ( content ) ĊĠĠĠĠĠĠĠ Ġdoc Id ?. let Ġ{ Ġlogger . warn (" Doc Ġrev Ġ$ doc Id Ġis Ġignored ") Ġ} ĊĠĠĠĠĠĠĠ Ġdoc Rev ?. let Ġ{ Ġlogger . warn (" Doc Ġrev Ġ$ doc Rev Ġis Ġignored ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( request , Ġresponse , Ġresult ) Ġ= Ġdb Uri With Params . http Post () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure Authentication ( db . server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. header ( headers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( json Content !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response Object ( C ouch DB . adapter . deserialize ( Save Response :: class . java )) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse E tag Ġ= Ġresponse . getHeader Value < String ? >( ET AG _ HEADER ) ĊĠĠĠĠĠĠĠ Ġlogger . info ( request . c Url String ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( result . component 1 (), Ġresponse E tag , Ġresponse . to Status ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave With Put ( rev : ĠString ? Ġ= Ġnull , Ġbatch : ĠBoolean ? Ġ= Ġnull , Ġnew Ed its : ĠBoolean ? Ġ= Ġnull , Ġcontent : ĠAny ): ĠTrip le < Save Response ?, ĠString ?, ĠSTATUS > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġconfigure Headers ( contentType Ġ= ĠAP PLICATION _ JSON ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( doc Id , Ġdoc Rev , Ġjson Content ) Ġ= ĠCouch DB . adapter . delete Document Id Rev ( content ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( doc Id Ġ== Ġnull Ġ&& Ġid Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Document Ġid Ġshould Ġbe Ġprovided ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( doc Id Ġ!= Ġnull Ġ&& Ġid Ġ!= Ġnull Ġ&& Ġid Ġ!= Ġdoc Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Document ĠId Ġ$ doc Id Ġincluded Ġin Ġthe Ġdocument Ġis Ġoverridden Ġby Ġparameter Ġ$ id ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠqueryString Ġ= Ġconfigure Parameters ( rev Ġ= Ġrev Ġ?: Ġdoc Rev , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbatch Ġ= Ġbatch , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ed its Ġ= Ġnew Ed its ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. encode QueryString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġif Ġ( it . isNotEmpty ()) Ġ"? $ it " Ġelse Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Uri With Params Ġ= Ġ"${ db . dbName }/${ ( id Ġ?: Ġdoc Id ). or Empty ()} $ queryString " ĊĠĠĠĠĠĠĠ Ġval Ġ( request , Ġresponse , Ġresult ) Ġ= Ġdocument Uri With Params . http Put () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure Authentication ( db . server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. header ( headers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( json Content !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response Object ( C ouch DB . adapter . deserialize ( Save Response :: class . java )) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse E tag Ġ= Ġresponse . getHeader Value < String ? >( ET AG _ HEADER ) ĊĠĠĠĠĠĠĠ Ġlogger . info ( request . c Url String ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( result . component 1 (), Ġresponse E tag , Ġresponse . to Status ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave ( rev : ĠString ? Ġ= Ġnull , Ġbatch : ĠBoolean ? Ġ= Ġnull , Ġnew Ed its : ĠBoolean ? Ġ= Ġnull , Ġcontent : ĠAny ): ĠTrip le < Save Response ?, ĠString ?, ĠSTATUS > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( doc Id , Ġ_, Ġ_) Ġ= ĠCouch DB . adapter . find Document Id Rev ( content ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( id Ġ!= Ġnull Ġ|| Ġdoc Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave With Put ( rev , Ġbatch , Ġnew Ed its , Ġcontent ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave With Post ( batch , Ġcontent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete ( rev : ĠString , Ġbatch : ĠBoolean ? Ġ= Ġnull , Ġfull Commit : ĠBoolean ? Ġ= Ġnull ): ĠTrip le < Save Response ?, ĠString ?, ĠSTATUS > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġconfigure Headers ( full Commit Ġ= Ġfull Commit ) ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġconfigure Parameters ( rev Ġ= Ġrev , Ġbatch Ġ= Ġbatch ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġresult ) Ġ= Ġdocument URI . http Delete ( parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. configure Authentication ( db . server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. header ( headers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response Object ( C ouch DB . adapter . deserialize ( Save Response :: class . java )) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse E tag Ġ= Ġresponse . getHeader Value < String ? >( ET AG _ HEADER ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( result . component 1 (), Ġresponse E tag , Ġresponse . to Status ()) ĊĠĠĠ Ġ} Ċ Ċ // ĠCopy Ġis Ġa Ġnon - standard Ġmethod Ġin ĠHTTP Ġthat Ġis Ġnot Ġsupported Ġby ĠF UE L Ġlibrary Ċ // ĉ fun Ġcopy ( destination : ĠString , Ġrev : ĠString ? Ġ= Ġnull , Ġbatch : ĠBoolean ? Ġ= Ġnull , Ġfull Commit : ĠBoolean ? Ġ= Ġnull ): ĠTrip le < Save Response ?, ĠString ?, ĠSTATUS > Ġ{ ĉ Ċ // ĉ ĉ Fuel . request (" COPY ", ) Ċ // ĉ } ĊĊĠĠĠ Ġfun Ġattachment ( name : ĠString ) Ġ= ĠCouch Database Doc Attachment ( db , Ġthis , Ġname ) Ċ }