package Ġde . fh do . lemma . model _ processing . code _ generation . java _ base . serialization Ċ Ċ import Ġde . fh do . lemma . data . Complex Type Ċ import Ġde . fh do . lemma . data . Data Structure Ċ import Ġde . fh do . lemma . data . ListType Ċ import Ġde . fh do . lemma . model _ processing . as File Ċ import Ġde . fh do . lemma . model _ processing . code _ generation . java _ base . load Original EObject Ċ import Ġde . fh do . lemma . model _ processing . utils . count Lines Ċ import Ġde . fh do . lemma . model _ processing . utils . main Interface Ċ import Ġde . fh do . lemma . model _ processing . utils . trim To Single Line Ċ import Ġorg . eclipse . emf . ecore . EObject Ċ import Ġorg . eclipse . x text . node model . util . Node Model Utils Ċ import Ġjava . io . File Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . Round ingMode Ċ Ċ /** Ċ Ġ* ĠHelper Ġto Ġcount Ġthe Ġlines Ġof Ġa Ġ[ serialization Result ] Ġas Ġwell Ġas Ġof Ġthe Ġoriginal Ġ[ EObject ] Ġin Ġthe Ġfile Ġat Ġthe Ċ Ġ* Ġ[ original Model FilePath ], Ġwhich Ġcorresponds Ġto Ġthe Ġgiven Ġ[ intermediate EObject ]. ĠThe Ġresult Ġis Ġa Ġ[ Line Count Info ] Ċ Ġ* Ġobject . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ internal Ġfun Ġcount Lines ( serialization Result : ĠPair < String , ĠString >, Ġintermediate EObject : ĠE Object ? Ġ= Ġnull , ĊĠĠĠ Ġoriginal Model FilePath : ĠString ? Ġ= Ġnull ) Ġ: ĠLine Count Info Ġ{ ĊĠĠĠ Ġ/* ĠCount Ġlines Ġof Ġgenerated Ġcode Ġ*/ ĊĠĠĠ Ġval Ġ( target FilePath , Ġgenerated Code ) Ġ= Ġserialization Result ĊĠĠĠ Ġval Ġgenerated Code Line Count Ġ= Ġgenerated Code . count Lines ( for File Ġ= Ġtarget FilePath ) ĊĊĠĠĠ Ġif Ġ( intermediate EObject Ġ== Ġnull Ġ|| Ġoriginal Model FilePath Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn ĠLine Count Info ( target FilePath , Ġgenerated Code Line Count ) ĊĊĠĠĠ Ġ/* ĠCount Ġlines Ġand Ġdetermine Ġadditional Ġinformation Ġof Ġoriginal ĠE Object Ġif Ġspecified Ġ*/ ĊĠĠĠ Ġval Ġoriginal EObject Ġ= Ġintermediate EObject . load Original EObject ( original Model FilePath ) ĊĠĠĠ Ġval Ġoriginal EObject Parser Node Ġ= ĠNode Model Utils . getNode ( original EObject ) ĊĠĠĠ Ġval Ġoriginal EObject Line Count Ġ= Ġoriginal EObject Parser Node . text . count Lines ( for File Ġ= Ġoriginal Model FilePath ) ĊĠĠĠ Ġval Ġoriginal EObject Additional Info Ġ= Ġoriginal EObject . derive Additional Line Count Info ( original Model FilePath ) ĊĠĠĠ Ġoriginal EObject Additional Info [ ORIGIN AL _ E OBJECT _ TYPE _ INFO _ FIELD ] Ġ= Ġoriginal EObject . main Interface . simple Name ĊĊĠĠĠ Ġreturn ĠLine Count Info ( ĊĠĠĠĠĠĠĠ Ġtarget FilePath , ĊĠĠĠĠĠĠĠ Ġgenerated Code Line Count , ĊĠĠĠĠĠĠĠ Ġoriginal EObject Line Count , ĊĠĠĠĠĠĠĠ Ġoriginal EObject Additional Info ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġclusters Ġinformation Ġy ielded Ġby Ġa Ġcall Ġto Ġ[ count Lines ]. ĠIt Ġcompri ses Ġthe Ġline Ġcount Ġof Ġthe Ġserialization Ċ Ġ* Ġresult , Ġthe Ġoriginal Ġ[ EObject ] Ġinstance , Ġand Ġarbitrary Ġadditional Ġinformation Ġconcerning Ġthe Ġoriginal Ġ[ EObject ] Ġlike Ċ Ġ* Ġnumber Ġof Ġdata Ġfields Ġetc . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ internal Ġclass ĠLine Count Info ( var Ġserialization Target FilePath : ĠString , Ġvar Ġserialization Result Line Count : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġvar Ġoriginal EObject Line Count : ĠInt Ġ= Ġ 0 , Ġval Ġadditional Info : ĠMap < String , ĠString > Ġ= Ġmutable Map Of ()) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTwo Ġ[ Line Count Info ] Ġinstances Ġare Ġequal , Ġif Ġtheir Ġ[ serialization Target FilePath ] Ġvalues Ġare Ġequal ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) ĊĠĠĠĠĠĠĠ Ġ= Ġif Ġ( this Ġ=== Ġother ) Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( other Ġ== Ġnull ) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( other Ġis ĠLine Count Info ) Ġserialization Target FilePath Ġ== Ġother . serialization Target FilePath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġhash Ġcode Ġof Ġa Ġ[ Line Count Info ] Ġis Ġequal Ġto Ġthe Ġhash Ġcode Ġof Ġits Ġ[ serialization Target FilePath ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġserialization Target FilePath . hashCode () Ċ } Ċ Ċ /** Ċ Ġ* ĠHelper Ġto Ġserialize Ġa Ġlist Ġof Ġ[ Line Count Info ] Ġinstances Ġto Ġa ĠCSV Ġstring . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ internal Ġfun Ġserialize Line Count Info ( line Count InfoList : ĠList < Line Count Info >) Ġ: ĠString Ġ{ ĊĠĠĠ Ġval Ġserialization Result Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġadditional Info Field Names Ġ= Ġline Count InfoList . map Ġ{ Ġit . additional Info . keys Ġ}. flatten (). to Sorted Set () ĊĊĠĠĠ Ġ/* ĠAdd Ġheading Ġ*/ ĊĠĠĠ Ġserialization Result . add ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGenerated Ġfile Ġpath ; ĠĊĠĠĠĠĠĠĠĠĠĠĠ ĠGenerated Ġline Ġcount ; ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOriginal Ġline Ġcount ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ${ additional Info Field Names . join ToString ("; ")} ĊĠĠĠĠĠĠĠ Ġ""" . trim To Single Line () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/* ĠAdd Ġline Ġcount Ġinformation Ġ*/ ĊĠĠĠ Ġvar Ġfile Extension Sum s Ġ= Ġmutable Map Of < String , ĠPair < Int , ĠInt >>() ĊĠĠĠ Ġvar Ġsummar ized E Objects Ġ= Ġmutable Set Of < String >() ĊĠĠĠ Ġfor Ġ( line Count Info Ġin Ġline Count InfoList ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadditional Info Ġ= Ġline Count Info . additional Info ĊĠĠĠĠĠĠĠ Ġval Ġadditional Info Csv Ġ= Ġadditional Info Field Names . join ToString ("; ") Ġ{ Ġadditional Info [ it ] Ġ?: Ġ" n / a " Ġ} ĊĠĠĠĠĠĠĠ Ġserialization Result . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ line Count Info . serialization Target FilePath }; ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ line Count Info . serialization Result Line Count }; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ line Count Info . original EObject Line Count }; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ additional Info Csv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim To Single Line () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCollect Ġline Ġcount Ġsums Ġper Ġfile Ġtype ĊĠĠĠĠĠĠĠ Ġval Ġfile Extension Ġ= Ġline Count Info . serialization Target FilePath . as File (). extension . toLowerCase () ĊĠĠĠĠĠĠĠ Ġvar Ġ( serialization Result Line Count Sum , Ġoriginal EObject Line Count Sum ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Extension Ġin Ġfile Extension Sum s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Extension Sum s [ file Extension ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġto Ġ 0 ĊĠĠĠĠĠĠĠ Ġserialization Result Line Count Sum Ġ+= Ġline Count Info . serialization Result Line Count ĊĠĠĠĠĠĠĠ Ġval Ġoriginal EObject Path Ġ= Ġline Count Info . additional Info [ ORIGIN AL _ E OBJECT _ PATH _ INFO _ FIELD ] ĊĠĠĠĠĠĠĠ Ġif Ġ( original EObject Path Ġ!= Ġnull Ġ&& Ġoriginal EObject Path Ġ! in Ġsummar ized E Objects ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal EObject Line Count Sum Ġ+= Ġline Count Info . original EObject Line Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsummar ized E Objects . add ( original EObject Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfile Extension Sum s [ file Extension ] Ġ= Ġserialization Result Line Count Sum Ġto Ġoriginal EObject Line Count Sum ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠWrite Ġline Ġcount Ġsums Ġ*/ ĊĠĠĠ Ġserialization Result . add ("\ n Line Ġcount Ġsums ") ĊĠĠĠ Ġserialization Result . add (" Extension ; Manual ĠLOC ; Generated ĠLOC ; Diff Ġ( How Ġmuch Ġcode Ġwas Ġtruly Ġgenerated ? );" Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Ratio Ġ( What Ġis Ġthe Ġshare Ġof Ġtruly Ġgenerated Ġcode Ġto Ġoverall Ġgenerated Ġcode ?) ") ĊĊĠĠĠ Ġvar Ġserialization Result Line Count Sum Overall Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġoriginal EObject Line Count Sum Overall Ġ= Ġ 0 ĊĠĠĠ Ġfile Extension Sum s . forEach Ġ{ Ġ( file Extension , Ġsums ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġ( serialization Result Line Count Sum , Ġoriginal EObject Line Count Sum ) Ġ= Ġsums ĊĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġserialization Result Line Count Sum Ġ- Ġoriginal EObject Line Count Sum ĊĠĠĠĠĠĠĠ Ġserialization Result . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ file Extension ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ original EObject Line Count Sum ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ serialization Result Line Count Sum ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ diff ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ calculate Percentage ( diff , Ġserialization Result Line Count Sum )} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim To Single Line () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġserialization Result Line Count Sum Overall Ġ+= Ġserialization Result Line Count Sum ĊĠĠĠĠĠĠĠ Ġoriginal EObject Line Count Sum Overall Ġ+= Ġoriginal EObject Line Count Sum ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġoverall Diff Ġ= Ġserialization Result Line Count Sum Overall Ġ- Ġoriginal EObject Line Count Sum Overall ĊĠĠĠ Ġserialization Result . add ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ original EObject Line Count Sum Overall ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ serialization Result Line Count Sum Overall ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ overall Diff ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ${ calculate Percentage ( overall Diff , Ġserialization Result Line Count Sum Overall )} ĊĠĠĠĠĠĠĠ Ġ""" . trim To Single Line () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn Ġserialization Result . join ToString ("\ n ") Ċ } Ċ Ċ /** Ċ Ġ* ĠHelper Ġto Ġcalculate Ġthe Ġshare Ġof Ġ[ value ] Ġin Ġ[ absolute ]. ĠThe Ġresult Ġis Ġa Ġpercentage Ġwith Ġtwo Ġdecimals . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ private Ġfun Ġcalculate Percentage ( value : ĠInt , Ġabsolute : ĠInt ) ĊĠĠĠ Ġ= ĠBigDecimal (( value Ġ* Ġ 1 . 0 Ġ/ Ġabsolute ) Ġ* Ġ 1 0 0 . 0 ). set Scale ( 2 , ĠRound ingMode . HALF _ E VEN ). toFloat () Ċ Ċ /** Ċ Ġ* ĠDer ive Ġadditional Ġline Ġcount Ġinformation Ġfor Ġthe Ġconcrete Ġruntime Ġtype Ġof Ġthis Ġ[ EObject ]. Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ private Ġfun ĠE Object . derive Additional Line Count Info ( original Model FilePath : ĠString ) Ġ: ĠMutable Map < String , ĠString > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠComplex Type Ġ-> Ġderive Additional Line Count Info ( original Model FilePath ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmutable Map Of () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠDer ive Ġadditional Ġline Ġcount Ġinformation Ġfor Ġ[ Complex Type ] Ġinstances , Ġe . g ., Ġthe Ġfield Ġcounts Ġof Ġ[ Data Structure ] Ġand Ċ Ġ* Ġ[ ListType ] Ġinstances . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ private Ġfun ĠComplex Type . derive Additional Line Count Info ( original Model FilePath : ĠString ) Ġ: ĠMutable Map < String , ĠString > Ġ{ ĊĠĠĠ Ġval Ġresult Map Ġ= Ġmutable Map Of ( ORIGIN AL _ E OBJECT _ PATH _ INFO _ FIELD Ġto Ġ"$ original Model FilePath ${ File . separator }$ name ") ĊĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠData Structure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Map [ COMPLEX _ TYPE _ FIELD _ COUNT _ INFO _ FIELD ] Ġ= Ġdata Fields . size . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Map [ DATA _ STRUCTURE _ OPERATION _ COUNT _ INFO _ FIELD ] Ġ= Ġoperations . size . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠList Type Ġ-> Ġresult Map [ COMPLEX _ TYPE _ FIELD _ COUNT _ INFO _ FIELD ] Ġ= Ġdata Fields . size . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Map Ċ } Ċ Ċ /** Ċ Ġ* ĠConstant Ġfor Ġthe Ġadditional Ġline Ġcount Ġinformation Ġ" original ĠE Object Ġtype ". Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ internal Ġconst Ġval ĠOR IGIN AL _ E OBJECT _ TYPE _ INFO _ FIELD Ġ= Ġ" original E ObjectType " Ċ Ċ /** Ċ Ġ* ĠConstant Ġfor Ġthe Ġadditional Ġline Ġcount Ġinformation Ġ" original ĠE Object Ġpath ", Ġvalid Ġfor Ġall Ġcounted Ġ[ EObject ] Ċ Ġ* Ġinstances . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ internal Ġconst Ġval ĠOR IGIN AL _ E OBJECT _ PATH _ INFO _ FIELD Ġ= Ġ" original EObject Path " Ċ Ċ /** Ċ Ġ* ĠConstant Ġfor Ġthe Ġadditional Ġline Ġcount Ġinformation Ġ" field Ġcount " Ġof Ġa Ġ[ Complex Type ] Ġinstance , Ġe . g ., Ġa Ġ[ Data Structure ] Ċ Ġ* Ġor Ġ[ ListType ]. Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ internal Ġconst Ġval ĠCOMP LEX _ TYPE _ FIELD _ COUNT _ INFO _ FIELD Ġ= Ġ" field Count " Ċ Ċ /** Ċ Ġ* ĠConstant Ġfor Ġthe Ġadditional Ġline Ġcount Ġinformation Ġ" operation Ġcount " Ġof Ġa Ġ[ Data Structure ] Ġinstance . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ internal Ġconst Ġval ĠDATA _ STRUCTURE _ OPERATION _ COUNT _ INFO _ FIELD Ġ= Ġ" operation Count "