diff --git a/gora-geode/pom.xml b/gora-geode/pom.xml
deleted file mode 100644
index 420e90c..0000000
--- a/gora-geode/pom.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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">
-    <parent>
-        <artifactId>gora</artifactId>
-        <groupId>org.apache.gora</groupId>
-        <version>1.0-SNAPSHOT</version>
-            <relativePath>../pom.xml</relativePath>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>gora-geode</artifactId>
-
-    <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
-    </properties>
-
-    <dependencies>
-        <!-- 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>
-
-        <dependency>
-            <groupId>org.apache.avro</groupId>
-            <artifactId>avro</artifactId>
-        </dependency>
-
-        <!-- Hadoop Dependencies -->
-        <dependency>
-            <groupId>org.apache.hadoop</groupId>
-            <artifactId>hadoop-client</artifactId>
-        </dependency>
-
-        <!-- Geode Dependencies -->
-        <dependency>
-            <groupId>org.apache.geode</groupId>
-            <artifactId>geode-core</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>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.hadoop</groupId>
-            <artifactId>hadoop-minicluster</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>testcontainers</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-    </dependencies>
-</project>
\ No newline at end of file
diff --git a/gora-geode/src/main/java/org/apache/gora/geode/query/GeodeQuery.java b/gora-geode/src/main/java/org/apache/gora/geode/query/GeodeQuery.java
deleted file mode 100644
index f6684d5..0000000
--- a/gora-geode/src/main/java/org/apache/gora/geode/query/GeodeQuery.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * 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.geode.query;
-
-import org.apache.gora.persistency.impl.PersistentBase;
-import org.apache.gora.query.impl.QueryBase;
-import org.apache.gora.store.DataStore;
-
-/**
- * {@link GeodeQuery} is the primary class
- * responsible for representing a cache manipulation query.
- */
-public class GeodeQuery<K, T extends PersistentBase> extends QueryBase<K, T> {
-
-  public GeodeQuery() {
-    super(null);
-  }
-
-  public GeodeQuery(DataStore<K, T> dataStore) {
-    super(dataStore);
-  }
-
-}
diff --git a/gora-geode/src/main/java/org/apache/gora/geode/query/GeodeResult.java b/gora-geode/src/main/java/org/apache/gora/geode/query/GeodeResult.java
deleted file mode 100644
index 9583270..0000000
--- a/gora-geode/src/main/java/org/apache/gora/geode/query/GeodeResult.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * 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.geode.query;
-
-import org.apache.gora.geode.store.GeodeStore;
-import org.apache.gora.persistency.impl.PersistentBase;
-import org.apache.gora.query.Query;
-import org.apache.gora.query.impl.ResultBase;
-import org.apache.gora.store.DataStore;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.NavigableSet;
-
-/**
- * {@link GeodeResult} is the primary class
- * responsible for representing result set of a cache manipulation query
- * {@link org.apache.gora.geode.query.GeodeQuery}
- */
-public class GeodeResult<K, T extends PersistentBase> extends ResultBase<K, T> {
-
-  private static final Logger LOG = LoggerFactory.getLogger(GeodeResult.class);
-  private NavigableSet<K> cacheKeySet;
-  private Iterator<K> iterator;
-  private int current;
-
-  public GeodeResult(DataStore<K, T> dataStore, Query<K, T> query) {
-    super(dataStore, query);
-  }
-
-  public GeodeResult(DataStore<K, T> dataStore, Query<K, T> query, NavigableSet<K> cacheKeySet) {
-    super(dataStore, query);
-    this.cacheKeySet = cacheKeySet;
-    this.iterator = cacheKeySet.iterator();
-    this.current = 0;
-  }
-
-  public GeodeStore<K, T> getDataStore() {
-    return (GeodeStore<K, T>)  super.getDataStore();
-  }
-
-  @Override
-  public float getProgress() throws IOException {
-    if (cacheKeySet.size() == 0) {
-      return 1;
-    }
-    return ((float) current / (float) cacheKeySet.size());
-  }
-
-  @Override
-  protected boolean nextInner() throws IOException {
-    if (!iterator.hasNext()) {
-      return false;
-    }
-    key = iterator.next();
-    LOG.info("Results set pointer is now moved to key {}.", key);
-    persistent = dataStore.get(key);
-    this.current++;
-    return true;
-  }
-
-  @Override
-  public int size() {
-    int totalSize = cacheKeySet.size();
-    int intLimit = (int) this.limit;
-    return intLimit > 0 && totalSize > intLimit ? intLimit : totalSize;
-  }
-}
diff --git a/gora-geode/src/main/java/org/apache/gora/geode/store/GeodeStore.java b/gora-geode/src/main/java/org/apache/gora/geode/store/GeodeStore.java
deleted file mode 100644
index 97136c1..0000000
--- a/gora-geode/src/main/java/org/apache/gora/geode/store/GeodeStore.java
+++ /dev/null
@@ -1,200 +0,0 @@
-package org.apache.gora.geode.store;
-
-import org.apache.geode.cache.Region;
-import org.apache.geode.cache.CacheFactory;
-import org.apache.geode.cache.RegionFactory;
-import org.apache.geode.cache.RegionShortcut;
-import org.apache.geode.cache.Cache;
-import org.apache.geode.cache.client.ClientCache;
-import org.apache.geode.cache.client.ClientCacheFactory;
-import org.apache.gora.geode.query.GeodeQuery;
-import org.apache.gora.geode.query.GeodeResult;
-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.query.impl.PartitionQueryImpl;
-import org.apache.gora.store.impl.DataStoreBase;
-import org.apache.gora.util.GoraException;
-
-import java.io.IOException;
-import java.util.NavigableSet;
-import java.util.Properties;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.concurrent.ConcurrentSkipListSet;
-
-import static org.apache.geode.cache.RegionShortcut.REPLICATE;
-import static org.apache.gora.geode.store.GeodeStoreParameters.GEODE_USERNAME;
-import static org.apache.gora.geode.store.GeodeStoreParameters.GEODE_SERVER_PORT;
-import static org.apache.gora.geode.store.GeodeStoreParameters.GEODE_SERVER_HOST;
-import static org.apache.gora.geode.store.GeodeStoreParameters.GEODE_PASSWORD;
-import static org.apache.gora.geode.store.GeodeStoreParameters.GEODE_REGION_SHORTCUT;
-import static org.apache.gora.geode.store.GeodeStoreParameters.PREFERRED_SCHEMA_NAME;
-
-
-public class GeodeStore<K, T extends PersistentBase> extends DataStoreBase<K, T> {
-
-    private ClientCache clientCache;
-    private Region<K, T> region;
-    private Properties geodeProperties;
-    private CacheFactory cacheFactory;
-
-    @Override
-    public void initialize(Class<K> keyClass, Class<T> persistentClass, Properties properties) throws GoraException {
-        super.initialize(keyClass, persistentClass, properties);
-        String geodeHostName = (String) properties.get(GEODE_SERVER_HOST);
-        int portNumber = Integer.parseInt((String) properties.get(GEODE_SERVER_PORT));
-        clientCache = new ClientCacheFactory().addPoolLocator(geodeHostName, portNumber).create();
-        String userName = properties.getProperty(GEODE_USERNAME);
-        String password = properties.getProperty(GEODE_PASSWORD);
-        geodeProperties = properties;
-
-        Properties clientProperties = clientCache.getDistributedSystem().getProperties();
-        if (userName != null) {
-            clientProperties.setProperty("security-username", userName);
-            clientProperties.setProperty("security-password", password);
-        } else throw new GoraException();
-        cacheFactory = new CacheFactory(clientProperties);
-    }
-
-    @Override
-    /*
-      Schema Name can be assigned via Property file using @PREFERRED_SCHEMA_NAME, or else PersistentClass name is used as the default schema name.
-     */
-    public String getSchemaName() {
-        String preferredSchemaName = properties.getProperty(PREFERRED_SCHEMA_NAME);
-        if (preferredSchemaName == null) {
-            return persistentClass.getSimpleName();
-        }
-        return preferredSchemaName;
-    }
-
-    @Override
-    public void createSchema() throws GoraException {
-        try {
-            Cache cache = cacheFactory.create();
-            String regionShortCut = geodeProperties.getProperty(GEODE_REGION_SHORTCUT);
-            RegionFactory<K, T> regionFactory;
-            if (regionShortCut != null) {
-                regionFactory = cache.createRegionFactory(RegionShortcut.valueOf(regionShortCut));
-            } else {
-                regionFactory = cache.createRegionFactory(REPLICATE);
-            }
-            region = regionFactory.create(getSchemaName());
-        } catch (Exception e) {
-            throw new GoraException(e);
-        }
-    }
-
-    @Override
-    public void deleteSchema() {
-        region.destroyRegion();
-    }
-
-    @Override
-    public boolean schemaExists() {
-        Properties properties = clientCache.getDistributedSystem().getProperties();
-        CacheFactory factory = new CacheFactory(properties);
-        Cache cache = factory.create();
-        Region<K, T> rf = cache.getRegion(getSchemaName());
-        return rf != null;
-    }
-
-    @Override
-    public boolean exists(K key) {
-        for (K existingKey : region.getInterestList()) {
-            if (existingKey.equals(key)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public T get(K key, String[] fields) {
-        return region.get(key);
-    }
-
-    @Override
-    public void put(K key, T obj) {
-        region.put(key, obj);
-    }
-
-    @Override
-    public boolean delete(K key) {
-        region.destroy(key);
-        return true;
-    }
-
-    @Override
-    public long deleteByQuery(Query<K, T> query) throws GoraException {
-        try {
-            long deletedRows = 0;
-            Result<K, T> result = query.execute();
-            while (result.next()) {
-                if (delete(result.getKey())) {
-                    deletedRows++;
-                }
-            }
-            LOG.info("Geode datastore deleted {} rows from Persistent datastore.", deletedRows);
-            return deletedRows;
-        } catch (Exception e) {
-            throw new GoraException(e);
-        }
-    }
-
-    @Override
-    public Result<K, T> execute(Query<K, T> query) {
-        K startKey = query.getStartKey();
-        K endKey = query.getEndKey();
-        NavigableSet<K> cacheEntrySubList = new ConcurrentSkipListSet<>();
-        if (startKey != null && endKey != null) {
-            boolean isInTheRegion = false;
-            for (K key : region.keySet()) {
-                if (key == startKey) {
-                    isInTheRegion = true;
-                }
-                if (isInTheRegion) {
-                    cacheEntrySubList.add(key);
-                }
-                if (key == endKey) {
-                    break;
-                }
-            }
-        } else {
-            // Empty
-            cacheEntrySubList = Collections.emptyNavigableSet();
-        }
-        return new GeodeResult<>(this, query, cacheEntrySubList);
-    }
-
-
-    @Override
-    public Query<K, T> newQuery() {
-        GeodeQuery<K, T> query = new GeodeQuery<>(this);
-        query.setFields(getFieldsToQuery(null));
-        return query;
-    }
-
-    @Override
-    public List<PartitionQuery<K, T>> getPartitions(Query<K, T> query) throws IOException {
-        List<PartitionQuery<K, T>> partitions = new ArrayList<>();
-        PartitionQueryImpl<K, T> partitionQuery = new PartitionQueryImpl<>(
-                query);
-        partitionQuery.setConf(this.getConf());
-        partitions.add(partitionQuery);
-        return partitions;
-    }
-
-    @Override
-    public void flush() {
-        LOG.info("Geode datastore flushed successfully.");
-    }
-
-    @Override
-    public void close() {
-
-    }
-}
diff --git a/gora-geode/src/main/java/org/apache/gora/geode/store/GeodeStoreParameters.java b/gora-geode/src/main/java/org/apache/gora/geode/store/GeodeStoreParameters.java
deleted file mode 100644
index 138bc29..0000000
--- a/gora-geode/src/main/java/org/apache/gora/geode/store/GeodeStoreParameters.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  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.geode.store;
-
-/**
- * Configuration Properties.
- */
-public class GeodeStoreParameters {
-
-  /**
-   * Property pointing to geode server contact points.
-   * string (multiple values with comma separated)
-   */
-  public static final String GEODE_SERVER_HOST = "gora.geode.server.hostname";
-
-  /**
-   * Property pointing to the port to use to connect to the geode hosts.
-   * integer
-   */
-  public static final String GEODE_SERVER_PORT = "gora.geode.server.port";
-
-  /**
-   * Property pointing to the gora schemaName.
-   * integer
-   */
-  public static final String PREFERRED_SCHEMA_NAME = "gora.geode.preferred.schemaName";
-
-  /**
-   * Property pointing to the geode region shortcut.
-   * integer
-   */
-  public static final String GEODE_REGION_SHORTCUT = "gora.geode.region.shortcut";
-
-  /**
-   * Property pointing to the username to connect to the server.
-   * string
-   */
-  public static final String GEODE_USERNAME = "gora.geode.username";
-
-  /**
-   * Property pointing to the password to connect to the server.
-   * string
-   */
-  public static final String GEODE_PASSWORD = "gora.geode.password";
-
-}
diff --git a/gora-geode/src/test/conf/gora.properties b/gora-geode/src/test/conf/gora.properties
deleted file mode 100644
index 3e8e111..0000000
--- a/gora-geode/src/test/conf/gora.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# 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.geode.store.GeodeStore
-gora.datastore.geode.server=localhost
-gora.datastore.geode.port="gora.geode.server.port"
\ No newline at end of file
diff --git a/gora-geode/src/test/java/org/apache/gora/geode/GeodeStartupLogWaitStrategy.java b/gora-geode/src/test/java/org/apache/gora/geode/GeodeStartupLogWaitStrategy.java
deleted file mode 100644
index 67110ba..0000000
--- a/gora-geode/src/test/java/org/apache/gora/geode/GeodeStartupLogWaitStrategy.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.geode;
-
-import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
-
-
-/**
- * Log based Geode server startup wait strategy to sync server
- * startup to test suit startup.
- */
-public class GeodeStartupLogWaitStrategy extends LogMessageWaitStrategy {
-
-    private static final String regEx = ".*Apache Geode has started. Time to relax..*";
-
-    public GeodeStartupLogWaitStrategy() {
-        withRegEx(regEx);
-    }
-
-}
\ No newline at end of file
diff --git a/gora-geode/src/test/java/org/apache/gora/geode/GoraGeodeTestDriver.java b/gora-geode/src/test/java/org/apache/gora/geode/GoraGeodeTestDriver.java
deleted file mode 100644
index c11e5c5..0000000
--- a/gora-geode/src/test/java/org/apache/gora/geode/GoraGeodeTestDriver.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.geode;
-
-import org.apache.gora.GoraTestDriver;
-
-import org.apache.gora.geode.store.GeodeStore;
-import org.apache.gora.geode.store.GeodeStoreParameters;
-import org.apache.gora.persistency.Persistent;
-import org.apache.gora.store.DataStore;
-import org.apache.gora.store.DataStoreFactory;
-import org.apache.gora.util.GoraException;
-import org.testcontainers.containers.GenericContainer;
-
-import java.util.Properties;
-
-import static org.apache.gora.geode.store.GeodeStoreParameters.GEODE_SERVER_PORT;
-
-/**
- * Helper class for third party tests using gora-geode backend.
- * @see GoraTestDriver for test specifics.
- * This driver is the base for all test cases that require an Geode server.
- * In this case we use docker container. A docker container is run before tests
- * and it is stopped after tests.
- *
- */
-public class GoraGeodeTestDriver extends GoraTestDriver {
-
-    private final GenericContainer GeodeContainer;
-    private Properties properties = DataStoreFactory.createProps();
-
-    /**
-     * Default constructor
-     */
-    public GoraGeodeTestDriver(GenericContainer GeodeContainer) {
-        super(GeodeStore.class);
-        this.GeodeContainer = GeodeContainer;
-    }
-
-    @Override
-    public void setUpClass() {
-        log.info("Setting up Geode Test Driver");
-        properties.put(GeodeStoreParameters.GEODE_SERVER_HOST, GeodeContainer.getContainerIpAddress());
-        properties.put(GEODE_SERVER_PORT, GeodeContainer.getMappedPort(10334).toString());
-    }
-
-    @Override
-    public void tearDownClass() {
-        log.info("Teardown Geode test driver");
-    }
-
-    /**
-     * Instantiate a new {@link DataStore}. Uses 'null' schema.
-     *
-     * @param keyClass The key class.
-     * @param persistentClass The value class.
-     * @return A new store instance.
-     * @throws GoraException
-     */
-    @Override
-    public <K, T extends Persistent> DataStore<K, T> createDataStore(Class<K> keyClass, Class<T> persistentClass)
-            throws GoraException {
-
-        final DataStore<K, T> dataStore = DataStoreFactory
-                .createDataStore((Class<? extends DataStore<K, T>>) dataStoreClass, keyClass, persistentClass, conf,
-                        properties);
-        dataStores.add(dataStore);
-        log.info("Datastore for {} was added.", persistentClass);
-        return dataStore;
-    }
-
-}
diff --git a/gora-geode/src/test/java/store/TestGeodeStore.java b/gora-geode/src/test/java/store/TestGeodeStore.java
deleted file mode 100644
index 421a766..0000000
--- a/gora-geode/src/test/java/store/TestGeodeStore.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * 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
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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 store;
-
-
-
-import org.apache.avro.util.Utf8;
-import org.apache.gora.examples.WebPageDataCreator;
-import org.apache.gora.examples.generated.WebPage;
-import org.apache.gora.geode.GeodeStartupLogWaitStrategy;
-import org.apache.gora.geode.GoraGeodeTestDriver;
-import org.apache.gora.geode.query.GeodeResult;
-import org.apache.gora.query.Query;
-import org.apache.gora.store.DataStoreTestBase;
-import org.apache.gora.util.GoraException;
-import org.junit.ClassRule;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.testcontainers.containers.GenericContainer;
-
-
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.time.Duration;
-
-import static org.junit.Assert.*;
-
-/**
- * Tests extending {@link DataStoreTestBase}
- * which run the base JUnit test suite for Gora.
- */
-public class TestGeodeStore extends DataStoreTestBase {
-
-    private static final String DOCKER_CONTAINER_NAME = "apachegeode/" +
-            "" +
-            "geode:1.15.0";
-
-    /**
-     * JUnit integration testing with Docker and Testcontainers
-     */
-    @ClassRule
-    public static GenericContainer Geode_CONTAINER = new GenericContainer(DOCKER_CONTAINER_NAME)
-            .withExposedPorts(10334)
-            .waitingFor(new GeodeStartupLogWaitStrategy())
-            .withStartupTimeout(Duration.ofSeconds(300));
-
-
-   // void withCommand("tail","-f","/dev/null").start();
-
-   // geode = new GenericContainer<>("apachegeode/geode:1.12.0");
-
-
-    static {
-        try {
-            setTestDriver(new GoraGeodeTestDriver(Geode_CONTAINER));
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @Test
-    public void testPutAndGet() throws GoraException {
-        WebPage page = webPageStore.newPersistent();
-
-        // Write webpage data
-        page.setUrl(new Utf8("http://example.com"));
-        byte[] contentBytes = "example content in example.com".getBytes(Charset.defaultCharset());
-        ByteBuffer buff = ByteBuffer.wrap(contentBytes);
-        page.setContent(buff);
-        webPageStore.put("com.example/http", page);
-        webPageStore.flush();
-
-        WebPage storedPage = webPageStore.get("com.example/http");
-
-        assertNotNull(storedPage);
-        assertEquals(page.getUrl(), storedPage.getUrl());
-    }
-
-    @Test
-    public void testCreateAndDeleteSchema() throws IOException {
-        WebPage page = webPageStore.newPersistent();
-
-        // Write webpage data
-        page.setUrl(new Utf8("http://example.com"));
-        webPageStore.put("com.example/http", page);
-        webPageStore.flush();
-
-        assertEquals("WebPage isn't created.", page.getUrl(), webPageStore.get("com.example/http").getUrl());
-
-        webPageStore.deleteSchema();
-
-        assertNull(webPageStore.get("com.example/http"));
-    }
-
-    @Test
-    public void testGetSchemaName() throws IOException {
-        assertEquals("WebPage", webPageStore.getSchemaName());
-        assertEquals("Employee", employeeStore.getSchemaName());
-    }
-
-    @Test
-    public void testExecute() throws IOException {
-        WebPageDataCreator.createWebPageData(webPageStore);
-
-        final Query<String, WebPage> query = webPageStore.newQuery();
-
-        int limit = 5;
-        query.setLimit(limit);
-        GeodeResult<String, WebPage> result = (GeodeResult<String, WebPage>) webPageStore.execute(query);
-        assertEquals(limit, result.size());
-
-        limit = 10;
-        query.setLimit(limit);
-        result = (GeodeResult<String, WebPage>) webPageStore.execute(query);
-        assertEquals(limit, result.size());
-
-    }
-
-    /**
-     * By design, you cannot update a Geode document blindly, you can only attempt to update a specific revision of a document. FIXME
-     */
-    @Test
-    @Ignore
-    public void testUpdate() throws Exception {
-        //By design, you cannot update a Geode document blindly, you can only attempt to update a specific revision of a document. FIXME
-    }
-
-    @Ignore("GeodeStore doesn't support 3 types union field yet")
-    @Override
-    public void testGet3UnionField() throws Exception {
-        // GeodeStore doesn't support 3 types union field yet
-    }
-
-    @Ignore("Skip until GORA-66 is fixed: need better semantic for end/start keys")
-    @Override
-    public void testDeleteByQueryFields() throws IOException {
-        // Skip until GORA-66 is fixed: need better semantic for end/start keys
-    }
-
-}
diff --git a/pom.xml b/pom.xml
index ab2244e..5dc91ea 100755
--- a/pom.xml
+++ b/pom.xml
@@ -780,7 +780,6 @@
     <module>gora-arangodb</module>
     <module>gora-rethinkdb</module>
     <module>gora-elasticsearch</module>
-    <module>gora-geode</module>
     <module>gora-tutorial</module>
     <module>gora-benchmark</module>
     <module>sources-dist</module>
@@ -1640,13 +1639,6 @@
         <version>2.0.10</version>
       </dependency>
 
-      <!-- Geode Dependencies -->
-      <dependency>
-        <groupId>org.apache.geode</groupId>
-        <artifactId>geode-core</artifactId>
-        <version>1.15.0</version>
-      </dependency>
-
       <!-- Amazon Dependencies -->
       <dependency>
         <groupId>com.amazonaws</groupId>
