package Ġju ux el . ad orn . data gen Ċ Ċ import Ġorg . w 3 c . dom . Element Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġorg . w 3 c . dom . NodeList Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ Ċ object ĠGenerator Config Loader Ġ{ ĊĠĠĠ Ġfun Ġread ( path : ĠPath ): ĠGenerator Config Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠFiles . new InputStream ( path ). use Ġ{ ĠDocument BuilderFactory . newInstance (). new Document Builder (). parse ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġdocument . documentElement ĊĠĠĠĠĠĠĠ Ġcheck ( root . tagName Ġ== ĠTags . ROOT ) Ġ{ Ġ" generator Ġconfig Ġroot Ġelement Ġmust Ġbe Ġ${ Tags . ROOT }, Ġfound Ġ${ root . tagName }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwood s Ġ= Ġroot . getElement Sequence By TagName ( Tags . WO OD ). map (:: read W ood ). toSet () ĊĠĠĠĠĠĠĠ Ġval Ġst ones Ġ= Ġroot . getElement Sequence By TagName ( Tags . ST ONE ). map (:: read Stone ). toSet () ĊĠĠĠĠĠĠĠ Ġval Ġw ools Ġ= Ġif Ġ( root . getAttribute ( Attributes . WO OL ). to Boolean ()) ĠColor Material . values () Ġelse Ġempty Array () ĊĠĠĠĠĠĠĠ Ġval Ġcondition Type Ġ= ĠCondition Type . parse ( root . getAttribute ( Attributes . CONDITION _ TYPE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" Unknown Ġcondition Ġtype Ġin Ġ$ path : Ġ${ root . getAttribute ( Attributes . CONDITION _ TYPE )} ") ĊĠĠĠĠĠĠĠ Ġreturn ĠGenerator Config ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwood s , Ġst ones , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw ools . map To ( Linked HashSet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGenerator Config . Material Entry ( it , Ġexclude Ġ= Ġempty Set (), Ġreplace Ġ= Ġempty Map ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Type ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< M Ġ: ĠMaterial > Ġread Material Entry ( element : ĠElement , Ġmaterial : ĠM ): ĠGenerator Config . Material Entry < M > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexclude Ġ= Ġelement . getElement Sequence By TagName ( Tags . EXCL UDE ). map To ( Linked HashSet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . getAttribute ( Attributes . GENER ATOR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġreplace Ġ= Ġbuild Substitution s Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( replace Element Ġin Ġelement . getElement Sequence By TagName ( Tags . REPLACE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġreplace Element . getAttribute ( Attributes . KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġreplace Element . getAttribute ( Attributes . WITH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġreplace Element . getAttribute ( Attributes . ID ). to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id ) Ġkey Ġwith Id Ġvalue Ġelse Ġkey Ġwith Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠGenerator Config . Material Entry ( material , Ġexclude , Ġreplace ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread W ood ( element : ĠElement ): ĠGenerator Config . Material Entry < W ood Material > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠId . parse ( element . getAttribute ( Attributes . ID )) ĊĠĠĠĠĠĠĠ Ġ// Ġto Boolean Ġis Ġluck ily Ġfalse Ġby Ġdefault Ġ( so Ġalso Ġfor Ġempty Ġstrings ) ĊĠĠĠĠĠĠĠ Ġval Ġf ung us Ġ= Ġelement . getAttribute ( Attributes . FUN G US ). to Boolean () ĊĠĠĠĠĠĠĠ Ġval Ġnon Fl amm able Ġ= Ġelement . getAttribute ( Attributes . NON _ FL AM M ABLE ). to Boolean () ĊĠĠĠĠĠĠĠ Ġreturn Ġread Material Entry ( element , ĠW ood Material ( id , Ġf ung us Ġ= Ġf ung us , Ġnon Fl amm able Ġ= Ġnon Fl amm able )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Stone ( element : ĠElement ): ĠGenerator Config . Material Entry < Stone Material > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠId . parse ( element . getAttribute ( Attributes . ID )) ĊĠĠĠĠĠĠĠ Ġval Ġbr icks Ġ= Ġelement . getAttribute ( Attributes . BR IC KS ). to Boolean () ĊĠĠĠĠĠĠĠ Ġval Ġside d Texture Ġ= Ġelement . getAttribute ( Attributes . SID ED _ TEXTURE ). to Boolean () ĊĠĠĠĠĠĠĠ Ġreturn Ġread Material Entry ( element , ĠSt one Material ( id , Ġbr icks Ġ= Ġbr icks , Ġhas Side d Texture Ġ= Ġside d Texture )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġoperator Ġfun ĠNode List . iterator (): ĠIterator < Node > Ġ= ĊĠĠĠĠĠĠĠ Ġiterator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( item ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠElement . getElement Sequence By TagName ( tag : ĠString ): ĠSequence < Element > Ġ= ĊĠĠĠĠĠĠĠ ĠSequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Elements By TagName ( tag ). iterator () ĊĠĠĠĠĠĠĠ Ġ}. filter Is Instance < Element >() ĊĊĠĠĠ Ġprivate Ġobject ĠTags Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠROOT Ġ= Ġ" data _ generators " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠW O OD Ġ= Ġ" wood " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠST ONE Ġ= Ġ" stone " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREPLACE Ġ= Ġ" replace " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX CL UDE Ġ= Ġ" exclude " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠAttributes Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONDITION _ TYPE Ġ= Ġ" condition _ type " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠW O OL Ġ= Ġ" w ool " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠID Ġ= Ġ" id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFUN G US Ġ= Ġ" fung us " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNON _ FL AM M ABLE Ġ= Ġ" non _ fl amm able " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBR IC KS Ġ= Ġ" br icks " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSID ED _ TEXTURE Ġ= Ġ" side d _ texture " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER ATOR Ġ= Ġ" generator " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY Ġ= Ġ" key " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠWITH Ġ= Ġ" with " ĊĠĠĠ Ġ} Ċ } Ċ