HBase improvements - Refactoring (mostly small improvements, the getHBaseClient 
method has been moved to HBaseDataContent)


Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/4a928d17
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/4a928d17
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/4a928d17

Branch: refs/heads/master
Commit: 4a928d175897f6d71738a7113663723d160ffa0b
Parents: f48e9c8
Author: Gerard Dellemann <[email protected]>
Authored: Mon Jun 4 01:20:09 2018 +0200
Committer: Gerard Dellemann <[email protected]>
Committed: Mon Jun 4 01:20:09 2018 +0200

----------------------------------------------------------------------
 .../org/apache/metamodel/hbase/HBaseClient.java |  58 ++++++---
 .../org/apache/metamodel/hbase/HBaseColumn.java |   5 +-
 .../hbase/HBaseCreateTableBuilder.java          |   9 +-
 .../metamodel/hbase/HBaseDataContext.java       |  14 +--
 .../hbase/HBaseRowDeletionBuilder.java          |  14 +--
 .../hbase/HBaseRowInsertionBuilder.java         |  29 ++---
 .../org/apache/metamodel/hbase/HBaseTable.java  |   7 +-
 .../metamodel/hbase/HBaseTableDropBuilder.java  |   2 +-
 .../metamodel/hbase/HBaseUpdateCallback.java    |  11 +-
 .../apache/metamodel/hbase/CreateTableTest.java |   8 +-
 .../apache/metamodel/hbase/DeleteRowTest.java   |  16 +--
 .../hbase/HBaseUpdateCallbackTest.java          |  44 +++++--
 .../apache/metamodel/hbase/InsertRowTest.java   | 118 ++++++++++---------
 13 files changed, 193 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/main/java/org/apache/metamodel/hbase/HBaseClient.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseClient.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseClient.java
index 8eda465..a9040fc 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseClient.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseClient.java
@@ -38,13 +38,13 @@ import org.slf4j.LoggerFactory;
 /**
  * This class can perform client-operations on a HBase datastore
  */
