package org.jboss.windup.bootstrap.commands.addons;
import java.util.concurrent.atomic.AtomicBoolean;
import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.addons.AddonId;
import org.jboss.forge.furnace.impl.addons.AddonRepositoryImpl;
import org.jboss.forge.furnace.manager.impl.AddonManagerImpl;
import org.jboss.forge.furnace.manager.maven.addon.MavenAddonDependencyResolver;
import org.jboss.forge.furnace.manager.request.AddonActionRequest;
import org.jboss.forge.furnace.manager.spi.AddonDependencyResolver;
import org.jboss.forge.furnace.versions.SingleVersion;
import org.jboss.forge.furnace.versions.Version;
import org.jboss.forge.furnace.versions.Versions;
import org.jboss.windup.bootstrap.commands.Command;
import org.jboss.windup.bootstrap.commands.CommandPhase;
import org.jboss.windup.bootstrap.commands.CommandResult;
import org.jboss.windup.bootstrap.commands.FurnaceDependent;
/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public class InstallAddonCommand extends AbstractAddonCommand implements Command, FurnaceDependent
{
private Furnace furnace;
private String addonId;
private AtomicBoolean batchMode;
public InstallAddonCommand(String addonId, AtomicBoolean batchMode)
{
this.addonId = addonId;
this.batchMode = batchMode;
}
@Override
public void setFurnace(Furnace furnace)
{
this.furnace = furnace;
}
@Override
public CommandResult execute()
{
install(addonId, batchMode.get());
return CommandResult.CONTINUE;
}
void install(String coordinates, boolean batchMode)
{
Version runtimeAPIVersion = AddonRepositoryImpl.getRuntimeAPIVersion();
try
{
AddonDependencyResolver resolver = new MavenAddonDependencyResolver();
AddonManagerImpl addonManager = new AddonManagerImpl(furnace, resolver);
AddonId addonId;
coordinates = convertColonVersionToComma(coordinates);
// This allows windup --install maven
if (coordinates.matches(artifactWithCommaVersionPattern))
{
addonId = AddonId.fromCoordinates(coordinates);
}
else if (coordinates.matches(artifactPattern))
{
AddonId[] versions = resolver.resolveVersions(coordinates).get();
String coordinate = coordinates;
if (versions.length == 0)
{
throw new IllegalArgumentException("No Artifact version found for " + coordinate);
}
else
{
AddonId selected = null;
for (int i = versions.length - 1; selected == null && i >= 0; i--)
{
String apiVersion = resolver.resolveAPIVersion(versions[i]).get();
if (apiVersion != null
&& Versions.isApiCompatible(runtimeAPIVersion, new SingleVersion(apiVersion)))
{
selected = versions[i];
}
}
if (selected == null)
{
throw new IllegalArgumentException("No compatible addon API version found for " + coordinate
+ " for API " + runtimeAPIVersion);
}
addonId = selected;
}
}
else
{
throw new IllegalArgumentException("Unrecognized format: " + coordinates + ", format must match: GROUP_ID:ARTIFACT_ID:VERSION");
}
AddonActionRequest request = addonManager.install(addonId);
System.out.println(request);
if (!batchMode)
{
String result = System.console().readLine("Confirm installation [Y/n]? ");
if ("n".equalsIgnoreCase(result.trim()))
{
System.out.println("Installation aborted.");
return;
}
}
request.perform();
System.out.println("Installation completed successfully.");
System.out.println();
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("> Forge version [" + runtimeAPIVersion + "]");
}
}
@Override
public CommandPhase getPhase()
{
return CommandPhase.POST_CONFIGURATION;
}
}