]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ClusterChangeManager.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / ClusterChangeManager.java
diff --git a/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ClusterChangeManager.java b/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ClusterChangeManager.java
new file mode 100644 (file)
index 0000000..9f203c8
--- /dev/null
@@ -0,0 +1,65 @@
+package fi.vtt.simantics.procore.internal;\r
+\r
+import gnu.trove.set.hash.THashSet;\r
+\r
+import java.util.Collection;\r
+import java.util.LinkedList;\r
+\r
+public class ClusterChangeManager {\r
+    \r
+    final private THashSet<ClusterChange> clusterChanges = new THashSet<ClusterChange>();\r
+    final private LinkedList<ClusterChange> removeList = new LinkedList<ClusterChange>();\r
+    private int changeCounter = 0;\r
+    private int byteLimit = 65536;\r
+    \r
+    public void checkFlush() {\r
+        if(changeCounter < 50) return;\r
+        ClusterChange test = removeList.poll();\r
+        if(test == null) return;\r
+        if(test.byteIndex > byteLimit) {\r
+            test.flushCollect(null);\r
+        } else {\r
+            removeList.add(test);\r
+        }\r
+    }\r
+    \r
+    public void updateChangeCounters() {\r
+        changeCounter = clusterChanges.size();\r
+        byteLimit = (100-changeCounter)*ClusterChange.MAX_FIXED_BYTES;\r
+    }\r
+\r
+    void addChange(ClusterChange change) {\r
+        clusterChanges.add(change);\r
+        updateChangeCounters();\r
+    }\r
+\r
+    Collection<ClusterChange> get() {\r
+        return clusterChanges;\r
+    }\r
+    \r
+    void add(ClusterChange change) {\r
+        if(clusterChanges.add(change)) {\r
+            removeList.add(change);\r
+        } else {\r
+            new Exception("trying to add change that already exists").printStackTrace();\r
+        }\r
+        updateChangeCounters();\r
+    }\r
+    \r
+    void remove(Collection<ClusterChange> changes) {\r
+        clusterChanges.removeAll(changes);\r
+        removeList.removeAll(changes);\r
+        updateChangeCounters();\r
+    }\r
+    \r
+    int size() {\r
+        return clusterChanges.size();\r
+    }\r
+    \r
+    void clear() {\r
+        clusterChanges.clear();\r
+        removeList.clear();\r
+        updateChangeCounters();\r
+    }\r
+    \r
+}\r