Skip to content

Commit 0c4e88d

Browse files
authored
Merge pull request #114 from chali/RemoveInternalGradleAPI
Remove extending internal Gradle class and replace it with delegation…
2 parents 79f19db + 5a081a1 commit 0c4e88d

File tree

1 file changed

+40
-27
lines changed

1 file changed

+40
-27
lines changed

src/main/groovy/netflix/nebula/dependency/recommender/provider/RecommendationProviderContainer.java

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,25 @@
1818
import groovy.lang.Closure;
1919
import netflix.nebula.dependency.recommender.DependencyRecommendationsPlugin;
2020
import 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.*;
2522
import org.gradle.api.artifacts.Dependency;
2623
import org.gradle.api.internal.ConfigureByMapAction;
2724
import org.gradle.api.internal.DefaultNamedDomainObjectList;
25+
import org.gradle.api.model.ObjectFactory;
2826
import org.gradle.util.ConfigureUtil;
27+
import org.gradle.util.GradleVersion;
2928

3029
import java.io.File;
30+
import java.lang.reflect.InvocationTargetException;
31+
import java.lang.reflect.Method;
3132
import java.util.*;
3233

3334
import 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

Comments
 (0)