Added LGPL V3. License. Updated copyright. Code formatting.
[sixth-data.git] / src / main / java / eu / svjatoslav / sixth / data / store / file / EntryRecord.java
1 /*
2  * Sixth Data. Copyright ©2012-2018, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of version 3 of the GNU Lesser General Public License
6  * or later as published by the Free Software Foundation.
7  */
8
9 package eu.svjatoslav.sixth.data.store.file;
10
11 import java.io.IOException;
12
13 class EntryRecord implements Comparable<EntryRecord> {
14     public static final int ENTRY_RECORD_LENGTH = 12;
15     final int id;
16     long location = 0;
17     int length = 0;
18
19     public EntryRecord(final FileDataStore dataStore, final int id)
20             throws IOException {
21
22         this.id = id;
23
24         final long entryRecordLocation = dataStore.entryAllocationTable
25                 .getEntryRecordLocation(id);
26
27         location = dataStore.readLong(entryRecordLocation);
28
29         if (isUsed())
30             length = dataStore.readInt(entryRecordLocation + 8);
31     }
32
33     public EntryRecord(final int id, final long location, final int length) {
34         this.id = id;
35         this.location = location;
36         this.length = length;
37     }
38
39     public void clear() {
40         location = 0;
41         length = 0;
42     }
43
44     @Override
45     public boolean equals(final Object o) {
46         if (o == null) return false;
47         return o instanceof EntryRecord && compareTo((EntryRecord) o) == 0;
48     }
49
50     @Override
51     public int compareTo(final EntryRecord o) {
52         if (location < o.location)
53             return -1;
54         if (location > o.location)
55             return 1;
56
57         if (id < o.id)
58             return -1;
59         if (id > o.id)
60             return 1;
61
62         return 0;
63     }
64
65     @Override
66     public int hashCode() {
67         int result = id;
68         result = 31 * result + (int) (location ^ (location >>> 32));
69         return result;
70     }
71
72     public boolean isUsed() {
73         return location != 0;
74
75     }
76
77     public void save(final FileDataStore dataStore) throws IOException {
78
79         final long entryRecordLocation = dataStore.entryAllocationTable
80                 .getEntryRecordLocation(id);
81
82         dataStore.writeLong(entryRecordLocation, location);
83         dataStore.writeInt(entryRecordLocation + 8, length);
84     }
85 }