/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 - 2 0 1 9 ĠHERE ĠEurope ĠB . V . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ* ĠLicense - Filename : ĠLICENSE Ċ Ġ*/ Ċ Ċ package Ġorg . oss review toolkit . model Ċ Ċ import Ġcom . fasterxml . jackson . annotation . Json Alias Ċ import Ġcom . fasterxml . jackson . annotation . JsonInclude Ċ Ċ import Ġjava . util . Deque Ċ import Ġjava . util . LinkedList Ċ import Ġjava . util . Sorted Set Ċ Ċ // ĠA Ġcustom Ġvalue Ġfilter Ġfor Ġ[ Package Link age ] Ġto Ġwork Ġaround Ċ // Ġhttps :// github . com / F aster XML / jackson - module - kotlin / issues / 1 9 3 . Ċ @ Suppress (" Equals With HashCode Exist ") Ċ class ĠPackage Link age Value Filter Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġ== ĠPackage Link age . DYNAMIC Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġhuman - readable Ġreference Ġto Ġa Ġsoftware Ġ[ Package ]. ĠEach Ġpackage Ġreference Ġitself Ġrefers Ġto Ġother Ġpackage Ċ Ġ* Ġreferences Ġthat Ġare Ġdependencies Ġof Ġthe Ġpackage . Ċ Ġ*/ Ċ // ĠDo Ġnot Ġserialize Ġdefault Ġvalues Ġto Ġreduce Ġthe Ġsize Ġof Ġthe Ġresult Ġfile . Ċ @ JsonInclude ( JsonInclude . Include . NON _ DEFAULT ) Ċ data Ġclass ĠPackage Reference ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġidentifier Ġof Ġthe Ġpackage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġid : ĠIdentifier , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġtype Ġof Ġlink age Ġused Ġfor Ġthe Ġreferred Ġpackage Ġfrom Ġits Ġdependent Ġpackage . ĠAs Ġmost Ġof Ġour Ġsupported ĊĠĠĠĠ Ġ* Ġpackage Ġmanagers Ġ/ Ġlanguages Ġonly Ġsupport Ġdynamic Ġlinking Ġor Ġat Ġleast Ġdefault Ġto Ġit , Ġalso Ġuse Ġthat Ġas Ġthe ĊĠĠĠĠ Ġ* Ġdefault Ġvalue Ġhere Ġto Ġnot Ġblow Ġup Ġour Ġresult Ġfiles . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ JsonInclude ( value Ġ= ĠJson Include . Include . CUSTOM , Ġvalue Filter Ġ= ĠPackage Link age Value Filter :: class ) ĊĠĠĠ Ġval Ġlink age : ĠPackage Link age Ġ= ĠPackage Link age . DYNAMIC , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġlist Ġof Ġreferences Ġto Ġpackages Ġthis Ġpackage Ġdepends Ġon . ĠNote Ġthat Ġthis Ġlist Ġdepends Ġon Ġthe Ġscope Ġin ĊĠĠĠĠ Ġ* Ġwhich Ġthis Ġpackage Ġreference Ġis Ġused . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġdependencies : ĠSorted Set < Package Reference > Ġ= Ġsorted Set Of (), ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġlist Ġof Ġ[ Or t Issue ] s Ġthat Ġoccurred Ġhandling Ġthis Ġ[ Package Reference ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Json Alias (" errors ") ĊĠĠĠ Ġval Ġissues : ĠList < Or t Issue > Ġ= Ġempty List () Ċ ) Ġ: ĠComparable < Package Reference > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġset Ġof Ġ[ Identifier ] s Ġthe Ġpackage Ġreferred Ġby Ġthis Ġ[ Package Reference ] Ġtransit ively Ġdepends Ġon , ĊĠĠĠĠ Ġ* Ġup Ġto Ġand Ġincluding Ġa Ġdepth Ġof Ġ[ max Depth ] Ġwhere Ġcounting Ġstarts Ġat Ġ 0 Ġ( for Ġthe Ġ[ Package Reference ] Ġitself ) Ġand Ġ 1 ĊĠĠĠĠ Ġ* Ġare Ġdirect Ġdependencies Ġetc . ĠA Ġvalue Ġbelow Ġ 0 Ġmeans Ġto Ġnot Ġlimit Ġthe Ġdepth . ĠIf Ġthe Ġgiven Ġ[ filter Predicate ] Ġis ĊĠĠĠĠ Ġ* Ġfalse Ġfor Ġa Ġspecific Ġ[ Package Reference ] Ġthe Ġcorresponding Ġ[ Identifier ] Ġis Ġexcluded Ġfrom Ġthe Ġresult . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcollect Dependencies ( ĊĠĠĠĠĠĠĠ Ġmax Depth : ĠInt Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠ Ġfilter Predicate : Ġ( Package Reference ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ} ĊĠĠĠ Ġ): ĠSet < Identifier > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Set Of < Identifier >() ĊĊĠĠĠĠĠĠĠ Ġval Ġqueue : ĠDe que < Pair < Package Reference , ĠInt >> Ġ= ĠLinkedList () ĊĠĠĠĠĠĠĠ Ġfun Ġenqueue ( packages : ĠCollection < Package Reference >, Ġlevel : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( max Depth Ġ< Ġ 0 Ġ|| Ġlevel Ġ<= Ġmax Depth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackages . forEach Ġ{ Ġqueue . add ( Pair ( it , Ġlevel )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġenqueue ( dependencies , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( pkg , Ġlevel ) Ġ= Ġqueue . remove First () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter Predicate ( pkg )) Ġresult Ġ+= Ġpkg . id ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġenqueue ( pkg . dependencies , Ġlevel Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcomparison Ġfunction Ġto Ġsort Ġpackage Ġreferences Ġby Ġtheir Ġidentifier . ĠThis Ġfunction Ġignores Ġall Ġother Ġproperties ĊĠĠĠĠ Ġ* Ġexcept Ġfor Ġ[ id ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠPackage Reference ) Ġ= Ġid . compareTo ( other . id ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġwhether Ġthe Ġpackage Ġidentified Ġby Ġ[ id ] Ġis Ġa Ġ( trans itive ) Ġdependency Ġof Ġthis Ġreference . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdepends On ( id : ĠIdentifier ): ĠBoolean Ġ= Ġdependencies . any Ġ{ Ġit . id Ġ== Ġid Ġ|| Ġit . depends On ( id ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġall Ġreferences Ġto Ġ[ id ] Ġas Ġa Ġdependency . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind References ( id : ĠIdentifier ): ĠList < Package Reference > Ġ= ĊĠĠĠĠĠĠĠ Ġdependencies . filter Ġ{ Ġit . id Ġ== Ġid Ġ} Ġ+ Ġdependencies . flatMap Ġ{ Ġit . find References ( id ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġwhether Ġthis Ġpackage Ġreference Ġor Ġany Ġof Ġits Ġdependencies Ġhas Ġissues . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhas Issues (): ĠBoolean Ġ= Ġissues . isNotEmpty () Ġ|| Ġdependencies . any Ġ{ Ġit . has Issues () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApply Ġthe Ġprovided Ġ[ transform ] Ġto Ġeach Ġnode Ġin Ġthe Ġdependency Ġtree Ġrepresented Ġby Ġthis Ġ[ Package Reference ] Ġand ĊĠĠĠĠ Ġ* Ġreturn Ġthe Ġmodified Ġ[ Package Reference ]. ĠThe Ġtree Ġis Ġtra versed Ġdepth - first Ġ( post - order ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtraverse ( transform : Ġ( Package Reference ) Ġ-> ĠPackage Reference ): ĠPackage Reference Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransformed Dependencies Ġ= Ġdependencies . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . traverse ( transform ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtransform ( copy ( dependencies Ġ= Ġtransformed Dependencies . to Sorted Set ())) ĊĠĠĠ Ġ} Ċ } Ċ