@@ -259,69 +259,80 @@ protected static final int putNum(long num, byte record[], int offset) {
259259 private static final Map <String , byte []> madeOIDs = new HashMap <String , byte []>(10 );
260260
261261 protected static final byte [] makeOID (String oid ) {
262- byte [] o ;
262+ byte [] o = (byte []) madeOIDs .get (oid );
263+ if (o != null ) {
264+ return o ;
265+ }
266+ try {
267+ o = parseOID (oid );
268+ } catch (NumberFormatException e ) {
269+ throw new NumberFormatException ("Bad OID string: '" + oid + "'" );
270+ }
271+ madeOIDs .put (oid , o );
272+ return o ;
273+ }
274+
275+ private static final byte [] parseOID (String oid ) {
276+ byte [] o = (byte []) madeOIDs .get (oid );
277+ if (o != null ) {
278+ return o ;
279+ }
263280 int dot , offset = 0 , oidOffset = 0 , value ;
281+ o = new byte [100 ];
282+ // Isn't this kind of thing excruciating in Java?
283+ while (oidOffset < oid .length () &&
284+ Character .isDigit (oid .charAt (oidOffset )) == true ) {
285+ if (offset > 90 ) // too large
286+ return null ;
287+
288+ dot = oid .indexOf ('.' , oidOffset );
289+ if (dot == -1 )
290+ dot = oid .length ();
264291
265- if ((o = (byte []) madeOIDs .get (oid )) == null ) {
266- o = new byte [100 ];
292+ value = Integer .parseInt (oid .substring (oidOffset , dot ));
267293
268- // Isn't this kind of thing excruciating in Java?
269- while (oidOffset < oid .length () &&
270- Character .isDigit (oid .charAt (oidOffset )) == true ) {
271- if (offset > 90 ) // too large
272- return null ;
294+ 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
297+ oidOffset = dot + 1 ; // skip past '.'
273298
274299 dot = oid .indexOf ('.' , oidOffset );
275300 if (dot == -1 )
276301 dot = oid .length ();
277302
278- value = Integer .parseInt (oid .substring (oidOffset , dot ));
279-
280- if (offset == 0 ) { // 1st two are special
281- if (dot == -1 ) // ### can't happen: -1 is reassigned above
282- return null ; // can't be this short
283- oidOffset = dot + 1 ; // skip past '.'
284-
285- dot = oid .indexOf ('.' , oidOffset );
286- if (dot == -1 )
287- dot = oid .length ();
288-
289- // ### Eh?!
290- value = value * 40 +
291- Integer .parseInt (oid .substring (oidOffset , dot ));
292- }
293-
294- if (value < 0x80 ) {
295- o [offset ++] = (byte ) value ;
296- } else {
297- int count = 0 ;
298- byte bits [] = new byte [12 ]; // save a 84 (12*7) bit number
299-
300- while (value != 0 ) {
301- bits [count ++] = (byte ) (value & 0x7f );
302- value >>= 7 ;
303- }
303+ // ### Eh?!
304+ value = value * 40 +
305+ Integer .parseInt (oid .substring (oidOffset , dot ));
306+ }
304307
305- // Now place in the correct order
306- while (--count > 0 )
307- o [offset ++] = (byte ) (bits [count ] | 0x80 );
308+ if (value < 0x80 ) {
309+ o [offset ++] = (byte ) value ;
310+ } else {
311+ int count = 0 ;
312+ byte bits [] = new byte [12 ]; // save a 84 (12*7) bit number
308313
309- o [offset ++] = bits [count ];
314+ while (value != 0 ) {
315+ bits [count ++] = (byte ) (value & 0x7f );
316+ value >>= 7 ;
310317 }
311318
312- dot = oid . indexOf ( '.' , oidOffset );
313- if ( dot == - 1 )
314- break ;
319+ // Now place in the correct order
320+ while (-- count > 0 )
321+ o [ offset ++] = ( byte ) ( bits [ count ] | 0x80 ) ;
315322
316- oidOffset = dot + 1 ;
323+ o [ offset ++] = bits [ count ] ;
317324 }
318325
319- byte [] ptr = new byte [offset ];
320- System .arraycopy (o , 0 , ptr , 0 , offset );
321- madeOIDs .put (oid , ptr );
322- return ptr ;
326+ dot = oid .indexOf ('.' , oidOffset );
327+ if (dot == -1 )
328+ break ;
329+
330+ oidOffset = dot + 1 ;
323331 }
324- return o ;
332+
333+ byte [] ptr = new byte [offset ];
334+ System .arraycopy (o , 0 , ptr , 0 , offset );
335+ return ptr ;
325336 }
326337
327338 public static final byte [] makeQuery (CQLNode root , Properties properties )
0 commit comments