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