package Ġcom . ill uz ion z stud ios . mist . config Ċ Ċ import Ġcom . ill uz ion z stud ios . mist . Logger Ċ import Ġcom . ill uz ion z stud ios . mist . M ist Ċ import Ġcom . ill uz ion z stud ios . mist . config . format . Comment Ċ import Ġcom . ill uz ion z stud ios . mist . config . format . Comment Style Ċ import Ġcom . ill uz ion z stud ios . mist . plugin . Sp ig ot Plugin Ċ import Ġcom . ill uz ion z stud ios . mist . util . File Util Ċ import Ġcom . ill uz ion z stud ios . mist . util . Text Util Ċ import Ġorg . apache . commons . lang . Validate Ċ import Ġorg . bukkit . configuration . Invalid ConfigurationException Ċ import Ġorg . bukkit . configuration . file . Yaml Constructor Ċ import Ġorg . bukkit . configuration . file . Yaml Rep res enter Ċ import Ġorg . bukkit . plugin . java . Java Plugin Ċ import Ġorg . yaml . s na key aml . Dump er Options Ċ import Ġorg . yaml . s na key aml . Yaml Ċ import Ġorg . yaml . s na key aml . error . YAML Exception Ċ import Ġorg . yaml . s na key aml . rep res enter . Rep res enter Ċ import Ġjava . io .* Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Matcher Ċ import Ġjava . util . regex . Pattern Ċ import Ġjava . util . stream . Collectors ĊĊ Ċ /** Ċ Ġ* ĠHandles Ġa Ġ[ Config Section ] Ġas Ġa ĠYAML Ġfile . ĠThis Ġmeans Ġbeing Ġa Ġfile Ċ Ġ* Ġand Ġhaving Ġa Ġfile Ġlocation Ġalong Ġwith Ġsaving , Ġreading , Ġand Ġwriting Ġutils . Ċ Ġ*/ Ċ open Ġclass ĠYaml Config Ġ: ĠConfig Section Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe ĠREG EX Ġto Ġparse ĠYAML Ġsyntax . ĠMat ches Ġ" key : Ġvalue " Ġmaking Ġsure Ġsyntax Ġis Ġright ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval ĠYAML _ REGEX Ġ= ĠPattern . compile ("^ ( Ġ*) ([^ :{} \\ [ \\ ], & * # ? |< >= ! % @ ` ]+ ): (.* )$ ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġpath Ġto Ġthe Ġdirectory Ġto Ġstore Ġthe Ġfile Ġin . ĠThis ĊĠĠĠĠ Ġ* Ġis Ġtaken Ġrelative Ġfrom Ġthe Ġ[ Java Plugin . getData Folder ], Ġmeaning ĊĠĠĠĠ Ġ* Ġthe Ġvalue Ġ"" Ġis Ġthe Ġ[ Java Plugin . getData Folder ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġwe Ġset Ġthis Ġvalue Ġto Ġ" foo ", Ġthis Ġfinal Ġdir Ġwould Ġbe Ġ" foo / config . yml " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġdirectory : ĠString ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġname Ġof Ġthe Ġfile Ġfor Ġthis Ġ[ Yaml Config ]. ĠName Ġmust Ġinclude ĊĠĠĠĠ Ġ* Ġthe Ġfile Ġextensions , Ġotherwise Ġdefault Ġ" yml " Ġwill Ġbe Ġappended . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval ĠfileName : ĠString ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġinstance Ġof Ġthe Ġ[ Sp ig ot Plugin ] Ġthat Ġthis Ġ[ Yaml Config ] ĊĠĠĠĠ Ġ* Ġbelongs Ġto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġplugin : ĠSp ig ot Plugin ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThese Ġare ĠYAML Ġoptions Ġused Ġto Ġhelp Ġparse Ġthe Ġfile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġyaml Options Ġ= ĠDump er Options () ĊĠĠĠ Ġprivate Ġval Ġyaml Rep res enter : ĠRe presenter Ġ= ĠYaml Rep res enter () ĊĠĠĠ Ġprivate Ġval Ġyaml Ġ= ĠYaml ( Yaml Constructor (), Ġyaml Rep res enter , Ġyaml Options ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFlag Ġindicating Ġif Ġthe Ġfile Ġis Ġloaded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġis Loaded Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġactual Ġfile Ġthat Ġthis Ġ[ Yaml Config ] Ġis ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġfile : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġif Ġ( directory Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( plugin !!. data Folder . toString () Ġ+ ĠFile . separator Ġ+ Ġdirectory , ĠfileName Ġ?: ĠM ist . SETTINGS _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( plugin !!. data Folder , ĠfileName Ġ?: ĠM ist . SETTINGS _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComments Ġto Ġdisplay Ġat Ġthe Ġtop / bottom Ġof Ġthe Ġfile ĊĠĠĠĠ Ġ* Ġto Ġgive Ġmore Ġcl arity Ġon Ġthe Ġcontents ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġheader Comment : ĠComment ? Ġ= Ġnull ĊĠĠĠ Ġprotected Ġvar Ġfooter Comment : ĠComment ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġ[ Charset ] Ġto Ġuse Ġfor Ġsaving Ġthe Ġfile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġdefault Charset Ġ= ĠStandard Charsets . UTF _ 8 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġflag Ġindicates Ġif Ġwe Ġshould Ġremove Ġnodes Ġnot Ġincluded Ġin Ġdefaults ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġauto Remove Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġflag Ġindicates Ġif Ġwe Ġshould Ġload Ġcomments Ġto Ġthe Ġfile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġload Comments Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefault Ġcomment Ġstyling Ġapplied Ġto Ġnodes Ġthat Ġhold Ġa Ġnormal Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdefault Node Comment Format Ġ= ĠComment Style . SIMPLE ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefault Ġcomment Ġstyling Ġapplied Ġto Ġnodes Ġthat Ġhold Ġa Ġ[ Config Section ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdefault Section Comment Format Ġ= ĠComment Style . SP AC ED ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtra Ġlines Ġto Ġput Ġbetween Ġroot Ġnodes , Ġas Ġin Ġa Ġ"\ n " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġroot Node Spacing Ġ= Ġ 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtra Ġlines Ġto Ġput Ġin Ġfront Ġof Ġcomments . Ġ< br ></ br > ĊĠĠĠĠ Ġ* ĠThis Ġis Ġseparate Ġfrom Ġroot Node Spacing , Ġif Ġapplicable . ĊĠĠĠĠ Ġ* ĠThese Ġare Ġ" Ġ" Ġcharacters ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcomment Spacing Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Ġ Ġ------------------------------------------------------------------------- ĊĠĠĠ Ġ// Ġ ĠConstructors ĊĠĠĠ Ġ// Ġ Ġ------------------------------------------------------------------------- ĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġplugin Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfile Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġdirectory Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠfileName Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġplugin Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . file Ġ= Ġfile ĊĠĠĠĠĠĠĠ Ġdirectory Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠfileName Ġ= Ġfile . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( plugin : ĠSp ig ot Plugin ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . plugin Ġ= Ġplugin ĊĠĠĠĠĠĠĠ Ġdirectory Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠfileName Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( plugin : ĠSp ig ot Plugin , Ġfile : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . plugin Ġ= Ġplugin ĊĠĠĠĠĠĠĠ Ġdirectory Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠfileName Ġ= Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( plugin : ĠSp ig ot Plugin , Ġdirectory : ĠString ?, Ġfile : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . plugin Ġ= Ġplugin ĊĠĠĠĠĠĠĠ Ġthis . directory Ġ= Ġdirectory ĊĠĠĠĠĠĠĠ ĠfileName Ġ= Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ String ] Ġlines Ġfrom Ġ[. header Comment ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġheader : ĠList < String ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( header Comment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Comment !!. lines !! ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġ[. header Comment ] Ġfrom ĠVar Args Ġof Ġ[ String ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdescription ĠStrings Ġto Ġset Ġfor Ġcomment ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Header ( var arg Ġdescription : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġheader Comment Ġ= Ġif Ġ( description . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComment Style . BLOCK ED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* description ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ String ] Ġlines Ġfrom Ġ[. footer Comment ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġfooter : ĠList < String ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( footer Comment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfooter Comment !!. lines !! ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġ[. footer Comment ] Ġfrom ĠVar Args Ġof Ġ[ String ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdescription ĠStrings Ġto Ġset Ġfor Ġcomment ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Footer ( var arg Ġdescription : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfooter Comment Ġ= Ġif Ġ( description . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComment Style . BLOCK ED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* description ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear Ġall Ġnodes Ġand Ġvalues Ġin Ġthis Ġconfig Ġin Ġmemory . ĊĠĠĠĠ Ġ* ĠDO ES ĠNOT ĠSAVE ĠTO ĠDIS K . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġclear Defaults ĠIf Ġto Ġalso Ġinvoke Ġ[. clear Defaults ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear Config ( clear Defaults : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroot !!. values !!. clear () ĊĠĠĠĠĠĠĠ Ġroot . config Comments !!. clear () ĊĠĠĠĠĠĠĠ Ġif Ġ( clear Defaults ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Defaults () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġ Ġ------------------------------------------------------------------------- ĊĠĠĠ Ġ// Ġ ĠFile ĠLoading ĊĠĠĠ Ġ// Ġ Ġ------------------------------------------------------------------------- ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear Ġall Ġdefault Ġoptions Ġin Ġthe Ġ[ Config Section ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear Defaults () Ġ{ ĊĠĠĠĠĠĠĠ Ġroot !!. default Comments !!. clear () ĊĠĠĠĠĠĠĠ Ġroot . default Values . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTo Ġbe Ġoverridden , Ġcalled Ġbefore Ġloading Ġthe Ġfile Ġinto Ġmemory ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġpre Load () Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTo Ġbe Ġoverridden , Ġcalled Ġafter Ġloading Ġthe Ġfile Ġinto Ġmemory ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġpost Load () Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoads Ġan Ġinternal Ġresource Ġonto Ġthe Ġserver ĊĠĠĠĠ Ġ* ĠFor Ġinstance Ġfile Ġin Ġresources / locales / en _ US . lang Ġwill Ġbe Ġloaded ĊĠĠĠĠ Ġ* Ġonto Ġthe Ġserver Ġunder Ġplugins / MY _ PLUGIN / locales / en _ US . lang ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠMain Ġapplications Ġare Ġimplementing Ġthis Ġ[ Yaml Config ] Ġinto Ġa Ġcustom ĊĠĠĠĠ Ġ* Ġobject , Ġfor Ġinstance Ġimplementing Ġa Ġspecific Ġtype Ġof Ġconfig . ĠThis Ġway Ġif Ġwe Ġhave ĊĠĠĠĠ Ġ* Ġany Ġdefaults Ġin Ġthe Ġplugin Ġwe Ġcan Ġload Ġto Ġthe Ġserver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġfile Ġalready Ġexists Ġon Ġdisk Ġit Ġjust Ġloads Ġthat . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile ĠThe Ġfile Ġobject Ġto Ġload ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoad Ġthe Ġ[. file ] Ġinto Ġmemory ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠIf Ġloaded Ġsuccessfully ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġload ( file : ĠFile Ġ= Ġthis . file !! ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠValidate . notNull ( file , Ġ" File Ġcannot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġfile . name ĊĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuffered InputStream ( FileInputStream ( file )). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . load ( InputStream Reader ( stream , ĠStandard Charsets . UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Loaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInternal Ġpath Ġto Ġlocale ĊĠĠĠĠĠĠĠ Ġval Ġinternal Path Ġ= Ġ( if Ġ( directory Ġ!= Ġnull Ġ&& Ġdirectory . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}. equals ("", Ġignore Case Ġ= Ġtrue )) Ġ"" Ġelse Ġ"$ directory /") Ġ+ ĠfileName ĊĠĠĠĠĠĠĠ Ġ// ĠAttempt Ġto Ġfind Ġresource ĊĠĠĠĠĠĠĠ Ġval Ġinput : ĠInputStream ? Ġ= ĠFile Util . get Internal Resource ( internal Path ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġbuffers ĊĠĠĠĠĠĠĠ Ġ// ĠInput Ġstream Ġfor Ġinternal Ġfile Ġand Ġexisting Ġfile ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuffered InputStream ( input !! ). use Ġ{ Ġdefault In Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBufferedReader ( InputStream Reader ( default In , ĠStandard Charsets . UTF _ 8 )). use Ġ{ Ġdefault Reader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLoad Ġfrom Ġdefault ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload ( default Reader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen Ġsave Ġin Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave ( file ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Loaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCould n 't Ġfind Ġinternal Ġresource Ġso Ġjust Ġdon 't Ġeven Ġload ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInvalid ConfigurationException :: class ) ĊĠĠĠ Ġfun Ġload ( reader : ĠReader ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġreader . buffered (). use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfirst Line Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . forEach Line Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( if Ġ( first Line ) Ġline . replace ("[ \ u FE FF \ uFF FE \ u 2 0 0 B ] ". to Regex (), Ġ"") Ġelse Ġline ). append ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Line Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġload FromString ( builder . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Invalid ConfigurationException :: class ) ĊĠĠĠ Ġfun Ġload FromString ( contents : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠValidate . notNull ( contents , Ġ" Contents Ġcannot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠ Ġval Ġinput : ĠMap < *, Ġ* >? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyaml . load ( contents ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e 2 : ĠYAML Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid ConfigurationException ( e 2 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e 3 : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid ConfigurationException (" Top Ġlevel Ġis Ġnot Ġa ĠMap .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( input Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOverride Ġold Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( load Comments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Comments ( contents , Ġinput ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Maps To Sections ( input , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠLoading Ġis Ġdone ĊĠĠĠĠĠĠĠ Ġpost Load () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġconvert Maps To Sections ( input : ĠMap < *, Ġ* >, Ġsection : ĠConfig Section ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key 1 , Ġvalue 1 ) Ġin Ġinput ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġkey 1 . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalue 1 !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠMap < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Maps To Sections ( value , Ġsection . create Section ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsection [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġparse Comments ( contents : ĠString , Ġinput : ĠMap < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġstarts Ġwith Ġa Ġcomment , Ġload Ġall Ġnon - breaking Ġcomments Ġas Ġa Ġheader ĊĠĠĠĠĠĠĠ Ġ// Ġthen Ġload Ġall Ġcomments Ġand Ġassign Ġto Ġthe Ġnext Ġvalid Ġnode Ġloaded ĊĠĠĠĠĠĠĠ Ġ// Ġ( Only Ġload Ġcomments Ġthat Ġare Ġon Ġtheir Ġown Ġline ) ĊĠĠĠĠĠĠĠ Ġval Ġ` in ` Ġ= ĠBufferedReader ( String Reader ( contents )) ĊĠĠĠĠĠĠĠ Ġvar Ġinside Scalar Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Path Ġ= ĠLinkedList < String >() ĊĠĠĠĠĠĠĠ Ġval Ġcomment Block Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. forEach Line Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Node Ġ&& Ġ! comment Block . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġheader Ġcomment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Node Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Comment Ġ= ĠComment . load Comment ( comment Block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Block . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( line . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}. startsWith ("# ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġload Ġfull - line Ġcomments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Block . add ( line . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġto Ġsee Ġif Ġthis Ġis Ġa Ġline Ġthat Ġwe Ġcan Ġprocess ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Offset : ĠInt Ġ= ĠText Util . get Offset ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinside Scalar Ġ= Ġinside Scalar Ġand Ġ( line Offset Ġ<= Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġm : ĠMatcher ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! inside Scalar Ġ&& ĠYAML _ REGEX . matcher ( line ). also Ġ{ Ġm Ġ= Ġit Ġ}. find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġfound Ġa Ġconfig Ġnode ! Ġ^ . ^ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġto Ġsee Ġwhat Ġthe Ġfull Ġpath Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepth Ġ= Ġm !!. group ( 1 ). length Ġ/ Ġindentation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( depth Ġ< Ġcurrent Path . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path . remove Last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path . add ( m !!. group ( 2 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġwe Ġhave Ġa Ġcomment Ġfor Ġthis Ġnode ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! comment Block . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġcurrent Path . stream (). collect ( Collectors . join ing ( path Separator . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment : ĠComment Ġ= ĠComment . Companion . load Comment ( comment Block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Block . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Comment ( path , Ġcomment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Node Ġ= Ġfalse Ġ// Ġwe 're Ġno Ġlonger Ġon Ġthe Ġfirst Ġnode ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġscal ars ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġline Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m !!. group ( 3 ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} Ġ== Ġ" |" Ġ|| Ġm !!. group ( 3 ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} Ġ== Ġ"> ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinside Scalar Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comment Block . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfooter Comment Ġ= ĠComment . load Comment ( comment Block ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Block . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete Ġall Ġnodes Ġand Ġvalues Ġthat Ġaren 't Ġdefault Ġvalues ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete Non Default Settings () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġold Ġconfig Ġvalues Ġ( thread - safe ) ĊĠĠĠĠĠĠĠ Ġval Ġdefault Keys Ġ= ĠlistOf (* default Values . keys . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġvalues !!. keys . to Typed Array ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! default Keys . contains ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvery Ġtime Ġwe Ġchange Ġthe Ġfile Ġthrough Ġcode Ġsave Ġit Ġto Ġdisk ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠonChange () Ġ{ ĊĠĠĠĠĠĠĠ Ġsave Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSave Ġcurrent Ġvalues Ġin Ġmemory Ġto Ġthe Ġfile Ġon Ġdisk ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠIf Ġit Ġsaved Ġcorrectly ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsave Changes (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsaved Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( changed Ġ|| Ġhas New Defaults ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Ġ= Ġsave () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsaved ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠIf Ġhas Ġdefault Ġvalues Ġdefined Ġby Ġno Ġvalues ĊĠĠĠĠ Ġ* Ġhave Ġbeen Ġset Ġat Ġthose Ġnodes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhas New Defaults (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull Ġ&& Ġ! file !!. exists ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġfor Ġ( def Ġin Ġdefault Values . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! values !!. containsKey ( def )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave ( file : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠValidate . notNull ( file , Ġ" File Ġcannot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . save ( File ( file )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġsave ( file : ĠFile Ġ= Ġthis . file !! ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠValidate . notNull ( file , Ġ" File Ġcannot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠ Ġif Ġ( file . parent File Ġ!= Ġnull Ġ&& Ġ! file . parent File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . parent File . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġsave ToString () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOutputStream Writer ( File OutputStream ( file ), Ġdefault Charset ). use Ġ{ Ġwriter Ġ-> Ġwriter . write ( data ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave ToString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auto Remove ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Non Default Settings () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyaml Options . indent Ġ= Ġindentation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyaml Options . default Flow Style Ġ= ĠDump er Options . Flow Style . BLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyaml Options . split Lines Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyaml Rep res enter . default Flow Style Ġ= ĠDump er Options . Flow Style . BLOCK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( header Comment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Comment !!. write Comment ( str , Ġ 0 , ĠComment Style . BLOCK ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr . write ("\ n ") Ġ// Ġadd Ġone Ġspace Ġafter Ġthe Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdump Ġ= Ġyaml . dump ( this . getValues ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dump Ġ!= ĠBL ANK _ CONFIG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Comments ( dump , Ġstr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( footer Comment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr . write ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfooter Comment !!. write Comment ( str , Ġ 0 , ĠComment Style . BLOCK ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstr . toString () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . display Error ( ex , Ġ" Error Ġloading Ġconfig ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Changes () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprotected Ġfun Ġwrite Comments ( data : ĠString ?, Ġout : ĠWriter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġline - by - line Ġapply Ġline Ġspacing Ġformatting Ġand Ġcomments Ġper - node ĊĠĠĠĠĠĠĠ Ġval Ġ` in ` Ġ= ĠBufferedReader ( String Reader ( data !! )) ĊĠĠĠĠĠĠĠ Ġvar Ġline : ĠString ? ĊĠĠĠĠĠĠĠ Ġvar Ġinside Scalar Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Node Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Path Ġ= ĠLinkedList < String >() ĊĠĠĠĠĠĠĠ Ġwhile Ġ(` in `. readLine (). also Ġ{ Ġline Ġ= Ġit Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġcomments Ġand Ġempty Ġlines Ġ( there Ġshouldn 't Ġbe Ġany , Ġbut Ġjust Ġin Ġcase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line !!. trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}. startsWith ("# ") Ġ|| Ġline !!. isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġto Ġsee Ġif Ġthis Ġis Ġa Ġline Ġthat Ġwe Ġcan Ġprocess ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Offset : ĠInt Ġ= ĠText Util . get Offset ( line !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinside Scalar Ġ= Ġinside Scalar Ġand Ġ( line Offset Ġ<= Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġm : ĠMatcher ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! inside Scalar Ġ&& ĠYAML _ REGEX . matcher ( line !! ). also Ġ{ Ġm Ġ= Ġit Ġ}. find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġfound Ġa Ġconfig Ġnode ! Ġ^ . ^ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġto Ġsee Ġwhat Ġthe Ġfull Ġpath Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepth Ġ= Ġm !!. group ( 1 ). length Ġ/ Ġindentation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( depth Ġ< Ġcurrent Path . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path . remove Last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path . add ( m !!. group ( 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġcurrent Path . stream (). collect ( Collectors . join ing ( path Separator . toString ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthis Ġis Ġa Ġroot - level Ġnode , Ġapply Ġextra Ġspacing Ġif Ġwe Ġaren 't Ġthe Ġfirst Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! first Node Ġ&& Ġdepth Ġ== Ġ 0 Ġ&& Ġroot Node Spacing Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString ( CharArray ( root Node Spacing )). replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ u 0 0 0 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ// Ġyes Ġit 's Ġsil ly , Ġbut Ġit Ġworks Ġ:> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Node Ġ= Ġfalse Ġ// Ġwe 're Ġno Ġlonger Ġon Ġthe Ġfirst Ġnode ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinsert Ġthe Ġrel av ant Ġcomment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment Ġ= Ġget Comment ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġspacing Ġbetween Ġprevious Ġnodes Ġand Ġcomments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depth Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ( String ( CharArray ( comment Spacing )). replace ("\ u 0 0 0 0 ", Ġ"\ n ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġformatting Ġstyle Ġfor Ġthis Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstyle Ġ= Ġcomment . st yling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( style Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġto Ġsee Ġwhat Ġtype Ġof Ġnode Ġthis Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġif Ġ( m !!. group ( 3 ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsetting Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Node Comment Format ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprobably Ġa Ġsection ? Ġ( need Ġto Ġpeek Ġahead Ġto Ġcheck Ġif Ġthis Ġis Ġa Ġlist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. mark ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Line Ġ= Ġ` in `. readLine (). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nextLine . startsWith ("- ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġa Ġsection Ġ: P ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Node Comment Format ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Section Comment Format ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwrite Ġit Ġdown ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . write Comment ( out , Ġline Offset , Ġstyle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġscal ars ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġline Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m !!. group ( 3 ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} Ġ== Ġ" |" Ġ|| Ġm !!. group ( 3 ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} Ġ== Ġ"> ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinside Scalar Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ( line !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ("\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ------------------------------------------------------------------------- ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠFinal Ġvariables ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġ------------------------------------------------------------------------- ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġ[ String ] Ġrepresentation Ġof Ġa Ġblank Ġ[ Yaml Config ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprotected Ġconst Ġval ĠBL ANK _ CONFIG Ġ= Ġ"{} \ n " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠStatic Ġmethod Ġto Ġjust Ġload Ġan Ġinternal ĠYAML Ġfile Ġright Ġonto Ġthe Ġserver Ġwithout Ġhaving ĊĠĠĠĠĠĠĠĠ Ġ* Ġto Ġcreate Ġa Ġcustom Ġclass Ġbecause Ġwe Ġaren 't Ġdoing Ġany Ġinternal Ġloading . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġplugin ĠĠĠ ĠThe Ġplugin Ġthis Ġfile Ġis Ġapart Ġof ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdirectory ĠThe Ġdirectory Ġto Ġput Ġthe Ġfile Ġin ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠfileName Ġ ĠThe Ġname Ġof Ġthe Ġfile ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġload Internal Yaml ( plugin : ĠSp ig ot Plugin , Ġdirectory : ĠString , ĠfileName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Load Ġ= ĠYaml Config ( plugin , Ġdirectory , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Load . load () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }