package Ġcom . ray br it ton . json query . tools Ċ Ċ import Ġcom . ray br it ton . json query . RuntimeException Ċ import Ġcom . ray br it ton . json query . ext . copy Without First Ċ import Ġcom . ray br it ton . json query . ext . copy Without Last Ċ import Ġcom . ray br it ton . json query . ext . to Path Ċ import Ġcom . ray br it ton . json query . ext . to Segments Ċ import Ġcom . ray br it ton . json query . models . JsonArray Ċ import Ġcom . ray br it ton . json query . models . JsonObject Ċ import Ġcom . ray br it ton . json query . models . Query Ċ import Ġcom . ray br it ton . json query . models . Select Projection Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠMethods Ġin Ġthis Ġfile Ġupdate Ġthe Ġobject Ġthey Ġare Ġcalled Ġinstead Ġof Ġreturning Ġa Ġnew Ġversion Ċ Ġ*/ Ċ internal Ġfun ĠAny ?. rewrite ( query : ĠQuery ) Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġreturn ĊĠĠĠ Ġif Ġ( query . select ?. projection Ġ== Ġnull ) Ġreturn ĊĊĠĠĠ Ġval Ġprojection Ġ= Ġquery . select . projection ĊĠĠĠ Ġwhen Ġ( projection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠSelect Projection . Single Field Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( projection . new Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( projection . field , Ġprojection . new Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSelect Projection . Multiple Fields Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojection . fields . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . second Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( it . first , Ġit . second !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠAny . rename ( segments : ĠList < String >, ĠnewName : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġkey Ġ= Ġsegments . last () ĊĠĠĠ Ġval Ġpath Ġ= Ġsegments . copy Without Last () ĊĠĠĠ Ġval Ġcontainer Ġ= Ġthis . navigate To Target ( path . join ToString (". ")) ĊĠĠĠ Ġwhen Ġ( container ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠJsonObject Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer [ new Name ] Ġ= Ġcontainer [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . remove ( key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠJson Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . filter Ġ{ Ġit Ġis ĠJsonObject Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġit Ġas ĠJsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement [ new Name ] Ġ= Ġelement [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Alias ing Ġ$ key Ġto Ġ$ new Name Ġis Ġnot Ġpossible Ġas Ġ${ container . java Class } Ġis Ġnot Ġin Ġan Ġobject ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠAny . create Path ( new : ĠList < String >) Ġ{ ĊĠĠĠ Ġif Ġ( new . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsegment Ġ= Ġnew [ 0 ] ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠJsonObject Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this [ segment ] Ġ! is ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ segment ] Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ segment ] !!. create Path ( new . copy Without First ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠJson Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . create Path ( new . copy Without First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Unable Ġto Ġrename Ġto Ġ${ new . join ToString (". ")}, Ġencountered : Ġ${ this . java Class }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠAny . move ( old : ĠList < String >, Ġnew : ĠList < String >) Ġ{ ĊĠĠĠ Ġval Ġkey Ġ= Ġold . last () ĊĠĠĠ Ġval Ġold Segments Ġ= Ġold . copy Without Last () ĊĠĠĠ Ġval Ġold Container Ġ= Ġthis . navigate To Target ( old Segments . to Path ()) ĊĠĠĠ Ġwhen Ġ( old Container ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠJsonObject Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġold Container . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Container . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Segments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġthis . navigate To Target ( old Segments . copy Without Last (). to Path ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJsonObject Ġ-> Ġparent . remove ( old Segments . last ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJson Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Parent Ġwas Ġa Ġvalue : Ġ$ parent Ġ(${ parent . java Class }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Path ( new ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Container Ġ= Ġthis . navigate To Target ( new . copy Without Last (). to Path ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Container Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Container [ new . last ()] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" create Path () Ġdidn 't Ġforce Ġtarget Ġto ĠJsonObject ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . remove E mpt ies () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠJson Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠArray Deque ( old Container . filter Ġ{ Ġit Ġis ĠJsonObject Ġ}. map Ġ{ Ġ( it Ġas ĠJsonObject ). remove ( key ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠJson Array ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġvalues . size ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . size Ġ< Ġit Ġ-> Ġthis . add ( JsonObject ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ it ] Ġ! is ĠJsonObject Ġ-> Ġthis [ it ] Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . filter Ġ{ Ġit Ġis ĠJsonObject Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit !!. create Path ( new ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Container Ġ= Ġit . navigate To Target ( new . copy Without Last (). to Path ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Container Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Container [ new . last ()] Ġ= Ġvalues . poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" create Path () Ġdidn 't Ġforce Ġtarget Ġto ĠJsonObject : Ġ${ new Container . java Class }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( this Ġis ĠJsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ new . last ()] Ġ= ĠJson Array ( values ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Path ( new ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . navigate To Target ( new . copy Without Last (). to Path ()) Ġas ĠJsonObject )[ new . last ()] Ġ= ĠJson Array ( values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . remove E mpt ies () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Alias ing Ġ$ key Ġto Ġ${ new . last ()} Ġis Ġnot Ġpossible Ġas Ġ${ old Container . java Class } Ġis Ġnot Ġin Ġan Ġobject ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠAny ?. remove E mpt ies () Ġ{ ĊĠĠĠ Ġval ĠisEmpty : Ġ( Any ?) Ġ-> ĠBoolean Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġ(( it Ġas ? ĠJson Array )?. isEmpty () Ġ== Ġtrue ) Ġ|| Ġ(( it Ġas ? ĠJsonObject )?. isEmpty () Ġ== Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠJson Array Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġthis . list Iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isEmpty ( element )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . remove E mpt ies () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isEmpty ( element )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠJsonObject Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġthis . keys . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isEmpty ( this [ key ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () Ġ// call Ġiterator . remove () Ġbefore Ġto Ġstop ĠConcurrent Modification Exception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ key ]. remove E mpt ies () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isEmpty ( this [ key ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠAny . update ( field : ĠString , ĠnewName : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġcurrent Path Ġ= Ġfield . to Segments () ĊĠĠĠ Ġval Ġnew Path Ġ= ĠnewName . to Segments () ĊĊĠĠĠ Ġif Ġ( current Path . copy Without Last () Ġ== Ġnew Path . copy Without Last ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġrename ( current Path , Ġnew Path . last ()) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġmove ( current Path , Ġnew Path ) ĊĠĠĠ Ġ} Ċ }