org.gradle.internal.component.external.model.ivy.RealisedIvyModuleResolveMetadata.java Source code

Java tutorial

Introduction

Here is the source code for org.gradle.internal.component.external.model.ivy.RealisedIvyModuleResolveMetadata.java

Source

/*
 * Copyright 2018 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.internal.component.external.model.ivy;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import org.gradle.api.Transformer;
import org.gradle.api.artifacts.component.ModuleComponentIdentifier;
import org.gradle.api.artifacts.component.ModuleComponentSelector;
import org.gradle.api.capabilities.CapabilitiesMetadata;
import org.gradle.api.internal.artifacts.ivyservice.NamespaceId;
import org.gradle.api.internal.attributes.ImmutableAttributes;
import org.gradle.internal.component.external.descriptor.Artifact;
import org.gradle.internal.component.external.descriptor.Configuration;
import org.gradle.internal.component.external.model.AbstractRealisedModuleComponentResolveMetadata;
import org.gradle.internal.component.external.model.ComponentVariant;
import org.gradle.internal.component.external.model.DefaultModuleComponentSelector;
import org.gradle.internal.component.external.model.ImmutableCapabilities;
import org.gradle.internal.component.external.model.LazyToRealisedModuleComponentResolveMetadataHelper;
import org.gradle.internal.component.external.model.ModuleComponentArtifactMetadata;
import org.gradle.internal.component.external.model.ModuleDependencyMetadata;
import org.gradle.internal.component.external.model.RealisedConfigurationMetadata;
import org.gradle.internal.component.external.model.VariantMetadataRules;
import org.gradle.internal.component.model.ConfigurationMetadata;
import org.gradle.internal.component.model.Exclude;
import org.gradle.internal.component.model.ExcludeMetadata;
import org.gradle.internal.component.model.ModuleSource;
import org.gradle.util.CollectionUtils;

import javax.annotation.Nullable;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;

/**
 * {@link AbstractRealisedModuleComponentResolveMetadata Realised version} of a {@link IvyModuleResolveMetadata}.
 *
 * @see DefaultIvyModuleResolveMetadata
 */
