]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.event/src/org/simantics/event/util/EventWriteData.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.event / src / org / simantics / event / util / EventWriteData.java
1 package org.simantics.event.util;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collections;\r
5 import java.util.Map;\r
6 \r
7 import org.simantics.databoard.Bindings;\r
8 import org.simantics.db.ReadGraph;\r
9 import org.simantics.db.Resource;\r
10 import org.simantics.db.VirtualGraph;\r
11 import org.simantics.db.WriteOnlyGraph;\r
12 import org.simantics.db.common.uri.UnescapedChildMapOfResource;\r
13 import org.simantics.db.exception.DatabaseException;\r
14 import org.simantics.db.layer0.util.Layer0Utils;\r
15 import org.simantics.event.ontology.EventResource;\r
16 import org.simantics.layer0.Layer0;\r
17 import org.simantics.utils.strings.AlphanumComparator;\r
18 \r
19 public class EventWriteData {\r
20         \r
21         public VirtualGraph vg;\r
22         public Layer0 L0;\r
23         public Resource eventLog;\r
24         public Resource targetSlice;\r
25         public String sliceName;\r
26         public int counter;\r
27         public Resource counterResource;\r
28         public Resource firstSliceResource;\r
29         public Map<String,Resource> slices;\r
30         \r
31         public int targetPos;\r
32         public int targetSliceNumber;\r
33         \r
34         public EventWriteData(ReadGraph graph, Resource eventLog, VirtualGraph vg) throws DatabaseException {\r
35                 EventResource EVENT = EventResource.getInstance(graph);\r
36                 this.vg = vg;\r
37                 this.L0 = Layer0.getInstance(graph);\r
38                 this.eventLog = eventLog;\r
39                 this.counterResource = graph.getSingleObject(eventLog, EVENT.HasModificationCounter);\r
40                 this.counter = graph.getValue(this.counterResource, Bindings.INTEGER);  \r
41         int sliceNumber = this.counter / EventUtils.SLICE_SIZE;\r
42         this.targetSlice = Layer0Utils.getPossibleChild(graph, eventLog, ""+sliceNumber);\r
43         this.sliceName = (this.targetSlice != null) ? ""+sliceNumber : "";\r
44         this.slices = graph.syncRequest(new UnescapedChildMapOfResource(eventLog));\r
45         }\r
46         \r
47         public void prepareToWrite(WriteOnlyGraph graph) throws DatabaseException {\r
48 \r
49                 targetPos = counter % EventUtils.SLICE_SIZE;\r
50             targetSliceNumber = counter / EventUtils.SLICE_SIZE;\r
51             \r
52             if(targetPos == 0 && !sliceName.equals(""+targetSliceNumber)) {\r
53                 Layer0 L0 = graph.getService(Layer0.class);\r
54                 EventResource EVENT = graph.getService(EventResource.class);\r
55                 targetSlice = graph.newResource();\r
56                 graph.claim(targetSlice, L0.InstanceOf, null, EVENT.EventSlice);\r
57                 graph.addLiteral(targetSlice, L0.HasName, L0.NameOf, L0.String, ""+targetSliceNumber, Bindings.STRING);\r
58                 graph.claim(targetSlice, L0.PartOf, L0.ConsistsOf, eventLog);\r
59                 slices.put(""+targetSliceNumber, targetSlice);\r
60                 sliceName = ""+targetSliceNumber;\r
61             }\r
62                 \r
63         }\r
64         \r
65         public void written() {\r
66         counter++;\r
67         }\r
68         \r
69         public void commit(WriteOnlyGraph graph) throws DatabaseException {\r
70                 \r
71         graph.claimValue(counterResource, counter, Bindings.INTEGER);\r
72         \r
73         int toRemove = Math.max(slices.size() - EventUtils.KEEPS_SLICES, 0); \r
74         \r
75         if(toRemove > 0) {\r
76 //              System.err.println("toRemove with counter=" + counter);\r
77                 ArrayList<String> keys = new ArrayList<String>(slices.keySet());\r
78                 Collections.sort(keys, AlphanumComparator.COMPARATOR);\r
79                 for(int i=0;i<toRemove;i++) {\r
80 //              System.err.println("-remove " + keys.get(i));\r
81                         graph.deny(eventLog, L0.ConsistsOf, L0.PartOf, slices.get(keys.get(i)), vg);\r
82                 }\r
83         }\r
84         \r
85         \r
86         \r
87         }\r
88         \r
89 }