/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 1 7 ĠDen is ĠSh ury gin . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġru . po cket byte . lo col aser . utils . json Ċ Ċ import Ġru . po cket byte . lo col aser . exception . Invalid Config Exception Ċ import Ġorg . json . simple . JSONArray Ċ import Ġorg . json . simple . JSONObject Ċ import Ġorg . json . simple . parser . Container Factory Ċ import Ġorg . json . simple . parser . JSONParser Ċ import Ġru . po cket byte . lo col aser . resource . formatting .* Ċ Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . lang . reflect . Modifier Ċ Ċ /** Ċ Ġ* ĠUtils Ġclass Ġto Ġparse ĠJSON . Ċ Ġ* Ċ Ġ* Ġ@ author ĠDen is ĠSh ury gin Ċ Ġ*/ Ċ object ĠJson Parse Utils Ġ{ ĊĊĠĠĠ Ġval ĠJSON _ PARSER Ġ= ĠJSON Parser () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInstance Ġof ĠContainer Factory Ġthat Ġreturns ĠLinked JSONObject Ġinstead Ġof ĠJSONObject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠJSON _ LINK ED _ CONTAINER _ FACTORY Ġ= Ġobject Ġ: ĠContainer Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcre at Array Container (): ĠMutable List < Any ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJSONArray () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Object Container (): ĠMutable Map < Any ?, ĠAny ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLinked JSONObject () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Invalid Config Exception :: class ) ĊĠĠĠ Ġfun ĠgetString ( json : ĠJSONObject , Ġkey : ĠString , Ġparent Key : ĠString ? Ġ= Ġnull , Ġthrow If Null : ĠBoolean Ġ= Ġfalse ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠgetObject ( json , Ġkey , Ġparent Key , Ġthrow If Null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( jsonObject Ġ!= Ġnull Ġ&& ĠjsonObject Ġ! is ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Config Exception (" Property Ġ${ key Name ( key , Ġparent Key )} Ġmust Ġbe Ġa ĠString .") ĊĠĠĠĠĠĠĠ Ġreturn ĠjsonObject Ġas ? ĠString ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Invalid Config Exception :: class ) ĊĠĠĠ Ġfun Ġget Boolean ( json : ĠJSONObject , Ġkey : ĠString , Ġparent Key : ĠString ? Ġ= Ġnull , Ġthrow If Null : ĠBoolean Ġ= Ġfalse ): ĠBoolean ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠgetObject ( json , Ġkey , Ġparent Key , Ġthrow If Null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( jsonObject Ġ!= Ġnull Ġ&& ĠjsonObject Ġ! is ĠBoolean ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Config Exception (" Property Ġ${ key Name ( key , Ġparent Key )} Ġmust Ġbe Ġa ĠBoolean .") ĊĠĠĠĠĠĠĠ Ġreturn Ġ( jsonObject Ġas ? ĠBoolean ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Invalid Config Exception :: class ) ĊĠĠĠ Ġfun Ġget Long ( json : ĠJSONObject , Ġkey : ĠString , Ġparent Key : ĠString ? Ġ= Ġnull , Ġthrow If Null : ĠBoolean Ġ= Ġfalse ): ĠLong ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠgetObject ( json , Ġkey , Ġparent Key , Ġthrow If Null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( jsonObject Ġ!= Ġnull Ġ&& ĠjsonObject Ġ! is ĠLong ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Config Exception (" Property Ġ${ key Name ( key , Ġparent Key )} Ġmust Ġbe Ġa ĠLong .") ĊĠĠĠĠĠĠĠ Ġreturn Ġ( jsonObject Ġas ? ĠLong ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Invalid Config Exception :: class ) ĊĠĠĠ Ġfun Ġget JSONObject ( json : ĠJSONObject , Ġkey : ĠString , Ġparent Key : ĠString ? Ġ= Ġnull , Ġthrow If Null : ĠBoolean Ġ= Ġfalse ): ĠJSONObject ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠgetObject ( json , Ġkey , Ġparent Key , Ġthrow If Null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( jsonObject Ġ!= Ġnull Ġ&& ĠjsonObject Ġ! is ĠJSONObject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Config Exception (" Property Ġ${ key Name ( key , Ġparent Key )} Ġmust Ġbe Ġa ĠJSONObject .") ĊĠĠĠĠĠĠĠ Ġreturn ĠjsonObject Ġas ? ĠJSONObject ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Invalid Config Exception :: class ) ĊĠĠĠ Ġfun Ġget Strings ( json : ĠJSONObject , Ġkey : ĠString , Ġparent Key : ĠString ? Ġ= Ġnull , Ġthrow If Null : ĠBoolean Ġ= Ġfalse ): ĠList < String >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠgetObject ( json , Ġkey , Ġparent Key , Ġthrow If Null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( jsonObject Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( jsonObject Ġis ĠJSONArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( jsonObject Ġas ĠJSONArray ?) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ! is ĠString Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Config Exception (" Property Ġ${ key Name ( key , Ġparent Key )} Ġmust Ġbe Ġa ĠStrings Ġarray .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠjsonObject Ġas ? ĠList < String > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Config Exception (" Property Ġ${ key Name ( key , Ġparent Key )} Ġmust Ġbe Ġa ĠStrings Ġarray .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Invalid Config Exception :: class ) ĊĠĠĠ Ġfun ĠgetFile ( json : ĠJSONObject , Ġkey : ĠString , Ġparent Key : ĠString ? Ġ= Ġnull , Ġthrow If Null : ĠBoolean Ġ= Ġfalse ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠgetString ( json , Ġkey , Ġparent Key , Ġthrow If Null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( path Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( File ( path ). canonical Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Invalid Config Exception :: class ) ĊĠĠĠ Ġfun ĠgetObject ( json : ĠJSONObject , Ġkey : ĠString , Ġparent Key : ĠString ? Ġ= Ġnull , Ġthrow If Null : ĠBoolean Ġ= Ġfalse ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġjson [ key ] ĊĠĠĠĠĠĠĠ Ġif Ġ( throw If Null Ġ&& ĠjsonObject Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Config Exception (" Property Ġ${ key Name ( key , Ġparent Key )} Ġis Ġnot Ġset .") ĊĠĠĠĠĠĠĠ Ġreturn ĠjsonObject ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Formatting Type ( json : ĠJSONObject , Ġkey : ĠString , Ġparent Key : ĠString ? Ġ= Ġnull , Ġthrow If Null : ĠBoolean Ġ= Ġfalse ): ĠFormat ting Type ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠgetObject ( json , Ġkey , Ġparent Key , Ġthrow If Null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( jsonObject Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen ( jsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" java " Ġ-> ĠJava Formatting Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" web " Ġ-> ĠWeb Formatting Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" no " Ġ-> ĠNo Formatting Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= ĠClass . forName ( jsonObject ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield : ĠField ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . getDeclared Field (" INSTANCE ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Field Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġnull Ġ&& Ġ! Modifier . is Private ( field . modifiers )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . get ( null ) Ġas ĠFormat ting Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . getDeclared Constructor (). newInstance () Ġas ĠFormat ting Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( jsonObject Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Config Exception (" Property Ġ${ key Name ( key , Ġparent Key )} Ġmust Ġbe Ġa ĠString .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġkey Name ( key : ĠString , Ġparent : ĠString ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder ("\" ") ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( parent ). append (".") ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . append ( key ). append ("\ "" ). toString () ĊĠĠĠ Ġ} Ċ } Ċ