/* * Copyright 2011 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.api.internal.artifacts; import org.gradle.StartParameter; import org.gradle.api.artifacts.ConfigurablePublishArtifact; import org.gradle.api.artifacts.dsl.ArtifactHandler; import org.gradle.api.artifacts.dsl.ComponentMetadataHandler; import org.gradle.api.artifacts.dsl.ComponentModuleMetadataHandler; import org.gradle.api.artifacts.dsl.DependencyHandler; import org.gradle.api.artifacts.dsl.RepositoryHandler; import org.gradle.api.attributes.AttributesSchema; import org.gradle.api.internal.DomainObjectContext; import org.gradle.api.internal.InstantiatorFactory; import org.gradle.api.internal.artifacts.component.ComponentIdentifierFactory; import org.gradle.api.internal.artifacts.configurations.ConfigurationContainerInternal; import org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer; import org.gradle.api.internal.artifacts.configurations.DependencyMetaDataProvider; import org.gradle.api.internal.artifacts.dsl.DefaultArtifactHandler; import org.gradle.api.internal.artifacts.dsl.DefaultComponentMetadataHandler; import org.gradle.api.internal.artifacts.dsl.DefaultComponentModuleMetadataHandler; import org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler; import org.gradle.api.internal.artifacts.dsl.PublishArtifactNotationParserFactory; import org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler; import org.gradle.api.internal.artifacts.dsl.dependencies.DependencyFactory; import org.gradle.api.internal.artifacts.dsl.dependencies.ProjectFinder; import org.gradle.api.internal.artifacts.ivyservice.CacheLockingManager; import org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver; import org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver; import org.gradle.api.internal.artifacts.ivyservice.IvyContextManager; import org.gradle.api.internal.artifacts.ivyservice.IvyContextualArtifactPublisher; import org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver; import org.gradle.api.internal.artifacts.ivyservice.dependencysubstitution.DependencySubstitutionRules; import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ResolveIvyFactory; import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.GradlePomModuleDescriptorParser; import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.VersionSelectorScheme; import org.gradle.api.internal.artifacts.ivyservice.moduleconverter.ConfigurationComponentMetaDataBuilder; import org.gradle.api.internal.artifacts.ivyservice.publisher.DefaultIvyDependencyPublisher; import org.gradle.api.internal.artifacts.ivyservice.publisher.IvyBackedArtifactPublisher; import org.gradle.api.internal.artifacts.ivyservice.publisher.IvyXmlModuleDescriptorWriter; import org.gradle.api.internal.artifacts.ivyservice.resolveengine.excludes.ModuleExclusions; import org.gradle.api.internal.artifacts.ivyservice.resolveengine.store.ResolutionResultsStoreFactory; import org.gradle.api.internal.artifacts.mvnsettings.LocalMavenRepositoryLocator; import org.gradle.api.internal.artifacts.query.ArtifactResolutionQueryFactory; import org.gradle.api.internal.artifacts.query.DefaultArtifactResolutionQueryFactory; import org.gradle.api.internal.artifacts.repositories.DefaultBaseRepositoryFactory; import org.gradle.api.internal.artifacts.repositories.transport.RepositoryTransportFactory; import org.gradle.api.internal.artifacts.transform.DefaultArtifactTransforms; import org.gradle.api.internal.artifacts.transform.DefaultVariantTransformRegistry; import org.gradle.api.internal.artifacts.transform.TransformedFileCache; import org.gradle.api.internal.artifacts.transform.VariantAttributeMatchingCache; import org.gradle.api.internal.artifacts.type.ArtifactTypeRegistry; import org.gradle.api.internal.artifacts.type.DefaultArtifactTypeRegistry; import org.gradle.api.internal.attributes.AttributesSchemaInternal; import org.gradle.api.internal.attributes.DefaultAttributesSchema; import org.gradle.api.internal.attributes.ImmutableAttributesFactory; import org.gradle.api.internal.changedetection.state.ValueSnapshotter; import org.gradle.api.internal.component.ComponentTypeRegistry; import org.gradle.api.internal.file.FileCollectionFactory; import org.gradle.api.internal.file.FileResolver; import org.gradle.api.internal.filestore.ivy.ArtifactIdentifierFileStore; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.api.internal.tasks.TaskResolver; import org.gradle.initialization.ProjectAccessListener; import org.gradle.internal.authentication.AuthenticationSchemeRegistry; import org.gradle.internal.classloader.ClassLoaderHierarchyHasher; import org.gradle.internal.component.external.model.ModuleComponentArtifactMetadata; import org.gradle.internal.component.model.ComponentAttributeMatcher; import org.gradle.internal.event.ListenerManager; import org.gradle.internal.operations.BuildOperationExecutor; import org.gradle.internal.reflect.Instantiator; import org.gradle.internal.resource.cached.ExternalResourceFileStore; import org.gradle.internal.resource.local.LocallyAvailableResourceFinder; import org.gradle.internal.service.DefaultServiceRegistry; import org.gradle.internal.service.ServiceRegistration; import org.gradle.internal.service.ServiceRegistry; import org.gradle.internal.typeconversion.NotationParser; import java.util.List; public class DefaultDependencyManagementServices implements DependencyManagementServices { private final ServiceRegistry parent; public DefaultDependencyManagementServices(ServiceRegistry parent) { this.parent = parent; } public DependencyResolutionServices create(FileResolver fileResolver, DependencyMetaDataProvider dependencyMetaDataProvider, ProjectFinder projectFinder, DomainObjectContext domainObjectContext) { DefaultServiceRegistry services = new DefaultServiceRegistry(parent); services.add(FileResolver.class, fileResolver); services.add(DependencyMetaDataProvider.class, dependencyMetaDataProvider); services.add(ProjectFinder.class, projectFinder); services.add(DomainObjectContext.class, domainObjectContext); services.addProvider(new DependencyResolutionScopeServices()); return services.get(DependencyResolutionServices.class); } public void addDslServices(ServiceRegistration registration) { registration.addProvider(new DependencyResolutionScopeServices()); } private static class DependencyResolutionScopeServices { AttributesSchemaInternal createConfigurationAttributesSchema(InstantiatorFactory instantiatorFactory) { return instantiatorFactory.decorate().newInstance(DefaultAttributesSchema.class, new ComponentAttributeMatcher(), instantiatorFactory); } VariantTransformRegistry createVariantTransforms(InstantiatorFactory instantiatorFactory, ImmutableAttributesFactory attributesFactory, TransformedFileCache transformedFileCache, ValueSnapshotter valueSnapshotter, ClassLoaderHierarchyHasher classLoaderHierarchyHasher) { return new DefaultVariantTransformRegistry(instantiatorFactory, attributesFactory, transformedFileCache, valueSnapshotter, classLoaderHierarchyHasher); } BaseRepositoryFactory createBaseRepositoryFactory(LocalMavenRepositoryLocator localMavenRepositoryLocator, FileResolver fileResolver, RepositoryTransportFactory repositoryTransportFactory, LocallyAvailableResourceFinder<ModuleComponentArtifactMetadata> locallyAvailableResourceFinder, ArtifactIdentifierFileStore artifactIdentifierFileStore, ExternalResourceFileStore externalResourceFileStore, VersionSelectorScheme versionSelectorScheme, AuthenticationSchemeRegistry authenticationSchemeRegistry, IvyContextManager ivyContextManager, ImmutableModuleIdentifierFactory moduleIdentifierFactory, ModuleExclusions moduleExclusions, InstantiatorFactory instantiatorFactory) { return new DefaultBaseRepositoryFactory( localMavenRepositoryLocator, fileResolver, repositoryTransportFactory, locallyAvailableResourceFinder, artifactIdentifierFileStore, externalResourceFileStore, new GradlePomModuleDescriptorParser(versionSelectorScheme, moduleIdentifierFactory, moduleExclusions), authenticationSchemeRegistry, ivyContextManager, moduleIdentifierFactory, instantiatorFactory ); } RepositoryHandler createRepositoryHandler(Instantiator instantiator, BaseRepositoryFactory baseRepositoryFactory) { return instantiator.newInstance(DefaultRepositoryHandler.class, baseRepositoryFactory, instantiator); } ConfigurationContainerInternal createConfigurationContainer(Instantiator instantiator, ConfigurationResolver configurationResolver, DomainObjectContext domainObjectContext, ListenerManager listenerManager, DependencyMetaDataProvider metaDataProvider, ProjectAccessListener projectAccessListener, ProjectFinder projectFinder, ConfigurationComponentMetaDataBuilder metaDataBuilder, FileCollectionFactory fileCollectionFactory, GlobalDependencyResolutionRules globalDependencyResolutionRules, ComponentIdentifierFactory componentIdentifierFactory, BuildOperationExecutor buildOperationExecutor, ImmutableAttributesFactory attributesFactory, ImmutableModuleIdentifierFactory moduleIdentifierFactory) { return instantiator.newInstance(DefaultConfigurationContainer.class, configurationResolver, instantiator, domainObjectContext, listenerManager, metaDataProvider, projectAccessListener, projectFinder, metaDataBuilder, fileCollectionFactory, globalDependencyResolutionRules.getDependencySubstitutionRules(), componentIdentifierFactory, buildOperationExecutor, taskResolverFor(domainObjectContext), attributesFactory, moduleIdentifierFactory ); } private TaskResolver taskResolverFor(DomainObjectContext domainObjectContext) { if (domainObjectContext instanceof ProjectInternal) { return ((ProjectInternal) domainObjectContext).getTasks(); } return null; } ArtifactTypeRegistry createArtifactTypeRegistry(Instantiator instantiator, ImmutableAttributesFactory immutableAttributesFactory) { return new DefaultArtifactTypeRegistry(instantiator, immutableAttributesFactory); } DependencyHandler createDependencyHandler(Instantiator instantiator, ConfigurationContainerInternal configurationContainer, DependencyFactory dependencyFactory, ProjectFinder projectFinder, ComponentMetadataHandler componentMetadataHandler, ComponentModuleMetadataHandler componentModuleMetadataHandler, ArtifactResolutionQueryFactory resolutionQueryFactory, AttributesSchema attributesSchema, VariantTransformRegistry artifactTransformRegistrations, ArtifactTypeRegistry artifactTypeRegistry) { return instantiator.newInstance(DefaultDependencyHandler.class, configurationContainer, dependencyFactory, projectFinder, componentMetadataHandler, componentModuleMetadataHandler, resolutionQueryFactory, attributesSchema, artifactTransformRegistrations, artifactTypeRegistry); } DefaultComponentMetadataHandler createComponentMetadataHandler(Instantiator instantiator, ImmutableModuleIdentifierFactory moduleIdentifierFactory) { return instantiator.newInstance(DefaultComponentMetadataHandler.class, instantiator, moduleIdentifierFactory); } DefaultComponentModuleMetadataHandler createComponentModuleMetadataHandler(Instantiator instantiator, ImmutableModuleIdentifierFactory moduleIdentifierFactory) { return instantiator.newInstance(DefaultComponentModuleMetadataHandler.class, moduleIdentifierFactory); } ArtifactHandler createArtifactHandler(Instantiator instantiator, DependencyMetaDataProvider dependencyMetaDataProvider, ConfigurationContainerInternal configurationContainer, DomainObjectContext context) { NotationParser<Object, ConfigurablePublishArtifact> publishArtifactNotationParser = new PublishArtifactNotationParserFactory(instantiator, dependencyMetaDataProvider, taskResolverFor(context)).create(); return instantiator.newInstance(DefaultArtifactHandler.class, configurationContainer, publishArtifactNotationParser); } GlobalDependencyResolutionRules createModuleMetadataHandler(ComponentMetadataProcessor componentMetadataProcessor, ComponentModuleMetadataProcessor moduleMetadataProcessor, List<DependencySubstitutionRules> rules) { return new DefaultGlobalDependencyResolutionRules(componentMetadataProcessor, moduleMetadataProcessor, rules); } ConfigurationResolver createDependencyResolver(ArtifactDependencyResolver artifactDependencyResolver, RepositoryHandler repositories, GlobalDependencyResolutionRules metadataHandler, ComponentIdentifierFactory componentIdentifierFactory, ResolutionResultsStoreFactory resolutionResultsStoreFactory, StartParameter startParameter, AttributesSchemaInternal attributesSchema, VariantTransformRegistry variantTransforms, ImmutableModuleIdentifierFactory moduleIdentifierFactory, ImmutableAttributesFactory attributesFactory, BuildOperationExecutor buildOperationExecutor, ArtifactTypeRegistry artifactTypeRegistry) { return new ErrorHandlingConfigurationResolver( new ShortCircuitEmptyConfigurationResolver( new DefaultConfigurationResolver( artifactDependencyResolver, repositories, metadataHandler, resolutionResultsStoreFactory, startParameter.isBuildProjectDependencies(), attributesSchema, new DefaultArtifactTransforms( new VariantAttributeMatchingCache( variantTransforms, attributesSchema, attributesFactory), attributesSchema), moduleIdentifierFactory, buildOperationExecutor, artifactTypeRegistry), componentIdentifierFactory, moduleIdentifierFactory)); } ArtifactPublicationServices createArtifactPublicationServices(ServiceRegistry services) { return new DefaultArtifactPublicationServices(services); } DependencyResolutionServices createDependencyResolutionServices(ServiceRegistry services) { return new DefaultDependencyResolutionServices(services); } ArtifactResolutionQueryFactory createArtifactResolutionQueryFactory(ConfigurationContainerInternal configurationContainer, RepositoryHandler repositoryHandler, ResolveIvyFactory ivyFactory, GlobalDependencyResolutionRules metadataHandler, CacheLockingManager cacheLockingManager, ComponentTypeRegistry componentTypeRegistry) { return new DefaultArtifactResolutionQueryFactory(configurationContainer, repositoryHandler, ivyFactory, metadataHandler, cacheLockingManager, componentTypeRegistry); } } private static class DefaultDependencyResolutionServices implements DependencyResolutionServices { private final ServiceRegistry services; private DefaultDependencyResolutionServices(ServiceRegistry services) { this.services = services; } public RepositoryHandler getResolveRepositoryHandler() { return services.get(RepositoryHandler.class); } public ConfigurationContainerInternal getConfigurationContainer() { return services.get(ConfigurationContainerInternal.class); } public DependencyHandler getDependencyHandler() { return services.get(DependencyHandler.class); } } private static class DefaultArtifactPublicationServices implements ArtifactPublicationServices { private final ServiceRegistry services; public DefaultArtifactPublicationServices(ServiceRegistry services) { this.services = services; } public RepositoryHandler createRepositoryHandler() { Instantiator instantiator = services.get(Instantiator.class); BaseRepositoryFactory baseRepositoryFactory = services.get(BaseRepositoryFactory.class); return instantiator.newInstance(DefaultRepositoryHandler.class, baseRepositoryFactory, instantiator); } public ArtifactPublisher createArtifactPublisher() { IvyBackedArtifactPublisher publisher = new IvyBackedArtifactPublisher( services.get(ConfigurationComponentMetaDataBuilder.class), new DefaultIvyDependencyPublisher(), new IvyXmlModuleDescriptorWriter() ); return new IvyContextualArtifactPublisher(services.get(IvyContextManager.class), publisher); } } }