Skip to content

Commit

Permalink
Simplify addon-install command to accept coordinates in standard form…
Browse files Browse the repository at this point in the history
…at (not split)
  • Loading branch information
lincolnthree committed Sep 5, 2014
1 parent 56ae6ae commit 9a66e6d
Showing 1 changed file with 101 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import javax.inject.Inject;

import org.jboss.forge.addon.dependencies.Coordinate;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.ProjectFactory;
import org.jboss.forge.addon.projects.Projects;
Expand All @@ -13,6 +14,7 @@
import org.jboss.forge.addon.ui.context.UIBuilder;
import org.jboss.forge.addon.ui.context.UIContext;
import org.jboss.forge.addon.ui.context.UIExecutionContext;
import org.jboss.forge.addon.ui.context.UIValidationContext;
import org.jboss.forge.addon.ui.input.InputComponent;
import org.jboss.forge.addon.ui.input.UICompleter;
import org.jboss.forge.addon.ui.input.UIInput;
Expand All @@ -21,29 +23,34 @@
import org.jboss.forge.addon.ui.result.Results;
import org.jboss.forge.addon.ui.util.Categories;
import org.jboss.forge.addon.ui.util.Metadata;
import org.jboss.forge.addon.ui.validate.UIValidator;
import org.jboss.forge.furnace.Furnace;
import org.jboss.forge.furnace.addons.AddonId;
import org.jboss.forge.furnace.manager.AddonManager;
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;

public class AddonInstallCommand extends AbstractUICommand implements AddonCommandConstants
{
private static final String FORGE_ADDON_GROUP_ID = "org.jboss.forge.addon:";

@Inject
private AddonManager addonManager;

@Inject
@WithAttributes(label = "Group ID", description = "The value of <groupId> from the addon's pom.xml", required = true)
private UIInput<String> groupId;
private AddonDependencyResolver resolver;

@Inject
@WithAttributes(label = "Name", description = "The value of <artifactId> from the addon's pom.xml", required = true)
private UIInput<String> name;
@WithAttributes(label = "Coordinate", description = "The addon's \"groupId:artifactId,version\" coordinate", required = true)
private UIInput<String> coordinate;

@Inject
@WithAttributes(label = "Version", description = "The value of <version> from the addon's pom.xml", required = true)
private UIInput<String> version;
private ProjectFactory projectFactory;

@Inject
private ProjectFactory projectFactory;
private Furnace furnace;

@Override
public Metadata getMetadata(UIContext context)
Expand All @@ -59,51 +66,118 @@ public Metadata getMetadata(UIContext context)
public void initializeUI(UIBuilder builder) throws Exception
{
Project project = Projects.getSelectedProject(projectFactory, builder.getUIContext());
final String topLevelPackage;
if (project != null)
{
MetadataFacet facet = project.getFacet(MetadataFacet.class);
topLevelPackage = facet.getProjectGroupName();
groupId.setDefaultValue(topLevelPackage);
name.setDefaultValue(facet.getProjectName());
version.setDefaultValue(facet.getProjectVersion());
}
else
{
topLevelPackage = null;
Coordinate c = facet.getOutputDependency().getCoordinate();
coordinate.setDefaultValue(AddonId.from(c.getArtifactId() + ":" + c.getGroupId(), c.getVersion())
.toCoordinates());
}
groupId.setCompleter(new UICompleter<String>()

coordinate.setCompleter(new UICompleter<String>()
{
@Override
public Iterable<String> getCompletionProposals(UIContext context, InputComponent<?, String> input, String value)
{
Set<String> items = new TreeSet<String>();
if (topLevelPackage != null)
items.add(topLevelPackage);
items.add("org.jboss.forge.addon");
items.add("org.jboss.forge.addon:");
return items;
}
});
builder.add(groupId).add(name).add(version);

coordinate.addValidator(new UIValidator()
{
@Override
public void validate(UIValidationContext context)
{
String coordinate = (String) context.getCurrentInputComponent().getValue();
try
{
resolveCoordinate(coordinate);
}
catch (IllegalArgumentException e)
{
context.addValidationError(context.getCurrentInputComponent(), "\"" + coordinate
+ "\" is not a valid Addon coordinate");
}
}
});

builder.add(coordinate);
}

@Override
public Result execute(UIExecutionContext context)
{
String coordinates = getCoordinates();
AddonId addonId = resolveCoordinate(coordinate.getValue());
try
{
addonManager.install(AddonId.fromCoordinates(coordinates)).perform();
return Results.success("Addon " + coordinates + " was installed successfully.");
addonManager.install(addonId).perform();
return Results.success("Addon " + addonId.toCoordinates() + " was installed successfully.");
}
catch (Throwable t)
{
return Results.fail("Addon " + coordinates + " could not be installed.", t);
return Results.fail("Addon " + addonId.toCoordinates() + " could not be installed.", t);
}
}

protected String getCoordinates()
// TODO this method needs to be abstracted into a utility
private AddonId resolveCoordinate(String addonCoordinates) throws IllegalArgumentException
{
return groupId.getValue() + ':' + name.getValue() + ',' + version.getValue();
Version runtimeAPIVersion = furnace.getVersion();
AddonId addon;
// This allows forge --install maven
if (addonCoordinates.contains(","))
{
if (addonCoordinates.contains(":"))
{
addon = AddonId.fromCoordinates(addonCoordinates);
}
else
{
addon = AddonId.fromCoordinates(FORGE_ADDON_GROUP_ID + addonCoordinates);
}
}
else
{
AddonId[] versions;
String coordinate;
if (addonCoordinates.contains(":"))
{
coordinate = addonCoordinates;
versions = resolver.resolveVersions(addonCoordinates).get();
}
else
{
coordinate = FORGE_ADDON_GROUP_ID + addonCoordinates;
versions = resolver.resolveVersions(coordinate).get();
}

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);
}

addon = selected;
}
}
return addon;
}
}

0 comments on commit 9a66e6d

Please sign in to comment.