]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.acorn/src/org/simantics/acorn/lru/FileInfo.java
Sharing org.simantics.acorn for everyone to use
[simantics/platform.git] / bundles / org.simantics.acorn / src / org / simantics / acorn / lru / FileInfo.java
diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/FileInfo.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/FileInfo.java
new file mode 100644 (file)
index 0000000..660f245
--- /dev/null
@@ -0,0 +1,139 @@
+package org.simantics.acorn.lru;
+
+import java.nio.file.Path;
+
+import org.simantics.db.Database.Session.ResourceSegment;
+import org.simantics.db.server.ProCoreException;
+import org.simantics.utils.datastructures.Pair;
+
+import gnu.trove.list.array.TByteArrayList;
+
+public class FileInfo extends LRUObject<String, FileInfo> {
+
+       private TByteArrayList bytes;
+       
+       // Stub
+       public FileInfo(LRU<String, FileInfo> LRU, Path readDir, String id, int offset, int length) {
+               super(LRU, id, readDir, id.toString() + ".extFile", offset, length, false, false);
+               LRU.map(this);
+       }
+       
+       // New
+       public FileInfo(LRU<String, FileInfo> LRU, String id, int size) {
+               super(LRU, id, LRU.getDirectory(), id.toString() + ".extFile", true, true);
+               this.bytes = new TByteArrayList(size);
+               LRU.insert(this, accessTime);
+       }
+
+       public byte[] getResourceFile() {
+               
+               if(VERIFY) verifyAccess();
+               
+               makeResident();
+               return bytes.toArray();
+
+       }
+       
+       
+       public ResourceSegment getResourceSegment(final byte[] clusterUID,
+                       final int resourceIndex, final long segmentOffset, short segmentSize)
+                       throws ProCoreException {
+
+               if(VERIFY) verifyAccess();
+
+               makeResident();
+
+               try {
+
+                       int segSize = segmentSize;
+                       if (segSize < 0)
+                               segSize += 65536;
+                       if (segmentSize == -1)
+                               segSize = Math.min(65535, bytes.size());
+
+                       final long valueSize = bytes.size();
+
+                       final byte[] segment = bytes.toArray((int) segmentOffset, segSize);
+
+                       return new ResourceSegment() {
+
+                               @Override
+                               public long getValueSize() {
+                                       return valueSize;
+                               }
+
+                               @Override
+                               public byte[] getSegment() {
+                                       return segment;
+                               }
+
+                               @Override
+                               public int getResourceIndex() {
+                                       return resourceIndex;
+                               }
+
+                               @Override
+                               public long getOffset() {
+                                       return segmentOffset;
+                               }
+
+                               @Override
+                               public byte[] getClusterId() {
+                                       return clusterUID;
+                               }
+                       };
+
+               } catch (Throwable t) {
+
+                       t.printStackTrace();
+
+               }
+
+               throw new UnsupportedOperationException();
+
+       }
+       
+       public void updateData(byte[] newBytes, long offset, long pos, long size) {
+
+               if(VERIFY) verifyAccess();
+               makeResident();
+
+               if(size == 0) {
+                       bytes.remove((int)offset, (int)(bytes.size()-offset));
+               } else {
+                       bytes.fill((int) (offset + size), (int) (offset + size), (byte) 0);
+                       bytes.set((int) offset, newBytes, (int) pos, (int) size);
+               }
+               
+               setDirty();
+               
+       }
+       
+       @Override
+       public Pair<byte[], Integer> toBytes() {
+               byte[] result = bytes.toArray();
+               release();
+               return Pair.make(result, result.length);
+       }
+       
+       @Override
+       protected void release() {
+               bytes = null;
+       }
+
+       @Override
+       public void fromFile(byte[] data) {
+               bytes = new TByteArrayList(data);
+       }
+
+       @Override
+       protected String getExtension() {
+               return "extFile";
+       }
+       
+       @Override
+       protected boolean overwrite() {
+               return true;
+       }
+
+}
\ No newline at end of file