package org.picketlink.forge.ui;
import java.util.List;
import java.util.concurrent.Callable;
import javax.inject.Inject;
import org.jboss.forge.addon.configuration.Configuration;
import org.jboss.forge.addon.configuration.facets.ConfigurationFacet;
import org.jboss.forge.addon.convert.Converter;
import org.jboss.forge.addon.dependencies.Coordinate;
import org.jboss.forge.addon.dependencies.DependencyResolver;
import org.jboss.forge.addon.dependencies.builder.DependencyBuilder;
import org.jboss.forge.addon.dependencies.builder.DependencyQueryBuilder;
import org.jboss.forge.addon.dependencies.util.NonSnapshotDependencyFilter;
import org.jboss.forge.addon.javaee.cdi.CDIFacet;
import org.jboss.forge.addon.javaee.cdi.ui.CDISetupCommand;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.ProjectFactory;
import org.jboss.forge.addon.projects.dependencies.DependencyInstaller;
import org.jboss.forge.addon.projects.facets.MetadataFacet;
import org.jboss.forge.addon.projects.ui.AbstractProjectCommand;
import org.jboss.forge.addon.ui.command.PrerequisiteCommandsProvider;
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.input.UIInput;
import org.jboss.forge.addon.ui.input.UISelectOne;
import org.jboss.forge.addon.ui.metadata.UICommandMetadata;
import org.jboss.forge.addon.ui.metadata.WithAttributes;
import org.jboss.forge.addon.ui.result.NavigationResult;
import org.jboss.forge.addon.ui.result.Result;
import org.jboss.forge.addon.ui.result.Results;
import org.jboss.forge.addon.ui.result.navigation.NavigationResultBuilder;
import org.jboss.forge.addon.ui.util.Categories;
import org.jboss.forge.addon.ui.util.Metadata;
import org.picketlink.forge.ConfigurationOperations;
/**
* Adds PicketLink dependencies to a project and creates a default configuration.
*
* @author Shane Bryzak
*/
public class PicketLinkSetupCommand extends AbstractProjectCommand implements PrerequisiteCommandsProvider {
public static final String PICKETLINK_CONFIGURATION_PACKAGE = "picketlinkConfigurationPackage";
public static final String DEFAULT_CONFIG_PACKAGE = "picketlink.config";
@Inject ProjectFactory projectFactory;
@Inject DependencyInstaller dependencyInstaller;
@Inject DependencyResolver dependencyResolver;
@Inject @WithAttributes(label = "Version", required = true,
description = "Select the version of PicketLink", shortName = 'v')
private UISelectOne<Coordinate> version;
@Inject @WithAttributes(label = "Show snapshot versions",
description = "Show snapshot versions in the list")
private UIInput<Boolean> showSnapshots;
@Inject @WithAttributes(label = "Configuration package", required = true,
description = "The PicketLink configuration will be created in this package",
shortName = 'p')
private UIInput<String> configurationPackage;
@Inject ConfigurationOperations configurationOps;
@Override
public void initializeUI(UIBuilder builder) throws Exception {
DependencyQueryBuilder query = DependencyQueryBuilder
.create("org.picketlink:picketlink-api");
if (!showSnapshots.getValue()) {
query.setFilter(new NonSnapshotDependencyFilter());
}
final List<Coordinate> coordinates = dependencyResolver.resolveVersions(query);
Callable<Iterable<Coordinate>> coordinatesBuilder = new Callable<Iterable<Coordinate>>() {
@Override
public Iterable<Coordinate> call() throws Exception {
return coordinates;
}
};
version.setValueChoices(coordinatesBuilder);
version.setItemLabelConverter(new Converter<Coordinate,String>() {
@Override
public String convert(Coordinate source) {
return source != null ? String.format("PicketLink %s", source.getVersion()) : null;
}
});
if (!coordinates.isEmpty()) {
Coordinate defaultCoord = coordinates.get(coordinates.size() - 1);
for (int i = coordinates.size() - 1; i >= 0; i--) {
String version = coordinates.get(i).getVersion();
if (version != null && version.toLowerCase().contains("final")) {
defaultCoord = coordinates.get(i);
break;
}
}
version.setDefaultValue(defaultCoord);
}
builder.add(version);
builder.add(showSnapshots);
Project project = getSelectedProject(builder.getUIContext());
ConfigurationFacet facet = project.getFacet(ConfigurationFacet.class);
Configuration config = facet.getConfiguration();
if (config.containsKey(PICKETLINK_CONFIGURATION_PACKAGE)) {
configurationPackage.setValue(config.getString(PICKETLINK_CONFIGURATION_PACKAGE));
} else {
MetadataFacet metadataFacet = project.getFacet(MetadataFacet.class);
configurationPackage.setValue(metadataFacet.getTopLevelPackage() + "." + DEFAULT_CONFIG_PACKAGE);
}
builder.add(configurationPackage);
}
@Override
public Result execute(UIExecutionContext context) throws Exception {
Project project = getSelectedProject(context);
DependencyBuilder builder = DependencyBuilder.create();
builder.setCoordinate(version.getValue());
dependencyInstaller.install(project, builder);
builder.getCoordinate().setArtifactId("picketlink-impl");
dependencyInstaller.install(project, builder);
configurationOps.newDefaultConfiguration(project, configurationPackage.getValue());
ConfigurationFacet facet = project.getFacet(ConfigurationFacet.class);
Configuration config = facet.getConfiguration();
config.setProperty(PICKETLINK_CONFIGURATION_PACKAGE, configurationPackage.getValue());
return Results.success("Successful");
}
@Override
public UICommandMetadata getMetadata(UIContext context)
{
return Metadata.forCommand(getClass())
.name("PicketLink: Setup")
.description("Installs the PicketLink dependencies into your project's pom.xml and creates a default configuration.")
.category(Categories.create("PicketLink"));
}
@Override
protected boolean isProjectRequired() {
return true;
}
@Override
protected ProjectFactory getProjectFactory() {
return projectFactory;
}
@Override
public NavigationResult getPrerequisiteCommands(UIContext context) {
NavigationResultBuilder builder = NavigationResultBuilder.create();
Project project = getSelectedProject(context);
if (project != null)
{
if (!project.hasFacet(CDIFacet.class))
{
builder.add(CDISetupCommand.class);
}
}
return builder.build();
}
}