1818import groovy .lang .Closure ;
1919import netflix .nebula .dependency .recommender .DependencyRecommendationsPlugin ;
2020import netflix .nebula .dependency .recommender .RecommendationStrategies ;
21- import org .gradle .api .Action ;
22- import org .gradle .api .GradleException ;
23- import org .gradle .api .Namer ;
24- import org .gradle .api .Project ;
21+ import org .gradle .api .*;
2522import org .gradle .api .artifacts .Dependency ;
2623import org .gradle .api .internal .ConfigureByMapAction ;
2724import org .gradle .api .internal .DefaultNamedDomainObjectList ;
25+ import org .gradle .api .model .ObjectFactory ;
2826import org .gradle .util .ConfigureUtil ;
27+ import org .gradle .util .GradleVersion ;
2928
3029import java .io .File ;
30+ import java .lang .reflect .InvocationTargetException ;
31+ import java .lang .reflect .Method ;
3132import java .util .*;
3233
3334import static netflix .nebula .dependency .recommender .DependencyRecommendationsPlugin .CORE_BOM_SUPPORT_ENABLED ;
3435
35- public class RecommendationProviderContainer extends DefaultNamedDomainObjectList < RecommendationProvider > {
36+ public class RecommendationProviderContainer {
3637
3738 private Project project ;
39+ private NamedDomainObjectList <RecommendationProvider > providers ;
3840 private RecommendationStrategies strategy = RecommendationStrategies .ConflictResolved ;
3941 private MavenBomRecommendationProvider mavenBomProvider ;
4042 private Boolean strictMode = false ;
@@ -46,17 +48,32 @@ public class RecommendationProviderContainer extends DefaultNamedDomainObjectLis
4648 public static final RecommendationStrategies OverrideTransitives = RecommendationStrategies .OverrideTransitives ;
4749 public static final RecommendationStrategies ConflictResolved = RecommendationStrategies .ConflictResolved ;
4850
49- private final Action <? super RecommendationProvider > addLastAction = new Action <RecommendationProvider >() {
50- public void execute (RecommendationProvider r ) {
51- RecommendationProviderContainer .super .add (r );
52- }
53- };
54-
5551 public RecommendationProviderContainer (Project project ) {
56- super (RecommendationProvider .class , null , new RecommendationProviderNamer ());
52+ if (GradleVersion .current ().getBaseVersion ().compareTo (GradleVersion .version ("6.1" )) >= 0 ) {
53+ createList (project );
54+ } else {
55+ providers = new DefaultNamedDomainObjectList <RecommendationProvider >(RecommendationProvider .class , null , new RecommendationProviderNamer ());
56+ }
5757 this .project = project ;
5858 this .mavenBomProvider = getMavenBomRecommendationProvider ();
59- this .add (this .mavenBomProvider );
59+ providers .add (this .mavenBomProvider );
60+ }
61+
62+ private void createList (Project project ) {
63+ ObjectFactory objects = project .getObjects ();
64+ try {
65+ Method factoryMethod = objects .getClass ().getDeclaredMethod ("namedDomainObjectList" , Class .class );
66+ providers = (NamedDomainObjectList <RecommendationProvider >) factoryMethod .invoke (objects , RecommendationProvider .class );
67+ } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e ) {
68+ throw new RuntimeException ("NamedDomainObjectList couldn't be created" , e );
69+ }
70+
71+ }
72+
73+ private static class RecommendationProviderNamer implements Namer <RecommendationProvider > {
74+ public String determineName (RecommendationProvider r ) {
75+ return r .getName ();
76+ }
6077 }
6178
6279 private MavenBomRecommendationProvider getMavenBomRecommendationProvider () {
@@ -69,25 +86,22 @@ private MavenBomRecommendationProvider getMavenBomRecommendationProvider() {
6986 return mavenBomRecommendationProvider ;
7087 }
7188
72- private static class RecommendationProviderNamer implements Namer <RecommendationProvider > {
73- public String determineName (RecommendationProvider r ) {
74- return r .getName ();
75- }
76- }
77-
7889 public <T extends RecommendationProvider > T addProvider (T provider , Action <? super T > configureAction ) {
7990 configureAction .execute (provider );
80- assertCanAdd (provider .getName ());
81- addLastAction .execute (provider );
91+ providers .add (provider );
8292 return provider ;
8393 }
8494
8595 public <T extends RecommendationProvider > T addFirst (T provider ) {
86- remove (provider );
87- super .add (0 , provider );
96+ providers . remove (provider );
97+ providers .add (0 , provider );
8898 return provider ;
8999 }
90100
101+ public RecommendationProvider getByName (String name ) {
102+ return providers .getByName (name );
103+ }
104+
91105 public PropertyFileRecommendationProvider propertiesFile (Map <String , ?> args ) {
92106 ensureCoreBomSupportNotEnabled ("propertiesFile" );
93107 String message = "nebula.dependency-recommender uses a properties file: " + args .get ("file" );
@@ -191,14 +205,14 @@ public MavenBomRecommendationProvider getMavenBomProvider() {
191205
192206 public String getRecommendedVersion (String group , String name ) {
193207 // providers are queried in LIFO order
194- for (int i = size ()-1 ; i >= 0 ; i --) {
208+ for (int i = providers . size ()-1 ; i >= 0 ; i --) {
195209 try {
196- String version = get (i ).getVersion (group , name );
210+ String version = providers . get (i ).getVersion (group , name );
197211 if (version != null ) {
198212 return version ;
199213 }
200214 } catch (Exception e ) {
201- project .getLogger ().error ("Exception while polling provider " + get (i ).getName () + " for version" , e );
215+ project .getLogger ().error ("Exception while polling provider " + providers . get (i ).getName () + " for version" , e );
202216 }
203217 }
204218 return null ;
@@ -265,5 +279,4 @@ Set<File> getFilesOnConfiguration() {
265279 rawPomDependencies .toArray (new org .gradle .api .artifacts .Dependency [0 ])).resolve ();
266280 }
267281 }
268-
269282}
0 commit comments