1 package org.simantics.acorn.lru;
3 import java.nio.file.Path;
5 import org.simantics.acorn.FileCache;
6 import org.simantics.acorn.exception.AcornAccessVerificationException;
7 import org.simantics.acorn.exception.IllegalAcornStateException;
8 import org.simantics.db.Database.Session.ResourceSegment;
9 import org.simantics.utils.datastructures.Pair;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
13 import gnu.trove.list.array.TByteArrayList;
15 public class FileInfo extends LRUObject<String, FileInfo> {
17 private static final Logger LOGGER = LoggerFactory.getLogger(FileInfo.class);
18 private TByteArrayList bytes;
21 public FileInfo(LRU<String, FileInfo> LRU, FileCache fileCache, Path readDir, String id, int offset, int length) throws AcornAccessVerificationException {
22 super(LRU, fileCache, id, readDir, id.toString() + ".extFile", offset, length, false, false);
27 public FileInfo(LRU<String, FileInfo> LRU, FileCache fileCache, String id, int size) throws AcornAccessVerificationException {
28 super(LRU, fileCache, id, LRU.getDirectory(), id.toString() + ".extFile", true, true);
29 this.bytes = new TByteArrayList(size);
30 LRU.insert(this, accessTime);
33 public byte[] getResourceFile() throws AcornAccessVerificationException, IllegalAcornStateException {
35 if(VERIFY) verifyAccess();
38 return bytes.toArray();
42 public ResourceSegment getResourceSegment(final byte[] clusterUID, final int resourceIndex, final long segmentOffset, short segmentSize) throws AcornAccessVerificationException, IllegalAcornStateException {
44 if(VERIFY) verifyAccess();
48 int segSize = segmentSize;
51 if (segmentSize == -1)
52 segSize = Math.min(65535, bytes.size());
54 final long valueSize = bytes.size();
55 final byte[] segment = bytes.toArray((int) segmentOffset, segSize);
57 return new ResourceSegment() {
60 public long getValueSize() {
65 public byte[] getSegment() {
70 public int getResourceIndex() {
75 public long getOffset() {
80 public byte[] getClusterId() {
84 } catch (Throwable t) {
85 throw new IllegalAcornStateException(t);
89 public void updateData(byte[] newBytes, long offset, long pos, long size) throws AcornAccessVerificationException, IllegalAcornStateException {
91 if(VERIFY) verifyAccess();
95 bytes.remove((int)offset, (int)(bytes.size()-offset));
97 bytes.fill((int) (offset + size), (int) (offset + size), (byte) 0);
98 bytes.set((int) offset, newBytes, (int) pos, (int) size);
106 public Pair<byte[], Integer> toBytes() {
107 byte[] result = bytes.toArray();
109 return Pair.make(result, result.length);
113 protected void release() {
118 public void fromFile(byte[] data) {
119 bytes = new TByteArrayList(data);
123 protected String getExtension() {
128 protected boolean overwrite() {
133 public Logger getLogger() {