initial poc commit

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

Branch: refs/heads/master
Commit: e28c661bccd40a0b03221ad6af08c2bcb3075149
Parents: 2b8b061
Author: Kevin Ratnasekera <djkevi...@yahoo.com>
Authored: Sun Jun 19 15:16:41 2016 +0530
Committer: Kevin Ratnasekera <djkevi...@yahoo.com>
Committed: Sun Jun 19 15:16:41 2016 +0530

----------------------------------------------------------------------
 .../org/apache/gora/store/DataStoreFactory.java | 39 ++++++++++
 .../jcache/store/JCacheCacheEntryListener.java  | 53 ++++++++++++++
 .../store/JCacheCacheEntryListenerFactory.java  | 55 ++++++++++++++
 .../jcache/store/JCacheCacheFactoryBuilder.java | 41 +++++++++++
 .../gora/jcache/store/JCacheCacheLoader.java    | 68 ++++++++++++++++++
 .../jcache/store/JCacheCacheLoaderFactory.java  | 63 ++++++++++++++++
 .../gora/jcache/store/JCacheCacheWriter.java    | 75 ++++++++++++++++++++
 .../jcache/store/JCacheCacheWriterFactory.java  | 62 ++++++++++++++++
 .../apache/gora/jcache/store/JCacheStore.java   | 42 +++++++++--
 gora-jcache/src/test/resources/gora.properties  |  3 +-
 gora-jcache/src/test/resources/hazelcast.xml    | 35 +++++++++
 11 files changed, 531 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-core/src/main/java/org/apache/gora/store/DataStoreFactory.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/main/java/org/apache/gora/store/DataStoreFactory.java 
