Skip to content

Commit ccf1adb

Browse files
committed
No new exceptions throw; testing
1 parent 6212959 commit ccf1adb

4 files changed

Lines changed: 60 additions & 46 deletions

File tree

src/main/java/org/z3950/zing/cql/CQLGenerator.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,7 @@ public CQLGenerator(Properties params) {
9595
this.params = params;
9696
String seed = params.getProperty("seed");
9797
if (seed != null) {
98-
try {
99-
rnd = new Random(Long.parseLong(seed));
100-
} catch (NumberFormatException e) {
101-
throw new NumberFormatException(
102-
"Bad seed value '" + seed + "'");
103-
}
98+
rnd = new Random(Long.parseLong(seed));
10499
} else {
105100
rnd = new Random();
106101
}

src/main/java/org/z3950/zing/cql/CQLNode.java

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -263,76 +263,65 @@ protected static final byte[] makeOID(String oid) {
263263
if (o != null) {
264264
return o;
265265
}
266-
try {
267-
o = parseOID(oid);
268-
} catch (NumberFormatException e) {
269-
throw new NumberFormatException("Bad OID string: '" + oid + "'");
266+
o = parseOID(oid);
267+
if (o == null) {
268+
return null;
270269
}
271270
madeOIDs.put(oid, o);
272271
return o;
273272
}
274273

275274
private static final byte[] parseOID(String oid) {
276-
byte[] o = (byte[]) madeOIDs.get(oid);
277-
if (o != null) {
278-
return o;
279-
}
280-
int dot, offset = 0, oidOffset = 0, value;
281-
o = new byte[100];
275+
int offset = 0, oidOffset = 0;
276+
byte [] o = new byte[100];
282277
// Isn't this kind of thing excruciating in Java?
283278
while (oidOffset < oid.length() &&
284279
Character.isDigit(oid.charAt(oidOffset)) == true) {
285-
if (offset > 90) // too large
280+
if (offset > 90) { // too large
286281
return null;
287-
288-
dot = oid.indexOf('.', oidOffset);
289-
if (dot == -1)
282+
}
283+
int dot = oid.indexOf('.', oidOffset);
284+
if (dot == -1) {
285+
if (offset == 0) {
286+
return null;
287+
}
290288
dot = oid.length();
291-
292-
value = Integer.parseInt(oid.substring(oidOffset, dot));
293-
289+
}
290+
int value = Integer.parseInt(oid.substring(oidOffset, dot));
294291
if (offset == 0) { // 1st two are special
295-
if (dot == -1) // ### can't happen: -1 is reassigned above
296-
return null; // can't be this short
297292
oidOffset = dot + 1; // skip past '.'
298-
299293
dot = oid.indexOf('.', oidOffset);
300-
if (dot == -1)
294+
if (dot == -1) {
301295
dot = oid.length();
302-
303-
// ### Eh?!
296+
}
304297
value = value * 40 +
305298
Integer.parseInt(oid.substring(oidOffset, dot));
306299
}
307-
308300
if (value < 0x80) {
309301
o[offset++] = (byte) value;
310302
} else {
311303
int count = 0;
312304
byte bits[] = new byte[12]; // save a 84 (12*7) bit number
313-
314305
while (value != 0) {
315306
bits[count++] = (byte) (value & 0x7f);
316307
value >>= 7;
317308
}
318-
319309
// Now place in the correct order
320-
while (--count > 0)
310+
while (--count > 0) {
321311
o[offset++] = (byte) (bits[count] | 0x80);
322-
312+
}
323313
o[offset++] = bits[count];
324314
}
325315

326316
dot = oid.indexOf('.', oidOffset);
327-
if (dot == -1)
328-
break;
329-
317+
if (dot == -1) {
318+
byte[] ptr = new byte[offset];
319+
System.arraycopy(o, 0, ptr, 0, offset);
320+
return ptr;
321+
}
330322
oidOffset = dot + 1;
331323
}
332-
333-
byte[] ptr = new byte[offset];
334-
System.arraycopy(o, 0, ptr, 0, offset);
335-
return ptr;
324+
return null;
336325
}
337326

338327
public static final byte[] makeQuery(CQLNode root, Properties properties)

src/main/java/org/z3950/zing/cql/CQLProxNode.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,7 @@ byte[] opType1() {
8989
offset = putNum(value, op, offset);
9090

9191
offset = putTag(CONTEXT, 2, PRIMITIVE, op, offset); // distance
92-
try {
93-
value = Integer.parseInt(ms.modifier("distance"));
94-
} catch (NumberFormatException e) {
95-
throw new NumberFormatException("Bad distance modifier: " + ms.modifier("distance"));
96-
}
92+
value = Integer.parseInt(ms.modifier("distance"));
9793
offset = putLen(numLen(value), op, offset);
9894
offset = putNum(value, op, offset);
9995

src/test/java/org/z3950/zing/cql/CQLParserTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,4 +193,38 @@ public static String[] getResourceListing(Class clazz, String path) throws IOExc
193193
throw new UnsupportedOperationException("Cannot list files for URL "
194194
+ dirURL);
195195
}
196+
197+
@Test
198+
public void testMakeOID() {
199+
String[] oids = {
200+
"1.2",
201+
"1.2.840.10003.5.109.10",
202+
"2.16.840",
203+
};
204+
int [][] expected = {
205+
{42},
206+
{42, 134, 72, 206, 19, 5, 109, 10},
207+
{96, 134, 72},
208+
};
209+
int i = 0;
210+
for (String oid : oids) {
211+
out.println("Testing OID: " + oid);
212+
byte[] encoded = CQLNode.makeOID(oid);
213+
for (int j = 0; j < expected[i].length && j < encoded.length; j++) {
214+
assertEquals("Byte " + j + " of OID " + oid, expected[i][j], encoded[j] & 0xff);
215+
}
216+
assertEquals("Length of OID " + oid, expected[i].length, encoded.length);
217+
i++;
218+
}
219+
// not very consistent below, but this is how it is implemented
220+
assertNull(CQLNode.makeOID(""));
221+
assertNull(CQLNode.makeOID("1"));
222+
assertNull(CQLNode.makeOID("b"));
223+
assertThrows(NumberFormatException.class, () -> {
224+
CQLNode.makeOID("1a.");
225+
});
226+
assertThrows(NumberFormatException.class, () -> {
227+
CQLNode.makeOID("1.b");
228+
});
229+
}
196230
}

0 commit comments

Comments
 (0)