package Ġcom . s oci ete gener ale . github crawler . output Ċ Ċ import Ġcom . s oci ete gener ale . github crawler . model . Repository Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . Buffered Writer Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Open Option Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . nio . file . Standard Open Option Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġa Ġspecific Ġoutput , Ġwhen Ġtargeting Ġto Ġpipe Ġthe Ġc rawler Ġoutput Ġinto ĠCI - d roid . ĠCI - d roid Ġexposes Ġa Ġ" bulk - actions ĠAPI " Ġthat Ġaccepts Ġan Ġaction Ġto Ġperform Ġon Ġa Ġlist Ġof Ġresources Ġ( that Ġcan Ġbe Ġon Ġmany Ġrepositories ). Ċ Ġ* Ċ Ġ* ĠWhen Ġusing Ġthis Ġoutput , Ġwe Ġtry Ġto Ġgenerate Ġthe Ġlist Ġof Ġresources , Ġin Ġa Ġformat Ġas Ġclose Ġas Ġpossible Ġas Ġthe Ġone Ġexpected Ġby ĠCI - d roid , Ġso Ġthat Ġwe Ġdon 't Ġneed Ġany Ġre - processing Ġand Ġcan Ġdirectly Ġcopy - paste Ġthe Ġcontent Ġin Ġthe Ġlist Ġof Ġthe Ġresources Ġin Ġthe Ġjson Ġpayload Ġwe 're Ġposting Ġon Ġthe ĠAPI . Ċ Ġ*/ Ċ class ĠC Id roid Ready Json File Output Ġ( val Ġindicators To Output : ĠList < String >, Ġval Ġwith Tags : ĠBoolean = false ) Ġ: ĠGitHub Crawler Output Ġ{ ĊĊĠĠĠ Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( this . java Class ) ĊĊĠĠĠ Ġprivate Ġval Ġfinal Output FileName : ĠString ĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠLocalDateTime . now () ĊĊĠĠĠĠĠĠĠ Ġval Ġformatter Ġ= ĠDateTime Formatter . of Pattern (" yyyy MM dd _ HH mm ss ") ĊĊĠĠĠĠĠĠĠ Ġfinal Output FileName Ġ= Ġ" C Id roid Ready Content _" Ġ+ Ġnow . format ( formatter ) Ġ+ Ġ". json " ĊĊĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= Ġopen File WithOptions ( Standard Open Option . CREATE _ NEW , Standard Open Option . WRITE ) ĊĊĠĠĠĠĠĠĠ Ġ// initi ating Ġthe ĠJson Ġarray ĊĠĠĠĠĠĠĠ Ġwriter . write ("[ \ n "); ĊĊĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġoutput ( analy zed Repository : ĠRepository ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġopen File WithOptions ( Standard Open Option . WRITE , ĠStandard Open Option . APPEND ). use Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb = StringBuilder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor (( branch , actual Indicators ) Ġin Ġanalyzed Repository . indicators Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("{ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" repo FullName \": Ġ\"" ). append ( analy zed Repository . fullName ). append ("\ ", ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// we Ġtake Ġthe Ġfirst Ġindicator Ġvalue , Ġassuming Ġit 's Ġa Ġpath Ġto Ġa Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" filePath On Repo \": Ġ\"" ). append ( actual Indicators . get ( indicators To Output [ 0 ])). append ("\ ", ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Other Indicators If Any ( sb , Ġactual Indicators ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( with Tags ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" tags \": Ġ\"" ). append ( analy zed Repository . tags ). append ("\ ", ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" branch Name \": Ġ\"" ). append ( branch . name ). append ("\" ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" }, ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( System . line Separator ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . write ( sb . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend Other Indicators If Any ( sb : ĠStringBuilder , Ġactual Indicators : ĠMap < String , ĠAny >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( indicators To Output . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġthere Ġare Ġothers , Ġwe Ġoutput Ġthem Ġbut Ġthey Ġprobably Ġwon 't Ġbe Ġprocessed Ġgiven Ġtheir Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. indicators To Output . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" other Indicator $ i \": Ġ\"" ). append ( actual Indicators . get ( indicators To Output [ i ])). append ("\ ", ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġfinalize Output (){ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠScanner ( File ( final Output FileName )). use Delimiter ("\\ Z "). next () ĊĠĠĠĠĠĠĠ Ġ// re moving Ġthe Ġlast Ġcharacter Ġwhich Ġis Ġa Ġ"," Ġfrom Ġthe Ġjson ĊĠĠĠĠĠĠĠ Ġval Ġwithout Last Character Ġ= Ġcontent . substring ( 0 , Ġcontent . length Ġ- Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= Ġopen File WithOptions ( Standard Open Option . WRITE , ĠStandard Open Option . TRUNC ATE _ EXIST ING ) ĊĊĠĠĠĠĠĠĠ Ġwriter . write ( without Last Character ) ĊĊĠĠĠĠĠĠĠ Ġ// closing Ġthe ĠJson Ġarray ĊĠĠĠĠĠĠĠ Ġwriter . write ("\ n ]"); ĊĊĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Spread Operator ") Ġ// no Ġperformance Ġimpact Ġgiven Ġthe Ġnumber Ġof Ġvalues Ġ( a Ġcouple , Ġmax ) .. ĊĠĠĠ Ġprivate Ġfun Ġopen File WithOptions ( var arg Ġoptions Ġ: ĠOpen Option ) Ġ: ĠBuffered Writer Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFiles . new Buffered Writer ( Paths . get ( final Output FileName ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStandard Charsets . UTF _ 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* options ) ĊĠĠĠ Ġ} Ċ } Ċ