Skip to content

Commit

Permalink
Work around Gradle-5-published metadata breaking pom resolution
Browse files Browse the repository at this point in the history
Fixes gh-263
  • Loading branch information
wilkinsona committed Jan 17, 2020
1 parent b26a31b commit 070077d
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -38,15 +38,19 @@
*/
class ConfigurationModelResolver implements ModelResolver {

private final Map<String, FileModelSource> pomCache = new HashMap<String, FileModelSource>();

private final Project project;

private final DependencyManagementConfigurationContainer configurationContainer;

private final Map<String, FileModelSource> pomCache = new HashMap<String, FileModelSource>();
private final PlatformCategoryAttributeConfigurer attributeConfigurer;

ConfigurationModelResolver(Project project, DependencyManagementConfigurationContainer configurationContainer) {
ConfigurationModelResolver(Project project, DependencyManagementConfigurationContainer configurationContainer,
PlatformCategoryAttributeConfigurer attributeConfigurer) {
this.project = project;
this.configurationContainer = configurationContainer;
this.attributeConfigurer = attributeConfigurer;
}

@Override
Expand All @@ -61,8 +65,9 @@ public ModelSource resolveModel(String groupId, String artifactId, String versio
return pom;
}

private FileModelSource resolveModel(String coordinates) {
private FileModelSource resolveModel(final String coordinates) {
Dependency dependency = this.project.getDependencies().create(coordinates);
this.attributeConfigurer.configureCategoryAttribute(dependency);
Configuration configuration = this.configurationContainer.newConfiguration(dependency);
return new FileModelSource(configuration.resolve().iterator().next());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2014-2018 the original author or authors.
* Copyright 2014-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -53,8 +53,8 @@ final class EffectiveModelBuilder {
private final ModelResolver modelResolver;

EffectiveModelBuilder(Project project,
DependencyManagementConfigurationContainer configurationContainer) {
this.modelResolver = new ConfigurationModelResolver(project, configurationContainer);
DependencyManagementConfigurationContainer configurationContainer, PlatformCategoryAttributeConfigurer attributeConfigurer) {
this.modelResolver = new ConfigurationModelResolver(project, configurationContainer, attributeConfigurer);
}

Model buildModel(File pom, PropertySource properties) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -52,6 +52,8 @@
*/
public class MavenPomResolver implements PomResolver {

private final PlatformCategoryAttributeConfigurer attributeConfigurer = new PlatformCategoryAttributeConfigurer();

private final DependencyManagementConfigurationContainer configurationContainer;

private final EffectiveModelBuilder effectiveModelBuilder;
Expand All @@ -67,7 +69,7 @@ public class MavenPomResolver implements PomResolver {
*/
public MavenPomResolver(Project project, DependencyManagementConfigurationContainer configurationContainer) {
this.configurationContainer = configurationContainer;
this.effectiveModelBuilder = new EffectiveModelBuilder(project, configurationContainer);
this.effectiveModelBuilder = new EffectiveModelBuilder(project, configurationContainer, this.attributeConfigurer);
this.dependencyHandler = project.getDependencies();
}

Expand All @@ -87,9 +89,11 @@ public List<Pom> resolvePoms(List<PomReference> pomReferences, PropertySource pr
private Configuration createConfiguration(List<PomReference> pomReferences) {
Configuration configuration = this.configurationContainer.newConfiguration();
for (PomReference pomReference: pomReferences) {
Coordinates coordinates = pomReference.getCoordinates();
configuration.getDependencies().add(this.dependencyHandler.create(coordinates.getGroupId() + ":"
+ coordinates.getArtifactId() + ":" + coordinates.getVersion() + "@pom"));
final Coordinates coordinates = pomReference.getCoordinates();
org.gradle.api.artifacts.Dependency dependency = this.dependencyHandler.create(coordinates.getGroupId() + ":"
+ coordinates.getArtifactId() + ":" + coordinates.getVersion() + "@pom");
this.attributeConfigurer.configureCategoryAttribute(dependency);
configuration.getDependencies().add(dependency);
}
return configuration;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright 2014-2020 the original author or authors.
*
* 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
*
* https://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 io.spring.gradle.dependencymanagement.internal.maven;

import java.lang.reflect.Method;

import org.gradle.api.Action;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.artifacts.ModuleDependency;
import org.gradle.util.GradleVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Support class for configuring the {@code org.gradle.category} attribute on a {@link ModuleDependency}
* with a value of {@code platform}. The configuration is done reflectively as the necessary APIs are not available
* in the version of Gradle against which the code is compiled.
* <p/>
* Configuring the attribute works around a problem in Gradle 5 that prevents resolution of a pom for which Gradle 5 has
* been used to publish Gradle module metadata. The problem does not occur with Gradle 6 as it ignores metadata
* published by Gradle 5.
*
* @author Andy Wilkinson
*/
class PlatformCategoryAttributeConfigurer {

private static final Logger logger = LoggerFactory.getLogger(PlatformCategoryAttributeConfigurer.class);

void configureCategoryAttribute(Dependency dependency) {
if (!(dependency instanceof ModuleDependency) || !isGradle5()) {
return;
}
try {
Method attributes = dependency.getClass().getMethod("attributes", Action.class);
attributes.invoke(dependency, new Action<Object>() {

@Override
public void execute(Object container) {
try {
Class<?> attributeClass = Class.forName("org.gradle.api.attributes.Attribute");
Object attribute = attributeClass.getMethod("of", String.class, Class.class)
.invoke(null, "org.gradle.category", String.class);
Class.forName("org.gradle.api.attributes.AttributeContainer")
.getMethod("attribute", attributeClass, Object.class)
.invoke(container, attribute, "platform");
}
catch (Throwable ex) {
logger.debug("Failed to configure platform attribute", ex);
}
}

});
}
catch (Throwable ex) {
logger.debug("Failed to configure platform attribute", ex);
}
}

private boolean isGradle5() {
return GradleVersion.current().getNextMajor().getVersion().startsWith("6.");
}

}

0 comments on commit 070077d

Please sign in to comment.