/* * Copyright 2017 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.ivyservice.moduleconverter; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.artifacts.component.ComponentIdentifier; import org.gradle.api.internal.artifacts.ImmutableModuleIdentifierFactory; import org.gradle.api.internal.artifacts.Module; import org.gradle.api.internal.artifacts.component.ComponentIdentifierFactory; import org.gradle.api.internal.artifacts.configurations.ConfigurationsProvider; import org.gradle.api.internal.artifacts.configurations.DependencyMetaDataProvider; import org.gradle.api.internal.artifacts.configurations.MutationValidator; import org.gradle.api.internal.artifacts.dsl.dependencies.ProjectFinder; import org.gradle.api.internal.attributes.AttributesSchemaInternal; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.internal.component.local.model.DefaultLocalComponentMetadata; import org.gradle.internal.component.model.ComponentResolveMetadata; public class DefaultRootComponentMetadataBuilder implements RootComponentMetadataBuilder { private final DependencyMetaDataProvider metaDataProvider; private final ComponentIdentifierFactory componentIdentifierFactory; private final ImmutableModuleIdentifierFactory moduleIdentifierFactory; private final ProjectFinder projectFinder; private final ConfigurationComponentMetaDataBuilder configurationComponentMetaDataBuilder; private final ConfigurationsProvider configurationsProvider; private final MetadataHolder holder; public DefaultRootComponentMetadataBuilder(DependencyMetaDataProvider metaDataProvider, ComponentIdentifierFactory componentIdentifierFactory, ImmutableModuleIdentifierFactory moduleIdentifierFactory, ProjectFinder projectFinder, ConfigurationComponentMetaDataBuilder configurationComponentMetaDataBuilder, ConfigurationsProvider configurationsProvider) { this.metaDataProvider = metaDataProvider; this.componentIdentifierFactory = componentIdentifierFactory; this.moduleIdentifierFactory = moduleIdentifierFactory; this.projectFinder = projectFinder; this.configurationComponentMetaDataBuilder = configurationComponentMetaDataBuilder; this.configurationsProvider = configurationsProvider; this.holder = new MetadataHolder(); } @Override public ComponentResolveMetadata toRootComponentMetaData() { Module module = metaDataProvider.getModule(); ComponentIdentifier componentIdentifier = componentIdentifierFactory.createComponentIdentifier(module); DefaultLocalComponentMetadata metaData = holder.tryCached(componentIdentifier); if (metaData != null) { return metaData; } ModuleVersionIdentifier moduleVersionIdentifier = moduleIdentifierFactory.moduleWithVersion(module.getGroup(), module.getName(), module.getVersion()); ProjectInternal project = projectFinder.findProject(module.getProjectPath()); AttributesSchemaInternal schema = project == null ? null : (AttributesSchemaInternal) project.getDependencies().getAttributesSchema(); metaData = new DefaultLocalComponentMetadata(moduleVersionIdentifier, componentIdentifier, module.getStatus(), schema); configurationComponentMetaDataBuilder.addConfigurations(metaData, configurationsProvider.getAll()); holder.cachedValue = metaData; return metaData; } public RootComponentMetadataBuilder withConfigurationsProvider(ConfigurationsProvider alternateProvider) { return new DefaultRootComponentMetadataBuilder( metaDataProvider, componentIdentifierFactory, moduleIdentifierFactory, projectFinder, configurationComponentMetaDataBuilder, alternateProvider ); } public MutationValidator getValidator() { return holder; } private static class MetadataHolder implements MutationValidator { private DefaultLocalComponentMetadata cachedValue; @Override public void validateMutation(MutationType type) { if (type == MutationType.DEPENDENCIES || type == MutationType.ARTIFACTS) { cachedValue = null; } } DefaultLocalComponentMetadata tryCached(ComponentIdentifier id) { if (cachedValue != null) { if (cachedValue.getComponentId().equals(id)) { return cachedValue; } cachedValue = null; } return null; } } }