package Ġio . ge or ocket . og cap if eature s Ċ Ċ import Ġio . ge or ocket . constants . Config Constants Ċ import Ġio . ge or ocket . http . Endpoint Ċ import Ġio . ge or ocket . index . Index Ċ import Ġio . ge or ocket . index . Indexer Factory Ċ import Ġio . ge or ocket . index . Meta Indexer Factory Ċ import Ġio . ge or ocket . index . mongodb . MongoDB Index Ċ import Ġio . ge or ocket . output . Multi Mer ger Ċ import Ġio . ge or ocket . query . Default Query Compiler Ċ import Ġio . ge or ocket . storage . Store Ċ import Ġio . ge or ocket . storage . Store Factory Ċ import Ġio . ge or ocket . util . HttpException Ċ import Ġio . ge or ocket . util . Path Utils Ċ import Ġio . vertx . core . Vert x Ċ import Ġio . vertx . core . http . HttpServer Response Ċ import Ġio . vertx . core . json . JsonObject Ċ import Ġio . vertx . ext . web . Router Ċ import Ġio . vertx . ext . web . Routing Context Ċ import Ġio . vertx . ext . web . handler . Body Handler Ċ import Ġio . vertx . kotlin . core . json . json ArrayOf Ċ import Ġio . vertx . kotlin . core . json . jsonObject Of Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . toList Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . apache . commons . text . String Escape Utils . escape Java Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . net . URL Encoder Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ /** Ċ Ġ* ĠAn Ġendpoint Ġto Ġmaintain Ġcollections Ċ Ġ* Ġ@ author ĠM ic hel ĠK ra em er Ċ Ġ*/ Ċ class ĠCollections Endpoint ( override Ġval Ġcoroutine Context : ĠCor outine Context , ĊĠĠĠ Ġprivate Ġval Ġvert x : ĠVert x ) Ġ: ĠEndpoint , ĠCor outine Scope Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Collections Endpoint :: class . java ) ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠFLOAT _ REGEX _ STR Ġ= Ġ""" [- + ]? [ 0 - 9 ]* \. ?[ 0 - 9 ]+ ([ e E ][ -+ ]? [ 0 - 9 ]+ )? """ ĊĠĠĠ Ġprivate Ġconst Ġval ĠB BOX _ REGEX _ STR Ġ= Ġ"$ FLOAT _ REGEX _ STR ,$ FLOAT _ REGEX _ STR ,$ FLOAT _ REGEX _ STR ,$ FLOAT _ REGEX _ STR " ĊĠĠĠ Ġprivate Ġval ĠB BOX _ REGEX Ġ= ĠB BOX _ REGEX _ STR . to Regex () ĊĠ Ġ} ĊĊĠ Ġprivate Ġlateinit Ġvar Ġconfig : ĠJsonObject ĊĠ Ġprivate Ġlateinit Ġvar Ġstore : ĠStore ĊĠ Ġprivate Ġlateinit Ġvar Ġindex : ĠIndex ĊĊĠ Ġoverride Ġsuspend Ġfun Ġcreate Router (): ĠRouter Ġ{ ĊĠĠĠ Ġconfig Ġ= Ġvert x . or Create Context . config () ĊĠĠĠ Ġstore Ġ= ĠStore Factory . create Store ( vertx ) ĊĠĠĠ Ġindex Ġ= ĠMongoDB Index . create ( vertx ) ĊĊĠĠĠ Ġval Ġrouter Ġ= ĠRouter . router ( vertx ) ĊĠĠĠ Ġrouter . get ("/ "). handler (:: on GetAll ) ĊĠĠĠ Ġrouter . get ("/ : name "). handler (:: on Get ) ĊĠĠĠ Ġval Ġpost MaxSize Ġ= Ġconfig . getLong ( Config Constants . HTTP _ POST _ MAX _ SIZE , Ġ- 1 L ) ĊĠĠĠ Ġrouter . post ("/ "). handler ( Body Handler . create (). set Body Limit ( post MaxSize )). handler (:: on Post ) ĊĠĠĠ Ġrouter . delete ("/ : name "). handler (:: onDelete ) ĊĊĠĠĠ Ġrouter . get ("/ : name / items "). handler (:: on Get Items ) ĊĠĠĠ Ġrouter . get ("/ : name / items /: id "). handler (:: on GetItem ById ) ĊĊĠĠĠ Ġreturn Ġrouter ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġclose () Ġ{ ĊĠĠĠ Ġstore . close () ĊĠĠĠ Ġindex . close () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcompile Query ( search : ĠString ?, Ġpath : ĠString ): ĠJsonObject Ġ{ ĊĠĠĠ Ġreturn ĠDefault Query Compiler ( Meta Indexer Factory . ALL Ġ+ ĠIndex er Factory . ALL ) ĊĠĠĠĠĠ Ġ. compile Query ( search Ġ?: Ġ"", Ġpath ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġitem ToJson ( name : ĠString , Ġpath : ĠString ): ĠJsonObject Ġ{ ĊĠĠĠ Ġreturn ĠjsonObject Of ( ĊĠĠĠĠĠ Ġ" name " Ġto Ġname , ĊĠĠĠĠĠ Ġ" links " Ġto Ġjson ArrayOf ( ĊĠĠĠĠĠĠĠ ĠjsonObject Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" href " Ġto ĠPath Utils . join ( path , Ġ" items "), ĊĠĠĠĠĠĠĠĠĠ Ġ" rel " Ġto Ġ" item ", ĊĠĠĠĠĠĠĠĠĠ Ġ" type " Ġto Ġ" application / gml + xml " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġon GetAll ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠ Ġval Ġrequest Ġ= Ġctx . request () ĊĠĠĠ Ġval Ġresponse Ġ= Ġctx . response () ĊĊĠĠĠ Ġresponse . put Header (" content - type ", Ġ" application / json ") ĊĊĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠjsonObject Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" links " Ġto Ġjson ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" href " Ġto Ġrequest . path (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" rel " Ġto Ġ" self ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" type " Ġto Ġ" application / json ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" title " Ġto Ġ" this Ġdocument " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠ Ġ" collections " Ġto Ġindex . get Collections (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem ToJson ( it , ĠPath Utils . join ( request . path (), Ġit )) Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġresponse . end ( r . encode ()) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEndpoint . fail ( response , Ġt ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġon Post ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠ Ġval Ġresponse Ġ= Ġctx . response () ĊĠĠĠ Ġval Ġbody Ġ= Ġctx . body As Json ĊĠĠĠ Ġval Ġname Ġ= Ġbody . getString (" name ") ĊĊĠĠĠ Ġif Ġ( name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠĠĠ Ġ. set StatusCode ( 4 0 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġ. end (" JSON Ġobject Ġmust Ġhave Ġa Ġname .") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index . exists Collection ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠHttp Exception ( 4 0 9 , Ġ" A Ġcollection Ġwith Ġthis Ġname Ġalready Ġexists ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġindex . add Collection ( name ) ĊĠĠĠĠĠĠĠ Ġresponse . set StatusCode ( 2 0 4 ). end () ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEndpoint . fail ( response , Ġt ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġon Get ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠ Ġval Ġresponse Ġ= Ġctx . response () ĊĊĠĠĠ Ġval Ġname Ġ= Ġctx . path Param (" name ") ĊĠĠĠ Ġif Ġ( name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠ Ġ. set StatusCode ( 4 0 0 ) ĊĠĠĠĠĠĠĠ Ġ. end (" No Ġcollection Ġname Ġgiven .") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexists Ġ= Ġindex . exists Collection ( name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( exists ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Header (" content - type ", Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set StatusCode ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end ( item ToJson ( name , Ġctx . request (). path ()). encode ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠHttp Exception ( 4 0 4 , Ġ" The Ġcollection Ġ`$ name ' Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEndpoint . fail ( response , Ġt ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠonDelete ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠ Ġval Ġresponse Ġ= Ġctx . response () ĊĊĠĠĠ Ġval Ġname Ġ= Ġctx . path Param (" name ") ĊĠĠĠ Ġif Ġ( name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠ Ġ. set StatusCode ( 4 0 0 ) ĊĠĠĠĠĠĠĠ Ġ. end (" No Ġcollection Ġname Ġgiven .") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdelete Ġchunks Ġin Ġthe Ġgiven Ġlayer Ġin Ġindex Ġand Ġstore ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġcompile Query ( null , Ġ"/ $ name ") ĊĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= Ġindex . get Paths ( query ) ĊĠĠĠĠĠĠĠ Ġstore . delete ( paths ) ĊĠĠĠĠĠĠĠ Ġindex . delete ( query ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġdelete Ġcollection ĊĠĠĠĠĠĠĠ Ġindex . delete Collection ( name ) ĊĊĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠĠĠ Ġ. set StatusCode ( 2 0 4 ) Ġ// ĠNo ĠContent ĊĠĠĠĠĠĠĠĠĠ Ġ. end () ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEndpoint . fail ( response , Ġt ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġprocess Query ( search : ĠString , Ġname : ĠString , Ġresponse : ĠHttp Server Response ) Ġ{ ĊĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠ Ġresponse . is Chunk ed Ġ= Ġtrue ĊĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġcompile Query ( search , Ġ"/ $ name ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġinitialize Ġmer ger ĊĠĠĠĠĠĠĠ Ġval Ġmer ger Ġ= ĠMulti Mer ger ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġdistinct Met as Ġ= Ġindex . get Distinct Meta ( query ) ĊĠĠĠĠĠĠĠ Ġdistinct Met as . collect Ġ{ Ġmer ger . init ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġaccepted Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġnot accepted Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġval Ġmet as Ġ= Ġindex . get Meta ( query ) ĊĠĠĠĠĠĠĠ Ġmet as . collect Ġ{ Ġchunk Meta Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= Ġstore . getOne ( chunk Meta . first ) ĊĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmer ger . merge ( chunk , Ġchunk Meta . second , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccepted ++ ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChunk Ġcannot Ġbe Ġmerged . Ġmaybe Ġit 's Ġa Ġnew Ġone Ġthat Ġhas ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbeen Ġadded Ġafter Ġthe Ġmer ger Ġwas Ġinitialized . ĠJust ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġit , Ġbut Ġemit Ġa Ġwarning Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot accepted ++ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( not accepted Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Could Ġnot Ġmerge Ġ$ not accepted Ġchunks .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( accepted Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmer ger . finish ( response ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" Not ĠFound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresponse . end () ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġ! is ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlog . error (" Could Ġnot Ġperform Ġquery ", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠEndpoint . fail ( response , Ġt ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠGet Ġitems Ġfrom Ġa Ġcollection ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġon Get Items ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠ Ġval Ġresponse Ġ= Ġctx . response () ĊĊĠĠĠ Ġval Ġname Ġ= Ġctx . path Param (" name ") ĊĠĠĠ Ġif Ġ( name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠ Ġ. set StatusCode ( 4 0 0 ) ĊĠĠĠĠĠĠĠ Ġ. end (" No Ġcollection Ġname Ġgiven .") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ġrespect Ġ' limit ' Ġparameter ĊĠĠĠ Ġvar Ġlimit Ġ= Ġ 1 0 ĊĠĠĠ Ġval Ġsearch Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġ// Ġtranslate Ġparams Ġto ĠGeo Rocket Ġquery ĊĠĠĠ Ġctx . queryParams (). forEach Ġ{ Ġe Ġ-> ĊĠĠĠĠĠ Ġval Ġkey Ġ= Ġe . key ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġe . value ĊĠĠĠĠĠ Ġwhen Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" bbox " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( B BOX _ REGEX Ġmatches Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Ġ+= Ġ"\" ${ escape Java ( value )}\ "" ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set StatusCode ( 4 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end (" Parameter Ġ` bbox ' Ġmust Ġcontain Ġfour Ġfloating Ġpoint Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" numbers Ġseparated Ġby Ġa Ġcomma ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" limit " Ġ-> Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġvalue . toInt () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set StatusCode ( 4 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. end (" Parameter Ġ` limit ' Ġmust Ġbe Ġa Ġnumber ") ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsearch . add (" EQ (\" ${ escape Java ( key )} \" Ġ\" ${ escape Java ( value )}\ ") ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġjoined Search Ġ= Ġif Ġ( search . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġ"" ĊĠĠĠ Ġ} Ġelse Ġif Ġ( search . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġsearch . first () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ" AND (${ search . join ToString (" Ġ") })" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprocess Query ( joined Search , Ġname , Ġresponse ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠGet Ġa Ġsingle Ġitem Ġfrom Ġa Ġcollection Ġby Ġits ĠID ĊĠĠ Ġ* Ġ@ param Ġctx Ġthe Ġcurrent Ġrouting Ġcontext ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġon GetItem ById ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠ Ġval Ġresponse Ġ= Ġctx . response () ĊĊĠĠĠ Ġval Ġname Ġ= Ġctx . path Param (" name ") ĊĠĠĠ Ġif Ġ( name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠ Ġ. set StatusCode ( 4 0 0 ) ĊĠĠĠĠĠĠĠ Ġ. end (" No Ġcollection Ġname Ġgiven .") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġid Ġ= Ġctx . path Param (" id ") ĊĠĠĠ Ġif Ġ( id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠĠĠ Ġ. set StatusCode ( 4 0 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġ. end (" No Ġfeature Ġid Ġgiven .") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġencoded Id Ġ= ĠURL Encoder . encode ( id , Ġ" UTF - 8 ") ĊĠĠĠ Ġprocess Query (" EQ ( gml Id Ġ$ encoded Id )", Ġname , Ġresponse ) ĊĠ Ġ} Ċ } Ċ