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