Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / ClusterChangeManager.java
1 package fi.vtt.simantics.procore.internal;\r
2 \r
3 import gnu.trove.set.hash.THashSet;\r
4 \r
5 import java.util.Collection;\r
6 import java.util.LinkedList;\r
7 \r
8 public class ClusterChangeManager {\r
9     \r
10     final private THashSet<ClusterChange> clusterChanges = new THashSet<ClusterChange>();\r
11     final private LinkedList<ClusterChange> removeList = new LinkedList<ClusterChange>();\r
12     private int changeCounter = 0;\r
13     private int byteLimit = 65536;\r
14     \r
15     public void checkFlush() {\r
16         if(changeCounter < 50) return;\r
17         ClusterChange test = removeList.poll();\r
18         if(test == null) return;\r
19         if(test.byteIndex > byteLimit) {\r
20             test.flushCollect(null);\r
21         } else {\r
22             removeList.add(test);\r
23         }\r
24     }\r
25     \r
26     public void updateChangeCounters() {\r
27         changeCounter = clusterChanges.size();\r
28         byteLimit = (100-changeCounter)*ClusterChange.MAX_FIXED_BYTES;\r
29     }\r
30 \r
31     void addChange(ClusterChange change) {\r
32         clusterChanges.add(change);\r
33         updateChangeCounters();\r
34     }\r
35 \r
36     Collection<ClusterChange> get() {\r
37         return clusterChanges;\r
38     }\r
39     \r
40     void add(ClusterChange change) {\r
41         if(clusterChanges.add(change)) {\r
42             removeList.add(change);\r
43         } else {\r
44             new Exception("trying to add change that already exists").printStackTrace();\r
45         }\r
46         updateChangeCounters();\r
47     }\r
48     \r
49     void remove(Collection<ClusterChange> changes) {\r
50         clusterChanges.removeAll(changes);\r
51         removeList.removeAll(changes);\r
52         updateChangeCounters();\r
53     }\r
54     \r
55     int size() {\r
56         return clusterChanges.size();\r
57     }\r
58     \r
59     void clear() {\r
60         clusterChanges.clear();\r
61         removeList.clear();\r
62         updateChangeCounters();\r
63     }\r
64     \r
65 }\r