]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.event/src/org/simantics/event/util/EventWriteData.java b/bundles/org.simantics.event/src/org/simantics/event/util/EventWriteData.java
new file mode 100644 (file)
index 0000000..b53957e
--- /dev/null
@@ -0,0 +1,89 @@
+package org.simantics.event.util;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Map;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.VirtualGraph;\r
+import org.simantics.db.WriteOnlyGraph;\r
+import org.simantics.db.common.uri.UnescapedChildMapOfResource;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.util.Layer0Utils;\r
+import org.simantics.event.ontology.EventResource;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.utils.strings.AlphanumComparator;\r
+\r
+public class EventWriteData {\r
+       \r
+       public VirtualGraph vg;\r
+       public Layer0 L0;\r
+       public Resource eventLog;\r
+       public Resource targetSlice;\r
+       public String sliceName;\r
+       public int counter;\r
+       public Resource counterResource;\r
+       public Resource firstSliceResource;\r
+       public Map<String,Resource> slices;\r
+       \r
+       public int targetPos;\r
+       public int targetSliceNumber;\r
+       \r
+       public EventWriteData(ReadGraph graph, Resource eventLog, VirtualGraph vg) throws DatabaseException {\r
+               EventResource EVENT = EventResource.getInstance(graph);\r
+               this.vg = vg;\r
+               this.L0 = Layer0.getInstance(graph);\r
+               this.eventLog = eventLog;\r
+               this.counterResource = graph.getSingleObject(eventLog, EVENT.HasModificationCounter);\r
+               this.counter = graph.getValue(this.counterResource, Bindings.INTEGER);  \r
+        int sliceNumber = this.counter / EventUtils.SLICE_SIZE;\r
+        this.targetSlice = Layer0Utils.getPossibleChild(graph, eventLog, ""+sliceNumber);\r
+        this.sliceName = (this.targetSlice != null) ? ""+sliceNumber : "";\r
+        this.slices = graph.syncRequest(new UnescapedChildMapOfResource(eventLog));\r
+       }\r
+       \r
+       public void prepareToWrite(WriteOnlyGraph graph) throws DatabaseException {\r
+\r
+               targetPos = counter % EventUtils.SLICE_SIZE;\r
+           targetSliceNumber = counter / EventUtils.SLICE_SIZE;\r
+           \r
+           if(targetPos == 0 && !sliceName.equals(""+targetSliceNumber)) {\r
+               Layer0 L0 = graph.getService(Layer0.class);\r
+               EventResource EVENT = graph.getService(EventResource.class);\r
+               targetSlice = graph.newResource();\r
+               graph.claim(targetSlice, L0.InstanceOf, null, EVENT.EventSlice);\r
+               graph.addLiteral(targetSlice, L0.HasName, L0.NameOf, L0.String, ""+targetSliceNumber, Bindings.STRING);\r
+               graph.claim(targetSlice, L0.PartOf, L0.ConsistsOf, eventLog);\r
+               slices.put(""+targetSliceNumber, targetSlice);\r
+               sliceName = ""+targetSliceNumber;\r
+           }\r
+               \r
+       }\r
+       \r
+       public void written() {\r
+        counter++;\r
+       }\r
+       \r
+       public void commit(WriteOnlyGraph graph) throws DatabaseException {\r
+               \r
+        graph.claimValue(counterResource, counter, Bindings.INTEGER);\r
+        \r
+        int toRemove = Math.max(slices.size() - EventUtils.KEEPS_SLICES, 0); \r
+        \r
+        if(toRemove > 0) {\r
+//             System.err.println("toRemove with counter=" + counter);\r
+               ArrayList<String> keys = new ArrayList<String>(slices.keySet());\r
+               Collections.sort(keys, AlphanumComparator.COMPARATOR);\r
+               for(int i=0;i<toRemove;i++) {\r
+//             System.err.println("-remove " + keys.get(i));\r
+                       graph.deny(eventLog, L0.ConsistsOf, L0.PartOf, slices.get(keys.get(i)), vg);\r
+               }\r
+        }\r
+        \r
+        \r
+        \r
+       }\r
+       \r
+}
\ No newline at end of file