Skip to content

Commit

Permalink
FORGE-2711: Introduce Driver: Add Dependency command
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi committed Dec 30, 2016
1 parent edec722 commit 6248027
Show file tree
Hide file tree
Showing 3 changed files with 206 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.addon.database.tools.ui;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

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.javaee.jpa.DatabaseType;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.ProjectFactory;
import org.jboss.forge.addon.projects.facets.DependencyFacet;
import org.jboss.forge.addon.projects.ui.AbstractProjectCommand;
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.InputComponent;
import org.jboss.forge.addon.ui.input.InputComponentFactory;
import org.jboss.forge.addon.ui.input.UICompleter;
import org.jboss.forge.addon.ui.input.UIInput;
import org.jboss.forge.addon.ui.input.UISelectOne;
import org.jboss.forge.addon.ui.result.Result;
import org.jboss.forge.addon.ui.result.Results;
import org.jboss.forge.addon.ui.util.Categories;
import org.jboss.forge.addon.ui.util.Completers;
import org.jboss.forge.addon.ui.util.Metadata;
import org.jboss.forge.furnace.container.simple.lifecycle.SimpleContainer;

/**
* Adds a dependency in the current project to the specified driver
*
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
*/
public class AddDriverDependencyCommand extends AbstractProjectCommand
{
private UISelectOne<DatabaseType> dbType;
private UIInput<String> version;
private UISelectOne<String> scope;

private DependencyResolver dependencyResolver;

@Override
public Metadata getMetadata(UIContext context)
{
return Metadata.forCommand(getClass()).name("Driver: Add Dependency")
.description("Adds a dependency in the current project to the specified driver")
.category(Categories.create("Database", "Drivers"));
}

@Override
public void initializeUI(UIBuilder builder) throws Exception
{
dependencyResolver = SimpleContainer.getServices(getClass().getClassLoader(), DependencyResolver.class).get();
InputComponentFactory factory = builder.getInputComponentFactory();

dbType = factory.createSelectOne("dbType", DatabaseType.class).setLabel("Database Type")
.setDescription("The database driver to be added to this project").setRequired(true)
.setNote(() -> {
return (dbType.hasValue()) ? dbType.getValue().getDriverCoordinate().toString() : null;
})
.setValueChoices(DatabaseType.getTypesWithDriverSet());

version = factory.createInput("version", String.class).setLabel("Driver Version")
.setDescription("The JDBC driver version to be used")
.setCompleter(new UICompleter<String>()
{
@Override
public Iterable<String> getCompletionProposals(UIContext context, InputComponent<?, String> input,
String value)
{
return Completers.fromValues(getVersionsFor(dbType.getValue())).getCompletionProposals(context,
input, value);
}
});

scope = factory.createSelectOne("scope", String.class).setLabel("Dependency Scope")
.setDescription("The scope this database driver dependency should use when added to this project")
.setRequired(true)
.setDefaultValue("runtime")
.setValueChoices(Arrays.asList("compile", "provided", "runtime", "test"));

builder.add(dbType).add(version).add(scope);
}

private List<String> getVersionsFor(DatabaseType type)
{
if (type == null)
{
return Collections.emptyList();
}
else
{
return dependencyResolver
.resolveVersions(DependencyQueryBuilder.create(type.getDriverCoordinate()))
.stream().map(Coordinate::getVersion).collect(Collectors.toList());
}
}

@Override
public Result execute(UIExecutionContext context) throws Exception
{
DatabaseType chosenDbType = dbType.getValue();
String chosenScope = scope.getValue();
String chosenVersion = version.getValue();
if (chosenVersion == null)
{
List<String> versions = getVersionsFor(chosenDbType);
if (!versions.isEmpty())
{
chosenVersion = versions.get(versions.size() - 1);
}
}
if (chosenVersion == null)
{
return Results.fail("No version specified or found for " + chosenDbType.getDriverCoordinate());
}
Project project = getSelectedProject(context);

DependencyBuilder dependency = DependencyBuilder.create()
.setCoordinate(chosenDbType.getDriverCoordinate())
.setVersion(chosenVersion)
.setScopeType(chosenScope);

DependencyFacet dependencyFacet = project.getFacet(DependencyFacet.class);
dependencyFacet.addDirectDependency(dependency);

return Results.success("JDBC Driver Dependency " + dependency + " installed");
}

@Override
protected boolean isProjectRequired()
{
return true;
}

@Override
protected ProjectFactory getProjectFactory()
{
return SimpleContainer.getServices(getClass().getClassLoader(), ProjectFactory.class).get();
}

}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
org.jboss.forge.addon.database.tools.ui.AddDriverDependencyCommand
org.jboss.forge.addon.database.tools.connections.ConnectionProfileManagerImpl
org.jboss.forge.addon.database.tools.connections.ui.CreateConnectionProfileCommandImpl
org.jboss.forge.addon.database.tools.connections.ui.RemoveConnectionProfileCommandImpl
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@
*/
package org.jboss.forge.addon.javaee.jpa;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import org.jboss.forge.addon.dependencies.Coordinate;
import org.jboss.forge.addon.dependencies.builder.CoordinateBuilder;

/**
* Relational database instance types.
*
Expand All @@ -14,35 +21,67 @@
*/
public enum DatabaseType
{
MYSQL,
// @formatter:off
MYSQL("mysql","mysql-connector-java"),
ORACLE,
DERBY,
DERBY("org.apache.derby","derby"),
DB2,
POSTGRES,
POSTGRES("postgresql","postgresql"),
DEFAULT,
DB2_AS400,
DB2_OS390,
MYSQL5_INNODB,
MYSQL_INNODB,
MYSQL5_ISAM,
MYSQL_ISAM,
MYSQL5_INNODB("mysql","mysql-connector-java"),
MYSQL_INNODB("mysql","mysql-connector-java"),
MYSQL5_ISAM("mysql","mysql-connector-java"),
MYSQL_ISAM("mysql","mysql-connector-java"),
ORACLE_9I,
ORACLE_10G,
SYBASE,
SYBASE_ANYWHERE,
SQL_SERVER,
SAP_DB,
INFORMIX,
HSQLDB,
H2,
HSQLDB("org.hsqldb","hsqldb"),
H2("com.h2database","h2"),
INGRES,
PROGRESS,
MCKOI,
MCKOI("com.mckoi","mckoisqldb"),
INTERBASE,
POINTBASE,
FRONTBASE,
FIREBIRD,
HSQLDB_IN_MEMORY,
ORACLE_11G,
ACCESS
FIREBIRD("org.firebirdsql.jdbc","jaybird-jdk18"),
HSQLDB_IN_MEMORY,
ORACLE_11G,
ACCESS;
// @formatter:on

private final Coordinate driverCoordinate;

private DatabaseType()
{
this.driverCoordinate = null;
}

private DatabaseType(String groupId, String artifactId)
{
this.driverCoordinate = CoordinateBuilder.create().setGroupId(groupId).setArtifactId(artifactId);
}

public Coordinate getDriverCoordinate()
{
return driverCoordinate;
}

public boolean isDriverCoordinateSet()
{
return this.driverCoordinate != null;
}

public static List<DatabaseType> getTypesWithDriverSet()
{
return Arrays.asList(DatabaseType.values())
.stream()
.filter(DatabaseType::isDriverCoordinateSet)
.collect(Collectors.toList());
}
}

0 comments on commit 6248027

Please sign in to comment.