--- /dev/null
+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