-public final class HBaseClient {
+final class HBaseClient {
 
     private static final Logger logger = 
LoggerFactory.getLogger(HBaseClient.class);
 
     private final Connection _connection;
 
-    public HBaseClient(Connection connection) {
+    public HBaseClient(final Connection connection) {
         this._connection = connection;
     }
 
@@ -55,24 +55,37 @@ public final class HBaseClient {
      * @param values
      * @throws IllegalArgumentException when any parameter is null or the 
indexOfIdColumn is impossible
      * @throws MetaModelException when no ID-column is found.
-     * @throws MetaModelException when a {@link IOException} is catched
+     * @throws MetaModelException when a {@link IOException} is caught
      */
-    // TODO: Use the ColumnTypes to determine the inserts. Now the toString() 
method is called on the object.
-    public void insertRow(String tableName, HBaseColumn[] columns, Object[] 
values, int indexOfIdColumn) {
+    public void insertRow(final String tableName, final HBaseColumn[] columns, 
final Object[] values,
+            final int indexOfIdColumn) {
         if (tableName == null || columns == null || values == null || 
indexOfIdColumn >= values.length
                 || values[indexOfIdColumn] == null) {
             throw new IllegalArgumentException(
                     "Can't insert a row without having (correct) tableName, 
columns, values or indexOfIdColumn");
         }
+        if (columns.length != values.length) {
+            throw new IllegalArgumentException("The amount of columns don't 
match the amount of values");
+        }
         try (final Table table = 
_connection.getTable(TableName.valueOf(tableName))) {
             // Create a put with the values of indexOfIdColumn as rowkey
-            final Put put = new 
Put(Bytes.toBytes(values[indexOfIdColumn].toString()));
+            final Put put = new 
Put(getValueAsByteArray(values[indexOfIdColumn]));
 
             // Add the other values to the put
             for (int i = 0; i < columns.length; i++) {
                 if (i != indexOfIdColumn) {
-                    put.addColumn(Bytes.toBytes(columns[i].getColumnFamily()), 
Bytes.toBytes(columns[i].getQualifier()),
-                            Bytes.toBytes(values[i].toString()));
+                    // NullChecker is already forced within the HBaseColumn 
class
+                    final byte[] columnFamily = 
Bytes.toBytes(columns[i].getColumnFamily());
+                    // An HBaseColumn doesn't need a qualifier, this only 
works when the qualifier is empty (not null).
+                    // Otherwise NullPointer exceptions will happen
+                    byte[] qualifier = null;
+                    if (columns[i].getQualifier() != null) {
+                        qualifier = Bytes.toBytes(columns[i].getQualifier());
+                    } else {
+                        qualifier = Bytes.toBytes(new String(""));
+                    }
+                    final byte[] value = getValueAsByteArray(values[i]);
+                    put.addColumn(columnFamily, qualifier, value);
                 }
             }
             // Add the put to the table
@@ -87,13 +100,13 @@ public final class HBaseClient {
      * @param tableName
      * @param rowKey
      * @throws IllegalArgumentException when any parameter is null
-     * @throws MetaModelException when a {@link IOException} is catched
+     * @throws MetaModelException when a {@link IOException} is caught
      */
-    public void deleteRow(String tableName, Object rowKey) {
+    public void deleteRow(final String tableName, final Object rowKey) {
         if (tableName == null || rowKey == null) {
             throw new IllegalArgumentException("Can't delete a row without 
having tableName or rowKey");
         }
-        byte[] rowKeyAsByteArray = Bytes.toBytes(rowKey.toString());
+        byte[] rowKeyAsByteArray = getValueAsByteArray(rowKey);
         if (rowKeyAsByteArray.length > 0) {
             try (final Table table = 
_connection.getTable(TableName.valueOf(tableName));) {
                 if (rowExists(table, rowKeyAsByteArray) == true) {
@@ -116,7 +129,7 @@ public final class HBaseClient {
      * @return boolean
      * @throws IOException
      */
-    private boolean rowExists(Table table, byte[] rowKey) throws IOException {
+    private boolean rowExists(final Table table, final byte[] rowKey) throws 
IOException {
         final Get get = new Get(rowKey);
         return !table.get(get).isEmpty();
     }
@@ -126,7 +139,7 @@ public final class HBaseClient {
      * @param tableName
      * @param columnFamilies
      * @throws IllegalArgumentException when any parameter is null
-     * @throws MetaModelException when a {@link IOException} is catched
+     * @throws MetaModelException when a {@link IOException} is caught
      */
     public void createTable(String tableName, Set<String> columnFamilies) {
         if (tableName == null || columnFamilies == null || 
columnFamilies.isEmpty()) {
@@ -152,9 +165,9 @@ public final class HBaseClient {
      * Disable and drop a table from a HBase datastore
      * @param tableName
      * @throws IllegalArgumentException when tableName is null
-     * @throws MetaModelException when a {@link IOException} is catched
+     * @throws MetaModelException when a {@link IOException} is caught
      */
-    public void dropTable(String tableName) {
+    public void dropTable(final String tableName) {
         if (tableName == null) {
             throw new IllegalArgumentException("Can't drop a table without 
having the tableName");
         }
@@ -166,4 +179,19 @@ public final class HBaseClient {
             throw new MetaModelException(e);
         }
     }
+
+    /**
+     * Converts a Object value into a byte array, if it isn't a byte array 
already
+     * @param value
+     * @return value as a byte array
+     */
+    private byte[] getValueAsByteArray(final Object value) {
+        byte[] valueAsByteArray;
+        if (value instanceof byte[]) {
+            valueAsByteArray = (byte[]) value;
+        } else {
+            valueAsByteArray = Bytes.toBytes(value.toString());
+        }
+        return valueAsByteArray;
+    }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/main/java/org/apache/metamodel/hbase/HBaseColumn.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseColumn.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseColumn.java
index 4470e10..45e7f4f 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseColumn.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseColumn.java
@@ -25,9 +25,9 @@ import org.apache.metamodel.schema.SuperColumnType;
 import org.apache.metamodel.schema.Table;
 
 public final class HBaseColumn extends MutableColumn {
-    public final static ColumnType DEFAULT_COLUMN_TYPE_FOR_ID_COLUMN = new 
ColumnTypeImpl("BYTE[]",
+    public static final ColumnType DEFAULT_COLUMN_TYPE_FOR_ID_COLUMN = new 
ColumnTypeImpl("BYTE[]",
             SuperColumnType.LITERAL_TYPE);
-    public final static ColumnType DEFAULT_COLUMN_TYPE_FOR_COLUMN_FAMILIES = 
ColumnType.LIST;
+    public static final ColumnType DEFAULT_COLUMN_TYPE_FOR_COLUMN_FAMILIES = 
ColumnType.LIST;
 
     private final String columnFamily;
     private final String qualifier;
@@ -59,6 +59,7 @@ public final class HBaseColumn extends MutableColumn {
 
         this.columnFamily = columnFamily;
         this.qualifier = qualifier;
+
         setColumnNumber(columnNumber);
         setPrimaryKey(HBaseDataContext.FIELD_ID.equals(columnFamily));
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/main/java/org/apache/metamodel/hbase/HBaseCreateTableBuilder.java
----------------------------------------------------------------------
diff --git 
a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseCreateTableBuilder.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseCreateTableBuilder.java
index db4463b..a7c760b 100644
--- 
a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseCreateTableBuilder.java
+++ 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseCreateTableBuilder.java
@@ -57,14 +57,15 @@ public class HBaseCreateTableBuilder extends 
AbstractTableCreationBuilder<HBaseU
 
     @Override
     public Table execute() {
-        if (_columnFamilies == null || _columnFamilies.size() == 0) {
+        if (_columnFamilies == null || _columnFamilies.isEmpty()) {
             throw new MetaModelException("Creating a table without 
columnFamilies");
         }
 
         final Table table = getTable();
 
         // Add the table to the datastore
-        getUpdateCallback().getHBaseClient().createTable(table.getName(), 
_columnFamilies);
+        ((HBaseDataContext) 
getUpdateCallback().getDataContext()).getHBaseClient().createTable(table.getName(),
+                _columnFamilies);
 
         // Update the schema
         addNewTableToSchema(table);
@@ -72,7 +73,9 @@ public class HBaseCreateTableBuilder extends 
AbstractTableCreationBuilder<HBaseU
     }
 
     /**
-     * Set the columnFamilies
+     * Set the columnFamilies. This should be used when creating this object 
using the 
+     * {@link 
HBaseCreateTableBuilder#HBaseCreateTableBuilder(HBaseUpdateCallback, Schema, 
String)} 
+     * constructor
      * @param columnFamilies
      */
     public void setColumnFamilies(Set<String> columnFamilies) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
----------------------------------------------------------------------
diff --git 
a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
index b913ca0..0386ec3 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
@@ -50,16 +50,12 @@ import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.util.FileHelper;
 import org.apache.metamodel.util.SimpleTableDef;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * MetaModel adaptor for Apache HBase.
  */
 public class HBaseDataContext extends QueryPostprocessDataContext implements 
UpdateableDataContext {
 
-    private static final Logger logger = 
LoggerFactory.getLogger(HBaseDataContext.class);
-
     public static final String FIELD_ID = "_id";
 
     private final HBaseConfiguration _configuration;
@@ -97,7 +93,7 @@ public class HBaseDataContext extends 
QueryPostprocessDataContext implements Upd
         }
     }
 
-    static protected Configuration createConfig(HBaseConfiguration 
configuration) {
+    protected static Configuration createConfig(HBaseConfiguration 
configuration) {
         Configuration config = 
org.apache.hadoop.hbase.HBaseConfiguration.create();
         config.set("hbase.zookeeper.quorum", 
configuration.getZookeeperHostname());
         config.set("hbase.zookeeper.property.clientPort", 
Integer.toString(configuration.getZookeeperPort()));
@@ -125,7 +121,7 @@ public class HBaseDataContext extends 
QueryPostprocessDataContext implements Upd
     }
 
     @Override
-    public Schema getMainSchema() throws MetaModelException {
+    protected Schema getMainSchema() throws MetaModelException {
         final MutableSchema schema = new 
MutableSchema(_configuration.getSchemaName());
 
         SimpleTableDef[] tableDefinitions = 
_configuration.getTableDefinitions();
@@ -137,7 +133,7 @@ public class HBaseDataContext extends 
QueryPostprocessDataContext implements Upd
                     SimpleTableDef emptyTableDef = new 
SimpleTableDef(tables[i].getNameAsString(), new String[0]);
                     tableDefinitions[i] = emptyTableDef;
                 }
-            } catch (IllegalArgumentException | IOException e) {
+            } catch (IOException e) {
                 throw new MetaModelException(e);
             }
         }
@@ -254,4 +250,8 @@ public class HBaseDataContext extends 
QueryPostprocessDataContext implements Upd
 
         return callback.getUpdateSummary();
     }
+
+    public HBaseClient getHBaseClient() {
+        return new HBaseClient(this.getConnection());
+    }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java
----------------------------------------------------------------------
diff --git 
a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java
index 99d2571..9b7f9ab 100644
--- 
a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java
+++ 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java
@@ -27,7 +27,7 @@ import org.apache.metamodel.schema.Table;
  */
 public class HBaseRowDeletionBuilder extends AbstractRowDeletionBuilder {
 
-    private HBaseClient _hBaseClient;
+    private HBaseDataContext _dataContext;
     private Object _key;
 
     /**
@@ -36,12 +36,12 @@ public class HBaseRowDeletionBuilder extends 
AbstractRowDeletionBuilder {
      * @param table
      * @throws IllegalArgumentException when the hBaseWriter is null
      */
-    public HBaseRowDeletionBuilder(final HBaseClient hBaseWriter, final Table 
table) {
+    public HBaseRowDeletionBuilder(final HBaseDataContext dataContext, final 
Table table) {
         super(table);
-        if (hBaseWriter == null) {
+        if (dataContext == null) {
             throw new IllegalArgumentException("hBaseClient cannot be null");
         }
-        this._hBaseClient = hBaseWriter;
+        this._dataContext = dataContext;
     }
 
     /** 
@@ -52,10 +52,10 @@ public class HBaseRowDeletionBuilder extends 
AbstractRowDeletionBuilder {
         if (_key == null) {
             throw new MetaModelException("Key cannot be null");
         }
-        _hBaseClient.deleteRow(getTable().getName(), _key);
+        _dataContext.getHBaseClient().deleteRow(getTable().getName(), _key);
     }
 
-    public void setKey(Object _key) {
-        this._key = _key;
+    public void setKey(Object key) {
+        this._key = key;
     }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java
----------------------------------------------------------------------
diff --git 
a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java
index 4ae97c1..b6f797a 100644
--- 
a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java
+++ 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java
@@ -35,7 +35,7 @@ import org.apache.metamodel.schema.Column;
 // TODO: Possible future improvement: Make it possible to change the columns 
for each execute.
 // Now each row will get exactly the same columns.
 public class HBaseRowInsertionBuilder extends 
AbstractRowInsertionBuilder<HBaseUpdateCallback> {
-    final int _indexOfIdColumn;
+    private final int _indexOfIdColumn;
 
     /**
      * Creates a {@link HBaseRowInsertionBuilder}. The table and the column's 
columnFamilies are checked to exist in the schema.
@@ -48,10 +48,6 @@ public class HBaseRowInsertionBuilder extends 
AbstractRowInsertionBuilder<HBaseU
     public HBaseRowInsertionBuilder(final HBaseUpdateCallback updateCallback, 
final HBaseTable table,
             final List<HBaseColumn> columns) {
         super(updateCallback, table, columns.stream().map(column -> (Column) 
column).collect(Collectors.toList()));
-        if (columns.isEmpty()) { // TODO: Columns null will already result in 
a NullPointer at the super. Should the
-                                 // super get a extra check?
-            throw new IllegalArgumentException("The hbaseColumns list is null 
or empty");
-        }
 
         this._indexOfIdColumn = getIndexOfIdColumn(columns);
         if (_indexOfIdColumn == -1) {
@@ -59,7 +55,8 @@ public class HBaseRowInsertionBuilder extends 
AbstractRowInsertionBuilder<HBaseU
         }
 
         checkTable(updateCallback, table);
-        checkForNotMatchingColumnFamilies(table, getColumnFamilies(columns));
+        // The columns parameter should match the table's columns, just to be 
sure, this is checked again
+        checkColumnFamilies(table, getColumnFamilies(columns));
     }
 
     /**
@@ -91,23 +88,23 @@ public class HBaseRowInsertionBuilder extends 
AbstractRowInsertionBuilder<HBaseU
             throw new MetaModelException("Trying to insert data into table: " 
+ tableGettingInserts.getName()
                     + ", which doesn't exist yet");
         }
-        checkForNotMatchingColumnFamilies(tableInSchema, 
tableGettingInserts.getColumnFamilies());
+        checkColumnFamilies(tableInSchema, 
tableGettingInserts.getColumnFamilies());
     }
 
     /**
      * Check if a list of columnNames all exist in this table
-     *
-     * @param columnNamesOfCheckedTable
+     * @param table Checked tabled
+     * @param columnFamilyNamesOfCheckedTable
      * @throws MetaModelException If a column doesn't exist
      */
-    public void checkForNotMatchingColumnFamilies(final HBaseTable table, 
final Set<String> columnNamesOfCheckedTable) {
+    public void checkColumnFamilies(final HBaseTable table, final Set<String> 
columnFamilyNamesOfCheckedTable) {
         Set<String> columnFamilyNamesOfExistingTable = 
table.getColumnFamilies();
 
-        for (String columnNameOfCheckedTable : columnNamesOfCheckedTable) {
+        for (String columnNameOfCheckedTable : 
columnFamilyNamesOfCheckedTable) {
             boolean matchingColumnFound = false;
-            Iterator<String> iterator = 
columnFamilyNamesOfExistingTable.iterator();
-            while (!matchingColumnFound && iterator.hasNext()) {
-                if (columnNameOfCheckedTable.equals(iterator.next())) {
+            Iterator<String> columnFamilies = 
columnFamilyNamesOfExistingTable.iterator();
+            while (!matchingColumnFound && columnFamilies.hasNext()) {
+                if (columnNameOfCheckedTable.equals(columnFamilies.next())) {
                     matchingColumnFound = true;
                 }
             }
@@ -130,8 +127,8 @@ public class HBaseRowInsertionBuilder extends 
AbstractRowInsertionBuilder<HBaseU
 
     @Override
     public synchronized void execute() {
-        getUpdateCallback().getHBaseClient().insertRow(getTable().getName(), 
getColumns(), getValues(),
-                _indexOfIdColumn);
+        ((HBaseDataContext) 
getUpdateCallback().getDataContext()).getHBaseClient().insertRow(getTable().getName(),
+                getColumns(), getValues(), _indexOfIdColumn);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTable.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTable.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTable.java
index c080856..dab24b0 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTable.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTable.java
@@ -58,15 +58,14 @@ final class HBaseTable extends MutableTable {
         super(tableDef.getName(), TableType.TABLE, schema);
         _dataContext = dataContext;
         _defaultRowKeyColumnType = defaultRowKeyColumnType;
-        addColumns(tableDef, defaultRowKeyColumnType);
+        addColumns(tableDef);
     }
 
     /**
      * Add multiple columns to this table
      * @param tableDef
-     * @param defaultRowKeyColumnType
      */
-    private void addColumns(final SimpleTableDef tableDef, final ColumnType 
defaultRowKeyColumnType) {
+    private void addColumns(final SimpleTableDef tableDef) {
         // Add the columns
         final String[] columnNames = tableDef.getColumnNames();
         if (columnNames == null || columnNames.length == 0) {
@@ -82,7 +81,7 @@ final class HBaseTable extends MutableTable {
             if (idColumnFound) {
                 addColumn(HBaseDataContext.FIELD_ID, 
columnTypes[indexOfIDColumn], indexOfIDColumn + 1);
             } else {
-                addColumn(HBaseDataContext.FIELD_ID, defaultRowKeyColumnType, 
1);
+                addColumn(HBaseDataContext.FIELD_ID, _defaultRowKeyColumnType, 
1);
             }
 
             // Add the other columns

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTableDropBuilder.java
----------------------------------------------------------------------
diff --git 
a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTableDropBuilder.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTableDropBuilder.java
index a08ab83..0e1d80c 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTableDropBuilder.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTableDropBuilder.java
@@ -41,7 +41,7 @@ public class HBaseTableDropBuilder extends 
AbstractTableDropBuilder {
     public void execute() {
         // Remove from the datastore
         final Table table = getTable();
-        _updateCallback.getHBaseClient().dropTable(table.getName());
+        ((HBaseDataContext) 
_updateCallback.getDataContext()).getHBaseClient().dropTable(table.getName());
 
         // Remove from schema
         ((MutableSchema) table.getSchema()).removeTable(table);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java
----------------------------------------------------------------------
diff --git 
a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java
index 9273b07..9c17ddd 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java
@@ -35,11 +35,8 @@ import org.apache.metamodel.schema.Table;
  */
 public class HBaseUpdateCallback extends AbstractUpdateCallback implements 
UpdateCallback {
 
-    private final HBaseClient _hBaseClient;
-
     public HBaseUpdateCallback(final HBaseDataContext dataContext) {
         super(dataContext);
-        _hBaseClient = new HBaseClient(dataContext.getConnection());
     }
 
     @Override
@@ -70,7 +67,7 @@ public class HBaseUpdateCallback extends 
AbstractUpdateCallback implements Updat
     }
 
     /**
-     * @throws IllegalArgumentException when table isn't a {@link HBaseTable}
+     * @throws UnsupportedOperationException use {@link 
HBaseUpdateCallback#insertInto(String, String)}
      */
     @Override
     public RowInsertionBuilder insertInto(final Table table) {
@@ -107,13 +104,9 @@ public class HBaseUpdateCallback extends 
AbstractUpdateCallback implements Updat
     @Override
     public RowDeletionBuilder deleteFrom(final Table table) {
         if (table instanceof HBaseTable) {
-            return new HBaseRowDeletionBuilder(_hBaseClient, table);
+            return new HBaseRowDeletionBuilder(((HBaseDataContext) 
getDataContext()), table);
         } else {
             throw new IllegalArgumentException("Not an HBase table: " + table);
         }
     }
-
-    public HBaseClient getHBaseClient() {
-        return _hBaseClient;
-    }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/test/java/org/apache/metamodel/hbase/CreateTableTest.java
----------------------------------------------------------------------
diff --git 
a/hbase/src/test/java/org/apache/metamodel/hbase/CreateTableTest.java 
b/hbase/src/test/java/org/apache/metamodel/hbase/CreateTableTest.java
index b619403..289212b 100644
--- a/hbase/src/test/java/org/apache/metamodel/hbase/CreateTableTest.java
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/CreateTableTest.java
@@ -145,7 +145,7 @@ public class CreateTableTest extends 
HBaseUpdateCallbackTest {
     @Test
     public void testCreateTableWithoutIDColumn() throws IOException {
         final HBaseTable table = createHBaseTable(TABLE_NAME, null, CF_FOO, 
CF_BAR, null);
-        final LinkedHashMap<HBaseColumn, Object> row = createRow(table, null, 
CF_FOO, CF_BAR);
+        final LinkedHashMap<HBaseColumn, Object> row = createRow(table, null, 
CF_FOO, CF_BAR, false);
         final Set<String> columnFamilies = 
getColumnFamilies(getHBaseColumnsFromRow(row));
         try {
             final HBaseCreateTableBuilder hBaseCreateTableBuilder = 
(HBaseCreateTableBuilder) getUpdateCallback()
@@ -165,7 +165,8 @@ public class CreateTableTest extends 
HBaseUpdateCallbackTest {
     @Test
     public void testSettingColumnFamiliesAfterConstrutor() {
         final HBaseTable table = createHBaseTable(TABLE_NAME, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR, null);
-        final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR);
+        final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR,
+                false);
         final Set<String> columnFamilies = 
getColumnFamilies(getHBaseColumnsFromRow(row));
         try {
             final HBaseCreateTableBuilder hBaseCreateTableBuilder = 
(HBaseCreateTableBuilder) getUpdateCallback()
@@ -185,7 +186,8 @@ public class CreateTableTest extends 
HBaseUpdateCallbackTest {
     @Test
     public void testCreateTableColumnFamiliesInConstrutor() {
         final HBaseTable table = createHBaseTable(TABLE_NAME, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR, null);
-        final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR);
+        final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR,
+                false);
         final Set<String> columnFamilies = 
getColumnFamilies(getHBaseColumnsFromRow(row));
         try {
             getUpdateCallback().createTable(getSchema(), TABLE_NAME, 
columnFamilies).execute();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/test/java/org/apache/metamodel/hbase/DeleteRowTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/metamodel/hbase/DeleteRowTest.java 
b/hbase/src/test/java/org/apache/metamodel/hbase/DeleteRowTest.java
index 3cf1ee4..7b7eeab 100644
--- a/hbase/src/test/java/org/apache/metamodel/hbase/DeleteRowTest.java
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/DeleteRowTest.java
@@ -121,12 +121,12 @@ public class DeleteRowTest extends 
HBaseUpdateCallbackTest {
             final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                     CF_BAR);
 
-            checkRows(false);
+            checkRows(false, false);
             final HBaseRowDeletionBuilder rowDeletionBuilder = 
(HBaseRowDeletionBuilder) getUpdateCallback().deleteFrom(
                     existingTable);
             rowDeletionBuilder.setKey(RK_1);
             rowDeletionBuilder.execute();
-            checkRows(false);
+            checkRows(false, false);
         } catch (Exception e) {
             fail("Should not get an exception that the row doesn't exist.");
         }
@@ -141,12 +141,12 @@ public class DeleteRowTest extends 
HBaseUpdateCallbackTest {
             final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                     CF_BAR);
 
-            checkRows(false);
+            checkRows(false, false);
             final HBaseRowDeletionBuilder rowDeletionBuilder = 
(HBaseRowDeletionBuilder) getUpdateCallback().deleteFrom(
                     existingTable);
             rowDeletionBuilder.setKey("");
             rowDeletionBuilder.execute();
-            checkRows(false);
+            checkRows(false, false);
         } catch (Exception e) {
             fail("Should not get an exception that the rowkey is empty.");
         }
@@ -161,19 +161,19 @@ public class DeleteRowTest extends 
HBaseUpdateCallbackTest {
             final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                     CF_BAR);
             final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, HBaseDataContext.FIELD_ID, CF_FOO,
-                    CF_BAR);
+                    CF_BAR, false);
             final List<HBaseColumn> columns = getHBaseColumnsFromRow(row);
 
-            checkRows(false);
+            checkRows(false, false);
             final HBaseRowInsertionBuilder rowInsertionBuilder = 
getUpdateCallback().insertInto(existingTable, columns);
             setValuesInInsertionBuilder(row, rowInsertionBuilder);
             rowInsertionBuilder.execute();
-            checkRows(true);
+            checkRows(true, false);
             final HBaseRowDeletionBuilder rowDeletionBuilder = 
(HBaseRowDeletionBuilder) getUpdateCallback().deleteFrom(
                     existingTable);
             rowDeletionBuilder.setKey(RK_1);
             rowDeletionBuilder.execute();
-            checkRows(false);
+            checkRows(false, false);
         } catch (Exception e) {
             fail("Should not get an exception on deleting a row.");
         }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/test/java/org/apache/metamodel/hbase/HBaseUpdateCallbackTest.java
----------------------------------------------------------------------
diff --git 
a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseUpdateCallbackTest.java 
b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseUpdateCallbackTest.java
index b1e503f..425100f 100644
--- 
a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseUpdateCallbackTest.java
+++ 
b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseUpdateCallbackTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.*;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -156,10 +157,11 @@ public abstract class HBaseUpdateCallbackTest extends 
HBaseTestCase {
      * @param idColumn ID-column, can be set to null to create a row without 
this column
      * @param columnFamily1 required columnFamily 1
      * @param columnFamily2 required columnFamily 1
+     * @param qualifiersNull true will create all {@link HBaseColumn}'s with 
qualifier null
      * @return {@link LinkedHashMap}<{@link HBaseColumn}, {@link Object}>
      */
     protected static LinkedHashMap<HBaseColumn, Object> createRow(final 
HBaseTable table, final String idColumn,
-            final String columnFamily1, final String columnFamily2) {
+            final String columnFamily1, final String columnFamily2, final 
boolean qualifiersNull) {
         final LinkedHashMap<HBaseColumn, Object> map = new LinkedHashMap<>();
 
         // Columns
@@ -167,10 +169,17 @@ public abstract class HBaseUpdateCallbackTest extends 
HBaseTestCase {
         if (idColumn != null) {
             columns.add(new HBaseColumn(idColumn, table));
         }
-        columns.add(new HBaseColumn(columnFamily1, Q_HELLO, table));
-        columns.add(new HBaseColumn(columnFamily1, Q_HI, table));
-        columns.add(new HBaseColumn(columnFamily2, Q_HEY, table));
-        columns.add(new HBaseColumn(columnFamily2, Q_BAH, table));
+        if (!qualifiersNull) {
+            columns.add(new HBaseColumn(columnFamily1, Q_HELLO, table));
+            columns.add(new HBaseColumn(columnFamily1, Q_HI, table));
+            columns.add(new HBaseColumn(columnFamily2, Q_HEY, table));
+            columns.add(new HBaseColumn(columnFamily2, Q_BAH, table));
+        } else {
+            columns.add(new HBaseColumn(columnFamily1, null, table));
+            columns.add(new HBaseColumn(columnFamily1, null, table));
+            columns.add(new HBaseColumn(columnFamily2, null, table));
+            columns.add(new HBaseColumn(columnFamily2, null, table));
+        }
 
         // Values
         final ArrayList<Object> values = new ArrayList<>();
@@ -205,6 +214,7 @@ public abstract class HBaseUpdateCallbackTest extends 
HBaseTestCase {
      * Set the values of a {@link HBaseRowInsertionBuilder} from the values in 
the mapped row
      * @param row {@link LinkedHashMap}<{@link HBaseColumn}, {@link Object}> 
containing the values
      * @param rowInsertionBuilder insertionBuilder to be set
+     * @param enoughMatchingValues if true, the amount of columns match the 
amount of values
      */
     protected void setValuesInInsertionBuilder(final 
LinkedHashMap<HBaseColumn, Object> row,
             final HBaseRowInsertionBuilder rowInsertionBuilder) {
@@ -215,23 +225,35 @@ public abstract class HBaseUpdateCallbackTest extends 
HBaseTestCase {
         }
     }
 
+    protected Collection<Object> getToLittleValues(final 
LinkedHashMap<HBaseColumn, Object> row) {
+        Collection<Object> values = row.values();
+        values.remove(V_123_BYTE_ARRAY);
+        return values;
+    }
+
     /**
      * Checks that the table does or doesn't have rows, depending on the 
rowsExists parameter
      * @param rowsExist true, check that the rows exists. false, check that 
the result is empty.
+     * @param qualifierNull true, check the results when the qualifier was set 
to null
      * @throws IOException
      */
-    protected void checkRows(final boolean rowsExist) throws IOException {
+    protected void checkRows(final boolean rowsExist, final boolean 
qualifierNull) throws IOException {
         try (org.apache.hadoop.hbase.client.Table table = 
getDataContext().getConnection().getTable(TableName.valueOf(
                 TABLE_NAME))) {
             final Get get = new Get(Bytes.toBytes(RK_1));
             final Result result = table.get(get);
+
             if (rowsExist) {
                 assertFalse(result.isEmpty());
-                assertEquals(V_WORLD, new 
String(result.getValue(Bytes.toBytes(CF_FOO), Bytes.toBytes(Q_HELLO))));
-                assertEquals(V_THERE, new 
String(result.getValue(Bytes.toBytes(CF_FOO), Bytes.toBytes(Q_HI))));
-                assertEquals(V_YO, new 
String(result.getValue(Bytes.toBytes(CF_BAR), Bytes.toBytes(Q_HEY))));
-                assertEquals(V_123_BYTE_ARRAY.toString(), new 
String(result.getValue(Bytes.toBytes(CF_BAR), Bytes
-                        .toBytes(Q_BAH))));
+                if (!qualifierNull) {
+                    assertEquals(V_WORLD, new 
String(result.getValue(Bytes.toBytes(CF_FOO), Bytes.toBytes(Q_HELLO))));
+                    assertEquals(V_THERE, new 
String(result.getValue(Bytes.toBytes(CF_FOO), Bytes.toBytes(Q_HI))));
+                    assertEquals(V_YO, new 
String(result.getValue(Bytes.toBytes(CF_BAR), Bytes.toBytes(Q_HEY))));
+                    assertArrayEquals(V_123_BYTE_ARRAY, 
result.getValue(Bytes.toBytes(CF_BAR), Bytes.toBytes(Q_BAH)));
+                } else {
+                    assertEquals(V_THERE, new 
String(result.getValue(Bytes.toBytes(CF_FOO), null)));
+                    assertArrayEquals(V_123_BYTE_ARRAY, 
result.getValue(Bytes.toBytes(CF_BAR), null));
+                }
             } else {
                 assertTrue(result.isEmpty());
             }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4a928d17/hbase/src/test/java/org/apache/metamodel/hbase/InsertRowTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/metamodel/hbase/InsertRowTest.java 
b/hbase/src/test/java/org/apache/metamodel/hbase/InsertRowTest.java
index a71422d..82ac9d8 100644
--- a/hbase/src/test/java/org/apache/metamodel/hbase/InsertRowTest.java
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/InsertRowTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.*;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.List;
 
@@ -70,7 +71,7 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
             final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                     CF_BAR);
             final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, HBaseDataContext.FIELD_ID, CF_FOO,
-                    CF_BAR);
+                    CF_BAR, false);
             final List<HBaseColumn> columns = getHBaseColumnsFromRow(row);
             getUpdateCallback().insertInto(mutableTable, columns);
             fail("Should get an exception that the type of the table is 
wrong.");
@@ -114,24 +115,6 @@ public class InsertRowTest extends HBaseUpdateCallbackTest 
{
     }
 
     /**
-     * Having the columns parameter empty at the builder, should throw an 
exception
-     *
-     * @throws IOException
-     */
-    @Test
-    public void testColumnsEmptyAtBuilder() throws IOException {
-        try {
-            final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
-                    CF_BAR);
-            List<HBaseColumn> emptyList = new ArrayList<>();
-            new HBaseRowInsertionBuilder(getUpdateCallback(), existingTable, 
emptyList);
-            fail("Should get an exception that the columns list is empty.");
-        } catch (IllegalArgumentException e) {
-            assertEquals("The hbaseColumns list is null or empty", 
e.getMessage());
-        }
-    }
-
-    /**
      * Using a table that doesn't exist in the schema, should throw an 
exception
      *
      * @throws IOException
@@ -144,7 +127,7 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
             final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                     CF_BAR);
             final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, HBaseDataContext.FIELD_ID, CF_FOO,
-                    CF_BAR);
+                    CF_BAR, false);
             final List<HBaseColumn> columns = getHBaseColumnsFromRow(row);
             getUpdateCallback().insertInto(wrongTable, columns);
             fail("Should get an exception that the table isn't in the 
schema.");
@@ -164,7 +147,7 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
         try {
             final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                     CF_BAR);
-            final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, null, CF_FOO, CF_BAR);
+            final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, null, CF_FOO, CF_BAR, false);
             final List<HBaseColumn> columns = getHBaseColumnsFromRow(row);
             getUpdateCallback().insertInto(existingTable, columns);
             fail("Should get an exception that ID-column doesn't exist.");
@@ -185,7 +168,7 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
             final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                     CF_BAR);
             final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, HBaseDataContext.FIELD_ID, CF_FOO,
-                    CF_BAR);
+                    CF_BAR, false);
             final List<HBaseColumn> columns = getHBaseColumnsFromRow(row);
             final HBaseTable wrongTable = createHBaseTable(TABLE_NAME, 
HBaseDataContext.FIELD_ID, CF_FOO,
                     wrongColumnFamily, null);
@@ -209,7 +192,7 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
             final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                     CF_BAR);
             final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, HBaseDataContext.FIELD_ID, CF_FOO,
-                    CF_BAR);
+                    CF_BAR, false);
             final List<HBaseColumn> columns = getHBaseColumnsFromRow(row);
             final HBaseTable wrongTable = createHBaseTable(TABLE_NAME, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR,
                     wrongColumnFamily);
@@ -228,7 +211,8 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
     public void testCreatingTheHBaseClientWithTableNameNull() {
         try {
             final HBaseTable table = createHBaseTable(TABLE_NAME, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR, null);
-            final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR);
+            final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR,
+                    false);
             final HBaseColumn[] columns = 
convertToHBaseColumnsArray(getHBaseColumnsFromRow(row));
             final Object[] values = new String[] { "Values" };
             new HBaseClient(getDataContext().getConnection()).insertRow(null, 
columns, values, 0);
@@ -261,7 +245,8 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
     public void testCreatingTheHBaseClientWithValuesNull() {
         try {
             final HBaseTable table = createHBaseTable(TABLE_NAME, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR, null);
-            final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR);
+            final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR,
+                    false);
             final HBaseColumn[] columns = 
convertToHBaseColumnsArray(getHBaseColumnsFromRow(row));
             new 
HBaseClient(getDataContext().getConnection()).insertRow(table.getName(), 
columns, null, 0);
             fail("Should get an exception that values is null");
@@ -278,7 +263,8 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
     public void testCreatingTheHBaseClientWithIndexOfIdColumnOutOfBounce() {
         try {
             final HBaseTable table = createHBaseTable(TABLE_NAME, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR, null);
-            final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR);
+            final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR,
+                    false);
             final HBaseColumn[] columns = 
convertToHBaseColumnsArray(getHBaseColumnsFromRow(row));
             final Object[] values = new String[] { "Values" };
             new 
HBaseClient(getDataContext().getConnection()).insertRow(table.getName(), 
columns, values, 10);
@@ -296,7 +282,8 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
     public void testCreatingTheHBaseClientWithRowKeyNull() {
         try {
             final HBaseTable table = createHBaseTable(TABLE_NAME, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR, null);
-            final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR);
+            final LinkedHashMap<HBaseColumn, Object> row = createRow(table, 
HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR,
+                    false);
             final HBaseColumn[] columns = 
convertToHBaseColumnsArray(getHBaseColumnsFromRow(row));
             final Object[] values = new String[] { null };
             new 
HBaseClient(getDataContext().getConnection()).insertRow(table.getName(), 
columns, values, 0);
@@ -308,6 +295,29 @@ public class InsertRowTest extends HBaseUpdateCallbackTest 
{
     }
 
     /**
+     * Inserting a row without setting enough values directly on the 
HBaseClient, should throw exception.
+     * NOTE: This exception is already prevented when using the {@link 
HBaseRowInsertionBuilder}
+     * @throws IOException 
+     */
+    @Test
+    public void testNotSettingEnoughValues() throws IOException {
+        try {
+            final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
+                    CF_BAR);
+            final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, HBaseDataContext.FIELD_ID, CF_FOO,
+                    CF_BAR, false);
+            final List<HBaseColumn> columns = getHBaseColumnsFromRow(row);
+            final Collection<Object> values = getToLittleValues(row);
+            final HBaseClient hBaseClient = ((HBaseDataContext) 
getUpdateCallback().getDataContext()).getHBaseClient();
+            hBaseClient.insertRow(TABLE_NAME, columns.toArray(new 
HBaseColumn[columns.size()]), values.toArray(
+                    new Object[values.size()]), 0); // TODO: find the ID-column
+            fail("Should get an exception when insering directly into the 
HBaseClient without having enough values.");
+        } catch (IllegalArgumentException e) {
+            assertEquals("The amount of columns don't match the amount of 
values", e.getMessage());
+        }
+    }
+
+    /**
      * Goodflow. Using an existing table and columns, should work
      */
     @Test
@@ -316,7 +326,7 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
             final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                     CF_BAR);
             final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, HBaseDataContext.FIELD_ID, CF_FOO,
-                    CF_BAR);
+                    CF_BAR, false);
             final List<HBaseColumn> columns = getHBaseColumnsFromRow(row);
             getUpdateCallback().insertInto(existingTable, columns);
         } catch (Exception e) {
@@ -324,31 +334,27 @@ public class InsertRowTest extends 
HBaseUpdateCallbackTest {
         }
     }
 
-    // /**
-    // * Goodflow. Executing the insertInto with the Values being null, should 
not throw an exception
-    // */
-    // public void testNotSettingTheValues() {
-    // if (isConfigured()) {
-    // try {
-    // final HBaseTable existingTable = createAndInsertTable(TABLE_NAME, 
HBaseDataContext.FIELD_ID, CF_FOO,
-    // CF_BAR);
-    // final LinkedHashMap<HBaseColumn, Object> row = createRow(existingTable, 
HBaseDataContext.FIELD_ID,
-    // CF_FOO, CF_BAR);
-    // final List<HBaseColumn> columns = getHBaseColumnsFromMap(row);
-    //
-    // checkRows(false);
-    // final HBaseRowInsertionBuilder rowInsertionBuilder = 
getUpdateCallback().insertInto(existingTable,
-    // columns);
-    // rowInsertionBuilder.execute();
-    // checkRows(false);
-    // } catch (Exception e) {
-    // fail("No exception should be thrown, when inserting without values.");
-    // }
-    // } else {
-    // warnAboutANotExecutedTest(getClass().getName(), new Object() {
-    // }.getClass().getEnclosingMethod().getName());
-    // }
-    // }
+    /**
+     * Goodflow, creating a row with qualifiers null should work.
+     */
+    @Test
+    public void testQaulifierNull() {
+        try {
+            final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
+                    CF_BAR);
+            final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, HBaseDataContext.FIELD_ID, CF_FOO,
+                    CF_BAR, true);
+            final List<HBaseColumn> columns = getHBaseColumnsFromRow(row);
+
+            checkRows(false, true);
+            final HBaseRowInsertionBuilder rowInsertionBuilder = 
getUpdateCallback().insertInto(existingTable, columns);
+            setValuesInInsertionBuilder(row, rowInsertionBuilder);
+            rowInsertionBuilder.execute();
+            checkRows(true, true);
+        } catch (Exception e) {
+            fail("Inserting a row without qualifiers should work.");
+        }
+    }
 
     /**
      * Goodflow. Inserting a row succesfully (with values set)
@@ -359,14 +365,14 @@ public class InsertRowTest extends 
HBaseUpdateCallbackTest {
             final HBaseTable existingTable = 
createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                     CF_BAR);
             final LinkedHashMap<HBaseColumn, Object> row = 
createRow(existingTable, HBaseDataContext.FIELD_ID, CF_FOO,
-                    CF_BAR);
+                    CF_BAR, false);
             final List<HBaseColumn> columns = getHBaseColumnsFromRow(row);
 
-            checkRows(false);
+            checkRows(false, false);
             final HBaseRowInsertionBuilder rowInsertionBuilder = 
getUpdateCallback().insertInto(existingTable, columns);
             setValuesInInsertionBuilder(row, rowInsertionBuilder);
             rowInsertionBuilder.execute();
-            checkRows(true);
+            checkRows(true, false);
         } catch (Exception e) {
             fail("No exception should be thrown, when inserting with values.");
         }

Reply via email to