public class DependencyInstallerImpl implements DependencyInstaller
{
@Override
public Dependency install(final Project project, final Dependency dependency)
{
DependencyFacet deps = project.getFacet(DependencyFacet.class);
// Exists in deps, no version change requested
Dependency unversioned = getUnversioned(dependency);
Dependency existing = deps.getEffectiveDependency(unversioned);
Dependency existingManaged = deps.getEffectiveManagedDependency(unversioned);
if (existing != null) // we already have the dep
{
if (!Strings.isNullOrEmpty(existing.getCoordinate().getVersion())
&& (existing.getCoordinate().getVersion().equals(dependency.getCoordinate().getVersion())
|| Strings.isNullOrEmpty(dependency.getCoordinate().getVersion())))
{
/*
* The version is the same as requested, or no specific version was requested. No action required.
*/
return existing;
}
else
{
/*
* Version is different. Update it.
*/
return updateAll(deps, dependency, unversioned);
}
}
else if (existingManaged != null)
{
/*
* we don't have a dependency, or the existing dependency did not have a version, but we do have a managed
* dependency
*/
if (!Strings.isNullOrEmpty(existingManaged.getCoordinate().getVersion())
&& (existingManaged.getCoordinate().getVersion().equals(dependency.getCoordinate().getVersion())
|| Strings.isNullOrEmpty(dependency.getCoordinate().getVersion())))
{
/*
* We have a version already, or the version is the same as requested, or no specific version was requested.
* No need to touch dep management because we already have the right version.
*/
deps.removeDependency(dependency);
updateDependency(deps, unversioned);
return existingManaged;
}
else
{
/*
* Version is different or unspecified, and we had no existing version.
*/
return updateAll(deps, dependency, unversioned);
}
}
else
{
Dependency toInstall = dependency;
if (Strings.isNullOrEmpty(dependency.getCoordinate().getVersion()))
{
List<Coordinate> versions = deps.resolveAvailableVersions(DependencyQueryBuilder.create(
dependency.getCoordinate()).setFilter(new NonSnapshotDependencyFilter()));
if (versions.isEmpty())
versions = deps.resolveAvailableVersions(DependencyQueryBuilder.create(
dependency.getCoordinate()));
if (!versions.isEmpty())
toInstall = DependencyBuilder.create(dependency).setVersion(
versions.get(versions.size() - 1).getVersion());