]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ChangeSetInfo.java
Sharing org.simantics.acorn for everyone to use
[simantics/platform.git] / bundles / org.simantics.acorn / src / org / simantics / acorn / lru / ChangeSetInfo.java
diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ChangeSetInfo.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ChangeSetInfo.java
new file mode 100644 (file)
index 0000000..12351a5
--- /dev/null
@@ -0,0 +1,113 @@
+package org.simantics.acorn.lru;
+
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.simantics.db.service.Bytes;
+import org.simantics.utils.datastructures.Pair;
+
+import gnu.trove.list.array.TByteArrayList;
+
+public class ChangeSetInfo extends LRUObject<Long, ChangeSetInfo> {
+
+       private byte[] metadataBytes;
+       private ArrayList<String> clusterChangeSetIds;
+       
+       // Stub
+       public ChangeSetInfo(LRU<Long, ChangeSetInfo> LRU, Path readDir, Long revision, int offset, int length) {
+               super(LRU, revision, readDir, "clusterStream", offset, length, false, false);
+               LRU.map(this);
+       }
+       
+       // New
+       public ChangeSetInfo(LRU<Long, ChangeSetInfo> LRU, Long revision, byte[] bytes, ArrayList<String> clusterChangeSetIds) {
+               super(LRU, revision, LRU.getDirectory(), "clusterStream", true, true);
+               this.metadataBytes = bytes;
+               this.metadataBytes = bytes;
+               this.clusterChangeSetIds = clusterChangeSetIds;
+               LRU.insert(this, accessTime);
+       }
+       
+       public ArrayList<String> getCSSIds() {
+               if(VERIFY) verifyAccess();
+               return clusterChangeSetIds;
+       }
+       
+       public byte[] getMetadataBytes() {
+               
+               if(VERIFY) verifyAccess();
+               
+               makeResident();
+               
+               return metadataBytes;
+               
+       }
+       
+       private static void writeLE(TByteArrayList bytes, int value) {
+               
+               bytes.add( (byte) (value & 0xFF));
+               bytes.add((byte) ((value >>> 8) & 0xFF));
+               bytes.add((byte) ((value >>> 16) & 0xFF));
+               bytes.add((byte) ((value >>> 24) & 0xFF));
+
+       }
+
+       @Override
+       protected Pair<byte[], Integer> toBytes() {
+               
+               TByteArrayList result = new TByteArrayList();
+               writeLE(result, metadataBytes.length);
+               result.add(metadataBytes);
+               writeLE(result, clusterChangeSetIds.size());
+               for(String id : clusterChangeSetIds) {
+                       byte[] bb = id.getBytes();
+                       writeLE(result, bb.length);
+                       result.add(bb);
+               }
+
+               release();
+               
+               byte[] ret = result.toArray();
+               
+               return Pair.make(ret, ret.length);
+               
+       }
+       
+       @Override
+       void release() {
+               clusterChangeSetIds = null;
+               metadataBytes = null;
+       }
+
+       @Override
+       public void fromFile(byte[] data) {
+               
+               clusterChangeSetIds = new ArrayList<String>();
+               
+               int metadataLength = Bytes.readLE4(data, 0);
+               metadataBytes = Arrays.copyOfRange(data, 4, 4+metadataLength);
+               int offset = 4+metadataLength;
+               int numberOfChangeSets = Bytes.readLE4(data, offset);
+               offset += 4;
+               for(int i=0;i<numberOfChangeSets;i++) {
+                       int length = Bytes.readLE4(data, offset);
+                       offset += 4;
+                       String id = new String(Arrays.copyOfRange(data, offset, offset+length));
+                       clusterChangeSetIds.add(id);
+                       offset += length;
+               }
+               
+       }
+
+       @Override
+       String getExtension() {
+               return "cs";
+       }
+       
+       @Override
+       protected boolean overwrite() {
+               return false;
+       }
+
+}
\ No newline at end of file