package Ġch . hs r . ifs . g cs . ui . mission . need Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġch . hs r . ifs . g cs . mission . Need Ċ import Ġcom . google . gson . Json Parser Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . InputStream Reader Ċ Ċ class ĠNeed Item Factory ( context : ĠContext ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNE ED _ ITEM _ DESCRIPTOR _ DIRECTORY Ġ= Ġ" needs " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG _ TAG Ġ= Ġthis :: class . simple Name ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠNeed Item Descriptor ( val Ġid : ĠString , Ġval Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġload ( stream : ĠInputStream ) Ġ= Ġwith ( Json Parser (). parse ( InputStream Reader ( stream , ĠChar sets . UTF _ 8 )). as JsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNeed Item Descriptor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġthis [" id "]. asString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġthis [" name "]. asString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġf Construct ors Ġ= Ġmutable Map Of < String , Ġ( Need ) Ġ-> ĠNeed Item >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . assets . list ( NEED _ ITEM _ DESCRIPTOR _ DIRECTORY )?. forEach Ġ{ Ġf Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . assets . open ("$ NEED _ ITEM _ DESCRIPTOR _ DIRECTORY /$ f "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNeed Item Descriptor . load ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Construct ors [ id ] Ġ= Ġ{ Ġneed Ġ-> ĠNeed Item ( need , Ġname ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" Failed Ġto Ġread Ġneed Ġitem Ġdescriptor Ġconfiguration Ġ'$ NEED _ ITEM _ DESCRIPTOR _ DIRECTORY /$ f '") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinstantiate ( need : ĠNeed ) Ġ= Ġf Construct ors [ need . id ]?. invoke ( need ) Ġ?: Ġthrow ĠIllegalArgumentException (" No Ġconstructor Ġfor Ġ${ need . id }") Ċ Ċ }