1
2
3
4
5
6
7
8
9
10
11 package org.eclipse.jgit.lfs.lib;
12
13 import java.io.IOException;
14 import java.io.ObjectInputStream;
15 import java.io.ObjectOutputStream;
16 import java.io.Serializable;
17
18 import org.eclipse.jgit.lfs.errors.InvalidLongObjectIdException;
19 import org.eclipse.jgit.util.NB;
20 import org.eclipse.jgit.util.RawParseUtils;
21
22
23
24
25
26
27
28
29 public class LongObjectId extends AnyLongObjectId implements Serializable {
30 private static final long serialVersionUID = 1L;
31
32 private static final LongObjectId ZEROID;
33
34 private static final String ZEROID_STR;
35
36 static {
37 ZEROID = new LongObjectId(0L, 0L, 0L, 0L);
38 ZEROID_STR = ZEROID.name();
39 }
40
41
42
43
44
45
46 public static final LongObjectId zeroId() {
47 return ZEROID;
48 }
49
50
51
52
53
54
55
56
57
58
59
60 public static final boolean isId(String id) {
61 if (id.length() != Constants.LONG_OBJECT_ID_STRING_LENGTH)
62 return false;
63 try {
64 for (int i = 0; i < Constants.LONG_OBJECT_ID_STRING_LENGTH; i++) {
65 RawParseUtils.parseHexInt4((byte) id.charAt(i));
66 }
67 return true;
68 } catch (ArrayIndexOutOfBoundsException e) {
69 return false;
70 }
71 }
72
73
74
75
76
77
78
79
80 public static final String toString(LongObjectId i) {
81 return i != null ? i.name() : ZEROID_STR;
82 }
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 public static boolean equals(final byte[] firstBuffer, final int fi,
100 final byte[] secondBuffer, final int si) {
101 return firstBuffer[fi] == secondBuffer[si]
102 && firstBuffer[fi + 1] == secondBuffer[si + 1]
103 && firstBuffer[fi + 2] == secondBuffer[si + 2]
104 && firstBuffer[fi + 3] == secondBuffer[si + 3]
105 && firstBuffer[fi + 4] == secondBuffer[si + 4]
106 && firstBuffer[fi + 5] == secondBuffer[si + 5]
107 && firstBuffer[fi + 6] == secondBuffer[si + 6]
108 && firstBuffer[fi + 7] == secondBuffer[si + 7]
109 && firstBuffer[fi + 8] == secondBuffer[si + 8]
110 && firstBuffer[fi + 9] == secondBuffer[si + 9]
111 && firstBuffer[fi + 10] == secondBuffer[si + 10]
112 && firstBuffer[fi + 11] == secondBuffer[si + 11]
113 && firstBuffer[fi + 12] == secondBuffer[si + 12]
114 && firstBuffer[fi + 13] == secondBuffer[si + 13]
115 && firstBuffer[fi + 14] == secondBuffer[si + 14]
116 && firstBuffer[fi + 15] == secondBuffer[si + 15]
117 && firstBuffer[fi + 16] == secondBuffer[si + 16]
118 && firstBuffer[fi + 17] == secondBuffer[si + 17]
119 && firstBuffer[fi + 18] == secondBuffer[si + 18]
120 && firstBuffer[fi + 19] == secondBuffer[si + 19]
121 && firstBuffer[fi + 20] == secondBuffer[si + 20]
122 && firstBuffer[fi + 21] == secondBuffer[si + 21]
123 && firstBuffer[fi + 22] == secondBuffer[si + 22]
124 && firstBuffer[fi + 23] == secondBuffer[si + 23]
125 && firstBuffer[fi + 24] == secondBuffer[si + 24]
126 && firstBuffer[fi + 25] == secondBuffer[si + 25]
127 && firstBuffer[fi + 26] == secondBuffer[si + 26]
128 && firstBuffer[fi + 27] == secondBuffer[si + 27]
129 && firstBuffer[fi + 28] == secondBuffer[si + 28]
130 && firstBuffer[fi + 29] == secondBuffer[si + 29]
131 && firstBuffer[fi + 30] == secondBuffer[si + 30]
132 && firstBuffer[fi + 31] == secondBuffer[si + 31];
133 }
134
135
136
137
138
139
140
141
142
143 public static final LongObjectId fromRaw(byte[] bs) {
144 return fromRaw(bs, 0);
145 }
146
147
148
149
150
151
152
153
154
155
156
157 public static final LongObjectId fromRaw(byte[] bs, int p) {
158 final long a = NB.decodeInt64(bs, p);
159 final long b = NB.decodeInt64(bs, p + 8);
160 final long c = NB.decodeInt64(bs, p + 16);
161 final long d = NB.decodeInt64(bs, p + 24);
162 return new LongObjectId(a, b, c, d);
163 }
164
165
166
167
168
169
170
171
172
173 public static final LongObjectId fromRaw(long[] is) {
174 return fromRaw(is, 0);
175 }
176
177
178
179
180
181
182
183
184
185
186
187 public static final LongObjectId fromRaw(long[] is, int p) {
188 return new LongObjectId(is[p], is[p + 1], is[p + 2], is[p + 3]);
189 }
190
191
192
193
194
195
196
197
198
199
200
201 public static final LongObjectId fromString(byte[] buf, int offset) {
202 return fromHexString(buf, offset);
203 }
204
205
206
207
208
209
210
211
212 public static LongObjectId fromString(String str) {
213 if (str.length() != Constants.LONG_OBJECT_ID_STRING_LENGTH)
214 throw new InvalidLongObjectIdException(str);
215 return fromHexString(org.eclipse.jgit.lib.Constants.encodeASCII(str),
216 0);
217 }
218
219 private static final LongObjectId fromHexString(byte[] bs, int p) {
220 try {
221 final long a = RawParseUtils.parseHexInt64(bs, p);
222 final long b = RawParseUtils.parseHexInt64(bs, p + 16);
223 final long c = RawParseUtils.parseHexInt64(bs, p + 32);
224 final long d = RawParseUtils.parseHexInt64(bs, p + 48);
225 return new LongObjectId(a, b, c, d);
226 } catch (ArrayIndexOutOfBoundsException e) {
227 InvalidLongObjectIdException e1 = new InvalidLongObjectIdException(
228 bs, p, Constants.LONG_OBJECT_ID_STRING_LENGTH);
229 e1.initCause(e);
230 throw e1;
231 }
232 }
233
234 LongObjectId(final long new_1, final long new_2, final long new_3,
235 final long new_4) {
236 w1 = new_1;
237 w2 = new_2;
238 w3 = new_3;
239 w4 = new_4;
240 }
241
242
243
244
245
246
247
248
249
250
251
252 protected LongObjectId(AnyLongObjectId src) {
253 w1 = src.w1;
254 w2 = src.w2;
255 w3 = src.w3;
256 w4 = src.w4;
257 }
258
259
260 @Override
261 public LongObjectId toObjectId() {
262 return this;
263 }
264
265 private void writeObject(ObjectOutputStream os) throws IOException {
266 os.writeLong(w1);
267 os.writeLong(w2);
268 os.writeLong(w3);
269 os.writeLong(w4);
270 }
271
272 private void readObject(ObjectInputStream ois) throws IOException {
273 w1 = ois.readLong();
274 w2 = ois.readLong();
275 w3 = ois.readLong();
276 w4 = ois.readLong();
277 }
278 }