package Ġde . fh do . lemma . model _ processing . ph ases Ċ Ċ import Ġde . fh do . lemma . model _ processing . as File Ċ import Ġde . fh do . lemma . model _ processing . debug Phase Ċ import Ġde . fh do . lemma . model _ processing . debug Phase Arguments Ċ import Ġde . fh do . lemma . model _ processing . ecore Main Interface Ċ import Ġde . fh do . lemma . ocl . O cl Query Helper Ċ import Ġorg . eclipse . emf . ecore . EObject Ċ import Ġpic oc li . CommandLine Ċ Ċ /** Ċ Ġ* ĠSuper class Ġfor Ġall Ġmodel Ġprocessor Ġphases Ġthat Ġconduct Ġmodel Ġquerying . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fl orian ĠR ade m acher ]( mailto : fl orian . r ade m acher @ fh - d ort m und . de ) Ċ Ġ*/ Ċ internal Ġabstract Ġclass ĠAbstract Model Query Phase ( private Ġval Ġmodel Kind : ĠModel Kind ) Ġ: ĠAbstract Model Processing Phase () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcommand Spec Ġ= ĠCommandLine . Model . Command Spec . create () ĊĊĠĠĠ Ġ// ĠModel Ġquerying Ġexpects Ġan Ġargument Ġto Ġa Ġphase - specific Ġcommand line Ġoption Ġto Ġspecify Ġthe Ġfile Ġcontaining Ġthe ĊĠĠĠ Ġ// Ġmodel Ġquery Ġstring ĊĠĠĠ Ġprivate Ġval Ġquery File Option : ĠCommandLine . Model . Option Spec Ġ= ĠCommandLine . Model . Option Spec ĊĠĠĠĠĠĠĠ Ġ. builder ("-- query _ file ") ĊĠĠĠĠĠĠĠ Ġ. param Label (" QUERY _ FILE ") ĊĠĠĠĠĠĠĠ Ġ. type ( String :: class . java ) ĊĠĠĠĠĠĠĠ Ġ. description (" the Ġquery Ġfile Ġto Ġbe Ġused Ġto Ġquery Ġthe Ġ${ model Kind . label } Ġmodel ") ĊĠĠĠĠĠĠĠ Ġ. build () !! ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġthe Ġphase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġinitialize ( id : ĠString , Ġis O mit table : ĠBoolean , Ġis Blocking : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġprocessor Implementation Package : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . initialize ( id , Ġis O mit table , Ġis Blocking , Ġprocessor Implementation Package ) ĊĊĠĠĠĠĠĠĠ Ġparameters Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturns Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Kind . relevant Elements ParameterName Ġwith Type ĠCollection :: class . java ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptional Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Kind . query ParameterName Ġwith Type ĠString :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Kind . query FilePath ParameterName Ġwith Type ĠString :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcommand Spec . add Option ( query File Option ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġthe Ġphase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġprocess ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġdebug Phase Arguments ( args ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġphase Ġalways Ġputs Ġthe Ġrelevant Ġmodel Ġelements Ġto Ġthe Ġphase Ġheap . ĠThe Ġdefault Ġvalue Ġof Ġnull Ġcommunic ates ĊĠĠĠĠĠĠĠ Ġ// Ġsubsequent Ġphases Ġlike Ġmodel Ġvalidation Ġthat Ġno Ġmodel Ġelements Ġshall Ġbe Ġexcluded Ġ( i . e ., Ġno Ġquerying ĊĠĠĠĠĠĠĠ Ġ// Ġoccurred ). ĊĠĠĠĠĠĠĠ Ġreturn Re levant Model Elements ( null ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠRead Ġthe Ġmodel Ġquery Ġstring Ġfrom Ġthe Ġmodel Ġquery Ġfile Ġpassed Ġas Ġan Ġargument Ġto Ġthe Ġphase - specific Ġcommand line ĊĠĠĠĠĠĠĠĠ Ġ* Ġoption ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġquery FilePath Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparse Result Ġ= ĠCommandLine ( command Spec ). parse Args (* args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatched Query File Option Ġ= Ġparse Result . matched Options (). find Ġ{ Ġit Ġ== Ġquery File Option Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatched Query File Option ?. getValue < String >() ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPhase Exception ( ex . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( query FilePath Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Phase Ġ{ Ġ" Got Ġfile Ġ\"$ query FilePath \" Ġfor Ġmodel Ġquerying " Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Phase Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġquery Ġfile Ġpassed Ġwith Ġphase Ġcommand line Ġoption ( s ) Ġ\" ${ query File Option . names (). join ToString ()} \" ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠPhase Ġwill Ġnot Ġbe Ġexecuted ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! query FilePath . as File (). exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCommandLine . Parameter Exception ( command Spec . command Line (), Ġ" Model Ġquery Ġfile Ġ$ query FilePath Ġdoes Ġnot Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" exist ") ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġquery FilePath . as File (). read Text () ĊĠĠĠĠĠĠĠ Ġreturn Query FilePath ( query FilePath ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( query . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPhase Exception (" No Ġquery Ġfound Ġin Ġquery Ġfile Ġ$ query FilePath ") ĊĠĠĠĠĠĠĠ Ġreturn Query ( query ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠExecute Ġthe ĠO CL Ġquery , Ġif Ġa Ġquery Ġstring Ġcould Ġbe Ġobtained Ġfrom Ġthe Ġquery Ġfile , Ġand Ġput Ġthe Ġlist Ġof Ġrelevant ĊĠĠĠĠĠĠĠĠ Ġ* Ġmodel Ġelements Ġ( i . e ., Ġmodel Ġelements Ġthat Ġmatched Ġthe Ġquery ) Ġto Ġthe Ġphase Ġheap ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġselected Model Elements Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO cl Query Helper . query Collection ( model Kind . getResource Of Passed Model () !! , Ġquery ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPhase Exception (" Error Ġwhen Ġexecuting ĠO CL Ġquery : Ġ${ ex . message }") ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠPhase Exception (" O CL Ġquery Ġdid Ġnot Ġreturn Ġan Ġinstance Ġof Ġ${ Collection :: class . java . name }, Ġwhich Ġis Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" necessary Ġwhen Ġquerying Ġintermediate Ġmodels ") ĊĊĠĠĠĠĠĠĠ Ġreturn Re levant Model Elements ( selected Model Elements ) ĊĠĠĠĠĠĠĠ Ġdebug Phase Ġ{ Ġ" Query Ġsuccessfully Ġexecuted Ġ( selected Ġmodel Ġelement Ġcount : Ġ${ selected Model Elements . size })" Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Model Elements . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Phase Ġ{ Ġ"\ t Break down Ġof Ġselected Ġmodel Ġelements :" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Model Elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. grouping By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠE Object Ġ-> Ġit . ecore Main Interface ()?. simple Name Ġ?: Ġit :: class . java . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ!= Ġnull Ġ-> Ġit :: class . java . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" null " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. each Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( classname , Ġcount ) Ġ-> Ġdebug Phase Ġ{ Ġ"\ t \ t - Ġ$ classname : Ġ$ count " Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġmethod Ġto Ġput Ġthe Ġlist Ġof Ġrelevant Ġmodel Ġelements Ġto Ġthe Ġphase Ġheap ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreturn Re levant Model Elements ( elements : ĠCollection < *> ?) ĊĠĠĠĠĠĠĠ Ġ= Ġmodel Kind . relevant Elements ParameterName Ġreturns Ġelements ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġmethod Ġto Ġput Ġthe Ġmodel Ġquery Ġon Ġthe Ġphase Ġheap ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreturn Query ( query : ĠString ) Ġ= Ġmodel Kind . query ParameterName Ġreturns Ġquery ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġmethod Ġto Ġput Ġthe Ġpath Ġto Ġthe Ġmodel Ġquery Ġfile Ġon Ġthe Ġphase Ġheap ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreturn Query FilePath ( query FilePath : ĠString ) Ġ= Ġmodel Kind . query FilePath ParameterName Ġreturns Ġquery FilePath Ċ }