1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 package org.apache.maven.resolver.internal.ant.tasks; 20 21 import org.apache.maven.resolver.internal.ant.AntRepoSys; 22 import org.apache.maven.resolver.internal.ant.types.Dependencies; 23 import org.apache.maven.resolver.internal.ant.types.LocalRepository; 24 import org.apache.maven.resolver.internal.ant.types.RemoteRepositories; 25 import org.apache.maven.resolver.internal.ant.types.RemoteRepository; 26 import org.apache.tools.ant.BuildException; 27 import org.apache.tools.ant.Task; 28 import org.apache.tools.ant.types.Reference; 29 import org.eclipse.aether.collection.CollectResult; 30 31 /** 32 * Abstract base class for Ant tasks that perform dependency resolution using Maven Resolver (Aether). 33 * <p> 34 * This class encapsulates support for specifying and configuring dependencies, remote repositories, 35 * and the local repository used during resolution. 36 * It provides helper methods to collect dependencies and manage nested configuration elements. 37 * </p> 38 * 39 * <p>This class is intended to be extended by concrete tasks that require dependency resolution, 40 * such as retrieving artifacts, resolving transitive dependencies, or analyzing dependency graphs.</p> 41 * 42 */ 43 public abstract class AbstractResolvingTask extends Task { 44 45 /** 46 * The dependency definitions to resolve. 47 * Configurable via a nested {@code <dependencies>} element or a reference using {@link #setDependenciesRef(Reference)}. 48 */ 49 protected Dependencies dependencies; 50 51 /** 52 * The list of remote repositories to use for resolution. 53 * Populated via one or more {@code <remoteRepo>} or {@code <remoteRepos>} nested elements. 54 */ 55 protected RemoteRepositories remoteRepositories; 56 57 /** 58 * Optional custom local repository definition. 59 * Created using the {@code <localRepo>} nested element. 60 */ 61 protected LocalRepository localRepository; 62 63 /** 64 * Default constructor for {@code AbstractResolvingTask}. 65 */ 66 public AbstractResolvingTask() { 67 // Default constructor 68 } 69 70 /** 71 * Adds a {@code <dependencies>} element to define the dependencies to be resolved. 72 * 73 * @param dependencies the {@link Dependencies} element to add 74 * @throws BuildException if multiple {@code <dependencies>} elements are specified 75 */ 76 public void addDependencies(final Dependencies dependencies) { 77 if (this.dependencies != null) { 78 throw new BuildException("You must not specify multiple <dependencies> elements"); 79 } 80 this.dependencies = dependencies; 81 } 82 83 /** 84 * Sets a reference to an existing {@link Dependencies} instance using {@code refid}. 85 * 86 * @param ref the reference to a {@code Dependencies} instance 87 */ 88 public void setDependenciesRef(final Reference ref) { 89 if (dependencies == null) { 90 dependencies = new Dependencies(); 91 dependencies.setProject(getProject()); 92 } 93 dependencies.setRefid(ref); 94 } 95 96 /** 97 * Creates a {@code <localRepo>} element to specify a custom local repository for resolution. 98 * 99 * @return the created {@link LocalRepository} instance 100 * @throws BuildException if multiple {@code <localRepo>} elements are specified 101 */ 102 public LocalRepository createLocalRepo() { 103 if (localRepository != null) { 104 throw new BuildException("You must not specify multiple <localRepo> elements"); 105 } 106 localRepository = new LocalRepository(this); 107 return localRepository; 108 } 109 110 /** 111 * Returns the {@link RemoteRepositories} instance used for resolution, creating it if necessary. 112 * 113 * @return the {@code RemoteRepositories} instance 114 */ 115 private RemoteRepositories getRemoteRepos() { 116 if (remoteRepositories == null) { 117 remoteRepositories = new RemoteRepositories(); 118 remoteRepositories.setProject(getProject()); 119 } 120 return remoteRepositories; 121 } 122 123 /** 124 * Adds a single {@code <remoteRepo>} element to the list of remote repositories used for resolution. 125 * 126 * @param repository the remote repository to add 127 */ 128 public void addRemoteRepo(final RemoteRepository repository) { 129 getRemoteRepos().addRemoterepo(repository); 130 } 131 132 /** 133 * Adds a {@code <remoteRepos>} element, representing a collection of remote repositories. 134 * 135 * @param repositories the remote repositories to add 136 */ 137 public void addRemoteRepos(final RemoteRepositories repositories) { 138 getRemoteRepos().addRemoterepos(repositories); 139 } 140 141 /** 142 * Sets a reference to an existing {@link RemoteRepositories} instance using {@code refid}. 143 * 144 * @param ref the reference to a {@code RemoteRepositories} element 145 */ 146 public void setRemoteReposRef(final Reference ref) { 147 final RemoteRepositories repos = new RemoteRepositories(); 148 repos.setProject(getProject()); 149 repos.setRefid(ref); 150 getRemoteRepos().addRemoterepos(repos); 151 } 152 153 /** 154 * Performs dependency collection using the configured {@link Dependencies}, 155 * {@link LocalRepository}, and {@link RemoteRepositories}. 156 * 157 * @return the result of the dependency collection 158 * @throws BuildException if dependency collection fails 159 */ 160 protected CollectResult collectDependencies() { 161 return AntRepoSys.getInstance(getProject()) 162 .collectDependencies(this, dependencies, localRepository, remoteRepositories); 163 } 164 }