1 package org.simantics.event.util;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collections;
\r
5 import java.util.Map;
\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
19 public class EventWriteData {
\r
21 public VirtualGraph vg;
\r
23 public Resource eventLog;
\r
24 public Resource targetSlice;
\r
25 public String sliceName;
\r
27 public Resource counterResource;
\r
28 public Resource firstSliceResource;
\r
29 public Map<String,Resource> slices;
\r
31 public int targetPos;
\r
32 public int targetSliceNumber;
\r
34 public EventWriteData(ReadGraph graph, Resource eventLog, VirtualGraph vg) throws DatabaseException {
\r
35 EventResource EVENT = EventResource.getInstance(graph);
\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
47 public void prepareToWrite(WriteOnlyGraph graph) throws DatabaseException {
\r
49 targetPos = counter % EventUtils.SLICE_SIZE;
\r
50 targetSliceNumber = counter / EventUtils.SLICE_SIZE;
\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
65 public void written() {
\r
69 public void commit(WriteOnlyGraph graph) throws DatabaseException {
\r
71 graph.claimValue(counterResource, counter, Bindings.INTEGER);
\r
73 int toRemove = Math.max(slices.size() - EventUtils.KEEPS_SLICES, 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