/* * Copyright 2012 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.resolveengine.result; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.artifacts.component.ComponentIdentifier; import org.gradle.api.artifacts.result.ComponentSelectionReason; import org.gradle.api.artifacts.result.ResolutionResult; import org.gradle.api.artifacts.result.ResolvedComponentResult; import org.gradle.api.artifacts.result.ResolvedDependencyResult; import org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.ComponentResult; import org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyResult; import org.gradle.api.internal.artifacts.result.DefaultResolutionResult; import org.gradle.api.internal.artifacts.result.DefaultResolvedComponentResult; import org.gradle.internal.Factory; import java.util.Collection; import java.util.HashMap; import java.util.Map; public class DefaultResolutionResultBuilder { private final Map<Long, DefaultResolvedComponentResult> modules = new HashMap<Long, DefaultResolvedComponentResult>(); private final CachingDependencyResultFactory dependencyResultFactory = new CachingDependencyResultFactory(); public static ResolutionResult empty(ModuleVersionIdentifier id, ComponentIdentifier componentIdentifier) { DefaultResolutionResultBuilder builder = new DefaultResolutionResultBuilder(); builder.visitComponent(new DefaultComponentResult(0L, id, VersionSelectionReasons.ROOT, componentIdentifier)); return builder.complete(0L); } public ResolutionResult complete(Long rootId) { return new DefaultResolutionResult(new RootFactory(modules.get(rootId))); } public void visitComponent(ComponentResult component) { create(component.getResultId(), component.getModuleVersion(), component.getSelectionReason(), component.getComponentId()); } public void visitOutgoingEdges(Long fromComponent, Collection<? extends DependencyResult> dependencies) { for (DependencyResult d : dependencies) { DefaultResolvedComponentResult from = modules.get(fromComponent); org.gradle.api.artifacts.result.DependencyResult dependency; if (d.getFailure() != null) { dependency = dependencyResultFactory.createUnresolvedDependency(d.getRequested(), from, d.getReason(), d.getFailure()); } else { DefaultResolvedComponentResult selected = modules.get(d.getSelected()); dependency = dependencyResultFactory.createResolvedDependency(d.getRequested(), from, selected); selected.addDependent((ResolvedDependencyResult) dependency); } from.addDependency(dependency); } } private void create(Long id, ModuleVersionIdentifier moduleVersion, ComponentSelectionReason selectionReason, ComponentIdentifier componentId) { if (!modules.containsKey(id)) { modules.put(id, new DefaultResolvedComponentResult(moduleVersion, selectionReason, componentId)); } } private static class RootFactory implements Factory<ResolvedComponentResult> { private DefaultResolvedComponentResult rootModule; public RootFactory(DefaultResolvedComponentResult rootModule) { this.rootModule = rootModule; } public ResolvedComponentResult create() { return rootModule; } } }