diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/com/c2kernel/persistency/MemoryOnlyClusterStorage.java | 113 |
1 files changed, 113 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()]);
+ }
+
+}
|
