METAMODEL-1151: Added DataContextFactory for HBase

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

Branch: refs/heads/master
Commit: 4ab20a35e9c14ab456f8a1f2b14f2ff8a11dca1a
Parents: 23c4488
Author: Kasper Sørensen <i.am.kasper.soren...@gmail.com>
Authored: Tue Aug 8 20:02:33 2017 -0700
Committer: Kasper Sørensen <i.am.kasper.soren...@gmail.com>
Committed: Tue Aug 8 20:02:33 2017 -0700

----------------------------------------------------------------------
 .../cassandra/CassandraDataContextFactory.java  |  3 +-
 .../factory/AbstractDataContextFactory.java     | 53 ++++++++++++--
 .../couchdb/CouchDbDataContextFactory.java      |  2 +-
 ....apache.metamodel.factory.DataContextFactory |  1 +
 .../metamodel/hbase/HBaseConfiguration.java     |  3 +-
 .../hbase/HbaseDataContextFactory.java          | 77 ++++++++++++++++++++
 ....apache.metamodel.factory.DataContextFactory |  1 +
 7 files changed, 128 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/4ab20a35/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataContextFactory.java
----------------------------------------------------------------------
diff --git 
a/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataContextFactory.java
 
b/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataContextFactory.java
index f5cdd9b..ac74305 100644
--- 
a/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataContextFactory.java
+++ 
b/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataContextFactory.java
@@ -29,7 +29,6 @@ import 
org.apache.metamodel.factory.UnsupportedDataContextPropertiesException;
 
 import com.datastax.driver.core.Cluster;
 import com.datastax.driver.core.Cluster.Builder;
