package Ġorg . red und ent . kotlin . xml . gen . writer Ċ Ċ import Ġcom . sun . tools . x jc . outline . Class Outline Ċ import Ġorg . red und ent . kotlin . xml . gen . Ex Options Ċ Ċ class ĠXml Class ( Ċĉ ĉ val Ġclazz : ĠClass Outline , Ċĉ ĉ private Ġval Ġopts : ĠEx Options , Ċĉ ĉ inner Class : ĠBoolean Ġ= Ġfalse ) Ġ: ĠCode Ġ{ Ċ ĉ val Ġname : ĠString Ġ= Ġclazz . target . short Name Ċ ĉ val Ġxmlns : ĠString ? Ġ= Ġif Ġ( clazz . target . is Element Ġ&& Ġclazz . target . element Name . namespace URI . isNotBlank ()) Ġclazz . target . element Name . namespace URI Ġelse Ġnull ĊĊ ĉ private Ġval Ġsuper ClassName : ĠString Ġ= Ġclazz . super Class ?. target ?. let Ġ{ Ġ"${ it . owner Package . name ()}. `${ it . short Name }` " Ġ} Ġ?: Ġ" Node " Ċ ĉ private Ġval Ġabstract : ĠBoolean Ġ= Ġclazz . target . is Abstract Ċ ĉ private Ġval Ġattributes : ĠMutable List < XmlAttribute > Ġ= ĠArrayList () Ċ ĉ private Ġval Ġmember Elements : ĠMutable List < XmlElement > Ġ= ĠArrayList () Ċ ĉ private Ġvar Ġroot Element : ĠXml Element ? Ġ= Ġnull Ċ ĉ private Ġval Ġinner Classes : ĠMutable List < Xml Class > Ġ= ĠArrayList () ĊĊ ĉ private Ġval Ġmodifier Ġ= Ġwhen Ġ{ Ċĉ ĉ abstract Ġ-> Ġ" abstract " Ċĉ ĉ inner Class Ġ-> Ġ" inner " Ċĉ ĉ else Ġ-> Ġ" open " Ċ ĉ } ĊĊ ĉ private Ġval Ġconstructor Arg Ġ= Ġif Ġ(! inner Class ) Ġ"( nodeName : ĠString )" Ġelse Ġ"" Ċ ĉ private Ġval ĠsuperClass Constructor Arg Ġ= Ġif Ġ( inner Class ) Ġ"\" $ name \"" Ġelse Ġ" nodeName " ĊĊ ĉ private Ġval Ġhas Body : ĠBoolean Ċĉ ĉ get () Ġ= Ġattributes . isNotEmpty () Ġ|| Ġxmlns Ġ!= Ġnull Ġ Ġ|| Ġinner Classes . isNotEmpty () Ġ|| Ġ( opts . use Member Functions Ġ&& Ġmember Elements . isNotEmpty ()) ĊĊ ĉ init Ġ{ Ċĉ ĉ clazz . target . attributes . map Ġ{ Ċĉĉ ĉ val Ġfield Ġ= Ġclazz . parent (). getField ( it ) Ċĉĉ ĉ val Ġname Ġ= Ġit . xml Name . local Part Ċĉĉ ĉ val Ġtype Ġ= Ġ"${ Code Writer . map Type ( field . raw Type . fullName ()) }${ if Ġ(! it . isRequired ) Ġ" ?" Ġelse Ġ"" }" ĊĊĉĉ ĉ XmlAttribute ( name , Ġtype ) Ċĉ ĉ }. forEach Ġ{ Ġattributes . add ( it ) Ġ} ĊĊĉ ĉ clazz . target . elements . forEach Ġ{ Ġelement Ġ-> Ċĉĉ ĉ element . types . forEach Ġ{ Ġtype Ġ-> Ċĉĉĉ ĉ member Elements . add ( XmlElement ( type . tagName . local Part , Ġtype . target , Ġtype . tagName . local Part , Ġelement . documentation , Ġif Ġ( opts . use Member Functions ) Ġnull Ġelse Ġclazz . target )) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ if Ġ( clazz . target . is Element ) Ġ{ Ċĉĉ ĉ val Ġname Ġ= Ġclazz . target . element Name . local Part Ċĉĉ ĉ root Element Ġ= ĠXml Element ( name , Ġclazz . target , Ġname , Ġclazz . target . documentation ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġwrite ( code Writer : ĠCode Writer ) Ġ{ Ċĉ ĉ with Ġ( code Writer ) Ġ{ Ċĉĉ ĉ write Kotlin Doc ( clazz . target . documentation ) ĊĊĉĉ ĉ if Ġ( clazz . target . is Ordered Ġ&& Ġclazz . target . elements . size Ġ> Ġ 1 ) Ġ{ Ċĉĉĉ ĉ writeln ("@ XmlType ( child Order Ġ= ĠarrayOf (${ clazz . target . elements . join ToString (", \ n \ t \ t ") Ġ{ Ġ"\" ${ it . types . first (). tagName . local Part }\ "" Ġ}} )) ") Ċĉĉ ĉ } Ċĉĉ ĉ writeln ("$ modifier Ġclass Ġ`$ name `$ constructor Arg Ġ: Ġ$ super ClassName ($ super Class Constructor Arg ) ${ if Ġ( has Body ) Ġ" Ġ{" Ġelse Ġ"\ n "} ") Ċĉĉ ĉ indent () ĊĊĉĉ ĉ if Ġ( xmlns Ġ!= Ġnull ) Ġ{ Ċĉĉĉ ĉ write Block Ġ{ Ċĉĉĉĉ ĉ """ Ċ init Ġ{ Ċ ĉ xmlns Ġ= Ġ"$ xmlns " Ċ } Ċ """ Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ if Ġ( attributes . isNotEmpty ()) Ġ{ Ċĉĉĉ ĉ attributes . forEach Ġ{ Ġit . write ( this ) Ġ} Ċĉĉĉ ĉ writeln () Ċĉĉ ĉ } ĊĊĉĉ ĉ if Ġ( opts . use Member Functions ) Ġ{ Ċĉĉĉ ĉ if Ġ( member Elements . isNotEmpty ()) Ġ{ Ċĉĉĉĉ ĉ member Elements . forEach Ġ{ Ġit . write ( this ) Ġ} Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ if Ġ( inner Classes . isNotEmpty ()) Ġ{ Ċĉĉĉ ĉ inner Classes . forEach Ġ{ Ġit . write ( this ) Ġ} Ċĉĉ ĉ } ĊĊĉĉ ĉ if Ġ( has Body ) Ġ{ Ċĉĉĉ ĉ trim Last NewLine () Ċĉĉ ĉ } ĊĊĉĉ ĉ ded ent () ĊĊĉĉ ĉ if Ġ( has Body ) Ġ{ Ċĉĉĉ ĉ writeln (" }\ n ") Ċĉĉ ĉ } ĊĊĉĉ ĉ if Ġ(! opts . use Member Functions ) Ġ{ Ċĉĉĉ ĉ member Elements . forEach Ġ{ Ġit . write ( this ) Ġ} Ċĉĉ ĉ } ĊĊĉĉ ĉ root Element ?. write ( this ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġadd Inner Class ( xml Class : ĠXml Class ) Ġ{ Ċĉ ĉ inner Classes . add ( xml Class ) Ċ ĉ } Ċ }