package Ġio . art ic ulus . fhir . generator Ċ Ċ import Ġcom . google . gson . JsonArray Ċ import Ġcom . google . gson . JsonObject Ċ Ċ class ĠF hir StructureDefinition ( val Ġfhir Spec : ĠF hir Spec , Ġval Ġprofile : ĠJsonObject ) Ġ{ ĊĠĠĠ Ġval ĠLOG Ġby Ġlogger () ĊĊĠĠĠ Ġval Ġstructure Ġ= ĠF hir StructureDefinition Structure ( fhir Spec , Ġthis ) ĊĠĠĠ Ġval Ġelements Ġ= Ġmutable ListOf < Fhir StructureDefinition Element >() ĊĠĠĠ Ġvar Ġmain Element : ĠF hir StructureDefinition Element ? Ġ= Ġnull ĊĠĠĠ Ġval Ġclasses Ġ= Ġmutable ListOf < Fhir Class >() ĊĠĠĠ Ġvar Ġdid Wrap Up : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġval Ġurl : ĠString ĊĠĠĠ Ġval Ġis Manual Ġ= Ġfalse ĊĠĠĠ Ġlateinit Ġvar Ġtarget Name : ĠString ĊĊĊĠĠĠ Ġfun Ġname (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstructure . name ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( profile . getString OrEmpty (" resourceType ") Ġ== Ġ" StructureDefinition ") ĊĊĠĠĠĠĠĠĠ Ġurl Ġ= Ġprofile [" url "]. asString ĊĊĠĠĠĠĠĠĠ Ġstructure . parseFrom ( profile ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġprocess Profile () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstruct Ġ= Ġif Ġ( structure . differ ential Ġ!= Ġnull ) Ġstructure . differ ential Ġas ĠJson Array Ġelse Ġstructure . snapshot Ġas ĠJson Array ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġmapped Ġ= Ġmutable Map Of < String , ĠF hir StructureDefinition Element >() ĊĠĠĠĠĠĠĠ Ġstruct . forEach Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= ĠF hir StructureDefinition Element ( this , Ġe Ġas ĠJsonObject , Ġ( main Element Ġ== Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements . add ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġelement . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapped . put ( path , Ġelement ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġestablish Ġhierarchy Ġ( may Ġmove Ġto Ġextra Ġloop Ġin Ġcase Ġelements Ġare Ġno Ġlonger Ġin Ġorder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Main Profile Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Element Ġ= Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapped [ element . parent Name ]?. addChild ( element ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . resolve Dependencies () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrun Ġcheck : Ġif Ġn _ min Ġ> Ġ 0 Ġand Ġparent Ġis Ġin Ġsummary , Ġmust Ġalso Ġbe Ġin Ġsummary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements . forEach Ġ{ Ġelem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġelem . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elem . min Ġ!= Ġnull Ġ&& Ġp Ġ!= Ġnull Ġ&& Ġp . is Summary Ġ&& Ġ! elem . is Summary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// logger . error (" n _ min Ġ> Ġ 0 Ġbut Ġnot Ġsummary : Ġ` {} ` ". format ( element . path )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelem . summary Min Conflict Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġclasses Ġand Ġclass Ġproperties ĊĠĠĠĠĠĠĠ Ġif Ġ( main Element Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( snap Class , Ġk ids ) Ġ= Ġmain Element !!. createClass () Ġ// Ġtodo Ġst ench ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snap Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" The Ġmain Ġelement Ġfor Ġ\"$ url \" Ġdid Ġnot Ġcreate Ġa Ġclass ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Class ( snap Class ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk ids . forEach Ġ{ Ġcls Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Class ( cls ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Name Ġ= Ġsnap Class . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġfound Class ( klass : ĠF hir Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclasses . add ( klass ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġelement With Id ( ident : ĠString ): ĠF hir StructureDefinition Element ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġelements . forEach Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . definition . id Ġ== Ġident ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġwrap Up () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġassign Ġall Ġsuper - classes Ġas Ġobjects ĊĠĠĠĠĠĠĠ Ġclasses . forEach Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . super Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsc Ġ= ĠF hir Class . with Name ( c . super className ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sc Ġ== Ġnull Ġ&& Ġc . super className Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug (" There Ġis Ġno Ġclass Ġimplementation Ġfor Ġclass Ġnamed Ġ${ c . super className } Ġin Ġprofile Ġ${ url }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . super Class Ġ= Ġsc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdid Wrap Up Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġwrite able Classes (): ĠList < Fhir Class > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġmutable ListOf < Fhir Class >() ĊĠĠĠĠĠĠĠ Ġclasses . forEach Ġ{ Ġf class Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f class . should Write ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . add ( f class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġc ĊĠĠĠ Ġ} Ċ }