1 package org.simantics.acorn.lru;
3 import java.nio.file.Path;
4 import java.util.ArrayList;
5 import java.util.Arrays;
7 import org.simantics.db.service.Bytes;
8 import org.simantics.utils.datastructures.Pair;
10 import gnu.trove.list.array.TByteArrayList;
12 public class ChangeSetInfo extends LRUObject<Long, ChangeSetInfo> {
14 private byte[] metadataBytes;
15 private ArrayList<String> clusterChangeSetIds;
18 public ChangeSetInfo(LRU<Long, ChangeSetInfo> LRU, Path readDir, Long revision, int offset, int length) {
19 super(LRU, revision, readDir, "clusterStream", offset, length, false, false);
24 public ChangeSetInfo(LRU<Long, ChangeSetInfo> LRU, Long revision, byte[] bytes, ArrayList<String> clusterChangeSetIds) {
25 super(LRU, revision, LRU.getDirectory(), "clusterStream", true, true);
26 this.metadataBytes = bytes;
27 this.metadataBytes = bytes;
28 this.clusterChangeSetIds = clusterChangeSetIds;
29 LRU.insert(this, accessTime);
32 public ArrayList<String> getCSSIds() {
33 if(VERIFY) verifyAccess();
34 return clusterChangeSetIds;
37 public byte[] getMetadataBytes() {
39 if(VERIFY) verifyAccess();
47 private static void writeLE(TByteArrayList bytes, int value) {
49 bytes.add( (byte) (value & 0xFF));
50 bytes.add((byte) ((value >>> 8) & 0xFF));
51 bytes.add((byte) ((value >>> 16) & 0xFF));
52 bytes.add((byte) ((value >>> 24) & 0xFF));
57 protected Pair<byte[], Integer> toBytes() {
59 TByteArrayList result = new TByteArrayList();
60 writeLE(result, metadataBytes.length);
61 result.add(metadataBytes);
62 writeLE(result, clusterChangeSetIds.size());
63 for(String id : clusterChangeSetIds) {
64 byte[] bb = id.getBytes();
65 writeLE(result, bb.length);
71 byte[] ret = result.toArray();
73 return Pair.make(ret, ret.length);
79 clusterChangeSetIds = null;
84 public void fromFile(byte[] data) {
86 clusterChangeSetIds = new ArrayList<String>();
88 int metadataLength = Bytes.readLE4(data, 0);
89 metadataBytes = Arrays.copyOfRange(data, 4, 4+metadataLength);
90 int offset = 4+metadataLength;
91 int numberOfChangeSets = Bytes.readLE4(data, offset);
93 for(int i=0;i<numberOfChangeSets;i++) {
94 int length = Bytes.readLE4(data, offset);
96 String id = new String(Arrays.copyOfRange(data, offset, offset+length));
97 clusterChangeSetIds.add(id);
104 String getExtension() {
109 protected boolean overwrite() {