]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.acorn/src/org/simantics/acorn/lru/FileInfo.java
Upgrade pdfbox to 2.0.3 and fastutil to 7.0.13.
[simantics/platform.git] / bundles / org.simantics.acorn / src / org / simantics / acorn / lru / FileInfo.java
1 package org.simantics.acorn.lru;
2
3 import java.nio.file.Path;
4
5 import org.simantics.db.Database.Session.ResourceSegment;
6 import org.simantics.db.server.ProCoreException;
7 import org.simantics.utils.datastructures.Pair;
8
9 import gnu.trove.list.array.TByteArrayList;
10
11 public class FileInfo extends LRUObject<String, FileInfo> {
12
13         private TByteArrayList bytes;
14         
15         // Stub
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);
18                 LRU.map(this);
19         }
20         
21         // New
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);
26         }
27
28         public byte[] getResourceFile() {
29                 
30                 if(VERIFY) verifyAccess();
31                 
32                 makeResident();
33                 return bytes.toArray();
34
35         }
36         
37         
38         public ResourceSegment getResourceSegment(final byte[] clusterUID,
39                         final int resourceIndex, final long segmentOffset, short segmentSize)
40                         throws ProCoreException {
41
42                 if(VERIFY) verifyAccess();
43
44                 makeResident();
45
46                 try {
47
48                         int segSize = segmentSize;
49                         if (segSize < 0)
50                                 segSize += 65536;
51                         if (segmentSize == -1)
52                                 segSize = Math.min(65535, bytes.size());
53
54                         final long valueSize = bytes.size();
55
56                         final byte[] segment = bytes.toArray((int) segmentOffset, segSize);
57
58                         return new ResourceSegment() {
59
60                                 @Override
61                                 public long getValueSize() {
62                                         return valueSize;
63                                 }
64
65                                 @Override
66                                 public byte[] getSegment() {
67                                         return segment;
68                                 }
69
70                                 @Override
71                                 public int getResourceIndex() {
72                                         return resourceIndex;
73                                 }
74
75                                 @Override
76                                 public long getOffset() {
77                                         return segmentOffset;
78                                 }
79
80                                 @Override
81                                 public byte[] getClusterId() {
82                                         return clusterUID;
83                                 }
84                         };
85
86                 } catch (Throwable t) {
87
88                         t.printStackTrace();
89
90                 }
91
92                 throw new UnsupportedOperationException();
93
94         }
95         
96         public void updateData(byte[] newBytes, long offset, long pos, long size) {
97
98                 if(VERIFY) verifyAccess();
99                 makeResident();
100
101                 if(size == 0) {
102                         bytes.remove((int)offset, (int)(bytes.size()-offset));
103                 } else {
104                         bytes.fill((int) (offset + size), (int) (offset + size), (byte) 0);
105                         bytes.set((int) offset, newBytes, (int) pos, (int) size);
106                 }
107                 
108                 setDirty();
109                 
110         }
111         
112         @Override
113         public Pair<byte[], Integer> toBytes() {
114                 byte[] result = bytes.toArray();
115                 release();
116                 return Pair.make(result, result.length);
117         }
118         
119         @Override
120         protected void release() {
121                 bytes = null;
122         }
123
124         @Override
125         public void fromFile(byte[] data) {
126                 bytes = new TByteArrayList(data);
127         }
128
129         @Override
130         protected String getExtension() {
131                 return "extFile";
132         }
133         
134         @Override
135         protected boolean overwrite() {
136                 return true;
137         }
138
139 }