summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2013-03-06 17:21:35 +0100
committerAndrew Branson <andrew.branson@cern.ch>2013-03-06 17:21:35 +0100
commit330aef68072603b6034e8abadfd5019d70bcbe60 (patch)
tree5429e90cb684bc7857b1c4f42768319af68d5ab7
parent4a58b77cbad6b78bad493f2656d571804fe83ea8 (diff)
Test properties file and memory cluster storage for testing.
-rw-r--r--src/main/java/com/c2kernel/persistency/MemoryOnlyClusterStorage.java113
-rw-r--r--src/test/resources/properties.conf1
2 files changed, 114 insertions, 0 deletions
diff --git a/src/main/java/com/c2kernel/persistency/MemoryOnlyClusterStorage.java b/src/main/java/com/c2kernel/persistency/MemoryOnlyClusterStorage.java
new file mode 100644
index 0000000..a895c32
--- /dev/null
+++ b/src/main/java/com/c2kernel/persistency/MemoryOnlyClusterStorage.java
@@ -0,0 +1,113 @@
+package com.c2kernel.persistency;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.c2kernel.entity.C2KLocalObject;
+
+public class MemoryOnlyClusterStorage extends ClusterStorage {
+
+ HashMap<Integer, Map<String, C2KLocalObject>> memoryCache = new HashMap<Integer, Map<String, C2KLocalObject>>();
+ /**
+ *
+ */
+ public MemoryOnlyClusterStorage() {
+ memoryCache = new HashMap<Integer, Map<String,C2KLocalObject>>();
+ }
+
+ @Override
+ public void open() throws ClusterStorageException {
+
+ }
+
+ @Override
+ public void close() throws ClusterStorageException {
+ }
+
+ @Override
+ public short queryClusterSupport(String clusterType) {
+ return ClusterStorage.READWRITE;
+ }
+
+ @Override
+ public String getName() {
+ return "Memory Cache";
+ }
+
+ @Override
+ public String getId() {
+ return "Memory Cache";
+ }
+
+ @Override
+ public C2KLocalObject get(Integer sysKey, String path)
+ throws ClusterStorageException {
+ Map<String, C2KLocalObject> sysKeyMemCache = memoryCache.get(sysKey);
+ if (sysKeyMemCache != null)
+ return sysKeyMemCache.get(path);
+ return null;
+ }
+
+ @Override
+ public void put(Integer sysKey, C2KLocalObject obj)
+ throws ClusterStorageException {
+
+ // create item cache if not present
+ Map<String, C2KLocalObject> sysKeyMemCache;
+ synchronized (memoryCache) {
+ if (memoryCache.containsKey(sysKey))
+ sysKeyMemCache = memoryCache.get(sysKey);
+ else {
+ sysKeyMemCache = new HashMap<String, C2KLocalObject>();
+ memoryCache.put(sysKey, sysKeyMemCache);
+ }
+ }
+
+ // store object in the cache
+ String path = ClusterStorage.getPath(obj);
+ synchronized(sysKeyMemCache) {
+ sysKeyMemCache.put(path, obj);
+ }
+
+ }
+
+ @Override
+ public void delete(Integer sysKey, String path)
+ throws ClusterStorageException {
+ Map<String, C2KLocalObject> sysKeyMemCache = memoryCache.get(sysKey);
+ if (sysKeyMemCache != null) {
+ synchronized (sysKeyMemCache) {
+ if (sysKeyMemCache.containsKey(path)) {
+ sysKeyMemCache.remove(path);
+ if (sysKeyMemCache.isEmpty()) {
+ synchronized (memoryCache) {
+ memoryCache.remove(sysKey);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public String[] getClusterContents(Integer sysKey, String path)
+ throws ClusterStorageException {
+ Map<String, C2KLocalObject> sysKeyMemCache = memoryCache.get(sysKey);
+ ArrayList<String> result = new ArrayList<String>();
+ if (sysKeyMemCache != null) {
+ if (path.endsWith("/"))
+ path = path.substring(0,path.length()-1);
+ path = path+"/";
+ for (String thisPath : sysKeyMemCache.keySet()) {
+ if (thisPath.startsWith(path)) {
+ int slash = path.indexOf('/');
+ String suffix = slash>-1?path.substring(slash+1):path;
+ if (!result.contains(suffix)) result.add(suffix);
+ }
+ }
+ }
+ return result.toArray(new String[result.size()]);
+ }
+
+}
diff --git a/src/test/resources/properties.conf b/src/test/resources/properties.conf
new file mode 100644
index 0000000..476aeb0
--- /dev/null
+++ b/src/test/resources/properties.conf
@@ -0,0 +1 @@
+ClusterStorage=MemoryOnlyClusterStorage \ No newline at end of file