// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . collabor ation . api . graphql Ċ Ċ import Ġcom . github . ben man es . caffe ine . cache . C affe ine Ċ import Ġorg . jetbrains . annotations . Visible ForTesting Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . time . Duration Ċ import Ġjava . time . temporal . Ch rono Unit Ċ Ċ abstract Ġclass ĠC aching GraphQL Query Loader ( private Ġval Ġfragments Directory : ĠString Ġ= Ġ" graphql / fragment ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġfragments File Extension : ĠString Ġ= Ġ" graphql ") Ġ{ ĊĊĠ Ġprivate Ġval Ġfragment Definition Regex Ġ= ĠRegex (" fragment Ġ( .* ) Ġon Ġ.* \\ { ") ĊĊĠ Ġprivate Ġval Ġfragments Cache Ġ= ĠC affe ine . newBuilder () ĊĠĠĠ Ġ. expire After Access ( Duration . of ( 2 , ĠCh rono Unit . MIN UTES )) ĊĠĠĠ Ġ. build < String , ĠFragment >() ĊĊĠ Ġprivate Ġval Ġqueries Cache Ġ= ĠC affe ine . newBuilder () ĊĠĠĠ Ġ. expire After Access ( Duration . of ( 1 , ĠCh rono Unit . MIN UTES )) ĊĠĠĠ Ġ. build < String , ĠString >() ĊĊĠ Ġ// ĠUse Ġpath Ġto Ġallow Ġgoing Ġto Ġthe Ġfile Ġquickly ĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġfun Ġload Query ( query Path : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġqueries Cache . get ( query Path ) Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠ Ġval Ġ( body , Ġfragment Names ) Ġ= Ġread Collect ing Fragment Names ( path ) ĊĊĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠ Ġval Ġfragments Ġ= ĠLinkedHashMap < String , ĠFragment >() ĊĠĠĠĠĠ Ġread Fragments With Dependencies ( fragment Names , Ġfragments ) ĊĠĠĠĠĠ Ġfor Ġ( fragment Ġin Ġfragments . values . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( fragment . body ). append ("\ n ") ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġbuilder . append ( body ) ĊĠĠĠĠĠ Ġbuilder . toString () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Fragments With Dependencies ( names : ĠSet < String >, Ġinto : ĠMutable Map < String , ĠFragment >) Ġ{ ĊĠĠĠ Ġfor Ġ( fragment Name Ġin Ġnames ) Ġ{ ĊĠĠĠĠĠ Ġval Ġfragment Ġ= Ġfragments Cache . get ( fragment Name ) Ġ{ Ġname Ġ-> ĊĠĠĠĠĠĠĠ ĠFragment ( name ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġinto [ fragment . name ] Ġ= Ġfragment ĊĊĠĠĠĠĠ Ġval Ġnon Processed Dependencies Ġ= Ġfragment . dependencies . filter Ġ{ Ġ! into . contains ( it ) Ġ}. toSet () ĊĠĠĠĠĠ Ġread Fragments With Dependencies ( non Processed Dependencies , Ġinto ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġread Collect ing Fragment Names ( filePath : ĠString ): ĠPair < String , ĠSet < String >> Ġ{ ĊĠĠĠ Ġval Ġbody Builder Ġ= ĠStringBuilder () ĊĠĠĠ Ġval Ġfragments Ġ= Ġmutable Set Of < String >() ĊĠĠĠ Ġval Ġinner Fragments Ġ= Ġmutable Set Of < String >() ĊĊĠĠĠ Ġval Ġstream Ġ= Ġget FileStream ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠGraphQL FileNotFoundException (" Couldn 't Ġfind Ġfile Ġ$ filePath ") ĊĠĠĠ Ġstream . reader (). forEach Line Ġ{ ĊĠĠĠĠĠ Ġval Ġline Ġ= Ġit . trim () ĊĠĠĠĠĠ Ġbody Builder . append ( line ). append ("\ n ") ĊĊĠĠĠĠĠ Ġif Ġ( line . startsWith (" fragment ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Name Ġ= Ġfragment Definition Regex . match Ent ire ( line )?. group Values ?. get ( 1 )?. trim () ĊĠĠĠĠĠĠĠ Ġif Ġ( fragment Name Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠ Ġinner Fragments . add ( fragment Name ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( line . startsWith (" ...") Ġ&& Ġline . length Ġ> Ġ 3 Ġ&& Ġ! line [ 3 ]. is Whitespace ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Name Ġ= Ġline . substring ( 3 ) ĊĠĠĠĠĠĠĠ Ġfragments . add ( fragment Name ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfragments . removeAll ( inner Fragments ) ĊĠĠĠ Ġreturn Ġbody Builder . toString (). remove Suffix ("\ n ") Ġto Ġfragments ĊĠ Ġ} ĊĊĠ Ġ// Ġvisible Ġto Ġavoid Ġstoring Ġtest Ġqueries Ġwith Ġthe Ġcode ĊĠ Ġ@ Visible ForTesting ĊĠ Ġprotected Ġopen Ġfun Ġget FileStream ( relative Path : ĠString ): ĠInputStream ? Ġ= Ġthis :: class . java . class Loader . getResource AsStream ( relative Path ) ĊĊĠ Ġprivate Ġinner Ġclass ĠFragment ( val Ġname : ĠString ) Ġ{ ĊĊĠĠĠ Ġval Ġbody : ĠString ĊĠĠĠ Ġval Ġdependencies : ĠSet < String > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġval Ġ( body , Ġdependencies ) Ġ= Ġread Collect ing Fragment Names ("$ fragments Directory /${ name }. $ fragments File Extension ") ĊĠĠĠĠĠ Ġthis . body Ġ= Ġbody ĊĠĠĠĠĠ Ġthis . dependencies Ġ= Ġdependencies ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠFragment ) Ġreturn Ġfalse ĊĊĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġother . name ) Ġreturn Ġfalse ĊĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠ Ġreturn Ġname . hashCode () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }