gora-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From lewi...@apache.org
Subject [01/37] gora git commit: Initial commit gora cassandra cql with Connection parameters
Date Wed, 23 Aug 2017 20:54:59 GMT
Repository: gora
Updated Branches:
  refs/heads/master 837b12606 -> 3d4e1d69a


Initial commit gora cassandra cql with Connection parameters


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

Branch: refs/heads/master
Commit: cd3522aa47c542594dc9cc4d91b023a65db71ae9
Parents: d5e5560
Author: madhawa-gunasekara <madhawag@wso2.com>
Authored: Tue Jun 13 01:03:21 2017 +0530
Committer: madhawa <madhawa30@gmail.com>
Committed: Fri Jun 16 23:27:12 2017 +0530

----------------------------------------------------------------------
 gora-cassandra-cql/pom.xml                      | 230 +++++++++
 gora-cassandra-cql/src/examples/java/.gitignore |  15 +
 .../org/apache/gora/cassandra/package-info.java |  20 +
 .../gora/cassandra/query/package-info.java      |  21 +
 .../cassandra/serializers/package-info.java     |  20 +
 .../gora/cassandra/store/CassandraStore.java    | 516 +++++++++++++++++++
 .../apache/gora/cassandra/store/Constants.java  | 100 ++++
 .../gora/cassandra/store/package-info.java      |  20 +
 gora-cassandra-cql/src/test/conf/cassandra.yaml | 418 +++++++++++++++
 .../src/test/conf/gora-cassandra-mapping.xml    |  95 ++++
 .../src/test/conf/gora.properties               |  30 ++
 .../src/test/conf/log4j-server.properties       |  48 ++
 gora-cassandra-cql/src/test/java/.gitignore     |  15 +
 .../gora/cassandra/GoraCassandraTestDriver.java | 157 ++++++
 .../org/apache/gora/cassandra/package-info.java |  21 +
 .../cassandra/store/TestCassandraStore.java     |  92 ++++
 .../gora/cassandra/store/package-info.java      |  21 +
 pom.xml                                         |   1 +
 18 files changed, 1840 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/pom.xml
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/pom.xml b/gora-cassandra-cql/pom.xml
new file mode 100644
index 0000000..b17fd41
--- /dev/null
+++ b/gora-cassandra-cql/pom.xml
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~  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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+     <!--
+    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.
+    -->
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>    
+        <groupId>org.apache.gora</groupId>
+        <artifactId>gora</artifactId>
+        <version>0.8-SNAPSHOT</version>
+        <relativePath>../</relativePath>
+    </parent>
+    <artifactId>gora-cassandra-cql</artifactId>
+    <packaging>bundle</packaging>
+
+    <name>Apache Gora :: Cassandra - CQL</name>
+        <url>http://gora.apache.org</url>
+    <description>The Apache Gora open source framework provides an in-memory data model and 
+    persistence for big data. Gora supports persisting to column stores, key value stores, 
+    document stores and RDBMSs, and analyzing the data with extensive Apache Hadoop MapReduce 
+    support.</description>
+    <inceptionYear>2010</inceptionYear>
+    <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+    </organization>
+    <issueManagement>
+        <system>JIRA</system>
+        <url>https://issues.apache.org/jira/browse/GORA</url>
+    </issueManagement>
+    <ciManagement>
+        <system>Jenkins</system>
+        <url>https://builds.apache.org/job/Gora-trunk/</url>
+    </ciManagement>
+
+    <properties>
+        <osgi.import>*</osgi.import>
+        <osgi.export>org.apache.gora.cassandra*;version="${project.version}";-noimport:=true</osgi.export>
+    </properties>
+
+    <build>
+        <directory>target</directory>
+        <outputDirectory>target/classes</outputDirectory>
+        <finalName>${project.artifactId}-${project.version}</finalName>
+        <testOutputDirectory>target/test-classes</testOutputDirectory>
+        <testSourceDirectory>src/test/java</testSourceDirectory>
+        <sourceDirectory>src/main/java</sourceDirectory>
+        <testResources>
+          <testResource>
+            <directory>${project.basedir}/src/test/conf</directory>
+            <includes>
+              <include>**/*</include>
+            </includes>
+            <!--targetPath>${project.basedir}/target/classes/</targetPath-->
+          </testResource>
+        </testResources>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>${build-helper-maven-plugin.version}</version>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src/examples/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+
+        <!-- OSX JDK 7 -->
+        <!-- should be removed once fixed in Cassandra -->
+        <dependency>
+            <groupId>org.xerial.snappy</groupId>
+            <artifactId>snappy-java</artifactId>
+            <version>1.0.5-M3</version>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- Gora Internal Dependencies -->
+        <dependency>
+            <groupId>org.apache.gora</groupId>
+            <artifactId>gora-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.gora</groupId>
+            <artifactId>gora-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- Cassandra Driver Dependencies -->
+        <dependency>
+            <groupId>com.datastax.cassandra</groupId>
+            <artifactId>cassandra-driver-core</artifactId>
+            <version>${cassandra-driver.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>guava</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- Cassandra Dependencies -->
+        <dependency>
+            <groupId>org.apache.cassandra</groupId>
+            <artifactId>cassandra-all</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.cassandra.deps</groupId>
+                    <artifactId>avro</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>log4j-over-slf4j</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- dependency>
+            <groupId>org.apache.cassandra</groupId>
+            <artifactId>cassandra-thrift</artifactId>
+        </dependency-->
+
+        <!--<dependency>-->
+        <!--<groupId>org.hectorclient</groupId>-->
+        <!--<artifactId>hector-core</artifactId>-->
+        <!--<exclusions>-->
+        <!--<exclusion>-->
+        <!--<groupId>org.apache.cassandra</groupId>-->
+        <!--<artifactId>cassandra-all</artifactId>-->
+        <!--</exclusion>-->
+        <!--</exclusions>-->
+        <!--</dependency>-->
+
+        <!-- Misc Dependencies -->
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.jdom</groupId>
+            <artifactId>jdom</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.apache.avro</groupId>
+            <artifactId>avro</artifactId>
+        </dependency>
+
+        <!-- Logging Dependencies -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>javax.jms</groupId>
+                    <artifactId>jms</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- Testing Dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-minicluster</artifactId>
+        </dependency>
+        
+    </dependencies>
+
+</project>

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/examples/java/.gitignore
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/examples/java/.gitignore b/gora-cassandra-cql/src/examples/java/.gitignore
new file mode 100644
index 0000000..09697dc
--- /dev/null
+++ b/gora-cassandra-cql/src/examples/java/.gitignore
@@ -0,0 +1,15 @@
+# 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.
+

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/package-info.java
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/package-info.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/package-info.java
new file mode 100644
index 0000000..5247ecc
--- /dev/null
+++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/package-info.java
@@ -0,0 +1,20 @@
+/**
+ * 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.
+ */
+/**
+ * This package contains Casandra datastore related all classes.
+ */
+package org.apache.gora.cassandra;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/query/package-info.java
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/query/package-info.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/query/package-info.java
new file mode 100644
index 0000000..49faefa
--- /dev/null
+++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/query/package-info.java
@@ -0,0 +1,21 @@
+/**
+ * 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.
+ */
+/**
+ * This package contains all the Cassandra store query representation class as well as Result set representing class
+ * when query is executed over the Cassandra dataStore.
+ */
+package org.apache.gora.cassandra.query;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/serializers/package-info.java
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/serializers/package-info.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/serializers/package-info.java
new file mode 100644
index 0000000..5d22d94
--- /dev/null
+++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/serializers/package-info.java
@@ -0,0 +1,20 @@
+/**
+ * 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.
+ */
+/**
+ * This package contains Cassandra store related util classes for serializer.
+ */
+package org.apache.gora.cassandra.serializers;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java
new file mode 100644
index 0000000..b4c6e68
--- /dev/null
+++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java
@@ -0,0 +1,516 @@
+/*
+ *  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.gora.cassandra.store;
+
+import com.datastax.driver.core.*;
+import com.datastax.driver.core.policies.*;
+import org.apache.gora.persistency.BeanFactory;
+import org.apache.gora.persistency.impl.PersistentBase;
+import org.apache.gora.query.PartitionQuery;
+import org.apache.gora.query.Query;
+import org.apache.gora.query.Result;
+import org.apache.gora.store.impl.DataStoreBase;
+import org.apache.hadoop.conf.Configuration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
+
+public class CassandraStore<K, T extends PersistentBase> extends DataStoreBase<K, T> {
+
+  /**
+   * Consistency property level for Cassandra column families
+   */
+  private static final String COL_FAM_CL = "cf.consistency.level";
+
+  /**
+   * Consistency property level for Cassandra read operations.
+   */
+  private static final String READ_OP_CL = "read.consistency.level";
+
+  /**
+   * Consistency property level for Cassandra write operations.
+   */
+  private static final String WRITE_OP_CL = "write.consistency.level";
+
+  public static final Logger LOG = LoggerFactory.getLogger(CassandraStore.class);
+
+  private Cluster cluster;
+
+  private Session session;
+
+  public CassandraStore() {
+    super();
+  }
+
+  @Override
+  public void initialize(Class<K> keyClass, Class<T> persistentClass, Properties properties) {
+    LOG.debug("Initializing Cassandra store");
+    super.initialize(keyClass, persistentClass, properties);
+    try {
+      Cluster.Builder builder = Cluster.builder();
+      populateSettings(builder, properties);
+      this.cluster = builder.build();
+      this.session = this.cluster.connect();
+    } catch (Exception e) {
+      LOG.error("Error while initializing Cassandra store: {}",
+              new Object[]{e.getMessage()});
+      throw new RuntimeException(e);
+    }
+  }
+
+  private void populateSettings(Cluster.Builder builder, Properties properties) {
+    String serversParam = properties.getProperty(Constants.CASSANDRA_SERVERS);
+    String[] servers = serversParam.split(",");
+    for (String server : servers) {
+      builder = builder.addContactPoint(server);
+    }
+    String portProp = properties.getProperty(Constants.PORT);
+    if (portProp != null) {
+      builder = builder.withPort(Integer.parseInt(portProp));
+    }
+    String clusterNameProp = properties.getProperty(Constants.CLUSTER_NAME);
+    if (clusterNameProp != null) {
+      builder = builder.withClusterName(clusterNameProp);
+    }
+    String compressionProp = properties.getProperty(Constants.COMPRESSION);
+    if (compressionProp != null) {
+      builder = builder.withCompression(ProtocolOptions.Compression.valueOf(compressionProp));
+    }
+    builder = this.populateCredentials(properties, builder);
+    builder = this.populateLoadBalancingProp(properties, builder);
+    String enableJMXProp = properties.getProperty(Constants.ENABLE_JMX_REPORTING);
+    if (enableJMXProp != null) {
+      if (!Boolean.parseBoolean(enableJMXProp)) {
+        builder = builder.withoutJMXReporting();
+      }
+    }
+    String enableMetricsProp = properties.getProperty(Constants.ENABLE_METRICS);
+    if (enableMetricsProp != null) {
+      if (!Boolean.parseBoolean(enableMetricsProp)) {
+        builder = builder.withoutMetrics();
+      }
+    }
+    builder = this.populatePoolingSettings(properties, builder);
+    String versionProp = properties.getProperty(Constants.PROTOCOL_VERSION);
+    if (versionProp != null) {
+      builder = builder.withProtocolVersion(ProtocolVersion.fromInt(Integer.parseInt(versionProp)));
+    }
+    builder = this.populateQueryOptions(properties, builder);
+    builder = this.populateReconnectPolicy(properties, builder);
+    builder = this.populateRetrytPolicy(properties, builder);
+    builder = this.populateSocketOptions(properties, builder);
+    String enableSSLProp = properties.getProperty(Constants.ENABLE_SSL);
+    if (enableSSLProp != null) {
+      if (Boolean.parseBoolean(enableSSLProp)) {
+        builder = builder.withSSL();
+      }
+    }
+  }
+
+
+  private Cluster.Builder populateLoadBalancingProp(Properties properties, Cluster.Builder builder) {
+    String loadBalancingProp = properties.getProperty(Constants.LOAD_BALANCING_POLICY);
+    if (loadBalancingProp != null) {
+      switch (loadBalancingProp) {
+        case "LatencyAwareRoundRobinPolicy":
+          builder = builder.withLoadBalancingPolicy(LatencyAwarePolicy.builder(new RoundRobinPolicy()).build());
+          break;
+        case "RoundRobinPolicy":
+          builder = builder.withLoadBalancingPolicy(new RoundRobinPolicy());
+          break;
+        case "DCAwareRoundRobinPolicy": {
+          String dataCenter = properties.getProperty(Constants.DATA_CENTER);
+          boolean allowRemoteDCsForLocalConsistencyLevel = Boolean.parseBoolean(
+                  properties.getProperty(Constants.ALLOW_REMOTE_DCS_FOR_LOCAL_CONSISTENCY_LEVEL));
+          if (dataCenter != null && !dataCenter.isEmpty()) {
+            if (allowRemoteDCsForLocalConsistencyLevel) {
+              builder = builder.withLoadBalancingPolicy(
+                      DCAwareRoundRobinPolicy.builder().withLocalDc(dataCenter)
+                              .allowRemoteDCsForLocalConsistencyLevel().build());
+            } else {
+              builder = builder.withLoadBalancingPolicy(
+                      DCAwareRoundRobinPolicy.builder().withLocalDc(dataCenter).build());
+            }
+          } else {
+            if (allowRemoteDCsForLocalConsistencyLevel) {
+              builder = builder.withLoadBalancingPolicy(
+                      (DCAwareRoundRobinPolicy.builder().allowRemoteDCsForLocalConsistencyLevel().build()));
+            } else {
+              builder = builder.withLoadBalancingPolicy((DCAwareRoundRobinPolicy.builder().build()));
+            }
+          }
+          break;
+        }
+        case "TokenAwareRoundRobinPolicy":
+          builder = builder.withLoadBalancingPolicy(new TokenAwarePolicy(new RoundRobinPolicy()));
+          break;
+        case "TokenAwareDCAwareRoundRobinPolicy": {
+          String dataCenter = properties.getProperty(Constants.DATA_CENTER);
+          boolean allowRemoteDCsForLocalConsistencyLevel = Boolean.parseBoolean(
+                  properties.getProperty(Constants.ALLOW_REMOTE_DCS_FOR_LOCAL_CONSISTENCY_LEVEL));
+          if (dataCenter != null && !dataCenter.isEmpty()) {
+            if (allowRemoteDCsForLocalConsistencyLevel) {
+              builder = builder.withLoadBalancingPolicy(new TokenAwarePolicy(
+                      DCAwareRoundRobinPolicy.builder().withLocalDc(dataCenter)
+                              .allowRemoteDCsForLocalConsistencyLevel().build()));
+            } else {
+              builder = builder.withLoadBalancingPolicy(new TokenAwarePolicy(
+                      DCAwareRoundRobinPolicy.builder().withLocalDc(dataCenter).build()));
+            }
+          } else {
+            if (allowRemoteDCsForLocalConsistencyLevel) {
+              builder = builder.withLoadBalancingPolicy(new TokenAwarePolicy(
+                      DCAwareRoundRobinPolicy.builder().allowRemoteDCsForLocalConsistencyLevel().build()));
+            } else {
+              builder = builder.withLoadBalancingPolicy(
+                      new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().build()));
+            }
+          }
+          break;
+        }
+        default:
+          LOG.error("Unsupported Cassandra load balancing " + "policy: " + loadBalancingProp);
+          break;
+      }
+    }
+    return builder;
+  }
+
+  private Cluster.Builder populateCredentials(Properties properties, Cluster.Builder builder) {
+    String usernameProp = properties.getProperty(Constants.USERNAME);
+    String passwordProp = properties.getProperty(Constants.PASSWORD);
+    if (usernameProp != null) {
+      builder = builder.withCredentials(usernameProp, passwordProp);
+    }
+    return builder;
+  }
+
+  private Cluster.Builder populatePoolingSettings(Properties properties, Cluster.Builder builder) {
+    String localCoreConnectionsPerHost = properties.getProperty(Constants.LOCAL_CORE_CONNECTIONS_PER_HOST);
+    String remoteCoreConnectionsPerHost = properties.getProperty(Constants.REMOTE_CORE_CONNECTIONS_PER_HOST);
+    String localMaxConnectionsPerHost = properties.getProperty(Constants.LOCAL_MAX_CONNECTIONS_PER_HOST);
+    String remoteMaxConnectionsPerHost = properties.getProperty(Constants.REMOTE_MAX_CONNECTIONS_PER_HOST);
+    String localNewConnectionThreshold = properties.getProperty(Constants.LOCAL_NEW_CONNECTION_THRESHOLD);
+    String remoteNewConnectionThreshold = properties.getProperty(Constants.REMOTE_NEW_CONNECTION_THRESHOLD);
+    String localMaxRequestsPerConnection = properties.getProperty(Constants.LOCAL_MAX_REQUESTS_PER_CONNECTION);
+    String remoteMaxRequestsPerConnection = properties.getProperty(Constants.REMOTE_MAX_REQUESTS_PER_CONNECTION);
+    PoolingOptions options = new PoolingOptions();
+    if (localCoreConnectionsPerHost != null) {
+      options.setCoreConnectionsPerHost(HostDistance.LOCAL, Integer.parseInt(localCoreConnectionsPerHost));
+    }
+    if (remoteCoreConnectionsPerHost != null) {
+      options.setCoreConnectionsPerHost(HostDistance.REMOTE, Integer.parseInt(remoteCoreConnectionsPerHost));
+    }
+    if (localMaxConnectionsPerHost != null) {
+      options.setMaxConnectionsPerHost(HostDistance.LOCAL, Integer.parseInt(localMaxConnectionsPerHost));
+    }
+    if (remoteMaxConnectionsPerHost != null) {
+      options.setMaxConnectionsPerHost(HostDistance.REMOTE, Integer.parseInt(remoteMaxConnectionsPerHost));
+    }
+    if (localNewConnectionThreshold != null) {
+      options.setNewConnectionThreshold(HostDistance.LOCAL, Integer.parseInt(localNewConnectionThreshold));
+    }
+    if (remoteNewConnectionThreshold != null) {
+      options.setNewConnectionThreshold(HostDistance.REMOTE, Integer.parseInt(remoteNewConnectionThreshold));
+    }
+    if (localMaxRequestsPerConnection != null) {
+      options.setMaxRequestsPerConnection(HostDistance.LOCAL, Integer.parseInt(localMaxRequestsPerConnection));
+    }
+    if (remoteMaxRequestsPerConnection != null) {
+      options.setMaxRequestsPerConnection(HostDistance.REMOTE, Integer.parseInt(remoteMaxRequestsPerConnection));
+    }
+    builder = builder.withPoolingOptions(options);
+    return builder;
+  }
+
+  private Cluster.Builder populateQueryOptions(Properties properties, Cluster.Builder builder) {
+    String consistencyLevelProp = properties.getProperty(Constants.CONSISTENCY_LEVEL);
+    String serialConsistencyLevelProp = properties.getProperty(Constants.SERIAL_CONSISTENCY_LEVEL);
+    String fetchSize = properties.getProperty(Constants.FETCH_SIZE);
+    QueryOptions options = new QueryOptions();
+    if (consistencyLevelProp != null) {
+      options.setConsistencyLevel(ConsistencyLevel.valueOf(consistencyLevelProp));
+    }
+    if (serialConsistencyLevelProp != null) {
+      options.setSerialConsistencyLevel(ConsistencyLevel.valueOf(serialConsistencyLevelProp));
+    }
+    if (fetchSize != null) {
+      options.setFetchSize(Integer.parseInt(fetchSize));
+    }
+    return builder.withQueryOptions(options);
+  }
+
+  private Cluster.Builder populateReconnectPolicy(Properties properties, Cluster.Builder builder) {
+    String reconnectionPolicy = properties.getProperty(Constants.RECONNECTION_POLICY);
+    if (reconnectionPolicy != null) {
+      switch (reconnectionPolicy) {
+        case "ConstantReconnectionPolicy": {
+          String constantReconnectionPolicyDelay = properties.getProperty(Constants.CONSTANT_RECONNECTION_POLICY_DELAY);
+
+          ConstantReconnectionPolicy policy = new ConstantReconnectionPolicy(Long.parseLong(constantReconnectionPolicyDelay));
+          builder = builder.withReconnectionPolicy(policy);
+          break;
+        }
+        case "ExponentialReconnectionPolicy": {
+          String exponentialReconnectionPolicyBaseDelay = properties.getProperty(Constants.EXPONENTIAL_RECONNECTION_POLICY_BASE_DELAY);
+          String exponentialReconnectionPolicyMaxDelay = properties.getProperty(Constants.EXPONENTIAL_RECONNECTION_POLICY_MAX_DELAY);
+
+          ExponentialReconnectionPolicy policy = new ExponentialReconnectionPolicy(Long.parseLong(exponentialReconnectionPolicyBaseDelay),
+                  Long.parseLong(exponentialReconnectionPolicyMaxDelay));
+          builder = builder.withReconnectionPolicy(policy);
+          break;
+        }
+        default:
+          LOG.error("Unsupported reconnection policy " + reconnectionPolicy);
+      }
+    }
+    return builder;
+  }
+
+  private Cluster.Builder populateRetrytPolicy(Properties properties, Cluster.Builder builder) {
+    String retryPolicy = properties.getProperty(Constants.RETRY_POLICY);
+    if (retryPolicy != null) {
+      switch (retryPolicy) {
+        case "DefaultRetryPolicy":
+          builder = builder.withRetryPolicy(DefaultRetryPolicy.INSTANCE);
+          break;
+        case "DowngradingConsistencyRetryPolicy":
+          builder = builder.withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE);
+          break;
+        case "FallthroughRetryPolicy":
+          builder = builder.withRetryPolicy(FallthroughRetryPolicy.INSTANCE);
+          break;
+        case "LoggingDefaultRetryPolicy":
+          builder = builder.withRetryPolicy(new LoggingRetryPolicy(DefaultRetryPolicy.INSTANCE));
+          break;
+        case "LoggingDowngradingConsistencyRetryPolicy":
+          builder = builder.withRetryPolicy(new LoggingRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE));
+          break;
+        case "LoggingFallthroughRetryPolicy":
+          builder = builder.withRetryPolicy(new LoggingRetryPolicy(FallthroughRetryPolicy.INSTANCE));
+          break;
+        default:
+          LOG.error("Unsupported retry policy " + retryPolicy);
+          break;
+      }
+    }
+    return builder;
+  }
+
+  private Cluster.Builder populateSocketOptions(Properties properties, Cluster.Builder builder) {
+    String connectionTimeoutMillisProp = properties.getProperty(Constants.CONNECTION_TIMEOUT_MILLIS);
+    String keepAliveProp = properties.getProperty(Constants.KEEP_ALIVE);
+    String readTimeoutMillisProp = properties.getProperty(Constants.READ_TIMEOUT_MILLIS);
+    String receiveBufferSizeProp = properties.getProperty(Constants.RECEIVER_BUFFER_SIZE);
+    String reuseAddress = properties.getProperty(Constants.REUSE_ADDRESS);
+    String sendBufferSize = properties.getProperty(Constants.SEND_BUFFER_SIZE);
+    String soLinger = properties.getProperty(Constants.SO_LINGER);
+    String tcpNoDelay = properties.getProperty(Constants.TCP_NODELAY);
+    SocketOptions options = new SocketOptions();
+    if (connectionTimeoutMillisProp != null) {
+      options.setConnectTimeoutMillis(Integer.parseInt(connectionTimeoutMillisProp));
+    }
+    if (keepAliveProp != null) {
+      options.setKeepAlive(Boolean.parseBoolean(keepAliveProp));
+    }
+    if (readTimeoutMillisProp != null) {
+      options.setReadTimeoutMillis(Integer.parseInt(readTimeoutMillisProp));
+    }
+    if (receiveBufferSizeProp != null) {
+      options.setReceiveBufferSize(Integer.parseInt(receiveBufferSizeProp));
+    }
+    if (reuseAddress != null) {
+      options.setReuseAddress(Boolean.parseBoolean(reuseAddress));
+    }
+    if (sendBufferSize != null) {
+      options.setSendBufferSize(Integer.parseInt(sendBufferSize));
+    }
+    if (soLinger != null) {
+      options.setSoLinger(Integer.parseInt(soLinger));
+    }
+    if (tcpNoDelay != null) {
+      options.setTcpNoDelay(Boolean.parseBoolean(tcpNoDelay));
+    }
+    return builder.withSocketOptions(options);
+  }
+
+  @Override
+  public void setPersistentClass(Class<T> persistentClass) {
+    super.setPersistentClass(persistentClass);
+  }
+
+  @Override
+  public Class<T> getPersistentClass() {
+    return super.getPersistentClass();
+  }
+
+  @Override
+  public String getSchemaName() {
+    return null;
+  }
+
+  @Override
+  public void createSchema() {
+
+  }
+
+  @Override
+  public void deleteSchema() {
+
+  }
+
+  @Override
+  public Class<K> getKeyClass() {
+    return super.getKeyClass();
+  }
+
+  @Override
+  public void setKeyClass(Class<K> keyClass) {
+    super.setKeyClass(keyClass);
+  }
+
+  @Override
+  public K newKey() {
+    return super.newKey();
+  }
+
+  @Override
+  public T newPersistent() {
+    return super.newPersistent();
+  }
+
+  @Override
+  public void setBeanFactory(BeanFactory<K, T> beanFactory) {
+    super.setBeanFactory(beanFactory);
+  }
+
+  @Override
+  public BeanFactory<K, T> getBeanFactory() {
+    return super.getBeanFactory();
+  }
+
+  @Override
+  public void close() {
+
+  }
+
+  @Override
+  public T get(K key) {
+    return super.get(key);
+  }
+
+  @Override
+  public T get(K key, String[] fields) {
+    return null;
+  }
+
+  @Override
+  public void put(K key, T obj) {
+
+  }
+
+  @Override
+  public boolean delete(K key) {
+    return false;
+  }
+
+  @Override
+  public long deleteByQuery(Query<K, T> query) {
+    return 0;
+  }
+
+  @Override
+  public Result<K, T> execute(Query<K, T> query) {
+    return null;
+  }
+
+  @Override
+  public Query<K, T> newQuery() {
+    return null;
+  }
+
+  @Override
+  public List<PartitionQuery<K, T>> getPartitions(Query<K, T> query) throws IOException {
+    return null;
+  }
+
+  @Override
+  public void flush() {
+
+  }
+
+  @Override
+  protected String[] getFieldsToQuery(String[] fields) {
+    return super.getFieldsToQuery(fields);
+  }
+
+  @Override
+  protected String[] getFields() {
+    return super.getFields();
+  }
+
+  @Override
+  public Configuration getConf() {
+    return super.getConf();
+  }
+
+  @Override
+  public void setConf(Configuration conf) {
+    super.setConf(conf);
+  }
+
+  @Override
+  protected Configuration getOrCreateConf() {
+    return super.getOrCreateConf();
+  }
+
+  @Override
+  public void readFields(DataInput in) {
+    super.readFields(in);
+  }
+
+  @Override
+  public void write(DataOutput out) {
+    super.write(out);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    return super.equals(obj);
+  }
+
+  @Override
+  public void truncateSchema() {
+    super.truncateSchema();
+  }
+
+  @Override
+  public boolean schemaExists() {
+    return false;
+  }
+
+  @Override
+  protected String getSchemaName(String mappingSchemaName, Class<?> persistentClass) {
+    return super.getSchemaName(mappingSchemaName, persistentClass);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/Constants.java
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/Constants.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/Constants.java
new file mode 100644
index 0000000..d90a24b
--- /dev/null
+++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/Constants.java
@@ -0,0 +1,100 @@
+/*
+ *  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.gora.cassandra.store;
+
+public class Constants {
+
+  /* string (multiple values with comma separated) */
+  public static final String CASSANDRA_SERVERS = "gora.cassandrastore.cassandraServers";
+  /* string */
+  public static final String KEYSPACE = "gora.cassandrastore.keyspace";
+  /* integer */
+  public static final String PORT = "gora.cassandrastore.port";
+  /* string */
+  public static final String CLUSTER_NAME = "gora.cassandrastore.clusterName";
+  /* "LZ4", "SNAPPY", "NONE" */
+  public static final String COMPRESSION = "gora.cassandrastore.compression";
+  /* string */
+  public static final String USERNAME = "gora.cassandrastore.username";
+  /* string */
+  public static final String PASSWORD = "gora.cassandrastore.password";
+  /* "RoundRobinPolicy", "LatencyAwareRoundRobinPolicy", "TokenAwareRoundRobinPolicy" */
+  public static final String LOAD_BALANCING_POLICY = "gora.cassandrastore.loadBalancingPolicy";
+  /* boolean */
+  public static final String ENABLE_JMX_REPORTING = "gora.cassandrastore.enableJMXReporting";
+  /* boolean */
+  public static final String ENABLE_METRICS = "gora.cassandrastore.enableMetrics";
+  /* inter */
+  public static final String LOCAL_CORE_CONNECTIONS_PER_HOST = "gora.cassandrastore.localCoreConnectionsPerHost";
+  /* integer */
+  public static final String REMOTE_CORE_CONNECTIONS_PER_HOST = "gora.cassandrastore.remoteCoreConnectionsPerHost";
+  /* integer */
+  public static final String LOCAL_MAX_CONNECTIONS_PER_HOST = "gora.cassandrastore.localMaxConnectionsPerHost";
+  /* integer */
+  public static final String REMOTE_MAX_CONNECTIONS_PER_HOST = "gora.cassandrastore.remoteMaxConnectionsPerHost";
+  /* integer */
+  public static final String LOCAL_NEW_CONNECTION_THRESHOLD= "gora.cassandrastore.localNewConnectionThreshold";
+  /* integer */
+  public static final String REMOTE_NEW_CONNECTION_THRESHOLD = "gora.cassandrastore.remoteNewConnectionThreshold";
+  /* integer */
+  public static final String LOCAL_MAX_REQUESTS_PER_CONNECTION = "gora.cassandrastore.localMaxRequestsPerConnection";
+  /* integer */
+  public static final String REMOTE_MAX_REQUESTS_PER_CONNECTION = "gora.cassandrastore.remoteMaxRequestsPerConnection";
+  /* integer */
+  public static final String PROTOCOL_VERSION = "gora.cassandrastore.protocolVersion";
+  /* "ALL", "ANY", "EACH_QUORUM", "LOCAL_ONE", "LOCAL_QUORUM", "LOCAL_SERIAL", "ONE", "QUORUM", "SERIAL", "THREE", "TWO" */
+  public static final String CONSISTENCY_LEVEL = "gora.cassandrastore.consistencyLevel";
+  /* integer */
+  public static final String FETCH_SIZE = "fetchSize";
+  /* "ALL", "ANY", "EACH_QUORUM", "LOCAL_ONE", "LOCAL_QUORUM", "LOCAL_SERIAL", "ONE", "QUORUM", "SERIAL", "THREE", "TWO" */
+  public static final String SERIAL_CONSISTENCY_LEVEL = "gora.cassandrastore.serialConsistencyLevel";
+  /* "ConstantReconnectionPolicy", "ExponentialReconnectionPolicy",  */
+  public static final String RECONNECTION_POLICY = "gora.cassandrastore.reconnectionPolicy";
+  /* long */
+  public static final String CONSTANT_RECONNECTION_POLICY_DELAY = "gora.cassandrastore.constantReconnectionPolicyDelay";
+  /* long */
+  public static final String EXPONENTIAL_RECONNECTION_POLICY_BASE_DELAY = "gora.cassandrastore.exponentialReconnectionPolicyBaseDelay";
+  /* long */
+  public static final String EXPONENTIAL_RECONNECTION_POLICY_MAX_DELAY = "gora.cassandrastore.exponentialReconnectionPolicyMaxDelay";
+  /* "DefaultRetryPolicy", "DowngradingConsistencyRetryPolicy", "FallthroughRetryPolicy",
+   * "LoggingDefaultRetryPolicy", "LoggingDowngradingConsistencyRetryPolicy", "LoggingFallthroughRetryPolicy" */
+  public static final String RETRY_POLICY = "gora.cassandrastore.retryPolicy";
+  /* integer */
+  public static final String CONNECTION_TIMEOUT_MILLIS = "gora.cassandrastore.connectionTimeoutMillis";
+  /* boolean */
+  public static final String KEEP_ALIVE = "gora.cassandrastore.keepAlive";
+  /* integer */
+  public static final String READ_TIMEOUT_MILLIS = "gora.cassandrastore.readTimeoutMillis";
+  /* integer */
+  public static final String RECEIVER_BUFFER_SIZE = "gora.cassandrastore.receiverBufferSize";
+  /* boolean */
+  public static final String REUSE_ADDRESS = "gora.cassandrastore.reuseAddress";
+  /* integer */
+  public static final String SEND_BUFFER_SIZE = "gora.cassandrastore.sendBufferSize";
+  /* integer */
+  public static final String SO_LINGER = "gora.cassandrastore.soLinger";
+  /* boolean */
+  public static final String TCP_NODELAY = "gora.cassandrastore.tcpNoDelay";
+  /* boolean */
+  public static final String ENABLE_SSL = "gora.cassandrastore.enableSSL";
+  /* string */
+  public static final String DATA_CENTER = "gora.cassandrastore.dataCenter";
+  /* boolean */
+  public static final String ALLOW_REMOTE_DCS_FOR_LOCAL_CONSISTENCY_LEVEL = "gora.cassandrastore.allowRemoteDCsForLocalConsistencyLevel";
+
+}

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/package-info.java
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/package-info.java b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/package-info.java
new file mode 100644
index 0000000..e6d0176
--- /dev/null
+++ b/gora-cassandra-cql/src/main/java/org/apache/gora/cassandra/store/package-info.java
@@ -0,0 +1,20 @@
+/**
+ * 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.
+ */
+/**
+ * This package contains all the Cassandra store related classes.
+ */
+package org.apache.gora.cassandra.store;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/test/conf/cassandra.yaml
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/test/conf/cassandra.yaml b/gora-cassandra-cql/src/test/conf/cassandra.yaml
new file mode 100644
index 0000000..772648d
--- /dev/null
+++ b/gora-cassandra-cql/src/test/conf/cassandra.yaml
@@ -0,0 +1,418 @@
+# Cassandra storage config YAML
+
+# NOTE:
+# See http://wiki.apache.org/cassandra/StorageConfiguration for
+# full explanations of configuration directives
+# /NOTE
+
+# The name of the cluster. This is mainly used to prevent machines in
+# one logical cluster from joining another.
+cluster_name: "Gora Cassandra Test Cluster"
+
+# You should always specify InitialToken when setting up a production
+# cluster for the first time, and often when adding capacity later.
+# The principle is that each node should be given an equal slice of
+# the token ring; see http://wiki.apache.org/cassandra/Operations
+# for more details.
+#
+# If blank, Cassandra will request a token bisecting the range of
+# the heaviest-loaded existing node. If there is no load information
+# available, such as is the case with a new cluster, it will pick
+# a random token, which will lead to hot spots.
+initial_token:
+
+# See http://wiki.apache.org/cassandra/HintedHandoff
+hinted_handoff_enabled: true
+# this defines the maximum amount of time a dead host will have hints
+# generated. After it has been dead this long, hints will be dropped.
+max_hint_window_in_ms: 3600000 # one hour
+# Sleep this long after delivering each row or row fragment
+#hinted_handoff_throttle_delay_in_ms: 50 (deprecated in 2.0.2)
+
+# authentication backend, implementing IAuthenticator; used to identify users
+authenticator: org.apache.cassandra.auth.AllowAllAuthenticator
+
+# authorization backend, implementing IAuthority; used to limit access/provide permissions
+authorizer: org.apache.cassandra.auth.AllowAllAuthorizer
+
+# The partitioner is responsible for distributing rows (by key) across
+# nodes in the cluster. Any IPartitioner may be used, including your
+# own as long as it is on the classpath. Out of the box, Cassandra
+# provides org.apache.cassandra.dht.RandomPartitioner
+# org.apache.cassandra.dht.ByteOrderedPartitioner,
+# org.apache.cassandra.dht.OrderPreservingPartitioner (deprecated),
+# and org.apache.cassandra.dht.CollatingOrderPreservingPartitioner
+# (deprecated).
+#
+# - RandomPartitioner distributes rows across the cluster evenly by md5.
+# When in doubt, this is the best option.
+# - ByteOrderedPartitioner orders rows lexically by key bytes. BOP allows
+# scanning rows in key order, but the ordering can generate hot spots
+# for sequential insertion workloads.
+# - OrderPreservingPartitioner is an obsolete form of BOP, that stores
+# - keys in a less-efficient format and only works with keys that are
+# UTF8-encoded Strings.
+# - CollatingOPP colates according to EN,US rules rather than lexical byte
+# ordering. Use this as an example if you need custom collation.
+#
+# See http://wiki.apache.org/cassandra/Operations for more on
+# partitioners and token selection.
+# partitioner: org.apache.cassandra.dht.RandomPartitioner
+partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
+
+# directories where Cassandra should store data on disk.
+data_file_directories:
+    - target/test/var/lib/cassandra/data
+
+# commit log
+commitlog_directory: target/test/var/lib/cassandra/commitlog
+
+# saved caches
+saved_caches_directory: target/test/var/lib/cassandra/saved_caches
+
+# commitlog_sync may be either "periodic" or "batch."
+# When in batch mode, Cassandra won't ack writes until the commit log
+# has been fsynced to disk. It will wait up to
+# commitlog_sync_batch_window_in_ms milliseconds for other writes, before
+# performing the sync.
+#
+# commitlog_sync: batch
+# commitlog_sync_batch_window_in_ms: 50
+#
+# the other option is "periodic" where writes may be acked immediately
+# and the CommitLog is simply synced every commitlog_sync_period_in_ms
+# milliseconds.
+commitlog_sync: periodic
+commitlog_sync_period_in_ms: 10000
+
+# any class that implements the SeedProvider interface and has a
+# constructor that takes a Map<String, String> of parameters will do.
+seed_provider:
+    # Addresses of hosts that are deemed contact points.
+    # Cassandra nodes use this list of hosts to find each other and learn
+    # the topology of the ring. You must change this if you are running
+    # multiple nodes!
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          # seeds is actually a comma-delimited list of addresses.
+          # Ex: "<ip1>,<ip2>,<ip3>"
+          - seeds: "127.0.0.1"
+
+# emergency pressure valve: each time heap usage after a full (CMS)
+# garbage collection is above this fraction of the max, Cassandra will
+# flush the largest memtables.
+#
+# Set to 1.0 to disable. Setting this lower than
+# CMSInitiatingOccupancyFraction is not likely to be useful.
+#
+# RELYING ON THIS AS YOUR PRIMARY TUNING MECHANISM WILL WORK POORLY:
+# it is most effective under light to moderate load, or read-heavy
+# workloads; under truly massive write load, it will often be too
+# little, too late.
+#flush_largest_memtables_at: 0.75 (deprecated in 2.0.2)
+
+# emergency pressure valve #2: the first time heap usage after a full
+# (CMS) garbage collection is above this fraction of the max,
+# Cassandra will reduce cache maximum _capacity_ to the given fraction
+# of the current _size_. Should usually be set substantially above
+# flush_largest_memtables_at, since that will have less long-term
+# impact on the system.
+#
+# Set to 1.0 to disable. Setting this lower than
+# CMSInitiatingOccupancyFraction is not likely to be useful.
+#reduce_cache_sizes_at: 0.85 (deprecated in 2.0.2)
+#reduce_cache_capacity_to: 0.6 (deprecated in 2.0.2)
+
+# For workloads with more data than can fit in memory, Cassandra's
+# bottleneck will be reads that need to fetch data from
+# disk. "concurrent_reads" should be set to (16 * number_of_drives) in
+# order to allow the operations to enqueue low enough in the stack
+# that the OS and drives can reorder them.
+#
+# On the other hand, since writes are almost never IO bound, the ideal
+# number of "concurrent_writes" is dependent on the number of cores in
+# your system; (8 * number_of_cores) is a good rule of thumb.
+concurrent_reads: 32
+concurrent_writes: 32
+
+# Total memory to use for memtables. Cassandra will flush the largest
+# memtable when this much memory is used.
+# If omitted, Cassandra will set it to 1/3 of the heap.
+# memtable_total_space_in_mb: 2048
+
+# Total space to use for commitlogs.
+# If space gets above this value (it will round up to the next nearest
+# segment multiple), Cassandra will flush every dirty CF in the oldest
+# segment and remove it.
+# commitlog_total_space_in_mb: 4096
+
+# This sets the amount of memtable flush writer threads. These will
+# be blocked by disk io, and each one will hold a memtable in memory
+# while blocked. If you have a large heap and many data directories,
+# you can increase this value for better flush performance.
+# By default this will be set to the amount of data directories defined.
+#memtable_flush_writers: 1
+
+# the number of full memtables to allow pending flush, that is,
+# waiting for a writer thread. At a minimum, this should be set to
+# the maximum number of secondary indexes created on a single CF.
+memtable_flush_queue_size: 4
+
+# Buffer size to use when performing contiguous column slices.
+# Increase this to the size of the column slices you typically perform
+# This property is not accepted in Cassandra 1.1.X
+# sliced_buffer_size_in_kb: 64
+
+# TCP port, for commands and data
+storage_port: 17000
+
+# Address to bind to and tell other Cassandra nodes to connect to. You
+# _must_ change this if you want multiple nodes to be able to
+# communicate!
+#
+# Leaving it blank leaves it up to InetAddress.getLocalHost(). This
+# will always do the Right Thing *if* the node is properly configured
+# (hostname, name resolution, etc), and the Right Thing is to use the
+# address associated with the hostname (it might not be).
+#
+# Setting this to 0.0.0.0 is always wrong.
+listen_address: localhost
+
+# Address to broadcast to other Cassandra nodes
+# Leaving this blank will set it to the same value as listen_address
+# broadcast_address: 1.2.3.4
+
+# The address to bind the Thrift RPC service to -- clients connect
+# here. Unlike ListenAddress above, you *can* specify 0.0.0.0 here if
+# you want Thrift to listen on all interfaces.
+#
+# Leaving this blank has the same effect it does for ListenAddress,
+# (i.e. it will be based on the configured hostname of the node).
+rpc_address: localhost
+# port for Thrift to listen for clients on
+rpc_port: 9160
+
+# enable or disable keepalive on rpc connections
+rpc_keepalive: true
+
+# Cassandra provides three options for the RPC Server:
+#
+# sync -> One connection per thread in the rpc pool (see below).
+# For a very large number of clients, memory will be your limiting
+# factor; on a 64 bit JVM, 128KB is the minimum stack size per thread.
+# Connection pooling is very, very strongly recommended.
+#
+# async -> Nonblocking server implementation with one thread to serve
+# rpc connections. This is not recommended for high throughput use
+# cases. Async has been tested to be about 50% slower than sync
+# or hsha and is deprecated: it will be removed in the next major release.
+#
+# hsha -> Stands for "half synchronous, half asynchronous." The rpc thread pool
+# (see below) is used to manage requests, but the threads are multiplexed
+# across the different clients.
+#
+# The default is sync because on Windows hsha is about 30% slower. On Linux,
+# sync/hsha performance is about the same, with hsha of course using less memory.
+rpc_server_type: sync
+
+# Uncomment rpc_min|max|thread to set request pool size.
+# You would primarily set max for the sync server to safeguard against
+# misbehaved clients; if you do hit the max, Cassandra will block until one
+# disconnects before accepting more. The defaults for sync are min of 16 and max
+# unlimited.
+#
+# For the Hsha server, the min and max both default to quadruple the number of
+# CPU cores.
+#
+# This configuration is ignored by the async server.
+#
+# rpc_min_threads: 16
+# rpc_max_threads: 2048
+
+# uncomment to set socket buffer sizes on rpc connections
+# rpc_send_buff_size_in_bytes:
+# rpc_recv_buff_size_in_bytes:
+
+# Frame size for thrift (maximum field length).
+# 0 disables TFramedTransport in favor of TSocket. This option
+# is deprecated; we strongly recommend using Framed mode.
+thrift_framed_transport_size_in_mb: 15
+
+# The max length of a thrift message, including all fields and
+# internal thrift overhead.
+thrift_max_message_length_in_mb: 16
+
+# Set to true to have Cassandra create a hard link to each sstable
+# flushed or streamed locally in a backups/ subdirectory of the
+# Keyspace data. Removing these links is the operator's
+# responsibility.
+incremental_backups: false
+
+# Whether or not to take a snapshot before each compaction. Be
+# careful using this option, since Cassandra won't clean up the
+# snapshots for you. Mostly useful if you're paranoid when there
+# is a data format change.
+snapshot_before_compaction: false
+
+# Add column indexes to a row after its contents reach this size.
+# Increase if your column values are large, or if you have a very large
+# number of columns. The competing causes are, Cassandra has to
+# deserialize this much of the row to read a single column, so you want
+# it to be small - at least if you do many partial-row reads - but all
+# the index data is read for each access, so you don't want to generate
+# that wastefully either.
+column_index_size_in_kb: 64
+
+# Size limit for rows being compacted in memory. Larger rows will spill
+# over to disk and use a slower two-pass compaction process. A message
+# will be logged specifying the row key.
+in_memory_compaction_limit_in_mb: 64
+
+# Number of simultaneous compactions to allow, NOT including
+# validation "compactions" for anti-entropy repair. Simultaneous
+# compactions can help preserve read performance in a mixed read/write
+# workload, by mitigating the tendency of small sstables to accumulate
+# during a single long running compactions. The default is usually
+# fine and if you experience problems with compaction running too
+# slowly or too fast, you should look at
+# compaction_throughput_mb_per_sec first.
+#
+# This setting has no effect on LeveledCompactionStrategy.
+#
+# concurrent_compactors defaults to the number of cores.
+# Uncomment to make compaction mono-threaded, the pre-0.8 default.
+#concurrent_compactors: 1
+
+# Multi-threaded compaction. When enabled, each compaction will use
+# up to one thread per core, plus one thread per sstable being merged.
+# This is usually only useful for SSD-based hardware: otherwise,
+# your concern is usually to get compaction to do LESS i/o (see:
+# compaction_throughput_mb_per_sec), not more.
+multithreaded_compaction: false
+
+# Throttles compaction to the given total throughput across the entire
+# system. The faster you insert data, the faster you need to compact in
+# order to keep the sstable count down, but in general, setting this to
+# 16 to 32 times the rate you are inserting data is more than sufficient.
+# Setting this to 0 disables throttling. Note that this account for all types
+# of compaction, including validation compaction.
+compaction_throughput_mb_per_sec: 16
+
+# Track cached row keys during compaction, and re-cache their new
+# positions in the compacted sstable. Disable if you use really large
+# key caches.
+compaction_preheat_key_cache: true
+
+# Throttles all outbound streaming file transfers on this node to the
+# given total throughput in Mbps. This is necessary because Cassandra does
+# mostly sequential IO when streaming data during bootstrap or repair, which
+# can lead to saturating the network connection and degrading rpc performance.
+# When unset, the default is 400 Mbps or 50 MB/s.
+# stream_throughput_outbound_megabits_per_sec: 400
+
+# Time to wait for a reply from other nodes before failing the command
+#rpc_timeout_in_ms: 10000 (deprecated in 2.0.2)
+
+# phi value that must be reached for a host to be marked down.
+# most users should never need to adjust this.
+# phi_convict_threshold: 8
+
+# endpoint_snitch -- Set this to a class that implements
+# IEndpointSnitch, which will let Cassandra know enough
+# about your network topology to route requests efficiently.
+# Out of the box, Cassandra provides
+# - org.apache.cassandra.locator.SimpleSnitch:
+# Treats Strategy order as proximity. This improves cache locality
+# when disabling read repair, which can further improve throughput.
+# - org.apache.cassandra.locator.RackInferringSnitch:
+# Proximity is determined by rack and data center, which are
+# assumed to correspond to the 3rd and 2nd octet of each node's
+# IP address, respectively
+# org.apache.cassandra.locator.PropertyFileSnitch:
+# - Proximity is determined by rack and data center, which are
+# explicitly configured in cassandra-topology.properties.
+endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
+
+# controls how often to perform the more expensive part of host score
+# calculation
+dynamic_snitch_update_interval_in_ms: 100
+# controls how often to reset all host scores, allowing a bad host to
+# possibly recover
+dynamic_snitch_reset_interval_in_ms: 600000
+# if set greater than zero and read_repair_chance is < 1.0, this will allow
+# 'pinning' of replicas to hosts in order to increase cache capacity.
+# The badness threshold will control how much worse the pinned host has to be
+# before the dynamic snitch will prefer other replicas over it. This is
+# expressed as a double which represents a percentage. Thus, a value of
+# 0.2 means Cassandra would continue to prefer the static snitch values
+# until the pinned host was 20% worse than the fastest.
+dynamic_snitch_badness_threshold: 0.1
+
+# request_scheduler -- Set this to a class that implements
+# RequestScheduler, which will schedule incoming client requests
+# according to the specific policy. This is useful for multi-tenancy
+# with a single Cassandra cluster.
+# NOTE: This is specifically for requests from the client and does
+# not affect inter node communication.
+# org.apache.cassandra.scheduler.NoScheduler - No scheduling takes place
+# org.apache.cassandra.scheduler.RoundRobinScheduler - Round robin of
+# client requests to a node with a separate queue for each
+# request_scheduler_id. The scheduler is further customized by
+# request_scheduler_options as described below.
+request_scheduler: org.apache.cassandra.scheduler.NoScheduler
+
+# Scheduler Options vary based on the type of scheduler
+# NoScheduler - Has no options
+# RoundRobin
+# - throttle_limit -- The throttle_limit is the number of in-flight
+# requests per client. Requests beyond
+# that limit are queued up until
+# running requests can complete.
+# The value of 80 here is twice the number of
+# concurrent_reads + concurrent_writes.
+# - default_weight -- default_weight is optional and allows for
+# overriding the default which is 1.
+# - weights -- Weights are optional and will default to 1 or the
+# overridden default_weight. The weight translates into how
+# many requests are handled during each turn of the
+# RoundRobin, based on the scheduler id.
+#
+# request_scheduler_options:
+# throttle_limit: 80
+# default_weight: 5
+# weights:
+# Keyspace1: 1
+# Keyspace2: 5
+
+# request_scheduler_id -- An identifer based on which to perform
+# the request scheduling. Currently the only valid option is keyspace.
+# request_scheduler_id: keyspace
+
+# index_interval controls the sampling of entries from the primrary
+# row index in terms of space versus time. The larger the interval,
+# the smaller and less effective the sampling will be. In technicial
+# terms, the interval coresponds to the number of index entries that
+# are skipped between taking each sample. All the sampled entries
+# must fit in memory. Generally, a value between 128 and 512 here
+# coupled with a large key cache size on CFs results in the best trade
+# offs. This value is not often changed, however if you have many
+# very small rows (many to an OS page), then increasing this will
+# often lower memory usage without a impact on performance.
+index_interval: 128
+
+# Enable or disable inter-node encryption
+# Default settings are TLS v1, RSA 1024-bit keys (it is imperative that
+# users generate their own keys) TLS_RSA_WITH_AES_128_CBC_SHA as the cipher
+# suite for authentication, key exchange and encryption of the actual data transfers.
+# NOTE: No custom encryption options are enabled at the moment
+# The available internode options are : all, none
+#
+# The passwords used in these options must match the passwords used when generating
+# the keystore and truststore. For instructions on generating these files, see:
+# http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore
+server_encryption_options:
+    internode_encryption: none
+    keystore: conf/.keystore
+    keystore_password: cassandra
+    truststore: conf/.truststore
+    truststore_password: cassandra

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/test/conf/gora-cassandra-mapping.xml
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/test/conf/gora-cassandra-mapping.xml b/gora-cassandra-cql/src/test/conf/gora-cassandra-mapping.xml
new file mode 100644
index 0000000..460063f
--- /dev/null
+++ b/gora-cassandra-cql/src/test/conf/gora-cassandra-mapping.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~  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.
+  -->
+
+<!--
+   The value of 'host' attribute of keyspace tag should match exactly what is in
+   gora.properties file. Essentially this means that if you are using port number, you should
+   use it every where regardless of whether it is the default port or not.
+   At runtime Gora will otherwise try to connect to localhost
+   https://issues.apache.org/jira/browse/GORA-269
+
+   The values of 'replication_factor' and 'placement_strategy' attribute of keyspace tag
+   only apply if gora create the kyespace. they have no effect if this is being used against 
+   an existing keyspace. the default value for 'replication_factor' is '1'
+   
+   The value of 'placement_strategy' should be a fully qualifed class name that is known to
+   the cassansra cluster, not the application or gora. As of this writing, the classes that ship
+   with cassandra are:
+   'org.apache.cassandra.locator.SimpleStrategy'
+   'org.apache.cassandra.locator.NetworkTopologyStrategy'
+   gora cassandra would use SimpleStrategy by default if no value for this attribute is specified
+   
+   The default value of 'gc_grace_seconds' is '0' which is ONLY VIABLE FOR SINGLE NODE
+   CLUSTER. you should update this value according to your cluster configuration. 
+   https://wiki.apache.org/cassandra/StorageConfiguration
+
+   The value of 'ttl' (time to live) attribute of field tag should most likely always
+   be zero unless you want Cassandra to create Tombstones and delete portions of your
+   data once this period expires. Any positive value is read and bound to the number
+   of seconds after which the value for that field will disappear. The default value of ttl
+   is '0'
+
+   More information on gora-cassandra configuration and mapping's can be found
+   at http://gora.apache.org/current/gora-cassandra.html
+-->
+
+<gora-otd>
+  <keyspace name="Employee" host="localhost:9160" placement_strategy="org.apache.cassandra.locator.SimpleStrategy"
+      replication_factor="1" cluster="Gora Cassandra Test Cluster">
+    <family name="p" gc_grace_seconds="5"/>
+     <family name="sc" type="super" />
+  </keyspace>
+
+  <keyspace name="WebPage" host="localhost:9160" placement_strategy="org.apache.cassandra.locator.SimpleStrategy"
+      replication_factor="1" cluster="Gora Cassandra Test Cluster">
+    <family name="p" gc_grace_seconds="5"/>
+    <family name="sc" type="super"/>
+  </keyspace>
+
+  <keyspace name="TokenDatum" host="localhost:9160" placement_strategy="org.apache.cassandra.locator.SimpleStrategy"
+      replication_factor="1" cluster="Gora Cassandra Test Cluster">
+    <family name="p" gc_grace_seconds="5"/>
+    <family name="sc" type="super"/>
+  </keyspace>
+
+  <class name="org.apache.gora.examples.generated.Employee" keyClass="java.lang.String" keyspace="Employee">
+    <field name="name"  family="p" qualifier="info:nm" ttl="10"/>
+    <field name="dateOfBirth"  family="p" qualifier="info:db" ttl="10"/>
+    <field name="ssn"  family="p" qualifier="info:sn" ttl="10"/>
+    <field name="salary"  family="p" qualifier="info:sl" ttl="10"/>
+    <field name="boss" family="p" qualifier="info:bs" ttl="10"/>
+    <field name="webpage" family="p" qualifier="info:wp" ttl="10"/>
+  </class>
+
+  <class name="org.apache.gora.examples.generated.WebPage" keyClass="java.lang.String" keyspace="WebPage">
+    <field name="url" family="p" qualifier="c:u" ttl="10"/>
+    <field name="content" family="p" qualifier="p:cnt:c" ttl="10"/>
+    <field name="parsedContent" family="sc" qualifier="p:parsedContent" ttl="10"/>
+    <field name="outlinks" family="sc" qualifier="p:outlinks" ttl="10"/>
+    <field name="headers" family="sc" qualifier="p:headers" ttl="10"/>
+    <field name="metadata" family="p" qualifier="c:mt" ttl="10"/>
+    <field name="byteData" family="sc" qualifier="p:byteData" ttl="10"/>
+    <field name="stringData" family="sc" qualifier="p:stringData" ttl="10"/>
+  </class>
+
+  <class name="org.apache.gora.examples.generated.TokenDatum" keyClass="java.lang.String" keyspace="TokenDatum">
+    <field name="count"  family="p" qualifier="common:count" ttl="10"/>
+  </class>
+
+</gora-otd>

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/test/conf/gora.properties
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/test/conf/gora.properties b/gora-cassandra-cql/src/test/conf/gora.properties
new file mode 100644
index 0000000..012ac08
--- /dev/null
+++ b/gora-cassandra-cql/src/test/conf/gora.properties
@@ -0,0 +1,30 @@
+#
+#  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.
+#
+
+gora.datastore.default=org.apache.gora.cassandra.CassandraStore
+gora.cassandrastore.cluster=Gora Cassandra Test Cluster
+gora.cassandrastore.host=localhost:9160
+# property is annotated in CassandraClient#checkKeyspace()
+# options are ANY, ONE, TWO, THREE, LOCAL_QUORUM, EACH_QUORUM, QUORUM and ALL. 
+gora.cassandrastore.cf.consistency.level=ONE
+gora.cassandrastore.read.consistency.level=QUORUM
+gora.cassandrastore.write.consistency.level=ONE
+
+
+
+
+

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/test/conf/log4j-server.properties
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/test/conf/log4j-server.properties b/gora-cassandra-cql/src/test/conf/log4j-server.properties
new file mode 100644
index 0000000..be53c55
--- /dev/null
+++ b/gora-cassandra-cql/src/test/conf/log4j-server.properties
@@ -0,0 +1,48 @@
+#
+#  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.
+#
+
+# for production, you should probably set pattern to %c instead of %l.  
+# (%l is slower.)
+
+# output messages into a rolling log file as well as stdout
+log4j.rootLogger=INFO,stdout,R
+
+# stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%5p %d{HH:mm:ss,SSS} %m%n
+
+# rolling log file
+log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R.maxFileSize=20MB
+log4j.appender.R.maxBackupIndex=50
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=%5p [%t] %d{ISO8601} %F (line %L) %m%n
+# Edit the next line to point to your logs directory
+log4j.appender.R.File=/var/log/cassandra/system.log
+
+# Application logging options
+#log4j.logger.org.apache.cassandra=DEBUG
+#log4j.logger.org.apache.cassandra.db=DEBUG
+#log4j.logger.org.apache.cassandra.service.StorageProxy=DEBUG
+
+# Adding this to avoid thrift logging disconnect errors.
+log4j.logger.org.apache.thrift.server.TNonblockingServer=ERROR
+
+# Add for gora-cassandra specific logging duing tests
+log4j.logger.org.apache.gora.cassandra=DEBUG
+

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/test/java/.gitignore
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/test/java/.gitignore b/gora-cassandra-cql/src/test/java/.gitignore
new file mode 100644
index 0000000..09697dc
--- /dev/null
+++ b/gora-cassandra-cql/src/test/java/.gitignore
@@ -0,0 +1,15 @@
+# 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.
+

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/GoraCassandraTestDriver.java
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/GoraCassandraTestDriver.java b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/GoraCassandraTestDriver.java
new file mode 100644
index 0000000..b36aca4
--- /dev/null
+++ b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/GoraCassandraTestDriver.java
@@ -0,0 +1,157 @@
+/*
+ *  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.
+ */
+
+/**
+ * @author lewismc
+ *
+ */
+
+package org.apache.gora.cassandra;
+
+import org.apache.gora.GoraTestDriver;
+
+import java.io.File;
+
+import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.service.CassandraDaemon;
+
+// Logging imports
+import org.apache.gora.cassandra.store.CassandraStore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Helper class for third party tests using gora-cassandra backend. 
+ * @see GoraTestDriver for test specifics.
+ * This driver is the base for all test cases that require an embedded Cassandra
+ * server. In this case we draw on Hector's @see EmbeddedServerHelper.
+ * It starts (setUp) and stops (tearDown) embedded Cassandra server.
+ * 
+ * @author lewismc
+ */
+
+public class GoraCassandraTestDriver extends GoraTestDriver {
+  private static Logger log = LoggerFactory.getLogger(GoraCassandraTestDriver.class);
+  
+  private String baseDirectory = "target/test";
+
+  private CassandraDaemon cassandraDaemon;
+
+  private Thread cassandraThread;
+
+  /**
+   * @return temporary base directory of running cassandra instance
+   */
+  public String getBaseDirectory() {
+    return baseDirectory;
+  }
+
+  public GoraCassandraTestDriver() {
+    super(CassandraStore.class);
+  }
+	
+  /**
+   * Starts embedded Cassandra server.
+   *
+   * @throws Exception
+   * 	if an error occurs
+   */
+  @Override
+  public void setUpClass(){
+    log.info("Starting embedded Cassandra Server...");
+    try {
+      cleanupDirectoriesFailover();
+      FileUtils.createDirectory(baseDirectory);
+      System.setProperty("log4j.configuration", "log4j-server.properties");
+      System.setProperty("cassandra.config", "cassandra.yaml");
+      
+      cassandraDaemon = new CassandraDaemon();
+      cassandraDaemon.init(null);
+      cassandraThread = new Thread(new Runnable() {
+	
+        public void run() {
+          try {
+            cassandraDaemon.start();
+          } catch (Exception e) {
+            log.error("Embedded casandra server run failed!", e);
+          }
+        }
+      });
+	
+      cassandraThread.setDaemon(true);
+      cassandraThread.start();
+    } catch (Exception e) {
+      log.error("Embedded casandra server start failed!", e);
+
+      // cleanup
+      tearDownClass();
+    }
+  }
+
+  /**
+   * Stops embedded Cassandra server.
+   *
+   * @throws Exception
+   * 	if an error occurs
+   */
+  @Override
+  public void tearDownClass(){
+    log.info("Shutting down Embedded Cassandra server...");
+    if (cassandraThread != null) {
+      cassandraDaemon.stop();
+      cassandraDaemon.destroy();
+      cassandraThread.interrupt();
+      cassandraThread = null;
+    }
+    cleanupDirectoriesFailover();
+  }  
+
+  /**
+   * Cleans up cassandra's temporary base directory.
+   *
+   * In case o failure waits for 250 msecs and then tries it again, 3 times totally.
+   */
+  public void cleanupDirectoriesFailover() {
+    int tries = 3;
+    while (tries-- > 0) {
+      try {
+        cleanupDirectories();
+        break;
+      } catch (Exception e) {
+        // ignore exception
+        try {
+          Thread.sleep(250);
+        } catch (InterruptedException e1) {
+          // ignore exception
+        }
+      }
+    }
+  }
+
+  /**
+   * Cleans up cassandra's temporary base directory.
+   *
+   * @throws Exception
+   * 	if an error occurs
+   */
+  public void cleanupDirectories() throws Exception {
+    File dirFile = new File(baseDirectory);
+    if (dirFile.exists()) {
+      FileUtils.deleteRecursive(dirFile);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/package-info.java
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/package-info.java b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/package-info.java
new file mode 100644
index 0000000..82d5c7e8
--- /dev/null
+++ b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/package-info.java
@@ -0,0 +1,21 @@
+/*
+ *  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.
+ */
+/**
+ * Tests for <code>gora-cassandra</code> including
+ * the test driver for {@link org.apache.gora.cassandra.GoraCassandraTestDriver}
+ */
+package org.apache.gora.cassandra;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStore.java
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStore.java b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStore.java
new file mode 100644
index 0000000..9518891
--- /dev/null
+++ b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/TestCassandraStore.java
@@ -0,0 +1,92 @@
+/**
+ * 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.
+ */
+
+/**
+ * Testing class for all standard gora-cassandra functionality.
+ * We extend DataStoreTestBase enabling us to run the entire base test
+ * suite for Gora. 
+ */
+package org.apache.gora.cassandra.store;
+
+import java.io.IOException;
+
+import org.apache.gora.cassandra.GoraCassandraTestDriver;
+import org.apache.gora.examples.generated.Employee;
+import org.apache.gora.examples.generated.WebPage;
+import org.apache.gora.store.DataStore;
+import org.apache.gora.store.DataStoreFactory;
+import org.apache.gora.store.DataStoreTestBase;
+import org.apache.hadoop.conf.Configuration;
+import org.junit.Before;
+import org.junit.Ignore;
+
+/**
+ * Test for CassandraStore.
+ */
+public class TestCassandraStore extends DataStoreTestBase{
+
+  private Configuration conf;
+
+  static {
+    setTestDriver(new GoraCassandraTestDriver());
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
+  public GoraCassandraTestDriver getTestDriver() {
+    return (GoraCassandraTestDriver) testDriver;
+  }
+
+
+  @Ignore("GORA-299 o.a.g.cassandra.CassandraStore#newQuery() should not use query.setFields(getFieldsToQuery(null));")
+  @Override
+  public void testQuery() throws IOException {}
+  @Ignore("GORA-299 o.a.g.cassandra.CassandraStore#newQuery() should not use query.setFields(getFieldsToQuery(null));")
+  @Override
+  public void testQueryStartKey() throws IOException {}
+  @Ignore("GORA-299 o.a.g.cassandra.CassandraStore#newQuery() should not use query.setFields(getFieldsToQuery(null));")
+  @Override
+  public void testQueryEndKey() throws IOException {}
+  @Ignore("GORA-299 o.a.g.cassandra.CassandraStore#newQuery() should not use query.setFields(getFieldsToQuery(null));")
+  @Override
+  public void testQueryKeyRange() throws IOException {}
+  @Ignore("GORA-299 o.a.g.cassandra.CassandraStore#newQuery() should not use query.setFields(getFieldsToQuery(null));")
+  @Override
+  public void testQueryWebPageSingleKey() throws IOException {}
+  @Ignore("GORA-299 o.a.g.cassandra.CassandraStore#newQuery() should not use query.setFields(getFieldsToQuery(null));")
+  @Override
+  public void testQueryWebPageSingleKeyDefaultFields() throws IOException {}
+  @Ignore("GORA-299 o.a.g.cassandra.CassandraStore#newQuery() should not use query.setFields(getFieldsToQuery(null));")
+  @Override
+  public void testQueryWebPageQueryEmptyResults() throws IOException {}
+  @Ignore("GORA-154 delete() and deleteByQuery() methods are not implemented at CassandraStore, and always returns false or 0")
+  @Override
+  public void testDelete() throws IOException {}
+  @Ignore("GORA-154 delete() and deleteByQuery() methods are not implemented at CassandraStore, and always returns false or 0")
+  @Override
+  public void testDeleteByQuery() throws IOException {}
+  @Ignore("GORA-154 delete() and deleteByQuery() methods are not implemented at CassandraStore, and always returns false or 0")
+  @Override
+  public void testDeleteByQueryFields() throws IOException {}
+  @Ignore("GORA-298 Implement CassandraStore#getPartitions")
+  @Override
+  public void testGetPartitions() throws IOException {}
+}

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/package-info.java
----------------------------------------------------------------------
diff --git a/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/package-info.java b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/package-info.java
new file mode 100644
index 0000000..6e1c6b8
--- /dev/null
+++ b/gora-cassandra-cql/src/test/java/org/apache/gora/cassandra/store/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+/**
+ * This package contains all the unit tests for basic CRUD operations
+ * functionality of the Cassandra dataStore.
+ */
+package org.apache.gora.cassandra.store;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/gora/blob/cd3522aa/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 2c2e20a..bef6928 100644
--- a/pom.xml
+++ b/pom.xml
@@ -749,6 +749,7 @@
     <!-- Amazon Dependencies -->
     <amazon.version>1.10.55</amazon.version>
     <!-- Cassandra Dependencies -->
+    <cassandra-driver.version>3.1.3</cassandra-driver.version>
     <cassandra.version>2.0.2</cassandra.version>
     <hector.version>1.1-4</hector.version>
     <!-- Solr Dependencies -->


Mime
View raw message