diff options
| author | Andrew Branson <andrew.branson@cern.ch> | 2013-03-06 17:21:35 +0100 |
|---|---|---|
| committer | Andrew Branson <andrew.branson@cern.ch> | 2013-03-06 17:21:35 +0100 |
| commit | 330aef68072603b6034e8abadfd5019d70bcbe60 (patch) | |
| tree | 5429e90cb684bc7857b1c4f42768319af68d5ab7 | |
| parent | 4a58b77cbad6b78bad493f2656d571804fe83ea8 (diff) | |
Test properties file and memory cluster storage for testing.
| -rw-r--r-- | src/main/java/com/c2kernel/persistency/MemoryOnlyClusterStorage.java | 113 | ||||
| -rw-r--r-- | src/test/resources/properties.conf | 1 |
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 |
