All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bancvue.gradle.maven.publish.DependencyResolver.groovy Maven / Gradle / Ivy

/*
 * Copyright 2014 BancVue, LTD
 *
 * 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.
 */
package com.bancvue.gradle.maven.publish

import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.DependencySet
import org.gradle.api.artifacts.ExcludeRule
import org.gradle.api.artifacts.ModuleDependency
import org.gradle.api.artifacts.ProjectDependency
import org.gradle.api.artifacts.PublishArtifact
import org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency
import org.gradle.api.publish.maven.MavenArtifact
import org.gradle.api.publish.maven.MavenPublication

class DependencyResolver {
	private Project project

	DependencyResolver(Project project) {
		this.project = project
	}

	List getDependencyExclusions(Dependency dependency) {
		List excludeRules = getDependencyExcludeRules(dependency)

		excludeRules.findAll { ExcludeRule excludeRule ->
			excludeRule.group || excludeRule.module
		}.collectAll { ExcludeRule excludeRule ->
			new Exclusion(excludeRule)
		}
	}

	List getDependencyExcludeRules(Dependency dependency) {
		Set excludeRules = []

		if (dependency instanceof ModuleDependency) {
			excludeRules.addAll(((ModuleDependency) dependency).excludeRules)
			excludeRules.addAll(getConfigurationExcludeRules(dependency))
		}
		excludeRules as List
	}

	private Set getConfigurationExcludeRules(Dependency dependency) {
		Configuration configuration = getConfigurationWithAssociatedDependency(dependency)
		configuration ? configuration.excludeRules : []
	}

	private Configuration getConfigurationWithAssociatedDependency(Dependency dependency) {
		project.configurations.find { Configuration config ->
			config.dependencies.find {
				dependency.is(it)
			}
		}
	}

	Set getRuntimeDependencies(ExtendedPublication publication) {
		Set runtimeDependencies = []
		DependencySet allDependencies = publication.runtimeConfiguration.allDependencies

		allDependencies.each { Dependency aDependency ->
			if (aDependency instanceof ProjectDependency) {
				runtimeDependencies.addAll(getConfigurationExternalDependencies(aDependency as ProjectDependency))
			} else if (aDependency.group && aDependency.name && aDependency.version) {
				runtimeDependencies.add(aDependency)
			}
		}
		runtimeDependencies
	}

	private List getConfigurationExternalDependencies(ProjectDependency dependency) {
		Configuration configuration = getAssociatedConfiguration(dependency)
		ProjectConfigurationExternalDependencyResolver configurationDependencyResolver =
				new ProjectConfigurationExternalDependencyResolver(dependency.dependencyProject, configuration)
		configurationDependencyResolver.getConfigurationExternalDependencies()
	}

	private Configuration getAssociatedConfiguration(ProjectDependency projectDependency) {
		String configurationName = projectDependency.configuration
		if (configurationName == "default") {
			configurationName = "runtime"
		}
		projectDependency.dependencyProject.getConfigurations().getByName(configurationName)
	}


	private static final class ProjectConfigurationExternalDependencyResolver {

		private Project project
		private Configuration configuration

		ProjectConfigurationExternalDependencyResolver(Project project, Configuration configuration) {
			this.project = project
			this.configuration = configuration
		}

		List getConfigurationExternalDependencies() {
			List publications = getAssociatedMavenPublications()

			publications.collect { MavenPublication publication ->
				new DefaultExternalModuleDependency(publication.groupId, publication.artifactId, publication.version)
			}
		}

		private List getAssociatedMavenPublications() {
			List publications = []
			configuration.artifacts.each { PublishArtifact artifact ->
				MavenPublication matchingPublication = getMavenPublicationWithMatchingArtifact(artifact)
				if (matchingPublication) {
					publications.add(matchingPublication)
				}
			}
			publications
		}

		private MavenPublication getMavenPublicationWithMatchingArtifact(PublishArtifact artifact) {
			project.publishing.publications.findAll {
				it instanceof MavenPublication
			}.find { MavenPublication publication ->
				MavenArtifact mavenArtifact = getPrimaryPublicationArtifact(publication)
				mavenArtifact?.file == artifact.file
			}
		}

		private MavenArtifact getPrimaryPublicationArtifact(MavenPublication publication) {
			publication.artifacts.find { MavenArtifact artifact ->
				artifact.classifier == null
			}
		}

	}

}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy