]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ChangeSetInfo.java
e1915d32b771aba4e7e1f5109f6be07d83d6b948
[simantics/platform.git] / bundles / org.simantics.acorn / src / org / simantics / acorn / lru / ChangeSetInfo.java
1 package org.simantics.acorn.lru;
2
3 import java.nio.file.Path;
4 import java.util.ArrayList;
5 import java.util.Arrays;
6
7 import org.simantics.acorn.exception.AcornAccessVerificationException;
8 import org.simantics.acorn.exception.IllegalAcornStateException;
9 import org.simantics.db.service.Bytes;
10 import org.simantics.utils.datastructures.Pair;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13
14 import gnu.trove.list.array.TByteArrayList;
15
16 public class ChangeSetInfo extends LRUObject<Long, ChangeSetInfo> {
17
18     private static final Logger LOGGER = LoggerFactory.getLogger(ChangeSetInfo.class);
19         private byte[] metadataBytes;
20         private ArrayList<String> clusterChangeSetIds;
21         
22         // Stub
23         public ChangeSetInfo(LRU<Long, ChangeSetInfo> LRU, Path readDir, Long revision, int offset, int length) throws AcornAccessVerificationException {
24                 super(LRU, revision, readDir, "clusterStream", offset, length, false, false);
25                 LRU.map(this);
26         }
27         
28         // New
29         public ChangeSetInfo(LRU<Long, ChangeSetInfo> LRU, Long revision, byte[] bytes, ArrayList<String> clusterChangeSetIds) throws AcornAccessVerificationException {
30                 super(LRU, revision, LRU.getDirectory(), "clusterStream", true, true);
31                 this.metadataBytes = bytes;
32                 this.metadataBytes = bytes;
33                 this.clusterChangeSetIds = clusterChangeSetIds;
34                 LRU.insert(this, accessTime);
35         }
36         
37         public ArrayList<String> getCCSIds() throws AcornAccessVerificationException {
38                 if(VERIFY) verifyAccess();
39                 return clusterChangeSetIds;
40         }
41         
42         public byte[] getMetadataBytes() throws AcornAccessVerificationException, IllegalAcornStateException {
43                 if(VERIFY)
44                     verifyAccess();
45                 
46                 makeResident();
47                 return metadataBytes;
48         }
49         
50         private static void writeLE(TByteArrayList bytes, int value) {
51                 
52                 bytes.add( (byte) (value & 0xFF));
53                 bytes.add((byte) ((value >>> 8) & 0xFF));
54                 bytes.add((byte) ((value >>> 16) & 0xFF));
55                 bytes.add((byte) ((value >>> 24) & 0xFF));
56
57         }
58
59         @Override
60         protected Pair<byte[], Integer> toBytes() {
61                 
62                 TByteArrayList result = new TByteArrayList();
63                 writeLE(result, metadataBytes.length);
64                 result.add(metadataBytes);
65                 writeLE(result, clusterChangeSetIds.size());
66                 for(String id : clusterChangeSetIds) {
67                         byte[] bb = id.getBytes();
68                         writeLE(result, bb.length);
69                         result.add(bb);
70                 }
71
72                 release();
73                 
74                 byte[] ret = result.toArray();
75                 
76                 return Pair.make(ret, ret.length);
77                 
78         }
79         
80         @Override
81         void release() {
82                 clusterChangeSetIds = null;
83                 metadataBytes = null;
84         }
85
86         @Override
87         public void fromFile(byte[] data) {
88                 
89                 clusterChangeSetIds = new ArrayList<String>();
90                 
91                 int metadataLength = Bytes.readLE4(data, 0);
92                 metadataBytes = Arrays.copyOfRange(data, 4, 4+metadataLength);
93                 int offset = 4+metadataLength;
94                 int numberOfChangeSets = Bytes.readLE4(data, offset);
95                 offset += 4;
96                 for(int i=0;i<numberOfChangeSets;i++) {
97                         int length = Bytes.readLE4(data, offset);
98                         offset += 4;
99                         String id = new String(Arrays.copyOfRange(data, offset, offset+length));
100                         clusterChangeSetIds.add(id);
101                         offset += length;
102                 }
103                 
104         }
105
106         @Override
107         String getExtension() {
108                 return "cs";
109         }
110         
111         @Override
112         protected boolean overwrite() {
113                 return false;
114         }
115
116         @Override
117         public Logger getLogger() {
118             return LOGGER;
119         }
120 }