// get hold of the ivy settings xml file
URL ivySettingsFile = this.getIvySettingsFile(pkgMgrContext, pkgCtx);
if (ivySettingsFile == null)
{
throw new DependencyResoultionException("Ivy settings file not found for package manager " + pkgMgrContext);
}
logger.info("Ivy settings file " + ivySettingsFile + " being used for dependency resolution of " + pkgCtx);
// create an ivy instance
Ivy ivy = Ivy.newInstance(ivySettings);
try
{
// configure Ivy (repos, etc...) through the settings file
ivy.configure(ivySettingsFile);
// file containing the list of dependencies (ex: ivy.xml)
File dependencyFile = new File(pkgCtx.getPackageRoot(), deps.getFile());
// resolve the dependencies
ResolveReport resolveReport = ivy.resolve(dependencyFile);
// check for errors (if any) during resolve
if (resolveReport.hasError())
{
List<String> problems = resolveReport.getAllProblemMessages();
if (problems != null && !problems.isEmpty())
{
StringBuffer errorMsgs = new StringBuffer();
for (String problem : problems)
{
errorMsgs.append(problem);
errorMsgs.append("\n");
}
logger.error("Errors encountered during dependency resolution for package " + pkgCtx + " :");
logger.error(errorMsgs);
throw new DependencyResoultionException("Dependencies could not be resolved for package " + pkgCtx);
}
}
// Now that the dependencies have been resolved, let now retrieve them
ModuleDescriptor md = resolveReport.getModuleDescriptor();
// the dependency packages will be retrieved to a sub folder under the package manager's
// tmp folder
File pkgTmpDir = new File(pkgMgrContext.getPackageManagerEnvironment().getPackageManagerTmpDir(), pkgCtx.getPackageName());
pkgTmpDir.mkdir();
ModuleRevisionId mRID = md.getModuleRevisionId();
RetrieveOptions retrieveOptions = new RetrieveOptions();
String pattern = pkgTmpDir.getAbsolutePath() + "/[organization]/[module]/[type]/[artifact]-[revision](-[classifier]).[ext]";
retrieveOptions.setDestIvyPattern(pattern);
// We only retrieve "jar" type artifacts (i.e. we are *not* interested in "source"
// or "javadoc" or any other artifact types
//Filter jarArtifactFilter = FilterHelper.getArtifactTypeFilter(new String[]{"jar", "package"});
//retrieveOptions.setArtifactFilter(jarArtifactFilter);
// default logging option
retrieveOptions.setLog(LogOptions.LOG_DEFAULT);
// retrieve them!
int packagesRetrieved = ivy.retrieve(mRID, pattern, retrieveOptions);
logger.info("Retrieved " + packagesRetrieved + " dependencies for package " + pkgCtx);
Set<PackageContext> depPkgCtxs = new HashSet<PackageContext>();
// for each of the retrieved packages, create a package context
for (File depPkg : getJarFilesRecursively(pkgTmpDir))
{
PackageContext depPkgCtx;
try
{
depPkgCtx = new DefaultPackageContext(pkgMgrContext, depPkg.toURI().toURL());
depPkgCtxs.add(depPkgCtx);
}
catch (InvalidPackageException e)
{
// this is not a package file so skip it and log a WARN message
logger.warn("Skipping dependency file " + depPkg
+ " since it's not a package. Was listed as a dependency of " + pkgCtx);
continue;
}
}
return depPkgCtxs;
}
catch (IOException ioe)
{
throw new DependencyResoultionException(ioe);
}
catch (ParseException pe)
{
throw new DependencyResoultionException(pe);
}
}