private static long _parseLong(String value, long defaultValue) { if (_useJDKParseLong == null) { if (OSDetector.isAIX() && ServerDetector.isWebSphere() && JavaDetector.isIBM() && JavaDetector.is64bit()) { _useJDKParseLong = Boolean.TRUE; } else { _useJDKParseLong = Boolean.FALSE; } } if (_useJDKParseLong) { try { return Long.parseLong(value); } catch (NumberFormatException nfe) { return defaultValue; } } int length = value.length(); if (length <= 0) { return defaultValue; } int pos = 0; long limit = -Long.MAX_VALUE; boolean negative = false; char c = value.charAt(0); if (c < CharPool.NUMBER_0) { if (c == CharPool.MINUS) { limit = Long.MIN_VALUE; negative = true; } else if (c != CharPool.PLUS) { return defaultValue; } if (length == 1) { return defaultValue; } pos++; } long smallLimit = limit / 10; long result = 0; while (pos < length) { if (result < smallLimit) { return defaultValue; } c = value.charAt(pos++); if ((c < CharPool.NUMBER_0) || (c > CharPool.NUMBER_9)) { return defaultValue; } int number = c - CharPool.NUMBER_0; result *= 10; if (result < (limit + number)) { return defaultValue; } result -= number; } if (negative) { return result; } else { return -result; } }