/* * Copyright 2016 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 * * 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 org.gradle.composite.internal; import org.gradle.api.artifacts.component.BuildIdentifier; import org.gradle.api.artifacts.component.ProjectComponentIdentifier; import org.gradle.api.initialization.IncludedBuild; import org.gradle.api.internal.SettingsInternal; import org.gradle.api.internal.artifacts.component.DefaultBuildIdentifier; import org.gradle.api.internal.artifacts.ivyservice.dependencysubstitution.DependencySubstitutionsInternal; import org.gradle.api.internal.composite.CompositeBuildContext; import org.gradle.api.internal.project.ProjectRegistry; import org.gradle.api.logging.Logging; import org.gradle.initialization.DefaultProjectDescriptor; import org.gradle.internal.component.local.model.DefaultProjectComponentIdentifier; import org.gradle.internal.composite.CompositeContextBuilder; import org.gradle.util.Path; import java.util.Set; public class DefaultCompositeContextBuilder implements CompositeContextBuilder { private static final org.gradle.api.logging.Logger LOGGER = Logging.getLogger(DefaultCompositeContextBuilder.class); private final DefaultIncludedBuilds allIncludedBuilds; private final DefaultProjectPathRegistry projectRegistry; private final CompositeBuildContext context; public DefaultCompositeContextBuilder(DefaultIncludedBuilds allIncludedBuilds, DefaultProjectPathRegistry projectRegistry, CompositeBuildContext context) { this.allIncludedBuilds = allIncludedBuilds; this.projectRegistry = projectRegistry; this.context = context; } @Override public void setRootBuild(SettingsInternal settings) { ProjectRegistry<DefaultProjectDescriptor> settingsProjectRegistry = settings.getProjectRegistry(); String rootName = settingsProjectRegistry.getRootProject().getName(); DefaultBuildIdentifier buildIdentifier = new DefaultBuildIdentifier(rootName, true); registerProjects(Path.ROOT, buildIdentifier, settingsProjectRegistry.getAllProjects()); } @Override public void addIncludedBuilds(Iterable<IncludedBuild> includedBuilds) { registerProjects(includedBuilds); registerSubstitutions(includedBuilds); } private void registerProjects(Iterable<IncludedBuild> includedBuilds) { for (IncludedBuild includedBuild : includedBuilds) { allIncludedBuilds.registerBuild(includedBuild); Path rootProjectPath = Path.ROOT.child(includedBuild.getName()); BuildIdentifier buildIdentifier = new DefaultBuildIdentifier(includedBuild.getName()); Set<DefaultProjectDescriptor> allProjects = ((IncludedBuildInternal) includedBuild).getLoadedSettings().getProjectRegistry().getAllProjects(); registerProjects(rootProjectPath, buildIdentifier, allProjects); } } private void registerProjects(Path rootPath, BuildIdentifier buildIdentifier, Set<DefaultProjectDescriptor> allProjects) { for (DefaultProjectDescriptor project : allProjects) { Path projectIdentityPath = rootPath.append(project.path()); ProjectComponentIdentifier projectComponentIdentifier = DefaultProjectComponentIdentifier.newProjectId(buildIdentifier, project.getPath()); projectRegistry.add(projectIdentityPath, projectComponentIdentifier); } } private void registerSubstitutions(Iterable<IncludedBuild> includedBuilds) { IncludedBuildDependencySubstitutionsBuilder contextBuilder = new IncludedBuildDependencySubstitutionsBuilder(context); for (IncludedBuild includedBuild : includedBuilds) { doAddToCompositeContext((IncludedBuildInternal) includedBuild, contextBuilder); } } private void doAddToCompositeContext(IncludedBuildInternal build, IncludedBuildDependencySubstitutionsBuilder contextBuilder) { DependencySubstitutionsInternal substitutions = build.resolveDependencySubstitutions(); if (!substitutions.hasRules()) { // Configure the included build to discover substitutions LOGGER.lifecycle("[composite-build] Configuring build: " + build.getProjectDir()); contextBuilder.build(build); } else { // Register the defined substitutions for included build context.registerSubstitution(substitutions.getRuleAction()); } } }