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