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