b/gora-core/src/main/java/org/apache/gora/store/DataStoreFactory.java
index e892012..eca57bf 100644
--- a/gora-core/src/main/java/org/apache/gora/store/DataStoreFactory.java
+++ b/gora-core/src/main/java/org/apache/gora/store/DataStoreFactory.java
@@ -42,6 +42,8 @@ public class DataStoreFactory{
 
   public static final String GORA_DEFAULT_DATASTORE_KEY = 
"gora.datastore.default";
 
+  public static final String GORA_DEFAULT_CACHE_DATASTORE_KEY = 
"gora.cache.datastore.default";
+
   public static final String GORA = "gora";
 
   public static final String DATASTORE = "datastore";
@@ -274,6 +276,39 @@ public class DataStoreFactory{
     return createDataStore(c, keyClass, persistent, conf, createProps, null);
   }
 
+
+  /**
+   * Instantiate <i>the default</i> {@link DataStore} wrapped over JCache 
datastore which provides caching
+   * abstraction over any GORA persistence dataStore.
+   * Uses default properties. Uses 'null' schema.
+   *
+   * Note:
+   *    consider that default dataStore is always visible
+   *
+   * @param keyClass The key class.
+   * @param persistent The value class.
+   * @param conf {@link Configuration} to be used be the store.
+   * @param isCacheEnabled caching enable
+   * @return A new store instance.
+   * @throws GoraException
+   */
+  @SuppressWarnings("unchecked")
+  public static <K, T extends Persistent> DataStore<K, T> getDataStore(
+          Class<K> keyClass, Class<T> persistent, Configuration conf, boolean 
isCacheEnabled) throws GoraException {
+    Properties createProps = createProps();
+    Class<? extends DataStore<K, T>> c;
+    try {
+      if (isCacheEnabled) {
+        c = (Class<? extends DataStore<K, T>>) 
Class.forName(getDefaultCacheDataStore(createProps));
+      } else {
+        c = (Class<? extends DataStore<K, T>>) 
Class.forName(getDefaultDataStore(createProps));
+      }
+    } catch (Exception ex) {
+      throw new GoraException(ex);
+    }
+    return createDataStore(c, keyClass, persistent, conf, createProps, null);
+  }
+
   /**
    * Tries to find a property with the given baseKey. First the property
    * key constructed as "gora.&lt;classname&gt;.&lt;baseKey&gt;" is searched.
@@ -381,6 +416,10 @@ public class DataStoreFactory{
     return getProperty(properties, GORA_DEFAULT_DATASTORE_KEY);
   }
 
+  private static String getDefaultCacheDataStore(Properties properties) {
+    return getProperty(properties, GORA_DEFAULT_CACHE_DATASTORE_KEY);
+  }
+
   private static String getProperty(Properties properties, String key) {
     return getProperty(properties, key, null);
   }

http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheEntryListener.java
----------------------------------------------------------------------
diff --git 
a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheEntryListener.java
 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheEntryListener.java
new file mode 100644
index 0000000..9284463
--- /dev/null
+++ 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheEntryListener.java
@@ -0,0 +1,53 @@
+/**
+ * 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.jcache.store;
+
+import org.apache.gora.persistency.impl.PersistentBase;
+
+import javax.cache.event.CacheEntryCreatedListener;
+import javax.cache.event.CacheEntryEvent;
+import javax.cache.event.CacheEntryListenerException;
+import javax.cache.event.CacheEntryRemovedListener;
+import java.util.concurrent.ConcurrentSkipListSet;
+
+public class JCacheCacheEntryListener<K, T extends PersistentBase>
+        implements CacheEntryCreatedListener<K, T>,
+        CacheEntryRemovedListener<K, T> {
+
+  private ConcurrentSkipListSet<K> cacheEntryList;
+
+  public JCacheCacheEntryListener(ConcurrentSkipListSet cacheEntryList) {
+    this.cacheEntryList = cacheEntryList;
+  }
+
+  @Override
+  public void onCreated(Iterable<CacheEntryEvent<? extends K, ? extends T>> 
cacheEntryEvents)
+          throws CacheEntryListenerException {
+    for (CacheEntryEvent<? extends K, ? extends T> event : cacheEntryEvents) {
+      cacheEntryList.add(event.getKey());
+    }
+  }
+
+  @Override
+  public void onRemoved(Iterable<CacheEntryEvent<? extends K, ? extends T>> 
cacheEntryEvents)
+          throws CacheEntryListenerException {
+    for (CacheEntryEvent<? extends K, ? extends T> event : cacheEntryEvents) {
+      cacheEntryList.remove(event.getKey());
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheEntryListenerFactory.java
----------------------------------------------------------------------
diff --git 
a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheEntryListenerFactory.java
 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheEntryListenerFactory.java
new file mode 100644
index 0000000..d1bfc1b
--- /dev/null
+++ 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheEntryListenerFactory.java
@@ -0,0 +1,55 @@
+/**
+ * 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.jcache.store;
+
+import org.apache.gora.persistency.impl.PersistentBase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.cache.configuration.Factory;
+
+public class JCacheCacheEntryListenerFactory <K,T extends PersistentBase>
+        implements Factory<JCacheCacheEntryListener<K, T>> {
+
+  private static final Logger LOG = 
LoggerFactory.getLogger(JCacheCacheEntryListenerFactory.class);
+  public static final long serialVersionUID = 201305101634L;
+  private JCacheCacheEntryListener<K, T> instance;
+
+  public JCacheCacheEntryListenerFactory(JCacheCacheEntryListener<K, T> 
instance) {
+    this.instance = instance;
+  }
+
+  public JCacheCacheEntryListener<K, T> create() {
+    return this.instance;
+  }
+
+  public boolean equals(Object other) {
+    if(this == other) {
+      return true;
+    } else if(other != null && this.getClass() == other.getClass()) {
+      JCacheCacheEntryListenerFactory that = 
(JCacheCacheEntryListenerFactory)other;
+      return this.instance.equals(that.instance);
+    } else {
+      return false;
+    }
+  }
+
+  public int hashCode() {
+    return this.instance.hashCode();
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheFactoryBuilder.java
----------------------------------------------------------------------
diff --git 
a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheFactoryBuilder.java
 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheFactoryBuilder.java
new file mode 100644
index 0000000..cfc8c77
--- /dev/null
+++ 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheFactoryBuilder.java
@@ -0,0 +1,41 @@
+/**
+ * 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.jcache.store;
+
+import org.apache.gora.persistency.impl.PersistentBase;
+
+import javax.cache.configuration.Factory;
+
+public class JCacheCacheFactoryBuilder {
+
+  public static <K, T extends PersistentBase> Factory<JCacheCacheLoader<K,T>>
+  factoryOfCacheLoader(Class<K> keyClass, Class<T> persistentClass) {
+    return new JCacheCacheLoaderFactory<>(keyClass, persistentClass);
+  }
+
+  public static <K, T extends PersistentBase> Factory<JCacheCacheWriter<K,T>>
+  factoryOfCacheWriter(Class<K> keyClass, Class<T> persistentClass) {
+    return new JCacheCacheWriterFactory<>(keyClass, persistentClass);
+  }
+
+  public static <K,T extends PersistentBase> 
Factory<JCacheCacheEntryListener<K, T>>
+  factoryOfEntryListener(JCacheCacheEntryListener<K, T> instance) {
+    return new JCacheCacheEntryListenerFactory<>(instance);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheLoader.java
----------------------------------------------------------------------
diff --git 
a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheLoader.java 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheLoader.java
new file mode 100644
index 0000000..f9b540b
--- /dev/null
+++ 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheLoader.java
@@ -0,0 +1,68 @@
+/**
+ * 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.jcache.store;
+
+import org.apache.gora.persistency.impl.PersistentBase;
+import org.apache.gora.store.DataStore;
+import org.apache.gora.store.DataStoreFactory;
+import org.apache.gora.util.GoraException;
+import org.apache.hadoop.conf.Configuration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.cache.integration.CacheLoader;
+import javax.cache.integration.CacheLoaderException;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class JCacheCacheLoader<K, T extends PersistentBase> implements 
CacheLoader<K, T> {
+
+  private static final Logger LOG = 
LoggerFactory.getLogger(JCacheCacheLoader.class);
+  private DataStore<K, T> dataStore;
+
+  public JCacheCacheLoader(Class<K> keyClass,
+                           Class<T> persistent) throws GoraException {
+    dataStore = DataStoreFactory.getDataStore(keyClass, persistent,
+            new Configuration());
+  }
+
+  @Override
+  public T load(K key) throws CacheLoaderException {
+    T persistent = null;
+    try {
+      persistent = dataStore.get(key);
+    } catch (CacheLoaderException ex) {
+      throw ex;
+    }
+    return persistent;
+  }
+
+  @Override
+  public Map<K, T> loadAll(Iterable<? extends K> keys) throws 
CacheLoaderException {
+    Map<K, T> loaded = new HashMap<K, T>();
+    for (K key : keys) {
+      T persistent = dataStore.get(key);
+      if (persistent != null) {
+        loaded.put(key, persistent);
+      }
+    }
+    return loaded;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheLoaderFactory.java
----------------------------------------------------------------------
diff --git 
a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheLoaderFactory.java
 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheLoaderFactory.java
new file mode 100644
index 0000000..e710515
--- /dev/null
+++ 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheLoaderFactory.java
@@ -0,0 +1,63 @@
+/**
+ * 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.jcache.store;
+
+import org.apache.gora.persistency.impl.PersistentBase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.cache.configuration.Factory;
+import java.lang.reflect.Constructor;
+
+public class JCacheCacheLoaderFactory<K, T extends PersistentBase>
+        implements Factory<JCacheCacheLoader<K,T>> {
+
+  public static final long serialVersionUID = 201305101626L;
+  private static final Logger LOG = 
LoggerFactory.getLogger(JCacheCacheLoaderFactory.class);
+  private Class<K> keyClass;
+  private Class<T> persistentClass;
+
+  public JCacheCacheLoaderFactory(Class<K> keyClass,
+                                      Class<T> persistentClass) {
+    this.keyClass = keyClass;
+    this.persistentClass = persistentClass;
+  }
+
+  public JCacheCacheLoader<K,T> create() {
+    try {
+      return (JCacheCacheLoader<K,T>) new JCacheCacheLoader(keyClass, 
persistentClass);
+    } catch (Exception ex) {
+      throw new RuntimeException("Failed to create an instance of " + 
JCacheCacheLoader.class, ex);
+    }
+  }
+
+  public boolean equals(Object other) {
+    if (this == other) {
+      return true;
+    } else if (other != null && this.getClass() == other.getClass()) {
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  public int hashCode() {
+    return this.hashCode();
+  }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheWriter.java
----------------------------------------------------------------------
diff --git 
a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheWriter.java 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheWriter.java
new file mode 100644
index 0000000..2e7fd00
--- /dev/null
+++ 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheWriter.java
@@ -0,0 +1,75 @@
+/**
+ * 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.jcache.store;
+
+import org.apache.gora.persistency.impl.PersistentBase;
+import org.apache.gora.store.DataStore;
+import org.apache.gora.store.DataStoreFactory;
+import org.apache.gora.util.GoraException;
+import org.apache.hadoop.conf.Configuration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.cache.Cache;
+import javax.cache.integration.CacheWriter;
+import javax.cache.integration.CacheWriterException;
+import java.util.Collection;
+import java.util.Iterator;
+
+public class JCacheCacheWriter<K, T extends PersistentBase> implements 
CacheWriter<K, T> {
+
+  private static final Logger LOG = 
LoggerFactory.getLogger(JCacheCacheWriter.class);
+  private DataStore<K, T> dataStore;
+
+  public JCacheCacheWriter(Class<K> keyClass,
+                           Class<T> persistent) throws GoraException {
+    dataStore = DataStoreFactory.getDataStore(keyClass, persistent,
+            new Configuration());
+  }
+
+  @Override
+  public void write(Cache.Entry<? extends K,
+          ? extends T> entry) throws CacheWriterException {
+    dataStore.put(entry.getKey(), entry.getValue());
+  }
+
+  @Override
+  public void writeAll(Collection<Cache.Entry<? extends K,
+          ? extends T>> entries) throws CacheWriterException {
+    Iterator<Cache.Entry<? extends K, ? extends T>> iterator = 
entries.iterator();
+    while (iterator.hasNext()) {
+      write(iterator.next());
+      iterator.remove();
+    }
+  }
+
+  @Override
+  public void delete(Object key) throws CacheWriterException {
+    dataStore.delete((K) key);
+  }
+
+  @Override
+  public void deleteAll(Collection<?> keys) throws CacheWriterException {
+    Iterator<?> iterator = keys.iterator();
+    while (iterator.hasNext()) {
+      delete(iterator.next());
+      iterator.remove();
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheWriterFactory.java
----------------------------------------------------------------------
diff --git 
a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheWriterFactory.java
 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheWriterFactory.java
new file mode 100644
index 0000000..f50330b
--- /dev/null
+++ 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheCacheWriterFactory.java
@@ -0,0 +1,62 @@
+/**
+ * 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.jcache.store;
+
+import org.apache.gora.persistency.impl.PersistentBase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.cache.configuration.Factory;
+import java.lang.reflect.Constructor;
+
+public class JCacheCacheWriterFactory<K, T extends PersistentBase> implements 
Factory<JCacheCacheWriter<K,T>> {
+
+  public static final long serialVersionUID = 201205101621L;
+  private static final Logger LOG = 
LoggerFactory.getLogger(JCacheCacheWriterFactory.class);
+  private Class<K> keyClass;
+  private Class<T> persistentClass;
+
+  public JCacheCacheWriterFactory(Class<K> keyClass,
+                                  Class<T> persistentClass) {
+    this.keyClass = keyClass;
+    this.persistentClass = persistentClass;
+  }
+
+  public JCacheCacheWriter<K,T> create() {
+    try {
+      return (JCacheCacheWriter<K,T>) new JCacheCacheWriter(keyClass, 
persistentClass);
+    } catch (Exception ex) {
+      throw new RuntimeException("Failed to create an instance of " + 
JCacheCacheWriter.class, ex);
+    }
+  }
+
+  public boolean equals(Object other) {
+    if (this == other) {
+      return true;
+    } else if (other != null && this.getClass() == other.getClass()) {
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  public int hashCode() {
+    return this.hashCode();
+  }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheStore.java
----------------------------------------------------------------------
diff --git 
a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheStore.java 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheStore.java
index 1c52fdd..ab193f6 100644
--- a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheStore.java
+++ b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheStore.java
@@ -20,6 +20,7 @@ package org.apache.gora.jcache.store;
 import java.io.IOException;
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentSkipListSet;
 
 import org.apache.gora.jcache.query.JCacheQuery;
 import org.apache.gora.persistency.impl.PersistentBase;
@@ -30,15 +31,42 @@ import org.apache.gora.store.impl.DataStoreBase;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class JCacheStore<K,T extends PersistentBase> extends 
DataStoreBase<K,T> {
-
+import javax.cache.Cache;
+import javax.cache.CacheManager;
+import javax.cache.Caching;
+import javax.cache.configuration.MutableCacheEntryListenerConfiguration;
+import javax.cache.configuration.MutableConfiguration;
+import javax.cache.spi.CachingProvider;
 
-  public static final Logger LOG = LoggerFactory.getLogger(JCacheStore.class);
+public class JCacheStore<K,T extends PersistentBase> extends 
DataStoreBase<K,T> {
 
+  private Cache<K, T> cache;
+  private CacheManager manager;
+  private ConcurrentSkipListSet<K> cacheEntryList;
+  private static final String GORA_DEFAULT_JCACHE_PROVIDER_KEY = 
"gora.datastore.jcache.provider";
+  private static final Logger LOG = LoggerFactory.getLogger(JCacheStore.class);
 
   @Override
   public void initialize(Class<K> keyClass, Class<T> persistentClass, 
Properties properties) {
     super.initialize(keyClass, persistentClass, properties);
+    CachingProvider cachingProvider = Caching.getCachingProvider(
+           properties.getProperty(GORA_DEFAULT_JCACHE_PROVIDER_KEY)
+    );
+    manager = cachingProvider.getCacheManager();
+    cacheEntryList = new ConcurrentSkipListSet<>();
+    MutableConfiguration<K, T> config = new MutableConfiguration<K, T>();
+    config.setTypes(keyClass, persistentClass);
+    config.setReadThrough(true);
+    config.setWriteThrough(true);
+    
config.setCacheLoaderFactory(JCacheCacheFactoryBuilder.factoryOfCacheLoader(keyClass,persistentClass));
+    
config.setCacheWriterFactory(JCacheCacheFactoryBuilder.factoryOfCacheWriter(keyClass,persistentClass));
+    config.addCacheEntryListenerConfiguration(
+            new MutableCacheEntryListenerConfiguration<>(
+                    JCacheCacheFactoryBuilder.factoryOfEntryListener(new 
JCacheCacheEntryListener<K,T>(cacheEntryList)),
+                    null, true, true
+            )
+    );
+    cache = manager.createCache(persistentClass.getSimpleName(),config);
   }
 
   @Override
@@ -66,12 +94,18 @@ public class JCacheStore<K,T extends PersistentBase> 
extends DataStoreBase<K,T>
   }
 
   @Override
+  public T get(K key){
+    return cache.get(key);
+  }
+
+  @Override
   public void put(K key, T val) {
+    cache.put(key,val);
   }
 
   @Override
   public boolean delete(K key) {
-    return false;
+    return cache.remove(key);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-jcache/src/test/resources/gora.properties
----------------------------------------------------------------------
diff --git a/gora-jcache/src/test/resources/gora.properties 
b/gora-jcache/src/test/resources/gora.properties
index 83f920a..ccbd282 100644
--- a/gora-jcache/src/test/resources/gora.properties
+++ b/gora-jcache/src/test/resources/gora.properties
@@ -13,4 +13,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-gora.datastore.default=org.apache.gora.jcache.store.JCacheStore
+gora.cache.datastore.default=org.apache.gora.jcache.store.JCacheStore
+gora.datastore.jcache.provider=com.hazelcast.cache.HazelcastCachingProvider

http://git-wip-us.apache.org/repos/asf/gora/blob/e28c661b/gora-jcache/src/test/resources/hazelcast.xml
----------------------------------------------------------------------
diff --git a/gora-jcache/src/test/resources/hazelcast.xml 
b/gora-jcache/src/test/resources/hazelcast.xml
new file mode 100755
index 0000000..5f24979
--- /dev/null
+++ b/gora-jcache/src/test/resources/hazelcast.xml
@@ -0,0 +1,35 @@
+<!--
+   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.
+-->
+
+<!--
+  Hazelcast instance configuration hazelcast.xml.
+-->
+
+<hazelcast xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+           xsi:schemaLocation="http://www.hazelcast.com/schema/config
+                               
http://www.hazelcast.com/schema/config/hazelcast-config-3.6.xsd";
+           xmlns="http://www.hazelcast.com/schema/config";>
+
+    <network>
+        <join>
+            <multicast enabled="false"/>
+            <tcp-ip enabled="true">
+                <member>127.0.0.1</member>
+            </tcp-ip>
+        </join>
+    </network>
+</hazelcast>

Reply via email to