public class RealisedIvyModuleResolveMetadata extends AbstractRealisedModuleComponentResolveMetadata
        implements IvyModuleResolveMetadata {

    public static RealisedIvyModuleResolveMetadata transform(DefaultIvyModuleResolveMetadata metadata) {
        VariantMetadataRules variantMetadataRules = metadata.getVariantMetadataRules();

        ImmutableList<ImmutableRealisedVariantImpl> variants = LazyToRealisedModuleComponentResolveMetadataHelper
                .realiseVariants(metadata, variantMetadataRules, metadata.getVariants());

        Map<String, ConfigurationMetadata> configurations = realiseConfigurations(metadata, variantMetadataRules);

        return new RealisedIvyModuleResolveMetadata(metadata, variants, configurations);
    }

    private static Map<String, ConfigurationMetadata> realiseConfigurations(
            DefaultIvyModuleResolveMetadata metadata, VariantMetadataRules variantMetadataRules) {
        Map<Artifact, ModuleComponentArtifactMetadata> artifacts = new IdentityHashMap<Artifact, ModuleComponentArtifactMetadata>();
        IvyConfigurationHelper configurationHelper = new IvyConfigurationHelper(metadata.getArtifactDefinitions(),
                artifacts, metadata.getExcludes(), metadata.getDependencies(), metadata.getId());

        Map<String, ConfigurationMetadata> configurations = Maps
                .newHashMapWithExpectedSize(metadata.getConfigurationNames().size());
        ImmutableMap<String, Configuration> configurationDefinitions = metadata.getConfigurationDefinitions();
        for (String configurationName : metadata.getConfigurationNames()) {
            Configuration configuration = configurationDefinitions.get(configurationName);
            ImmutableSet<String> hierarchy = LazyToRealisedModuleComponentResolveMetadataHelper
                    .constructHierarchy(configuration, configurationDefinitions);

            NameOnlyVariantResolveMetadata variant = new NameOnlyVariantResolveMetadata(configurationName);
            ImmutableAttributes variantAttributes = variantMetadataRules.applyVariantAttributeRules(variant,
                    metadata.getAttributes());

            CapabilitiesMetadata capabilitiesMetadata = variantMetadataRules.applyCapabilitiesRules(variant,
                    ImmutableCapabilities.EMPTY);

            configurations.put(configurationName,
                    createConfiguration(configurationHelper, variantMetadataRules, metadata.getId(),
                            configurationName, configuration.isTransitive(), configuration.isVisible(), hierarchy,
                            configurationHelper.filterArtifacts(configurationName, hierarchy),
                            configurationHelper.filterExcludes(hierarchy), variantAttributes,
                            ImmutableCapabilities.of(capabilitiesMetadata.getCapabilities())));
        }
        return configurations;
    }

    private final ImmutableMap<String, Configuration> configurationDefinitions;
    private final ImmutableList<IvyDependencyDescriptor> dependencies;
    private final ImmutableList<Artifact> artifactDefinitions;
    private final ImmutableList<Exclude> excludes;
    private final ImmutableMap<NamespaceId, String> extraAttributes;
    private final DefaultIvyModuleResolveMetadata metadata;
    private final String branch;

    private RealisedIvyModuleResolveMetadata(RealisedIvyModuleResolveMetadata metadata,
            List<IvyDependencyDescriptor> dependencies) {
        super(metadata);
        this.configurationDefinitions = metadata.getConfigurationDefinitions();
        this.branch = metadata.getBranch();
        this.artifactDefinitions = metadata.getArtifactDefinitions();
        this.dependencies = ImmutableList.copyOf(dependencies);
        this.excludes = metadata.getExcludes();
        this.extraAttributes = metadata.getExtraAttributes();
        this.metadata = metadata.metadata;
    }

    private RealisedIvyModuleResolveMetadata(RealisedIvyModuleResolveMetadata metadata, ModuleSource source) {
        super(metadata, source);
        this.configurationDefinitions = metadata.configurationDefinitions;
        this.branch = metadata.branch;
        this.artifactDefinitions = metadata.artifactDefinitions;
        this.dependencies = metadata.dependencies;
        this.excludes = metadata.excludes;
        this.extraAttributes = metadata.extraAttributes;
        this.metadata = metadata.metadata.withSource(source);
    }

    RealisedIvyModuleResolveMetadata(DefaultIvyModuleResolveMetadata metadata,
            ImmutableList<? extends ComponentVariant> variants, Map<String, ConfigurationMetadata> configurations) {
        super(metadata, variants, configurations);
        this.configurationDefinitions = metadata.getConfigurationDefinitions();
        this.branch = metadata.getBranch();
        this.artifactDefinitions = metadata.getArtifactDefinitions();
        this.dependencies = metadata.getDependencies();
        this.excludes = metadata.getExcludes();
        this.extraAttributes = metadata.getExtraAttributes();
        this.metadata = metadata;
    }

    private static RealisedConfigurationMetadata createConfiguration(IvyConfigurationHelper configurationHelper,
            VariantMetadataRules variantMetadataRules, ModuleComponentIdentifier componentId, String name,
            boolean transitive, boolean visible, ImmutableSet<String> hierarchy,
            ImmutableList<ModuleComponentArtifactMetadata> artifacts, ImmutableList<ExcludeMetadata> excludes,
            ImmutableAttributes componentLevelAttributes, ImmutableCapabilities capabilities) {
        RealisedConfigurationMetadata configuration = new RealisedConfigurationMetadata(componentId, name,
                transitive, visible, hierarchy, artifacts, excludes, componentLevelAttributes, capabilities);
        ImmutableList<ModuleDependencyMetadata> dependencyMetadata = configurationHelper
                .filterDependencies(configuration);
        dependencyMetadata = ImmutableList.copyOf(variantMetadataRules
                .applyDependencyMetadataRules(new NameOnlyVariantResolveMetadata(name), dependencyMetadata));
        configuration.setDependencies(dependencyMetadata);
        return configuration;
    }

    @Override
    public MutableIvyModuleResolveMetadata asMutable() {
        return metadata.asMutable();
    }

    @Override
    public IvyModuleResolveMetadata withSource(ModuleSource source) {
        return new RealisedIvyModuleResolveMetadata(this, source);
    }

    @Nullable
    @Override
    public String getBranch() {
        return branch;
    }

    @Override
    public ImmutableMap<String, Configuration> getConfigurationDefinitions() {
        return configurationDefinitions;
    }

    @Override
    public ImmutableList<Artifact> getArtifactDefinitions() {
        return artifactDefinitions;
    }

    @Override
    public ImmutableList<Exclude> getExcludes() {
        return excludes;
    }

    @Override
    public ImmutableMap<NamespaceId, String> getExtraAttributes() {
        return extraAttributes;
    }

    @Override
    public IvyModuleResolveMetadata withDynamicConstraintVersions() {
        List<IvyDependencyDescriptor> transformed = CollectionUtils.collect(getDependencies(),
                new Transformer<IvyDependencyDescriptor, IvyDependencyDescriptor>() {
                    @Override
                    public IvyDependencyDescriptor transform(IvyDependencyDescriptor dependency) {
                        ModuleComponentSelector selector = dependency.getSelector();
                        String dynamicConstraintVersion = dependency.getDynamicConstraintVersion();
                        ModuleComponentSelector newSelector = DefaultModuleComponentSelector
                                .newSelector(selector.getModuleIdentifier(), dynamicConstraintVersion);
                        return dependency.withRequested(newSelector);
                    }
                });
        return this.withDependencies(transformed);
    }

    @Override
    public ImmutableList<IvyDependencyDescriptor> getDependencies() {
        return dependencies;
    }

    private IvyModuleResolveMetadata withDependencies(List<IvyDependencyDescriptor> transformed) {
        return new RealisedIvyModuleResolveMetadata(this, transformed);
    }

}