blob: e06ed7e10652b2ddc4a543d920b64967abdec283 [file] [log] [blame]
package org.robolectric.internal.dependency;
import org.apache.maven.artifact.ant.DependenciesTask;
import org.apache.maven.artifact.ant.RemoteRepository;
import org.apache.maven.model.Dependency;
import org.apache.tools.ant.Project;
import org.robolectric.RoboSettings;
import org.robolectric.util.Util;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Hashtable;
public class MavenDependencyResolver implements DependencyResolver {
private final Project project = new Project();
private final String repositoryUrl;
private final String repositoryId;
public MavenDependencyResolver() {
this(RoboSettings.getMavenRepositoryUrl(), RoboSettings.getMavenRepositoryId());
}
public MavenDependencyResolver(String repositoryUrl, String repositoryId) {
this.repositoryUrl = repositoryUrl;
this.repositoryId = repositoryId;
}
/**
* Get an array of local artifact URLs for the given dependencies. The order of the URLs is guaranteed to be the
* same as the input order of dependencies, i.e., urls[i] is the local artifact URL for dependencies[i].
*/
public URL[] getLocalArtifactUrls(DependencyJar... dependencies) {
DependenciesTask dependenciesTask = createDependenciesTask();
configureMaven(dependenciesTask);
RemoteRepository remoteRepository = new RemoteRepository();
remoteRepository.setUrl(repositoryUrl);
remoteRepository.setId(repositoryId);
dependenciesTask.addConfiguredRemoteRepository(remoteRepository);
dependenciesTask.setProject(project);
for (DependencyJar dependencyJar : dependencies) {
Dependency dependency = new Dependency();
dependency.setArtifactId(dependencyJar.getArtifactId());
dependency.setGroupId(dependencyJar.getGroupId());
dependency.setType(dependencyJar.getType());
dependency.setVersion(dependencyJar.getVersion());
if (dependencyJar.getClassifier() != null) {
dependency.setClassifier(dependencyJar.getClassifier());
}
dependenciesTask.addDependency(dependency);
}
dependenciesTask.execute();
@SuppressWarnings("unchecked")
Hashtable<String, String> artifacts = project.getProperties();
URL[] urls = new URL[dependencies.length];
for (int i = 0; i < urls.length; i++) {
try {
urls[i] = Util.url(artifacts.get(key(dependencies[i])));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
return urls;
}
@Override
public URL getLocalArtifactUrl(DependencyJar dependency) {
URL[] urls = getLocalArtifactUrls(dependency);
if (urls.length > 0) {
return urls[0];
}
return null;
}
private String key(DependencyJar dependency) {
String key = dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getType();
if(dependency.getClassifier() != null) {
key += ":" + dependency.getClassifier();
}
return key;
}
protected DependenciesTask createDependenciesTask() {
return new DependenciesTask();
}
protected void configureMaven(DependenciesTask dependenciesTask) {
// maybe you want to override this method and some settings?
}
}