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.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;
15 import gnu.trove.list.array.TByteArrayList;
17 public class ChangeSetInfo extends LRUObject<Long, ChangeSetInfo> {
19 private static final Logger LOGGER = LoggerFactory.getLogger(ChangeSetInfo.class);
20 private byte[] metadataBytes;
21 private ArrayList<String> clusterChangeSetIds;
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);
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);
38 public ArrayList<String> getCCSIds() throws AcornAccessVerificationException {
39 if(VERIFY) verifyAccess();
40 return clusterChangeSetIds;
43 public byte[] getMetadataBytes() throws AcornAccessVerificationException, IllegalAcornStateException {
51 private static void writeLE(TByteArrayList bytes, int value) {
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));
61 protected Pair<byte[], Integer> toBytes() {
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);
75 byte[] ret = result.toArray();
77 return Pair.make(ret, ret.length);
83 clusterChangeSetIds = null;
88 public void fromFile(byte[] data) {
90 clusterChangeSetIds = new ArrayList<String>();
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);
97 for(int i=0;i<numberOfChangeSets;i++) {
98 int length = Bytes.readLE4(data, offset);
100 String id = new String(Arrays.copyOfRange(data, offset, offset+length));
101 clusterChangeSetIds.add(id);
108 String getExtension() {
113 protected boolean overwrite() {
118 public Logger getLogger() {