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