001 /*
002 * Licensed under the Apache License, Version 2.0 (the "License");
003 * you may not use this file except in compliance with the License.
004 * You may obtain a copy of the License at
005 *
006 * http://www.apache.org/licenses/LICENSE-2.0
007 *
008 * Unless required by applicable law or agreed to in writing, software
009 * distributed under the License is distributed on an "AS IS" BASIS,
010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
011 * See the License for the specific language governing permissions and
012 * limitations under the License.
013 */
014 /*
015 * This file has been modified by Chris Pheby in accordance with Section 4.2
016 * of the Apache Software License
017 */
018 package org.jadira.dependencynavigator.controller;
019
020 import org.apache.maven.model.Dependency;
021 import org.apache.maven.model.Exclusion;
022 import org.apache.maven.model.Model;
023 import org.jadira.dependencynavigator.assembler.Assembler;
024 import org.jadira.dependencynavigator.assembler.AssemblerException;
025 import org.jadira.dependencynavigator.controller.model.DuplicatesListManager;
026 import org.jadira.dependencynavigator.implementations.IProgressMeter;
027 import org.jadira.dependencynavigator.implementations.Repository;
028 import org.jadira.dependencynavigator.model.Artifact;
029 import org.jadira.dependencynavigator.model.ArtifactInitialisationException;
030 import org.jadira.dependencynavigator.model.LeafDependency;
031 import org.jadira.dependencynavigator.model.PomFile;
032
033 import java.util.Stack;
034
035 public class ArtifactResolver {
036
037 public static final String ROLE = "org.jadira.dependencynavigator.controller.ArtifactResolver";
038
039 private Controller controller;
040 private Assembler assembler;
041 private DuplicatesListManager duplicatesListManager;
042 private Repository repository;
043
044 /**
045 * @param dependencyHeirarchyParent - the pom file containing the dependency
046 * @param progress
047 * @param path
048 * @param dependency - the dependency requiring resolution
049 * @return the artifact indicated by this dependency information or null if the artifact has been excluded by the
050 * scope filters or exclusions
051 * @throws DependencyResolutionException if smth is out of order
052 */
053 public Artifact resolveArtifact(PomFile dependencyHeirarchyParent, Dependency dependency, IProgressMeter progress, Stack<LeafDependency> path) throws DependencyResolutionException {
054 String groupId = dependency.getGroupId() == null ? dependencyHeirarchyParent.getGroupId() : dependency.getGroupId();
055 String artifactId = dependency.getArtifactId();
056 String version = dependency.getVersion() == null ? dependencyHeirarchyParent.getGroupId() : dependency.getGroupId();
057
058 // resolve scope and exclude if scope is not being shown
059 String scope = dependency.getScope();
060 if (isNullOrEmpty(scope)) {
061 scope = Artifact.DEFAULT_SCOPE;
062 }
063 if (!controller.includeScope(scope)) {
064 return null;
065 }
066 if (controller.getResolveExclusions().getValue()) {
067 if (dependencyHeirarchyParent.isExcluded(groupId, artifactId, new Stack<Artifact>())) {
068 return null;
069 }
070 }
071
072 // attempt to locate a pom file for this dependency
073 try {
074 Model model = repository.resolveFile(groupId, artifactId, version);
075 if (model == null) {
076 // if a corresponsing pom file does not exist then add the
077 // dependancy as a leaf node
078 LeafDependency leafDependency = new LeafDependency(dependencyHeirarchyParent, dependency, scope);
079 duplicatesListManager.add(leafDependency);
080 return leafDependency;
081 }
082 // if a pom file exists then add as a non-leaf node
083 PomFile pomFile = new PomFile(assembler.assemble(model, repository), dependencyHeirarchyParent, scope);
084 addPomToDuplicatesList(pomFile);
085 if (controller.getResolveExclusions().getValue()) {
086 addExclusions(pomFile, dependency);
087 }
088 pomFile.resolveDependencies(this, progress, path);
089 return pomFile;
090 } catch (ArtifactInitialisationException e) {
091 throw new DependencyResolutionException(e);
092 } catch (AssemblerException e) {
093 throw new DependencyResolutionException(e);
094 }
095 }
096
097 public void addPomToDuplicatesList(PomFile pomFile) {
098 duplicatesListManager.add(pomFile);
099 }
100
101 private void addExclusions(Artifact artifact, Dependency dependency) {
102 for (Object o : dependency.getExclusions()) {
103 Exclusion exclusion = (Exclusion) o;
104 artifact.addExclusion(exclusion.getGroupId(), exclusion.getArtifactId());
105 }
106 }
107
108 private boolean isNullOrEmpty(String value) {
109 return value == null || value.trim().length() == 0;
110 }
111 }