-import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 
 public class CassandraDataContextFactory extends AbstractDataContextFactory {
@@ -65,7 +64,7 @@ public class CassandraDataContextFactory extends 
AbstractDataContextFactory {
 
         final Cluster cluster = clusterBuilder.build();
 
-        final String keySpace = Objects.firstNonNull((String) 
map.get("keyspace"), properties.getDatabaseName());
+        final String keySpace = getString(map.get("keyspace"), 
properties.getDatabaseName());
 
         return new CassandraDataContext(cluster, keySpace, 
properties.getTableDefs());
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4ab20a35/core/src/main/java/org/apache/metamodel/factory/AbstractDataContextFactory.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/metamodel/factory/AbstractDataContextFactory.java
 
b/core/src/main/java/org/apache/metamodel/factory/AbstractDataContextFactory.java
index 7ecca91..f338d3e 100644
--- 
a/core/src/main/java/org/apache/metamodel/factory/AbstractDataContextFactory.java
+++ 
b/core/src/main/java/org/apache/metamodel/factory/AbstractDataContextFactory.java
@@ -18,7 +18,12 @@
  */
 package org.apache.metamodel.factory;
 
+import java.util.Collection;
+import java.util.Map;
+
 import org.apache.metamodel.DataContext;
+import org.apache.metamodel.util.BooleanComparator;
+import org.apache.metamodel.util.NumberComparator;
 
 /**
  * Abstract implementation of {@link DataContextFactory} with utility methods 
for easier subclass implementation.
@@ -38,19 +43,51 @@ public abstract class AbstractDataContextFactory implements 
DataContextFactory {
         return getType().equals(properties.getDataContextType());
     }
 
-    protected String getString(String value, String ifNull) {
-        return value == null ? ifNull : value;
+    protected String getString(Object value, String ifNull) {
+        if (isNullOrEmpty(value)) {
+            return ifNull;
+        }
+        return value.toString();
+    }
+
+    protected int getInt(Object value, int ifNull) {
+        if (isNullOrEmpty(value)) {
+            return ifNull;
+        }
+        return NumberComparator.toNumber(value).intValue();
     }
 
-    protected int getInt(Integer value, int ifNull) {
-        return value == null ? ifNull : value;
+    protected boolean getBoolean(Object value, boolean ifNull) {
+        if (isNullOrEmpty(value)) {
+            return ifNull;
+        }
+        return BooleanComparator.toBoolean(value).booleanValue();
     }
 
-    protected boolean getBoolean(Boolean value, boolean ifNull) {
-        return value == null ? ifNull : value;
+    protected char getChar(Object value, char ifNull) {
+        if (isNullOrEmpty(value)) {
+            return ifNull;
+        }
+        if (value instanceof Character) {
+            return ((Character) value).charValue();
+        }
+        return value.toString().charAt(0);
     }
 
-    protected char getChar(Character value, char ifNull) {
-        return value == null ? ifNull : value;
+    private static boolean isNullOrEmpty(Object value) {
+        if (value == null) {
+            return false;
+        }
+        if (value instanceof String && ((String) value).isEmpty()) {
+            return false;
+        }
+        if (value instanceof Collection && ((Collection<?>) value).isEmpty()) {
+            return false;
+        }
+        if (value instanceof Map && ((Map<?, ?>) value).isEmpty()) {
+            return false;
+        }
+        return true;
     }
+
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4ab20a35/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContextFactory.java
----------------------------------------------------------------------
diff --git 
a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContextFactory.java
 
b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContextFactory.java
index edb93d8..81c6bc0 100644
--- 
a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContextFactory.java
+++ 
b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContextFactory.java
@@ -53,7 +53,7 @@ public class CouchDbDataContextFactory extends 
AbstractDataContextFactory {
         } else {
             httpClientBuilder.host(properties.getHostname());
             httpClientBuilder.port(getInt(properties.getPort(), 
CouchDbDataContext.DEFAULT_PORT));
-            httpClientBuilder.enableSSL(getBoolean((Boolean) 
properties.toMap().get("ssl"), false));
+            
httpClientBuilder.enableSSL(getBoolean(properties.toMap().get("ssl"), false));
         }
 
         httpClientBuilder.username(properties.getUsername());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4ab20a35/couchdb/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory
----------------------------------------------------------------------
diff --git 
a/couchdb/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory
 
b/couchdb/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory
new file mode 100644
index 0000000..cfc189f
--- /dev/null
+++ 
b/couchdb/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory
@@ -0,0 +1 @@
+org.apache.metamodel.csv.CouchDbDataContextFactory
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4ab20a35/hbase/src/main/java/org/apache/metamodel/hbase/HBaseConfiguration.java
----------------------------------------------------------------------
diff --git 
a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseConfiguration.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseConfiguration.java
index f2ec2ec..c9fc45e 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseConfiguration.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseConfiguration.java
@@ -32,6 +32,7 @@ public class HBaseConfiguration extends BaseObject implements 
Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    public static final ColumnType DEFAULT_ROW_KEY_TYPE = ColumnType.BINARY;
     public static final String DEFAULT_SCHEMA_NAME = "HBase";
     public static final String DEFAULT_ZOOKEEPER_HOSTNAME = "127.0.0.1";
     public static final int DEFAULT_ZOOKEEPER_PORT = 2181;
@@ -56,7 +57,7 @@ public class HBaseConfiguration extends BaseObject implements 
Serializable {
     }
 
     public HBaseConfiguration(String zookeeperHostname, int zookeeperPort) {
-        this(DEFAULT_SCHEMA_NAME, zookeeperHostname, zookeeperPort, null, 
ColumnType.BINARY);
+        this(DEFAULT_SCHEMA_NAME, zookeeperHostname, zookeeperPort, null, 
DEFAULT_ROW_KEY_TYPE);
     }
 
     public HBaseConfiguration(String zookeeperHostname, int zookeeperPort, 
ColumnType defaultRowKeyType) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4ab20a35/hbase/src/main/java/org/apache/metamodel/hbase/HbaseDataContextFactory.java
----------------------------------------------------------------------
diff --git 
a/hbase/src/main/java/org/apache/metamodel/hbase/HbaseDataContextFactory.java 
b/hbase/src/main/java/org/apache/metamodel/hbase/HbaseDataContextFactory.java
new file mode 100644
index 0000000..f3c2d8a
--- /dev/null
+++ 
b/hbase/src/main/java/org/apache/metamodel/hbase/HbaseDataContextFactory.java
@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.hbase;
+
+import java.util.Map;
+
+import org.apache.metamodel.ConnectionException;
+import org.apache.metamodel.DataContext;
+import org.apache.metamodel.factory.AbstractDataContextFactory;
+import org.apache.metamodel.factory.DataContextProperties;
+import org.apache.metamodel.factory.ResourceFactoryRegistry;
+import org.apache.metamodel.factory.UnsupportedDataContextPropertiesException;
+import org.apache.metamodel.schema.ColumnType;
+import org.apache.metamodel.schema.ColumnTypeImpl;
+import org.apache.metamodel.util.SimpleTableDef;
+
+public class HbaseDataContextFactory extends AbstractDataContextFactory {
+
+    @Override
+    protected String getType() {
+        return "hbase";
+    }
+
+    @Override
+    public DataContext create(DataContextProperties properties, 
ResourceFactoryRegistry resourceFactoryRegistry)
+            throws UnsupportedDataContextPropertiesException, 
ConnectionException {
+        final Map<String, Object> map = properties.toMap();
+
+        final String schemaName = getString(map.get("schema"),
+                getString(properties.getDatabaseName(), 
HBaseConfiguration.DEFAULT_SCHEMA_NAME));
+        final String zookeeperHostname =
+                getString(map.get("zookeeper-hostname"), 
HBaseConfiguration.DEFAULT_ZOOKEEPER_HOSTNAME);
+        final int zookeeperPort = getInt(map.get("zookeeper-port"), 
HBaseConfiguration.DEFAULT_ZOOKEEPER_PORT);
+        final SimpleTableDef[] tableDefinitions = properties.getTableDefs();
+
+        final ColumnType defaultRowKeyType;
+        final Object configuredDefaultRowKeyType = 
map.get("default-row-key-type");
+        if (configuredDefaultRowKeyType == null) {
+            defaultRowKeyType = HBaseConfiguration.DEFAULT_ROW_KEY_TYPE;
+        } else if (configuredDefaultRowKeyType instanceof ColumnType) {
+            defaultRowKeyType = (ColumnType) configuredDefaultRowKeyType;
+        } else if (configuredDefaultRowKeyType instanceof String && !((String) 
configuredDefaultRowKeyType).isEmpty()) {
+            defaultRowKeyType = ColumnTypeImpl.valueOf((String) 
configuredDefaultRowKeyType);
+        } else {
+            defaultRowKeyType = HBaseConfiguration.DEFAULT_ROW_KEY_TYPE;
+        }
+
+        final int hbaseClientRetries =
+                getInt(map.get("hbase-client-retries"), 
HBaseConfiguration.DEFAULT_HBASE_CLIENT_RETRIES);
+        final int zookeeperSessionTimeout =
+                getInt(map.get("zookeeper-session-timeout"), 
HBaseConfiguration.DEFAULT_ZOOKEEPER_SESSION_TIMEOUT);
+        final int zookeeperRecoveryRetries =
+                getInt(map.get("zookeeper-recovery-retries"), 
HBaseConfiguration.DEFAULT_ZOOKEEPER_RECOVERY_RETRIES);
+
+        final HBaseConfiguration configuration =
+                new HBaseConfiguration(schemaName, zookeeperHostname, 
zookeeperPort, tableDefinitions,
+                        defaultRowKeyType, hbaseClientRetries, 
zookeeperSessionTimeout, zookeeperRecoveryRetries);
+        return new HBaseDataContext(configuration);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/4ab20a35/hbase/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory
----------------------------------------------------------------------
diff --git 
a/hbase/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory
 
b/hbase/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory
new file mode 100644
index 0000000..abf20fd
--- /dev/null
+++ 
b/hbase/src/main/resources/META-INF/services/org.apache.metamodel.factory.DataContextFactory
@@ -0,0 +1 @@
+org.apache.metamodel.csv.HbaseDataContextFactory
\ No newline at end of file

Reply via email to