/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* 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
*
*******************************************************************************/
package org.ebayopensource.turmeric.eclipse.mavenapi.internal.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactScopeEnum;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.repository.metadata.ArtifactMetadata;
import org.apache.maven.repository.metadata.MetadataResolutionRequest;
import org.apache.maven.repository.metadata.MetadataResolutionResult;
import org.apache.maven.repository.metadata.MetadataTreeNode;
import org.ebayopensource.turmeric.eclipse.mavenapi.exception.MavenEclipseApiException;
/**
* The Class MavenApiUtil.
*
* @author bishen
*/
public final class MavenApiUtil {
private MavenApiUtil() {
}
/**
* Tries to resolve the given {@code ArtifactMetadata}s in the given
* local/remote repositories and returns the resolved {@code Artifact}s.
*
* @param embedder the embedder
* @param mdCollection the md collection
* @param localRepository the local repository
* @param remoteRepositories the remote repositories
* @return the list
* @throws MavenEclipseApiException the maven eclipse api exception
*/
public static List<Artifact> resolveArtifacts(RepositorySystem embedder, List<ArtifactMetadata> mdCollection,
ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories) throws MavenEclipseApiException {
if (mdCollection == null || mdCollection.isEmpty()) {
return null;
}
List<Artifact> res = new ArrayList<Artifact>(mdCollection.size());
Artifact artifact = null;
for (Iterator<ArtifactMetadata> i$ = mdCollection.iterator(); i$.hasNext(); res
.add(artifact)) {
ArtifactMetadata md = i$.next();
artifact = embedder.createArtifact(
md.getGroupId(), md.getArtifactId(), md.getVersion(),
md.getScope(), md.getType() != null ? md.getType() : "jar");
resolveArtifact(embedder, artifact, localRepository,
remoteRepositories);
}
return res;
}
/**
* Tries to resolve the given artifact in the given local/remote
* repositories.
*
* @param embedder the embedder
* @param artifact the artifact
* @param localRepository the local repository
* @param remoteRepositories the remote repositories
* @return the artifact resolution result
* @throws MavenEclipseApiException the maven eclipse api exception
*/
public static ArtifactResolutionResult resolveArtifact(RepositorySystem embedder,
Artifact artifact, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories) throws MavenEclipseApiException {
return resolveArtifact(embedder, artifact, localRepository,
remoteRepositories, false);
}
/**
* Tries to resolve the given artifact in the given local/remote
* repositories.
*
* @param embedder the embedder
* @param artifact the artifact
* @param localRepository the local repository
* @param remoteRepositories the remote repositories
* @param resolveDependencies the resolve dependencies
* @return the artifact resolution result
* @throws MavenEclipseApiException the maven eclipse api exception
*/
public static ArtifactResolutionResult resolveArtifact(RepositorySystem embedder,
Artifact artifact, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories,
boolean resolveDependencies) throws MavenEclipseApiException {
if (embedder == null) {
return null;
}
ArtifactResolutionRequest request = new ArtifactResolutionRequest();
request.setArtifact(artifact);
request.setLocalRepository(localRepository);
request.setRemoteRepositories(remoteRepositories);
request.setResolveTransitively(resolveDependencies);
return embedder.resolve(request);
}
/**
* Tries to resolve a metadata tree based on the given.
*
* @param embedder the embedder
* @param req the req
* @return the metadata resolution result
* @throws MavenEclipseApiException the maven eclipse api exception
* {@code MetadataResolutionRequest} and embed it in a
* {@code MetadataResolutionResult}.
*/
public static MetadataResolutionResult resolveMetadata(RepositorySystem embedder,
MetadataResolutionRequest req) throws MavenEclipseApiException {
MetadataResolutionResult res = new MetadataResolutionResult();
MetadataTreeNode tree = resolveMetadataTree(embedder, req.getQuery(),
null, req.getLocalRepository(), req.getRemoteRepositories());
res.setTree(tree);
return res;
}
private static MetadataTreeNode resolveMetadataTree(RepositorySystem embedder,
ArtifactMetadata query, MetadataTreeNode parent,
ArtifactRepository localRepository, List remoteRepositories)
throws MavenEclipseApiException {
try {
Artifact pomArtifact = embedder
.createArtifact(query.getGroupId(), query.getArtifactId(),
query.getVersion(), query.getScope(),
query.getType() != null ? query.getType() : "jar");
//Artifact art = MavenApiHelper.getMavenEmbedder().resolve(groupId, artifactId, version, type, classifier, remoteRepositories, monitor);
ArtifactResolutionResult result = resolveArtifact(embedder,
pomArtifact, localRepository, remoteRepositories, false);
if (pomArtifact.isResolved()) {
MetadataTreeNode node = new MetadataTreeNode(query, parent,
true, query.getScopeAsEnum());
Set<Artifact> artifacts = result.getArtifacts();
if (artifacts.size() > 1) {
List<Artifact> dependencies = new ArrayList<Artifact>(
artifacts);
// remove the first one, which is the source artifact itself
dependencies.remove(0);
int nKids = dependencies.size();
node.setNChildren(nKids);
int kidNo = 0;
MetadataTreeNode kidNode;
for (Artifact artifact : dependencies) {
ArtifactMetadata amd = new ArtifactMetadata(
artifact.getGroupId(),
artifact.getArtifactId(),
artifact.getVersion(), artifact.getType(),
ArtifactScopeEnum.valueOf(artifact.getScope()));
// 20100514#emac: no need to resolve dependencies
// recursively
// kidNode = resolveMetadataTree(embedder, amd, node,
// localRepository, remoteRepositories);
kidNode = new MetadataTreeNode(amd, node,
artifact.isResolved(), amd.getScopeAsEnum());
node.addChild(kidNo++, kidNode);
}
}
return node;
}
return new MetadataTreeNode(pomArtifact, parent, false,
query.getArtifactScope());
} catch (Exception anyEx) {
throw new MavenEclipseApiException(anyEx);
}
}
}