/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 2 1 ĠAnd rei ĠHe ide lb acher Ġ< and rei . he ide lb acher @ gmail . com > Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . chron ol ens . coup ling Ċ Ċ import Ġorg . chron ol ens . core . cli . Sub command Ċ import Ġorg . chron ol ens . core . cli . restrict To Ċ import Ġorg . chron ol ens . core . model . source Path Ċ import Ġorg . chron ol ens . core . repository . Transaction Ċ import Ġorg . chron ol ens . core . serialization . Json Module Ċ import Ġorg . chron ol ens . coup ling . Graph . Sub graph Ċ import Ġjava . io . File Ċ Ċ internal Ġclass ĠD iver gent Change Command Ġ: ĠSub command () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġhelp : ĠString Ġget () Ġ= Ġ""" ĊĠĠĠĠĠĠĠ ĠLoads Ġthe Ġpersisted Ġrepository , Ġbuilds Ġthe Ġtemporal Ġcoup ling Ġgraphs Ġfor ĊĠĠĠĠĠĠĠ Ġthe Ġanalyzed Ġsource Ġfiles , Ġdetect s Ġthe ĠD iver gent ĠChange Ġinstances , ĊĠĠĠĠĠĠĠ Ġreports Ġthe Ġresults Ġto Ġthe Ġstandard Ġoutput Ġand Ġdump s Ġthe Ġcoup ling Ġgraphs ĊĠĠĠĠĠĠĠ Ġfor Ġeach Ġsource Ġfile Ġin Ġthe Ġ'. chron ol ens / div erg ent - change ' Ġdirectory . ĊĠĠĠ Ġ""" ĊĊĠĠĠ Ġprivate Ġval Ġmax Change Set Ġby Ġoption < Int >() ĊĠĠĠĠĠĠĠ Ġ. help (" the Ġmaximum Ġnumber Ġof Ġchanged Ġfiles Ġin Ġa Ġrevision ") ĊĠĠĠĠĠĠĠ Ġ. defaultValue ( 1 0 0 ). restrict To ( min Ġ= Ġ 1 ) ĊĊĠĠĠ Ġprivate Ġval Ġmin Re visions Ġby Ġoption < Int >(). help ( ĊĠĠĠĠĠĠĠ Ġ" the Ġminimum Ġnumber Ġof Ġrevisions Ġof Ġa Ġmethod Ġor Ġcoup ling Ġrelation " ĊĠĠĠ Ġ). defaultValue ( 5 ). restrict To ( min Ġ= Ġ 1 ) ĊĊĠĠĠ Ġprivate Ġval Ġmin Coup ling Ġby Ġoption < Double >() ĊĠĠĠĠĠĠĠ Ġ. help (" the Ġminimum Ġtemporal Ġcoup ling Ġbetween Ġtwo Ġmethods ") ĊĠĠĠĠĠĠĠ Ġ. defaultValue ( 0 . 1 ). restrict To ( min Ġ= Ġ 0 . 0 ) ĊĊĠĠĠ Ġprivate Ġval Ġmin Blob Density Ġby Ġoption < Double >(). help ( ĊĠĠĠĠĠĠĠ Ġ" the Ġminimum Ġaverage Ġdegree Ġ( sum Ġof Ġcoup ling ) Ġof Ġmethods Ġin Ġa Ġblob " ĊĠĠĠ Ġ). defaultValue ( 2 . 5 ). restrict To ( min Ġ= Ġ 0 . 0 ) ĊĊĠĠĠ Ġprivate Ġval Ġmax Anti Coup ling Ġby Ġoption < Double >(). help ( ĊĠĠĠĠĠĠĠ Ġ" the Ġmaximum Ġdegree Ġ( sum Ġof Ġcoup ling ) Ġof Ġa Ġmethod Ġin Ġan Ġanti - blob " ĊĠĠĠ Ġ). defaultValue ( 0 . 5 ). restrict To ( min Ġ= Ġ 0 . 0 ) ĊĊĠĠĠ Ġprivate Ġval Ġmin Anti Blob Size Ġby Ġoption < Int >() ĊĠĠĠĠĠĠĠ Ġ. help (" the Ġminimum Ġsize Ġof Ġan Ġanti - blob ") ĊĠĠĠĠĠĠĠ Ġ. defaultValue ( 1 0 ). restrict To ( min Ġ= Ġ 1 ) ĊĊĠĠĠ Ġprivate Ġval Ġmin Metric Value Ġby Ġoption < Int >(). help ( ĊĠĠĠĠĠĠĠ Ġ""" ignore Ġsource Ġfiles Ġthat Ġhave Ġless Ġblobs Ġ/ Ġanti - blobs Ġthan Ġthe ĊĠĠĠĠĠĠĠ Ġspecified Ġlimit """ ĊĠĠĠ Ġ). defaultValue ( 0 ). restrict To ( min Ġ= Ġ 0 ) ĊĊĠĠĠ Ġprivate Ġfun ĠTemp oral Context . aggregate Graphs (): ĠList < Graph > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġids By File Ġ= Ġids . groupBy ( String :: source Path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġids By File . keys . map Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġids Ġ= Ġids By File [ path ]. or Empty (). toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Graph From ( path , Ġids ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanalyze ( history : ĠSequence < Transaction >): ĠReport Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanalyzer Ġ= ĠHistory Analyzer ( max Change Set , Ġmin Re visions , Ġmin Coup ling ) ĊĠĠĠĠĠĠĠ Ġval Ġtemporal Context Ġ= Ġanalyzer . analyze ( history ) ĊĠĠĠĠĠĠĠ Ġval Ġgraphs Ġ= Ġtemporal Context . aggregate Graphs () ĊĠĠĠĠĠĠĠ Ġval Ġcolored Graphs Ġ= Ġmutable ListOf < Colo red Graph >() ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġmutable ListOf < File Report >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( graph Ġin Ġgraphs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblobs Ġ= Ġgraph . find Blob s ( min Blob Density ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanti Blob Ġ= Ġgraph . find Anti Blob ( max Anti Coup ling , Ġmin Anti Blob Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolored Graphs Ġ+= Ġgraph . color Nodes ( blobs , Ġanti Blob ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Ġ+= ĠFile Report ( graph . label , Ġblobs , Ġanti Blob ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfiles . sortBy Descending ( File Report :: value ) ĊĠĠĠĠĠĠĠ Ġreturn ĠReport ( files , Ġcolored Graphs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= Ġload () ĊĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġanalyze ( repository . get History ()) ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġreport . files . filter Ġ{ Ġit . value Ġ>= Ġmin Metric Value Ġ} ĊĠĠĠĠĠĠĠ ĠJson Module . serialize ( System . out , Ġfiles ) ĊĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= ĠFile (". chron ol ens ", Ġ" div erg ent - change ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( colored Graph Ġin Ġreport . colored Graphs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph Directory Ġ= ĠFile ( directory , Ġcolored Graph . graph . label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Directory . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgraph File Ġ= ĠFile ( graph Directory , Ġ" graph . json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph File . output Stream (). use Ġ{ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Module . serialize ( out , Ġcolored Graph ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠReport ( ĊĠĠĠĠĠĠĠ Ġval Ġfiles : ĠList < File Report >, ĊĠĠĠĠĠĠĠ Ġval Ġcolored Graphs : ĠList < Colo red Graph >, ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠFile Report ( ĊĠĠĠĠĠĠĠ Ġval Ġfile : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġblobs : ĠList < Sub graph >, ĊĠĠĠĠĠĠĠ Ġval Ġanti Blob : ĠSub graph ?, ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrespons ibilities : ĠInt Ġ= Ġblobs . size Ġ+ Ġif Ġ( anti Blob Ġ!= Ġnull ) Ġ 1 Ġelse Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġcategory : ĠString Ġ= Ġ" SOLID ĠBreak ers " ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString Ġ= Ġ" Single ĠResp ons ibility ĠBreak ers " ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠInt Ġ= Ġrespons ibilities ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠGraph . color Nodes ( ĊĠĠĠ Ġblobs : ĠList < Sub graph >, ĊĠĠĠ Ġanti Blob : ĠSub graph ?, Ċ ): ĠCo lo red Graph Ġ{ ĊĠĠĠ Ġval Ġgroups Ġ= Ġblobs . map ( Sub graph :: nodes ) Ġ+ ĠlistOf NotNull ( anti Blob ?. nodes ) ĊĠĠĠ Ġreturn Ġcolor Nodes ( groups ) Ċ } Ċ