/*
* Copyright 2013 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;
import com.google.common.collect.Lists;
import org.gradle.api.artifacts.PublishArtifact;
import org.gradle.api.artifacts.component.ModuleComponentIdentifier;
import org.gradle.api.internal.artifacts.configurations.OutgoingVariant;
import org.gradle.api.internal.attributes.AttributeContainerInternal;
import org.gradle.internal.component.external.descriptor.Configuration;
import org.gradle.internal.component.external.descriptor.ModuleDescriptorState;
import org.gradle.internal.component.external.descriptor.MutableModuleDescriptorState;
import org.gradle.internal.component.local.model.BuildableLocalComponentMetadata;
import org.gradle.internal.component.local.model.LocalFileDependencyMetadata;
import org.gradle.internal.component.model.DefaultIvyArtifactName;
import org.gradle.internal.component.model.Exclude;
import org.gradle.internal.component.model.IvyArtifactName;
import org.gradle.internal.component.model.LocalOriginDependencyMetadata;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class DefaultIvyModulePublishMetadata implements BuildableIvyModulePublishMetadata, BuildableLocalComponentMetadata {
private final ModuleComponentIdentifier id;
private final MutableModuleDescriptorState descriptor;
private final Map<ModuleComponentArtifactIdentifier, IvyModuleArtifactPublishMetadata> artifactsById = new LinkedHashMap<ModuleComponentArtifactIdentifier, IvyModuleArtifactPublishMetadata>();
private final Map<String, Configuration> configurations = new LinkedHashMap<String, Configuration>();
private final Set<LocalOriginDependencyMetadata> dependencies = new LinkedHashSet<LocalOriginDependencyMetadata>();
public DefaultIvyModulePublishMetadata(ModuleComponentIdentifier id, String status) {
this.id = id;
this.descriptor = new MutableModuleDescriptorState(id, status, true);
}
public DefaultIvyModulePublishMetadata(ModuleComponentIdentifier id, ModuleDescriptorState moduleDescriptor) {
this.id = id;
this.descriptor = (MutableModuleDescriptorState) moduleDescriptor;
}
public ModuleComponentIdentifier getId() {
return id;
}
public MutableModuleDescriptorState getModuleDescriptor() {
return descriptor;
}
@Override
public Map<String, Configuration> getConfigurations() {
return configurations;
}
@Override
public Collection<LocalOriginDependencyMetadata> getDependencies() {
return dependencies;
}
@Override
public void addConfiguration(String name, String description, Set<String> extendsFrom, Set<String> hierarchy, boolean visible, boolean transitive, AttributeContainerInternal attributes, boolean canBeConsumed, boolean canBeResolved) {
List<String> sortedExtends = Lists.newArrayList(extendsFrom);
Collections.sort(sortedExtends);
Configuration configuration = new Configuration(name, transitive, visible, sortedExtends);
configurations.put(name, configuration);
}
@Override
public void addExclude(Exclude exclude) {
descriptor.addExclude(exclude);
}
@Override
public void addDependency(LocalOriginDependencyMetadata dependency) {
dependencies.add(normalizeVersionForIvy(dependency));
}
/**
* [1.0] is a valid version in maven, but not in Ivy: strip the surrounding '[' and ']' characters for ivy publish.
*/
private static LocalOriginDependencyMetadata normalizeVersionForIvy(LocalOriginDependencyMetadata dependency) {
String version = dependency.getRequested().getVersion();
if (version.startsWith("[") && version.endsWith("]") && version.indexOf(',') == -1) {
String normalizedVersion = version.substring(1, version.length() - 1);
return dependency.withRequestedVersion(normalizedVersion);
}
return dependency;
}
@Override
public void addArtifacts(String configuration, Iterable<? extends PublishArtifact> artifacts) {
for (PublishArtifact artifact : artifacts) {
DefaultIvyArtifactName ivyName = DefaultIvyArtifactName.forPublishArtifact(artifact);
DefaultIvyModuleArtifactPublishMetadata ivyArtifact = getOrCreate(ivyName);
ivyArtifact.setFile(artifact.getFile());
ivyArtifact.addConfiguration(configuration);
}
}
@Override
public void addVariant(String configuration, OutgoingVariant variant) {
// Ignore
}
public void addArtifact(IvyArtifactName artifact, File file) {
DefaultIvyModuleArtifactPublishMetadata publishMetadata = new DefaultIvyModuleArtifactPublishMetadata(id, artifact);
publishMetadata.setFile(file);
artifactsById.put(publishMetadata.getId(), publishMetadata);
}
public void addArtifact(IvyModuleArtifactPublishMetadata artifact) {
artifactsById.put(artifact.getId(), artifact);
}
private DefaultIvyModuleArtifactPublishMetadata getOrCreate(IvyArtifactName ivyName) {
for (IvyModuleArtifactPublishMetadata artifactPublishMetadata : artifactsById.values()) {
if (artifactPublishMetadata.getArtifactName().equals(ivyName)) {
return (DefaultIvyModuleArtifactPublishMetadata) artifactPublishMetadata;
}
}
DefaultIvyModuleArtifactPublishMetadata artifact = new DefaultIvyModuleArtifactPublishMetadata(id, ivyName);
artifactsById.put(artifact.getId(), artifact);
return artifact;
}
public Collection<IvyModuleArtifactPublishMetadata> getArtifacts() {
return artifactsById.values();
}
@Override
public void addFiles(String configuration, LocalFileDependencyMetadata files) {
// Ignore
}
}