1 package org.simantics.acorn.lru;
3 import java.nio.file.Path;
5 import org.simantics.db.Database.Session.ResourceSegment;
6 import org.simantics.db.server.ProCoreException;
7 import org.simantics.utils.datastructures.Pair;
9 import gnu.trove.list.array.TByteArrayList;
11 public class FileInfo extends LRUObject<String, FileInfo> {
13 private TByteArrayList bytes;
16 public FileInfo(LRU<String, FileInfo> LRU, Path readDir, String id, int offset, int length) {
17 super(LRU, id, readDir, id.toString() + ".extFile", offset, length, false, false);
22 public FileInfo(LRU<String, FileInfo> LRU, String id, int size) {
23 super(LRU, id, LRU.getDirectory(), id.toString() + ".extFile", true, true);
24 this.bytes = new TByteArrayList(size);
25 LRU.insert(this, accessTime);
28 public byte[] getResourceFile() {
30 if(VERIFY) verifyAccess();
33 return bytes.toArray();
38 public ResourceSegment getResourceSegment(final byte[] clusterUID,
39 final int resourceIndex, final long segmentOffset, short segmentSize)
40 throws ProCoreException {
42 if(VERIFY) verifyAccess();
48 int segSize = segmentSize;
51 if (segmentSize == -1)
52 segSize = Math.min(65535, bytes.size());
54 final long valueSize = bytes.size();
56 final byte[] segment = bytes.toArray((int) segmentOffset, segSize);
58 return new ResourceSegment() {
61 public long getValueSize() {
66 public byte[] getSegment() {
71 public int getResourceIndex() {
76 public long getOffset() {
81 public byte[] getClusterId() {
86 } catch (Throwable t) {
92 throw new UnsupportedOperationException();
96 public void updateData(byte[] newBytes, long offset, long pos, long size) {
98 if(VERIFY) verifyAccess();
102 bytes.remove((int)offset, (int)(bytes.size()-offset));
104 bytes.fill((int) (offset + size), (int) (offset + size), (byte) 0);
105 bytes.set((int) offset, newBytes, (int) pos, (int) size);
113 public Pair<byte[], Integer> toBytes() {
114 byte[] result = bytes.toArray();
116 return Pair.make(result, result.length);
120 protected void release() {
125 public void fromFile(byte[] data) {
126 bytes = new TByteArrayList(data);
130 protected String getExtension() {
135 protected boolean overwrite() {