public Dependency install(final Project project, final Dependency dependency, final ScopeType type)
{
DependencyFacet deps = project.getFacet(DependencyFacet.class);
// Exists in deps, no version change requested
Dependency existing = deps.getEffectiveDependency(dependency);
Dependency existingManaged = deps.getEffectiveManagedDependency(dependency);
DependencyBuilder unversioned = DependencyBuilder.create(dependency).setVersion(null)
.setScopeType(type == null ? dependency.getScopeType() : type.toString())
.setPackagingType(dependency.getPackagingType());
if (existing != null) // we already have the dep
{
if (!Strings.isNullOrEmpty(existing.getVersion())
&& (existing.getVersion().equals(dependency.getVersion()) // the version is the same as requested
|| Strings.isNullOrEmpty(dependency.getVersion()))) // or no specific version was requested
{
// take no action
return existing;
}
else if (Strings.isNullOrEmpty(existing.getVersion()) // we have no existing version
&& !Strings.isNullOrEmpty(dependency.getVersion())) // but we did request one
{
return update(dependency, deps, unversioned);
}
else // version is different
{
return promptAndUpdate(dependency, deps, 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.getVersion()) // we have a version already
&& (!existingManaged.getVersion().equals(dependency.getVersion()) // the version is the same as
// requested
|| Strings.isNullOrEmpty(dependency.getVersion()))) // or no specific version was requested
{
// don't need to touch dep management because we already have the right version
deps.removeDependency(dependency);
deps.addDirectDependency(unversioned);
return existingManaged;
}
else if (Strings.isNullOrEmpty(existingManaged.getVersion()) // we have no existing version
&& !Strings.isNullOrEmpty(dependency.getVersion())) // but we did request one
{
return update(dependency, deps, unversioned);
}
else // version is different or unspecified, and we had no existing version.