KNOX-2132 - JDBCKnoxShellTableBuilder should have optional username and password fields
diff --git a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/JDBCKnoxShellTableBuilder.java b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/JDBCKnoxShellTableBuilder.java
index 63be4a1..a2e5d7f 100644
--- a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/JDBCKnoxShellTableBuilder.java
+++ b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/JDBCKnoxShellTableBuilder.java
@@ -32,6 +32,26 @@
private String driver;
private Connection conn;
private boolean tableManagedConnection = true;
+ private String username;
+ private String pass;
+
+ public JDBCKnoxShellTableBuilder username(String username) {
+ this.username = username;
+ return this;
+ }
+
+ public String username() {
+ return username;
+ }
+
+ public JDBCKnoxShellTableBuilder pwd(String pass) {
+ this.pass = pass;
+ return this;
+ }
+
+ public String password() {
+ return pass;
+ }
JDBCKnoxShellTableBuilder(KnoxShellTable table) {
super(table);
@@ -76,7 +96,7 @@
}
public KnoxShellTable sql(String sql) throws IOException, SQLException {
- conn = conn == null ? DriverManager.getConnection(connectionUrl) : conn;
+ conn = conn == null ? createConnection() : conn;
try (Statement statement = conn.createStatement(); ResultSet resultSet = statement.executeQuery(sql);) {
processResultSet(resultSet);
} finally {
@@ -87,19 +107,40 @@
return this.table;
}
+ public Connection createConnection() throws SQLException {
+ Connection con = null;
+ if (username != null && pass != null) {
+ con = DriverManager.getConnection(connectionUrl, username, pass);
+ }
+ else {
+ con = DriverManager.getConnection(connectionUrl);
+ }
+ return con;
+ }
+
// added this as a private method so that KnoxShellTableHistoryAspect will not
// intercept this call
private void processResultSet(ResultSet resultSet) throws SQLException {
final ResultSetMetaData metadata = resultSet.getMetaData();
final int colCount = metadata.getColumnCount();
- this.table.title(metadata.getTableName(1));
+ try {
+ table.title(metadata.getTableName(1));
+ }
+ catch (SQLException e) {
+ // nop. Apache HiveDriver doesn't support this.
+ }
for (int i = 1; i < colCount + 1; i++) {
this.table.header(metadata.getColumnName(i));
}
while (resultSet.next()) {
- this.table.row();
+ table.row();
for (int i = 1; i < colCount + 1; i++) {
- this.table.value(resultSet.getObject(metadata.getColumnName(i), Comparable.class));
+ try {
+ table.value(resultSet.getObject(metadata.getColumnName(i), Comparable.class));
+ }
+ catch (SQLException e) {
+ table.value(resultSet.getString(metadata.getColumnName(i)));
+ }
}
}
}
diff --git a/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java b/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
index 2e2cd2d..84d1723 100644
--- a/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
+++ b/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
@@ -384,6 +384,23 @@
}
@Test
+ public void testJDBCBuilderUsernamePassword() throws Exception {
+ // Since testing statics isn't really doable with EasyMock we
+ // are limited to what we can test here. We will just ensure that
+ // the expected username/password are set when needed in the sql call.
+ KnoxShellTable table = new KnoxShellTable();
+ JDBCKnoxShellTableBuilder builder = new JDBCKnoxShellTableBuilder(table) {
+ @Override
+ public KnoxShellTable sql(String sql) {
+ assertNotNull(username());
+ assertNotNull(password());
+ return table;
+ }
+ };
+ builder.username("joe").pwd("pass").sql("select * from book");
+ }
+
+ @Test
public void testJDBCBuilderUsingConnectionString() throws Exception {
System.setProperty(SYSTEM_PROPERTY_DERBY_STREAM_ERROR_FILE, "/dev/null");
final Path derbyDatabaseFolder = Paths.get(testFolder.newFolder().toPath().toString(), SAMPLE_DERBY_DATABASE_NAME);