// ĠCopyright Ġ( c ) Ġ 2 0 2 0 - 2 0 2 1 ĠDrag on K night Of B reeze ĠWin dea Ċ // ĠB reeze Ġis Ġblow ing ... Ċ Ċ @ file : Suppress (" UN CHECK ED _ CAST ") Ċ Ċ package Ġic u . win dea . b reeze framework . core . component Ċ Ċ import Ġic u . win dea . b reeze framework . core . extension .* Ċ Ċ // path Matcher Ġ*. kt Ċ // https :// docs . oracle . com / javase / 8 / docs / api / java / nio / file / FileSystem . html # getPath Matcher - java . lang . String - Ċ Ċ /** Ċ Ġ* Ġ è·¯å¾Ħ æł¼å¼ı ãĢĤ Ċ Ġ* Ċ Ġ* Ġ è·¯å¾Ħ æł¼å¼ı çĶ¨äºİ è¡¨ç¤º æŁ¥è¯¢ å¯¹è±¡ åľ¨ åħ¶ ç»ĵæŀĦ ä¸ŃçļĦ ä½įç½® ï¼Į åı¯ä»¥ åĮħåĲ« å¤ļä¸ª åħĥ è·¯å¾Ħ åĴĮ åıĺéĩı ï¼Į åı¯ä»¥ çĶ¨äºİ åĮ¹éħį åĴĮ æŁ¥è¯¢ ãĢĤ Ċ Ġ*/ Ċ interface ĠPath Format Ġ: ĠComponent Ġ{ Ċ ĉ /** Ċĉ Ġ* Ġ æłĩåĩĨ åĮĸ æĮĩå®ļçļĦ è·¯å¾Ħ ãĢĤ å°Ĩ ä¼ļ åİ» éĻ¤ åħ¶ ä¸ŃçļĦ ç©º çĻ½ ä»¥åıĬ å°¾ éļı çļĦ åĪĨ éļĶ ç¬¦ ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġnormalize ( path : ĠString ): ĠString ĊĊ ĉ /** Ċĉ Ġ* ĠåĪ¤æĸŃ æĮĩå®ļçļĦ åŃĹç¬¦ä¸² æĺ¯åĲ¦ åĮ¹éħį æĮĩå®ļçļĦ è·¯å¾Ħ ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġmatches ( value : ĠString , Ġpath : ĠString ): ĠBoolean ĊĊ ĉ /** Ċĉ Ġ* Ġ è§£æŀĲ è·¯å¾Ħ åıĺéĩı ãĢĤ å¦Ĥæŀľ è·¯å¾Ħ ä¸į åĮ¹éħį ï¼Į åĪĻ è¿ĶåĽŀ ç©º ç»ĵæŀľ ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġresolve Variables ( value : ĠString , Ġpath : ĠString ): ĠMap < String , ĠString > ĊĊ ĉ /** Ċĉ Ġ* Ġå°Ĩ æĮĩå®ļçļĦ åŃĹç¬¦ä¸² åĪĨ éļĶ æĪĲ åħĥ è·¯å¾Ħ åĪĹè¡¨ ï¼Į å¹¶ è¿ĩæ»¤ ç©º çļĦ åħĥ è·¯å¾Ħ ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġsplit ( path : ĠString ): ĠList < String > ĊĊ ĉ /** Ċĉ Ġ* Ġå°Ĩ æĮĩå®ļçļĦ åŃĹç¬¦ä¸² åĪĨ éļĶ æĪĲ åħĥ è·¯å¾Ħ åºıåĪĹ ï¼Į å¹¶ è¿ĩæ»¤ ç©º çļĦ åħĥ è·¯å¾Ħ ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġsplit To Sequence ( path : ĠString ): ĠSequence < String > ĊĊ ĉ /** Ċĉ Ġ* Ġå°Ĩ åħĥ è·¯å¾Ħ æķ°ç»Ħ ç»ĦåĲĪ æĪĲ å®Įæķ´ è·¯å¾Ħ ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġjoin ToString ( meta Paths : ĠArray < String >): ĠString ĊĊ ĉ /** Ċĉ Ġ* Ġå°Ĩ åħĥ è·¯å¾Ħ åĪĹè¡¨ ç»ĦåĲĪ æĪĲ å®Įæķ´ è·¯å¾Ħ ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġjoin ToString ( meta Paths : ĠIterable < String >): ĠString ĊĊ ĉ /** Ċĉ Ġ* Ġå°Ĩ åħĥ è·¯å¾Ħ åºıåĪĹ ç»ĦåĲĪ æĪĲ å®Įæķ´ è·¯å¾Ħ ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġjoin ToString ( meta Paths : ĠSequence < String >): ĠString ĊĊ ĉ /** Ċĉ Ġ* Ġæł¹æį® æĮĩå®ļ è·¯å¾Ħ æŁ¥è¯¢ æŁ¥è¯¢ å¯¹è±¡ ï¼Į è¿ĶåĽŀ æŁ¥è¯¢ ç»ĵæŀľ åĪĹè¡¨ ãĢĤ Ċĉ Ġ* Ġå¦Ĥæŀľ æĮĩå®ļ è·¯å¾Ħ ä¸ºç©º è·¯å¾Ħ ï¼Į åĪĻ è¿ĶåĽŀ æŁ¥è¯¢ å¯¹è±¡çļĦ åįķ ä¾ĭ åĪĹè¡¨ ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġ< T > Ġquery ( value : ĠAny , Ġpath : ĠString ): ĠList < T > ĊĊ ĉ /** Ċĉ Ġ* Ġæł¹æį® æĮĩå®ļ è·¯å¾Ħ æŁ¥è¯¢ æŁ¥è¯¢ å¯¹è±¡ ï¼Į å¾ĹåĪ° é¦ĸ ä¸ª åĮ¹éħį çļĦåĢ¼ ï¼Į æĪĸèĢħ æĬĽ åĩº å¼Ĥå¸¸ ãĢĤ Ċĉ Ġ* Ġå¦Ĥæŀľ æĮĩå®ļ è·¯å¾Ħ ä¸ºç©º è·¯å¾Ħ ï¼Į åĪĻ è¿ĶåĽŀ æŁ¥è¯¢ å¯¹è±¡ æľ¬ èº« ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġ< T > Ġget ( value : ĠAny , Ġpath : ĠString ): ĠT ĊĊ ĉ /** Ċĉ Ġ* Ġæł¹æį® æĮĩå®ļ è·¯å¾Ħ æŁ¥è¯¢ æŁ¥è¯¢ å¯¹è±¡ ï¼Į å¾ĹåĪ° é¦ĸ ä¸ª åĮ¹éħį çļĦåĢ¼ ï¼Į æĪĸèĢħ è¿ĶåĽŀ null ãĢĤ Ċĉ Ġ* Ġå¦Ĥæŀľ æĮĩå®ļ è·¯å¾Ħ ä¸ºç©º è·¯å¾Ħ ï¼Į åĪĻ è¿ĶåĽŀ æŁ¥è¯¢ å¯¹è±¡ æľ¬ èº« ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġ< T > Ġget OrNull ( value : ĠAny , Ġpath : ĠString ): ĠT ? ĊĊ ĉ /** Ċĉ Ġ* Ġæł¹æį® æĮĩå®ļ è·¯å¾Ħ æŁ¥è¯¢ æŁ¥è¯¢ å¯¹è±¡ ï¼Į å¾ĹåĪ° é¦ĸ ä¸ª åĮ¹éħį çļĦåĢ¼ ï¼Į æĪĸèĢħ è¿ĶåĽŀ é»ĺè®¤ åĢ¼ ãĢĤ Ċĉ Ġ* Ġå¦Ĥæŀľ æĮĩå®ļ è·¯å¾Ħ ä¸ºç©º è·¯å¾Ħ ï¼Į åĪĻ è¿ĶåĽŀ æŁ¥è¯¢ å¯¹è±¡ æľ¬ èº« ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġ< T > Ġget OrDefault ( value : ĠAny , Ġpath : ĠString , ĠdefaultValue : ĠT ): ĠT ĊĊ ĉ /** Ċĉ Ġ* Ġæł¹æį® æĮĩå®ļ è·¯å¾Ħ æŁ¥è¯¢ æŁ¥è¯¢ å¯¹è±¡ ï¼Į å¾ĹåĪ° é¦ĸ ä¸ª åĮ¹éħį çļĦåĢ¼ ï¼Į æĪĸèĢħ è¿ĶåĽŀ é»ĺè®¤ åĢ¼ ãĢĤ Ċĉ Ġ* Ġå¦Ĥæŀľ æĮĩå®ļ è·¯å¾Ħ ä¸ºç©º è·¯å¾Ħ ï¼Į åĪĻ è¿ĶåĽŀ æŁ¥è¯¢ å¯¹è±¡ æľ¬ èº« ãĢĤ Ċĉ Ġ*/ Ċ ĉ fun Ġ< T > Ġget OrElse ( value : ĠAny , Ġpath : ĠString , ĠdefaultValue : Ġ() Ġ-> ĠT ): ĠT ĊĊ ĉ override Ġfun Ġcomponent Copy ( component Params : ĠMap < String , ĠAny ?> ): ĠPath Format Ġ{ Ċĉ ĉ throw ĠUnsupportedOperationException (" Cannot Ġcopy Ġcomponent Ġof Ġtype : Ġ${ java Class . name }. ") Ċ ĉ } Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ abstract Ġclass ĠAbstract Path Format ( Ċ ĉ protected Ġval Ġdelimiter : ĠChar Ġ= Ġ'/', Ċ ĉ protected Ġval Ġprefix : ĠString Ġ= Ġ"/", Ċ ĉ protected Ġval Ġvariable Prefix : ĠChar Ġ= Ġ'{ ', Ċ ĉ protected Ġval Ġvariable Suffix : ĠChar ? Ġ= Ġ' }', Ċ ) Ġ: ĠPath Format Ġ{ Ċ ĉ private Ġval Ġdelimiter String : ĠString Ġ= Ġdelimiter . toString () ĊĊ ĉ override Ġfun Ġnormalize ( path : ĠString ): ĠString Ġ{ Ċĉ ĉ return Ġbuild String Ġ{ Ċĉĉ ĉ for ( char Ġin Ġpath . trim ()) Ġ{ Ċĉĉĉ ĉ if (! char . is Whitespace ()) Ġappend ( char ) Ċĉĉ ĉ } Ċĉ ĉ }. trim End ( delimiter ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġmatches ( value : ĠString , Ġpath : ĠString ): ĠBoolean Ġ{ Ċĉ ĉ // NOTE Ġ éģįåİĨ å¹¶ æ¯Ķè¾ĥ ä¸¤ä¸ª åŃĹç¬¦ä¸² ä¸ŃçļĦ åŃĹç¬¦ ä»¥ ä¼ĺåĮĸ æĢ§èĥ½ Ċĉ ĉ var Ġpath Index Ġ= Ġ 0 Ċĉ ĉ var Ġvalue Index Ġ= Ġ 0 Ċĉ ĉ val Ġlast Path Index Ġ= Ġpath . last Index Ċĉ ĉ val Ġlast Value Index Ġ= Ġvalue . last Index Ċĉ ĉ while ( path Index Ġ<= Ġlast Path Index Ġ&& Ġvalue Index Ġ<= Ġlast Value Index ) Ġ{ Ċĉĉ ĉ val Ġpath Char Ġ= Ġpath [ path Index ] Ċĉĉ ĉ when Ġ{ Ċĉĉĉ ĉ // å¦Ĥæŀľ path éģįåİĨ åĪ° ä¸ĭ ä¸Ģä¸ª ' /' å¹¶ä¸Ķ ä¹ĭåĲİ æĺ¯ ' {' å¤Ħ ï¼Į åĪĻ éľĢè¦ģ è·³ åĪ° ' /' å¹¶ä¸Ķ ä¹ĭåīį å¿ħé¡» æĺ¯ '} ' å¤Ħ ï¼Į æŃ¤ æĹ¶ value è¦ģ éģįåİĨ åĪ° ä¸ĭ ä¸Ģä¸ª ' /' å¤Ħ Ċĉĉĉ ĉ path Char Ġ== Ġdelimiter Ġ&& Ġ( path Index Ġ< Ġlast Path Index Ġ&& Ġpath [ path Index Ġ+ Ġ 1 ] Ġ== Ġvariable Prefix ) Ġ-> Ġ{ Ċĉĉĉĉ ĉ do Ġpath Index ++ Ġwhile ( path Index Ġ<= Ġlast Path Index Ġ&& Ġpath [ path Index ] Ġ!= Ġdelimiter ) Ċĉĉĉĉ ĉ do Ġvalue Index ++ Ġwhile ( value Index Ġ<= Ġlast Value Index Ġ&& Ġvalue [ value Index ] Ġ!= Ġdelimiter ) Ċĉĉĉĉ ĉ if ( variable Suffix Ġ!= Ġnull Ġ&& Ġpath [ path Index Ġ- Ġ 1 ] Ġ!= Ġvariable Suffix ) Ġ{ Ċĉĉĉĉĉ ĉ throw ĠIllegalArgumentException (" Invalid Ġpath Ġ'$ path ': Ġmis matched Ġvariable Ġprefix Ġand Ġsuffix .") Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ // å¦Ĥæŀľ ä¸į åĮ¹éħį ï¼Į åĪĻ çĽ´æİ¥ åĮ¹éħį å¤±è´¥ Ċĉĉĉ ĉ path Char Ġ!= Ġvalue [ value Index ] Ġ-> Ġreturn Ġfalse Ċĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉ ĉ path Index ++ Ċĉĉĉĉ ĉ value Index ++ Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ // å¦Ĥæŀľ ç´¢å¼ķ éĥ½ æľĢç»Ī éģįåİĨ åĪ°äºĨ æľĢåĲİ çļĦ ç´¢å¼ķ ï¼Į åĪĻ åĮ¹éħį æĪĲåĬŁ Ċĉ ĉ return Ġpath Index Ġ- Ġlast Path Index Ġ== Ġvalue Index Ġ- Ġlast Value Index Ċ ĉ } ĊĊ ĉ override Ġfun Ġresolve Variables ( value : ĠString , Ġpath : ĠString ): ĠMap < String , ĠString > Ġ{ Ċĉ ĉ // NOTE Ġ éģįåİĨ å¹¶ æ¯Ķè¾ĥ ä¸¤ä¸ª åŃĹç¬¦ä¸² ä¸ŃçļĦ åŃĹç¬¦ ä»¥ ä¼ĺåĮĸ æĢ§èĥ½ Ċĉ ĉ val Ġvariables Ġ= Ġmutable Map Of < String , ĠString >() Ċĉ ĉ var Ġpath Index Ġ= Ġ 0 Ċĉ ĉ var Ġvalue Index Ġ= Ġ 0 Ċĉ ĉ val Ġlast Path Index Ġ= Ġpath . last Index Ċĉ ĉ val Ġlast Value Index Ġ= Ġvalue . last Index Ċĉ ĉ while ( path Index Ġ<= Ġlast Path Index Ġ&& Ġvalue Index Ġ<= Ġlast Value Index ) Ġ{ Ċĉĉ ĉ val Ġpath Char Ġ= Ġpath [ path Index ] Ċĉĉ ĉ when Ġ{ Ċĉĉĉ ĉ // å¦Ĥæŀľ path éģįåİĨ åĪ° ä¸ĭ ä¸Ģä¸ª ' /' å¹¶ä¸Ķ ä¹ĭåĲİ æĺ¯ ' {' å¤Ħ ï¼Į åĪĻ éľĢè¦ģ è·³ åĪ° ' /' å¹¶ä¸Ķ ä¹ĭåīį å¿ħé¡» æĺ¯ '} ' å¤Ħ ï¼Į æŃ¤ æĹ¶ value è¦ģ éģįåİĨ åĪ° ä¸ĭ ä¸Ģä¸ª ' /' å¤Ħ Ċĉĉĉ ĉ path Char Ġ== Ġdelimiter Ġ&& Ġ( path Index Ġ< Ġlast Path Index Ġ&& Ġpath [ path Index Ġ+ Ġ 1 ] Ġ== Ġvariable Prefix ) Ġ-> Ġ{ Ċĉĉĉĉ ĉ val Ġvariable Name StartIndex Ġ= Ġpath Index Ġ+ Ġ 2 Ċĉĉĉĉ ĉ val Ġvariable Value StartIndex Ġ= Ġvalue Index Ġ+ Ġ 1 Ċĉĉĉĉ ĉ do Ġpath Index ++ Ġwhile ( path Index Ġ<= Ġlast Path Index Ġ&& Ġpath [ path Index ] Ġ!= Ġdelimiter ) Ċĉĉĉĉ ĉ do Ġvalue Index ++ Ġwhile ( value Index Ġ<= Ġlast Value Index Ġ&& Ġvalue [ value Index ] Ġ!= Ġdelimiter ) Ċĉĉĉĉ ĉ if ( variable Suffix Ġ!= Ġnull Ġ&& Ġpath [ path Index Ġ- Ġ 1 ] Ġ!= Ġvariable Suffix ) Ġ{ Ċĉĉĉĉĉ ĉ throw ĠIllegalArgumentException (" Invalid Ġpath Ġ'$ path ': Ġmis matched Ġvariable Ġprefix Ġand Ġsuffix .") Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ val Ġvariable Name End Index Ġ= Ġpath Index Ġ- Ġ 1 Ċĉĉĉĉ ĉ val Ġvariable Value End Index Ġ= Ġvalue Index Ċĉĉĉĉ ĉ val Ġvariable Name Ġ= Ġpath . substring ( variable Name StartIndex , Ġvariable Name End Index ) Ċĉĉĉĉ ĉ val Ġvariable Value Ġ= Ġvalue . substring ( variable Value StartIndex , Ġvariable Value End Index ) Ċĉĉĉĉ ĉ variables [ variable Name ] Ġ= Ġvariable Value Ċĉĉĉ ĉ } Ċĉĉĉ ĉ // å¦Ĥæŀľ ä¸į åĮ¹éħį ï¼Į åĪĻ çĽ´æİ¥ åĮ¹éħį å¤±è´¥ Ċĉĉĉ ĉ path Char Ġ!= Ġvalue [ value Index ] Ġ-> Ġreturn Ġmap Of () Ċĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉ ĉ path Index ++ Ċĉĉĉĉ ĉ value Index ++ Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ // å¦Ĥæŀľ ç´¢å¼ķ éĥ½ æľĢç»Ī éģįåİĨ åĪ°äºĨ æľĢåĲİ çļĦ ç´¢å¼ķ ï¼Į åĪĻ åĮ¹éħį æĪĲåĬŁ Ċĉ ĉ return Ġif ( path Index Ġ- Ġlast Path Index Ġ== Ġvalue Index Ġ- Ġlast Value Index ) Ġvariables Ġelse Ġmap Of () Ċ ĉ } ĊĊ ĉ override Ġfun Ġsplit ( path : ĠString ): ĠList < String > Ġ{ Ċĉ ĉ return Ġnormalize ( path ). remove Prefix ( prefix ). split ( delimiter ). filter NotEmpty () Ċ ĉ } ĊĊ ĉ override Ġfun Ġsplit To Sequence ( path : ĠString ): ĠSequence < String > Ġ{ Ċĉ ĉ return Ġnormalize ( path ). remove Prefix ( prefix ). split To Sequence ( delimiter ). filter NotEmpty () Ċ ĉ } ĊĊ ĉ override Ġfun Ġjoin ToString ( meta Paths : ĠArray < String >): ĠString Ġ{ Ċĉ ĉ return Ġmeta Paths . join ToString ( delimiter String ). add Prefix ( prefix ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġjoin ToString ( meta Paths : ĠIterable < String >): ĠString Ġ{ Ċĉ ĉ return Ġmeta Paths . join ToString ( delimiter String ). add Prefix ( prefix ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġjoin ToString ( meta Paths : ĠSequence < String >): ĠString Ġ{ Ċĉ ĉ return Ġmeta Paths . join ToString ( delimiter String ). add Prefix ( prefix ) Ċ ĉ } ĊĊ ĉ protected Ġopen Ġfun Ġ< T > Ġmeta Query ( value : ĠAny , Ġpath : ĠString ): ĠList < T > Ġ{ Ċĉ ĉ return Ġwhen Ġ{ Ċĉĉ ĉ path . startsWith ( variable Prefix ) Ġ&& Ġ( variable Suffix Ġ== Ġnull Ġ|| Ġpath . endsWith ( variable Suffix )) Ġ-> Ġ{ Ċĉĉĉ ĉ Qu eri ers . Results Qu er ier . query ( value , Ġ"") Ċĉĉ ĉ } Ċĉĉ ĉ path . startsWith ( variable Prefix ) Ġ-> Ġ{ Ċĉĉĉ ĉ throw ĠIllegalArgumentException (" Invalid Ġpath Ġ'$ path ': Ġmis matched Ġvariable Ġprefix Ġand Ġsuffix .") Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> ĠQu eri ers . String Qu er ier . query OrNull ( value , Ġpath . remove Prefix ( prefix )) ?. to Singleton List () Ġ?: ĠlistOf () Ċĉ ĉ } Ġas ĠList < T > Ċ ĉ } ĊĊ ĉ override Ġfun Ġ< T > Ġquery ( value : ĠAny , Ġpath : ĠString ): ĠList < T > Ġ{ Ċĉ ĉ val Ġmeta Paths Ġ= Ġsplit To Sequence ( path ) Ċĉ ĉ if ( meta Paths . none ()) Ġreturn ĠlistOf ( value ) Ġas ĠList < T > Ċĉ ĉ var Ġresult Ġ= ĠlistOf < Any ? >( value ) Ċĉ ĉ for ( meta Path Ġin Ġmeta Paths ) Ġ{ Ċĉĉ ĉ result Ġ= Ġresult . flatMap Ġ{ Ġv Ġ-> Ċĉĉĉ ĉ try Ġ{ Ċĉĉĉĉ ĉ if ( v Ġ!= Ġnull ) Ġmeta Query ( v , Ġmeta Path ) Ġelse ĠlistOf () Ċĉĉĉ ĉ } Ġcatch ( e : ĠException ) Ġ{ Ċĉĉĉĉ ĉ throw ĠIllegalArgumentException (" Cannot Ġquery Ġ'${ value . java Class . simple Name }' Ġby Ġpath Ġ'$ path '. ", Ġe ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġresult Ġas ĠList < T > Ċ ĉ } ĊĊ ĉ protected Ġopen Ġfun Ġ< T > Ġmeta Get ( value : ĠAny , Ġpath : ĠString ): ĠT ? Ġ{ Ċĉ ĉ return Ġwhen Ġ{ Ċĉĉ ĉ path . startsWith ( variable Prefix ) Ġ&& Ġ( variable Suffix Ġ== Ġnull Ġ|| Ġpath . endsWith ( variable Suffix )) Ġ-> Ġ{ Ċĉĉĉ ĉ Qu eri ers . First Result Qu er ier . query OrNull ( value , Ġ"") Ċĉĉ ĉ } Ċĉĉ ĉ path . startsWith ( variable Prefix ) Ġ-> Ġ{ Ċĉĉĉ ĉ throw ĠIllegalArgumentException (" Invalid Ġpath Ġ'$ path ': Ġmis matched Ġvariable Ġprefix Ġand Ġsuffix .") Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> ĠQu eri ers . String Qu er ier . query OrNull ( value , Ġpath . remove Prefix ( prefix )) Ġas ĠT ? Ċĉ ĉ } Ġas ĠT ? Ċ ĉ } ĊĊ ĉ override Ġfun Ġ< T > Ġget ( value : ĠAny , Ġpath : ĠString ): ĠT Ġ{ Ċĉ ĉ val Ġmeta Paths Ġ= Ġsplit To Sequence ( path ) Ċĉ ĉ if ( meta Paths . none ()) Ġreturn Ġvalue Ġas ĠT Ċĉ ĉ var Ġcurrent Value Ġ= Ġvalue Ċĉ ĉ for ( meta Path Ġin Ġmeta Paths ) Ġ{ Ċĉĉ ĉ current Value Ġ= Ċĉĉĉ ĉ meta Get ( current Value , Ġmeta Path ) Ġ?: Ġthrow ĠIllegalArgumentException (" Cannot Ġquery Ġby Ġpath Ġ'$ path '. ") Ċĉ ĉ } Ċĉ ĉ return Ġcurrent Value Ġas ĠT Ċ ĉ } ĊĊ ĉ override Ġfun Ġ< T > Ġget OrNull ( value : ĠAny , Ġpath : ĠString ): ĠT ? Ġ{ Ċĉ ĉ val Ġmeta Paths Ġ= Ġsplit To Sequence ( path ) Ċĉ ĉ if ( meta Paths . none ()) Ġreturn Ġvalue Ġas ĠT Ċĉ ĉ var Ġcurrent Value Ġ= Ġvalue Ċĉ ĉ for ( meta Path Ġin Ġmeta Paths ) Ġ{ Ċĉĉ ĉ current Value Ġ= Ġmeta Get ( current Value , Ġmeta Path ) Ġ?: Ġreturn Ġnull Ċĉ ĉ } Ċĉ ĉ return Ġcurrent Value Ġas ĠT Ċ ĉ } ĊĊ ĉ override Ġfun Ġ< T > Ġget OrDefault ( value : ĠAny , Ġpath : ĠString , ĠdefaultValue : ĠT ): ĠT Ġ{ Ċĉ ĉ val Ġmeta Paths Ġ= Ġsplit To Sequence ( path ) Ċĉ ĉ if ( meta Paths . none ()) Ġreturn Ġvalue Ġas ĠT Ċĉ ĉ var Ġcurrent Value Ġ= Ġvalue Ċĉ ĉ for ( meta Path Ġin Ġmeta Paths ) Ġ{ Ċĉĉ ĉ current Value Ġ= Ġmeta Get ( current Value , Ġmeta Path ) Ġ?: Ġreturn ĠdefaultValue Ċĉ ĉ } Ċĉ ĉ return Ġcurrent Value Ġas ĠT Ċ ĉ } ĊĊ ĉ override Ġfun Ġ< T > Ġget OrElse ( value : ĠAny , Ġpath : ĠString , ĠdefaultValue : Ġ() Ġ-> ĠT ): ĠT Ġ{ Ċĉ ĉ val Ġmeta Paths Ġ= Ġsplit To Sequence ( path ) Ċĉ ĉ if ( meta Paths . none ()) Ġreturn Ġvalue Ġas ĠT Ċĉ ĉ var Ġcurrent Value Ġ= Ġvalue Ċĉ ĉ for ( meta Path Ġin Ġmeta Paths ) Ġ{ Ċĉĉ ĉ current Value Ġ= Ġmeta Get ( current Value , Ġmeta Path ) Ġ?: Ġreturn ĠdefaultValue () Ċĉ ĉ } Ċĉ ĉ return Ġcurrent Value Ġas ĠT Ċ ĉ } ĊĊ ĉ override Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġcomponent Equals ( other ) ĊĊ ĉ override Ġfun ĠhashCode () Ġ= Ġcomponent Hash code () ĊĊ ĉ override Ġfun ĠtoString () Ġ= Ġcomponent ToString () Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ object ĠPath Formats Ġ: ĠComponent Registry < Path Format >() Ġ{ Ċ ĉ // region Ġimplementations Ċ ĉ /** Ċĉ Ġ* Ġ æłĩåĩĨ è·¯å¾Ħ ãĢĤ Ċĉ Ġ* Ċĉ Ġ* Ġ è§ĦåĪĻ ï¼ļ Ċĉ Ġ* Ġ* Ġä»¥ `/` ä½ľä¸º åĪĨ éļĶ ç¬¦ ãĢĤ Ċĉ Ġ* Ġ* Ġ`{ name }` Ġ åĮ¹éħį ä»»æĦı é¡¹ ï¼Į å¹¶ åĳ½åĲį ä¸º ` name `ãĢĤ Ċĉ Ġ* Ġ* Ġ` index ` Ġ åĮ¹éħį ç´¢å¼ķ ` index `ï¼Į ` index ` æĺ¯ æķ´æķ° ãĢĤ Ċĉ Ġ* Ġ* Ġ` name ` Ġ åĮ¹éħį åĲįåŃĹ ãĢģ éĶ® ` name `ãĢĤ Ċĉ Ġ*/ Ċ ĉ object ĠStandard Path Ġ: ĠAbstract Path Format () ĊĊ ĉ /** Ċĉ Ġ* ĠJson æĮĩéĴĪ è·¯å¾Ħ ãĢĤ Ċĉ Ġ* Ċĉ Ġ* Ġ è§ĦåĪĻ ï¼ļ Ċĉ Ġ* Ġ* Ġä»¥ `/` ä½ľä¸º åĪĨ éļĶ ç¬¦ ãĢĤ Ċĉ Ġ* Ġ* Ġ`{ name }` Ġ åĮ¹éħį ä»»æĦı é¡¹ ï¼Į å¹¶ åĳ½åĲį ä¸º ` name `ãĢĤ Ċĉ Ġ* Ġ* Ġ`- ` Ġï¼Ī ä»ħ å¯¹äºİ èµĭåĢ¼ æĵįä½ľ ï¼ī åĮ¹éħį æķ°ç»Ħ æľĢåĲİ ä¸Ģä¸ª åħĥç´ł çļĦ ä¸ĭ ä¸Ģä¸ª åħĥç´ł ãĢĤ Ċĉ Ġ* Ġ* Ġ` index ` Ġ åĮ¹éħį ç´¢å¼ķ ` index `ï¼Į ` index ` æĺ¯ æķ´æķ° ãĢĤ Ċĉ Ġ* Ġ* Ġ` name ` Ġ åĮ¹éħį åĲįåŃĹ ãĢģ éĶ® ` name `ãĢĤ Ċĉ Ġ*/ Ċ ĉ object ĠJson Pointer Path Ġ: ĠAbstract Path Format () ĊĊ ĉ /** Ċĉ Ġ* ĠAnt è·¯å¾Ħ ãĢĤ Ċĉ Ġ* Ċĉ Ġ* Ġ è§ĦåĪĻ ï¼ļ Ċĉ Ġ* Ġ* Ġä»¥ `/` ä½ľä¸º åĪĨ éļĶ ç¬¦ ãĢĤ Ċĉ Ġ* Ġ* Ġ` ?` Ġ åĮ¹éħį ä»»æĦı åįķ ä¸ª åŃĹç¬¦ ãĢĤ Ċĉ Ġ* Ġ* Ġ` *` Ġ åĮ¹éħį éĻ¤äºĨ åĪĨ éļĶ ç¬¦ ä¹ĭ å¤ĸ çļĦ ä»»æĦı æķ°éĩı çļĦ ä»»æĦı åŃĹç¬¦ ãĢĤ Ċĉ Ġ* Ġ* Ġ` ** ` Ġ åĮ¹éħį ä»»æĦı æķ°éĩı çļĦ ä»»æĦı åŃĹç¬¦ ãĢĤ Ċĉ Ġ* Ġ* Ġ`{ name }` Ġ åĮ¹éħį ä»»æĦı é¡¹ ï¼Į å¹¶ åĳ½åĲį ä¸º ` name `ãĢĤ Ċĉ Ġ* Ġ* Ġ` index ` Ġ åĮ¹éħį ç´¢å¼ķ ` index `ï¼Į ` index ` æĺ¯ æķ´æķ° ãĢĤ Ċĉ Ġ* Ġ* Ġ` name ` Ġ åĮ¹éħį åĲįåŃĹ ãĢģ éĶ® ` name `ãĢĤ Ċĉ Ġ*/ Ċ ĉ object ĠAnt Path Ġ: ĠAbstract Path Format () Ġ{ Ċĉ ĉ private Ġconst Ġval Ġsingle Wildcard Ġ= Ġ' ?' Ċĉ ĉ private Ġconst Ġval Ġwild Card Ġ= Ġ'*' ĊĊĉ ĉ override Ġfun Ġmatches ( value : ĠString , Ġpath : ĠString ): ĠBoolean Ġ{ Ċĉĉ ĉ // NOTE Ġ éģįåİĨ å¹¶ æ¯Ķè¾ĥ ä¸¤ä¸ª åŃĹç¬¦ä¸² ä¸ŃçļĦ åŃĹç¬¦ ä»¥ ä¼ĺåĮĸ æĢ§èĥ½ Ċĉĉ ĉ var Ġpath Index Ġ= Ġ 0 Ċĉĉ ĉ var Ġvalue Index Ġ= Ġ 0 Ċĉĉ ĉ val Ġlast Path Index Ġ= Ġpath . last Index Ċĉĉ ĉ val Ġlast Value Index Ġ= Ġvalue . last Index Ċĉĉ ĉ while ( path Index Ġ<= Ġlast Path Index Ġ&& Ġvalue Index Ġ<= Ġlast Value Index ) Ġ{ Ċĉĉĉ ĉ val Ġpath Char Ġ= Ġpath [ path Index ] Ċĉĉĉ ĉ when Ġ{ Ċĉĉĉĉ ĉ // å¦Ĥæŀľ path éģįåİĨ åĪ° ä¸ĭ ä¸Ģä¸ª ' /' å¹¶ä¸Ķ ä¹ĭåĲİ æĺ¯ ' {' å¤Ħ ï¼Į åĪĻ éľĢè¦ģ è·³ åĪ° ' /' å¹¶ä¸Ķ ä¹ĭåīį å¿ħé¡» æĺ¯ '} ' å¤Ħ ï¼Į æŃ¤ æĹ¶ value è¦ģ éģįåİĨ åĪ° ä¸ĭ ä¸Ģä¸ª ' /' å¤Ħ Ċĉĉĉĉ ĉ path Char Ġ== Ġdelimiter Ġ&& Ġ( path Index Ġ< Ġlast Path Index Ġ&& Ġpath [ path Index Ġ+ Ġ 1 ] Ġ== Ġvariable Prefix ) Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ do Ġvalue Index ++ Ġwhile ( value Index Ġ<= Ġlast Value Index Ġ&& Ġvalue [ value Index ] Ġ!= Ġdelimiter ) Ċĉĉĉĉĉ ĉ do Ġpath Index ++ Ġwhile ( path Index Ġ<= Ġlast Path Index Ġ&& Ġpath [ path Index ] Ġ!= Ġdelimiter ) Ċĉĉĉĉĉ ĉ if ( variable Suffix Ġ!= Ġnull Ġ&& Ġpath [ path Index Ġ- Ġ 1 ] Ġ!= Ġvariable Suffix ) Ġ{ Ċĉĉĉĉĉĉ ĉ throw ĠIllegalArgumentException (" Invalid Ġpath Ġ'$ path ': Ġmis matched Ġvariable Ġprefix Ġand Ġsuffix .") Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ // å¦Ĥæŀľ path éģįåİĨ åĪ° ' ** ' å¤Ħ ï¼Į åĪĻ éľĢè¦ģ è·³ åĪ° è¿Ļ ä¹ĭåĲİ ï¼Į æŃ¤ æĹ¶ value éľĢè¦ģ éģįåİĨ åĪ° ä¸ĭ ä¸ª ç»§ç»Ń åĮ¹éħį å¤Ħ ï¼Į æĹłæ³ķ ç»§ç»Ń åĮ¹éħį åĪĻ çĽ´æİ¥ åĮ¹éħį æĪĲåĬŁ Ċĉĉĉĉ ĉ path Char Ġ== Ġwild Card Ġ&& Ġ( path Index Ġ< Ġlast Path Index Ġ&& Ġpath [ path Index Ġ+ Ġ 1 ] Ġ== Ġwild Card ) Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ path Index Ġ+= Ġ 2 Ċĉĉĉĉĉ ĉ if ( path Index Ġ> Ġlast Path Index ) Ġreturn Ġtrue Ċĉĉĉĉĉ ĉ do Ġvalue Index ++ Ġwhile ( value Index Ġ<= Ġlast Value Index Ġ&& Ġvalue [ value Index ] Ġ!= Ġpath [ path Index ]) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ // å¦Ĥæŀľ path éģįåİĨ åĪ° ' *' å¤Ħ ï¼Į åĪĻ éľĢè¦ģ è·³ åĪ° è¿Ļ ä¹ĭåĲİ ï¼Į æŃ¤ æĹ¶ value éľĢè¦ģ éģįåİĨ åĪ° ä¸ĭ ä¸ª ç»§ç»Ń åĮ¹éħį çļĦ ' /' ä¹ĭåīį å¤Ħ ï¼Į æĹłæ³ķ ç»§ç»Ń åĮ¹éħį åĪĻ çĽ´æİ¥ åĮ¹éħį æĪĲåĬŁ Ċĉĉĉĉ ĉ path Char Ġ== Ġwild Card Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ path Index Ġ+= Ġ 1 Ċĉĉĉĉĉ ĉ if ( path Index Ġ> Ġlast Path Index ) Ġreturn Ġtrue Ċĉĉĉĉĉ ĉ do Ġvalue Index ++ Ġwhile ( value Index Ġ<= Ġlast Value Index Ġ&& Ġvalue [ value Index ] Ġ!= Ġdelimiter Ġ&& Ġvalue [ value Index ] Ġ!= Ġpath [ path Index ]) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ // å¦Ĥæŀľ path éģįåİĨ åĪ° ' ?' å¤Ħ ï¼Į åĪĻ éľĢè¦ģ è·³ è¿Ļ ä¹ĭåĲİ ï¼Į æŃ¤ æĹ¶ value éľĢè¦ģ éģįåİĨ åĪ° ä¸ĭ ä¸ª åŃĹç¬¦ Ċĉĉĉĉ ĉ path Char Ġ== Ġsingle Wildcard Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ path Index ++ Ċĉĉĉĉĉ ĉ value Index ++ Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ // å¦Ĥæŀľ ä¸į åĮ¹éħį ï¼Į åĪĻ çĽ´æİ¥ åĮ¹éħį å¤±è´¥ Ċĉĉĉĉ ĉ path Char Ġ!= Ġvalue [ value Index ] Ġ-> Ġreturn Ġfalse Ċĉĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ path Index ++ Ċĉĉĉĉĉ ĉ value Index ++ Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ // å¿½ çķ¥ å¤ļ ä½Ļ çļĦ éĢļ éħį ç¬¦ Ċĉĉ ĉ return Ġwhen Ġ{ Ċĉĉĉ ĉ path Index Ġ- Ġlast Path Index Ġ== Ġvalue Index Ġ- Ġlast Value Index Ġ-> Ġtrue Ċĉĉĉ ĉ path Index Ġ== Ġlast Path Index Ġ&& Ġpath [ path Index ] Ġ== Ġwild Card Ġ-> Ġtrue Ċĉĉĉ ĉ path Index Ġ== Ġlast Path Index Ġ- Ġ 1 Ġ&& Ġpath [ path Index ] Ġ== Ġwild Card Ġ&& Ġpath [ path Index Ġ+ Ġ 1 ] Ġ== Ġwild Card Ġ-> Ġtrue Ċĉĉĉ ĉ else Ġ-> Ġfalse Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġresolve Variables ( value : ĠString , Ġpath : ĠString ): ĠMap < String , ĠString > Ġ{ Ċĉĉ ĉ // NOTE Ġ éģįåİĨ å¹¶ æ¯Ķè¾ĥ ä¸¤ä¸ª åŃĹç¬¦ä¸² ä¸ŃçļĦ åŃĹç¬¦ ä»¥ ä¼ĺåĮĸ æĢ§èĥ½ Ċĉĉ ĉ val Ġvariables Ġ= Ġmutable Map Of < String , ĠString >() Ċĉĉ ĉ var Ġpath Index Ġ= Ġ 0 Ċĉĉ ĉ var Ġvalue Index Ġ= Ġ 0 Ċĉĉ ĉ val Ġlast Path Index Ġ= Ġpath . last Index Ċĉĉ ĉ val Ġlast Value Index Ġ= Ġvalue . last Index Ċĉĉ ĉ while ( path Index Ġ<= Ġlast Path Index Ġ&& Ġvalue Index Ġ<= Ġlast Value Index ) Ġ{ Ċĉĉĉ ĉ val Ġpath Char Ġ= Ġpath [ path Index ] Ċĉĉĉ ĉ when Ġ{ Ċĉĉĉĉ ĉ // å¦Ĥæŀľ path éģįåİĨ åĪ° ä¸ĭ ä¸Ģä¸ª ' /' å¹¶ä¸Ķ ä¹ĭåĲİ æĺ¯ ' {' å¤Ħ ï¼Į åĪĻ éľĢè¦ģ è·³ åĪ° ' /' å¹¶ä¸Ķ ä¹ĭåīį å¿ħé¡» æĺ¯ '} ' å¤Ħ ï¼Į æŃ¤ æĹ¶ value è¦ģ éģįåİĨ åĪ° ä¸ĭ ä¸Ģä¸ª ' /' å¤Ħ Ċĉĉĉĉ ĉ path Char Ġ== Ġdelimiter Ġ&& Ġ( path Index Ġ< Ġlast Path Index Ġ&& Ġpath [ path Index Ġ+ Ġ 1 ] Ġ== Ġvariable Prefix ) Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ val Ġvariable Name StartIndex Ġ= Ġpath Index Ġ+ Ġ 2 Ċĉĉĉĉĉ ĉ val Ġvariable Value StartIndex Ġ= Ġvalue Index Ġ+ Ġ 1 Ċĉĉĉĉĉ ĉ do Ġpath Index ++ Ġwhile ( path Index Ġ<= Ġlast Path Index Ġ&& Ġpath [ path Index ] Ġ!= Ġdelimiter ) Ċĉĉĉĉĉ ĉ do Ġvalue Index ++ Ġwhile ( value Index Ġ<= Ġlast Value Index Ġ&& Ġvalue [ value Index ] Ġ!= Ġdelimiter ) Ċĉĉĉĉĉ ĉ if ( variable Suffix Ġ!= Ġnull Ġ&& Ġpath [ path Index Ġ- Ġ 1 ] Ġ!= Ġvariable Suffix ) Ġ{ Ċĉĉĉĉĉĉ ĉ throw ĠIllegalArgumentException (" Invalid Ġpath Ġ'$ path ': Ġmis matched Ġvariable Ġprefix Ġand Ġsuffix .") Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ val Ġvariable Name End Index Ġ= Ġpath Index Ġ- Ġ 1 Ċĉĉĉĉĉ ĉ val Ġvariable Value End Index Ġ= Ġvalue Index Ċĉĉĉĉĉ ĉ val Ġvariable Name Ġ= Ġpath . substring ( variable Name StartIndex , Ġvariable Name End Index ) Ċĉĉĉĉĉ ĉ val Ġvariable Value Ġ= Ġvalue . substring ( variable Value StartIndex , Ġvariable Value End Index ) Ċĉĉĉĉĉ ĉ variables [ variable Name ] Ġ= Ġvariable Value Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ // å¦Ĥæŀľ path éģįåİĨ åĪ° ' ** ' å¤Ħ ï¼Į åĪĻ éľĢè¦ģ è·³ åĪ° è¿Ļ ä¹ĭåĲİ ï¼Į æŃ¤ æĹ¶ value éľĢè¦ģ éģįåİĨ åĪ° ä¸ĭ ä¸ª ç»§ç»Ń åĮ¹éħį å¤Ħ ï¼Į æĹłæ³ķ ç»§ç»Ń åĮ¹éħį åĪĻ çĽ´æİ¥ åĮ¹éħį æĪĲåĬŁ Ċĉĉĉĉ ĉ path Char Ġ== Ġwild Card Ġ&& Ġ( path Index Ġ< Ġlast Path Index Ġ&& Ġpath [ path Index Ġ+ Ġ 1 ] Ġ== Ġwild Card ) Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ path Index Ġ+= Ġ 2 Ċĉĉĉĉĉ ĉ if ( path Index Ġ> Ġlast Path Index ) Ġreturn Ġvariables Ċĉĉĉĉĉ ĉ do Ġvalue Index ++ Ġwhile ( value Index Ġ<= Ġlast Value Index Ġ&& Ġvalue [ value Index ] Ġ!= Ġpath [ path Index ]) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ // å¦Ĥæŀľ path éģįåİĨ åĪ° ' *' å¤Ħ ï¼Į åĪĻ éľĢè¦ģ è·³ åĪ° è¿Ļ ä¹ĭåĲİ ï¼Į æŃ¤ æĹ¶ value éľĢè¦ģ éģįåİĨ åĪ° ä¸ĭ ä¸ª ç»§ç»Ń åĮ¹éħį çļĦ ' /' ä¹ĭåīį å¤Ħ ï¼Į æĹłæ³ķ ç»§ç»Ń åĮ¹éħį åĪĻ çĽ´æİ¥ åĮ¹éħį æĪĲåĬŁ Ċĉĉĉĉ ĉ path Char Ġ== Ġwild Card Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ path Index Ġ+= Ġ 1 Ċĉĉĉĉĉ ĉ if ( path Index Ġ> Ġlast Path Index ) Ġreturn Ġvariables Ċĉĉĉĉĉ ĉ do Ġvalue Index ++ Ġwhile ( value Index Ġ<= Ġlast Value Index Ġ&& Ġvalue [ value Index ] Ġ!= Ġdelimiter Ġ&& Ġvalue [ value Index ] Ġ!= Ġpath [ path Index ]) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ // å¦Ĥæŀľ path éģįåİĨ åĪ° ' ?' å¤Ħ ï¼Į åĪĻ éľĢè¦ģ è·³ è¿Ļ ä¹ĭåĲİ ï¼Į æŃ¤ æĹ¶ value éľĢè¦ģ éģįåİĨ åĪ° ä¸ĭ ä¸ª åŃĹç¬¦ Ċĉĉĉĉ ĉ path Char Ġ== Ġsingle Wildcard Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ path Index ++ Ċĉĉĉĉĉ ĉ value Index ++ Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ // å¦Ĥæŀľ ä¸į åĮ¹éħį ï¼Į åĪĻ çĽ´æİ¥ åĮ¹éħį å¤±è´¥ Ċĉĉĉĉ ĉ path Char Ġ!= Ġvalue [ value Index ] Ġ-> Ġreturn Ġmap Of () Ċĉĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ path Index ++ Ċĉĉĉĉĉ ĉ value Index ++ Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ // å¿½ çķ¥ å¤ļ ä½Ļ çļĦ éĢļ éħį ç¬¦ Ċĉĉ ĉ return Ġwhen Ġ{ Ċĉĉĉ ĉ path Index Ġ- Ġlast Path Index Ġ== Ġvalue Index Ġ- Ġlast Value Index Ġ-> Ġvariables Ċĉĉĉ ĉ path Index Ġ== Ġlast Path Index Ġ&& Ġpath [ path Index ] Ġ== Ġwild Card Ġ-> Ġvariables Ċĉĉĉ ĉ path Index Ġ== Ġlast Path Index Ġ- Ġ 1 Ġ&& Ġpath [ path Index ] Ġ== Ġwild Card Ġ&& Ġpath [ path Index Ġ+ Ġ 1 ] Ġ== Ġwild Card Ġ-> Ġvariables Ċĉĉĉ ĉ else Ġ-> Ġmap Of () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġ< T > Ġmeta Query ( value : ĠAny , Ġpath : ĠString ): ĠList < T > Ġ{ Ċĉĉ ĉ throw ĠUnsupportedOperationException (" Query Ġoperation Ġis Ġnot Ġsupported Ġby Ġant Ġpath .") Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġ< T > Ġquery ( value : ĠAny , Ġpath : ĠString ): ĠList < T > Ġ{ Ċĉĉ ĉ throw ĠUnsupportedOperationException (" Query Ġoperation Ġis Ġnot Ġsupported Ġby Ġant Ġpath .") Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġ< T > Ġmeta Get ( value : ĠAny , Ġpath : ĠString ): ĠT ? Ġ{ Ċĉĉ ĉ throw ĠUnsupportedOperationException (" Get Ġoperation Ġis Ġnot Ġsupported Ġby Ġant Ġpath .") Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġ< T > Ġget OrNull ( value : ĠAny , Ġpath : ĠString ): ĠT ? Ġ{ Ċĉĉ ĉ throw ĠUnsupportedOperationException (" Get Ġoperation Ġis Ġnot Ġsupported Ġby Ġant Ġpath .") Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġ< T > Ġget OrElse ( value : ĠAny , Ġpath : ĠString , ĠdefaultValue : Ġ() Ġ-> ĠT ): ĠT Ġ{ Ċĉĉ ĉ throw ĠUnsupportedOperationException (" Get Ġoperation Ġis Ġnot Ġsupported Ġby Ġant Ġpath .") Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* Ġ å¼ķçĶ¨ è·¯å¾Ħ ãĢĤ Ċĉ Ġ* Ċĉ Ġ* Ġ è§ĦåĪĻ ï¼ļ Ċĉ Ġ* Ġ* Ġä»¥ `.` ä½ľä¸º åĪĨ éļĶ ç¬¦ ï¼Į åı¯ä»¥åľ¨ ç´¢å¼ķ ä¹ĭåīį çľģ çķ¥ ãĢĤ Ċĉ Ġ* Ġ* Ġ`[ index ]` Ġ åĮ¹éħį ç´¢å¼ķ ` index `ï¼Į ` index ` æĺ¯ æķ´æķ° ãĢĤ Ċĉ Ġ* Ġ* Ġ` name ` Ġ åĮ¹éħį åĲįåŃĹ ãĢģ éĶ® ` name `ãĢĤ Ċĉ Ġ*/ Ċ ĉ object ĠReference Path Ġ: ĠAbstract Path Format ('.', Ġ"") Ġ{ Ċĉ ĉ private Ġconst Ġval Ġindex Prefix Ġ= Ġ'[' Ċĉ ĉ private Ġconst Ġval Ġindex Suffix Ġ= Ġ' ]' ĊĊĉ ĉ override Ġfun Ġnormalize ( path : ĠString ): ĠString Ġ{ Ċĉĉ ĉ return Ġbuild String Ġ{ Ċĉĉĉ ĉ for ( char Ġin Ġpath ) Ġ{ Ċĉĉĉĉ ĉ if ( char Ġ== Ġ'[ ') Ġappend ('. '). append ( char ) Ġelse Ġif (! char . is Whitespace ()) Ġappend ( char ) Ċĉĉĉ ĉ } Ċĉĉ ĉ }. trim Start ('.') Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġmatches ( value : ĠString , Ġpath : ĠString ): ĠBoolean Ġ{ Ċĉĉ ĉ return Ġnormalize ( value ) Ġ== Ġnormalize ( path ) Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġresolve Variables ( value : ĠString , Ġpath : ĠString ): ĠMap < String , ĠString > Ġ{ Ċĉĉ ĉ throw ĠUnsupportedOperationException (" Resolve Ġvariables Ġoperation Ġis Ġnot Ġsupported Ġby Ġreference Ġpath .") Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġ< T > Ġmeta Query ( value : ĠAny , Ġpath : ĠString ): ĠList < T > Ġ{ Ċĉĉ ĉ return Ġwhen Ġ{ Ċĉĉĉ ĉ path . sur round sWith ( index Prefix , Ġindex Suffix ) Ġ-> Ġ{ Ċĉĉĉĉ ĉ val Ġindex Ġ= Ġpath . substring ( 1 , Ġpath . length Ġ- Ġ 1 ). toInt () Ċĉĉĉĉ ĉ Qu eri ers . Index Qu er ier . query OrNull ( value , Ġindex )?. to Singleton List () Ġ?: ĠlistOf () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġ-> ĠQu eri ers . String Qu er ier . query OrNull ( value , Ġpath . remove Prefix ( prefix )) ?. to Singleton List () Ġ?: ĠlistOf () Ċĉĉ ĉ } Ġas ĠList < T > Ċĉ ĉ } ĊĊĉ ĉ override Ġfun Ġ< T > Ġmeta Get ( value : ĠAny , Ġpath : ĠString ): ĠT ? Ġ{ Ċĉĉ ĉ return Ġwhen Ġ{ Ċĉĉĉ ĉ path . sur round sWith ( index Prefix , Ġindex Suffix ) Ġ-> Ġ{ Ċĉĉĉĉ ĉ val Ġindex Ġ= Ġpath . substring ( 1 , Ġpath . length Ġ- Ġ 1 ). toInt () Ċĉĉĉĉ ĉ Qu eri ers . Index Qu er ier . query OrNull ( value , Ġindex ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġ-> ĠQu eri ers . String Qu er ier . query OrNull ( value , Ġpath . remove Prefix ( prefix )) Ġas ĠT ? Ċĉĉ ĉ } Ġas ĠT ? Ċĉ ĉ } Ċ ĉ } Ċ ĉ // endregion ĊĊ ĉ override Ġfun Ġregister Default () Ġ{ Ċĉ ĉ register ( Standard Path ) Ċĉ ĉ register ( Json Pointer Path ) Ċĉ ĉ register ( Ant Path ) Ċĉ ĉ register ( Reference Path ) Ċ ĉ } Ċ } Ċ