[ https://issues.apache.org/jira/browse/AXIOM-438?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Masaki Nishikawa closed AXIOM-438. ---------------------------------- > StringIndexOutOfBoundsException occur on rare occasions is when you create a > stub object > ---------------------------------------------------------------------------------------- > > Key: AXIOM-438 > URL: https://issues.apache.org/jira/browse/AXIOM-438 > Project: Axiom > Issue Type: Bug > Components: API > Affects Versions: 1.2.10 > Environment: Linux > Reporter: Masaki Nishikawa > Priority: Trivial > > (Google Translated) > There is a problem with the logic of UUIDGenerator.getInitialUUID, is rare, > can occur when generating the object of the stub is > StringIndexOutOfBoundsException. > The cause is because the next "1" s number, places such as "01" when over a > string of numeric Integer.toHexString will decrease. > What are you handling this like why, I do not understand, what the problem be > solved by simply zero-fill? > We appreciate if you fix this bug. > 【The appropriate program】 > public class UUIDGenerator { > /* Omitted */ > protected static String getInitialUUID() { > if (myRand == null) { > myRand = new Random(); > } > long rand = myRand.nextLong(); > String sid; > try { > sid = InetAddress.getLocalHost().toString(); > } catch (UnknownHostException e) { > sid = Thread.currentThread().getName(); > } > StringBuffer sb = new StringBuffer(); > sb.append(sid); > sb.append(":"); > sb.append(Long.toString(rand)); > MessageDigest md5 = null; > try { > md5 = MessageDigest.getInstance("MD5"); > } catch (NoSuchAlgorithmException e) { > throw new OMException(e); > } > md5.update(sb.toString().getBytes()); > byte[] array = md5.digest(); > StringBuffer sb2 = new StringBuffer(); > for (int j = 0; j < array.length; ++j) { > int b = array[j] & 0xFF; > sb2.append(Integer.toHexString(b)); // The problem here! Is a > string of "1" the number "01" is Integer.toHexString, reduce the number of > digits is > } > int begin = myRand.nextInt(); > if (begin < 0) begin = begin * -1; > begin = begin % 8; > return sb2.toString().substring(begin, begin + 18).toUpperCase(); // > Is raised here StringIndexOutofBoundsException > } > /* Omitted */ > } > 【Error Trace】 > java.lang.StringIndexOutOfBoundsException: String index out of range: 25 > at java.lang.String.substring(Unknown Source) > at > org.apache.axiom.om.util.UUIDGenerator.getInitialUUID(UUIDGenerator.java:94) > at org.apache.axiom.om.util.UUIDGenerator.getUUID(UUIDGenerator.java:54) > at > org.apache.axis2.description.AxisOperation.<init>(AxisOperation.java:90) > at > org.apache.axis2.description.AxisOperation.<init>(AxisOperation.java:95) > at > org.apache.axis2.description.TwoChannelAxisOperation.<init>(TwoChannelAxisOperation.java:52) > at > org.apache.axis2.description.OutInAxisOperation.<init>(OutInAxisOperation.java:65) > at > org.apache.axis2.description.RobustOutOnlyAxisOperation.<init>(RobustOutOnlyAxisOperation.java:47) > at org.apache.axis2.client.Stub.addAnonymousOperations(Stub.java:233) > > (原文) > UUIDGenerator.getInitialUUIDのロジックに問題があり、ごく稀にですが、スタブのオブジェクト生成時にStringIndexOutOfBoundsExceptionが発生します。 > 原因はInteger.toHexStringで数値を文字列化する際に"01"のような数値だと"1"となり、桁数が減ってしまうためです。 > なぜこのような処理をしているのか、理解できていないのですが、単純に0埋めすれば解決する問題でしょうか? > このバグを修正していただけると幸いです。 > 【該当プログラム】 > public class UUIDGenerator { > /* 省略 */ > protected static String getInitialUUID() { > if (myRand == null) { > myRand = new Random(); > } > long rand = myRand.nextLong(); > String sid; > try { > sid = InetAddress.getLocalHost().toString(); > } catch (UnknownHostException e) { > sid = Thread.currentThread().getName(); > } > StringBuffer sb = new StringBuffer(); > sb.append(sid); > sb.append(":"); > sb.append(Long.toString(rand)); > MessageDigest md5 = null; > try { > md5 = MessageDigest.getInstance("MD5"); > } catch (NoSuchAlgorithmException e) { > throw new OMException(e); > } > md5.update(sb.toString().getBytes()); > byte[] array = md5.digest(); > StringBuffer sb2 = new StringBuffer(); > for (int j = 0; j < array.length; ++j) { > int b = array[j] & 0xFF; > sb2.append(Integer.toHexString(b)); // > ここが問題!Integer.toHexStringで"01"の数値が"1"の文字列になり、桁数が減る > } > int begin = myRand.nextInt(); > if (begin < 0) begin = begin * -1; > begin = begin % 8; > return sb2.toString().substring(begin, begin + 18).toUpperCase(); // > ここでStringIndexOutofBoundsExceptionが発生 > } > /* 省略 */ > } > 【トレース内容】 > java.lang.StringIndexOutOfBoundsException: String index out of range: 25 > at java.lang.String.substring(Unknown Source) > at > org.apache.axiom.om.util.UUIDGenerator.getInitialUUID(UUIDGenerator.java:94) > at org.apache.axiom.om.util.UUIDGenerator.getUUID(UUIDGenerator.java:54) > at > org.apache.axis2.description.AxisOperation.<init>(AxisOperation.java:90) > at > org.apache.axis2.description.AxisOperation.<init>(AxisOperation.java:95) > at > org.apache.axis2.description.TwoChannelAxisOperation.<init>(TwoChannelAxisOperation.java:52) > at > org.apache.axis2.description.OutInAxisOperation.<init>(OutInAxisOperation.java:65) > at > org.apache.axis2.description.RobustOutOnlyAxisOperation.<init>(RobustOutOnlyAxisOperation.java:47) > at org.apache.axis2.client.Stub.addAnonymousOperations(Stub.java:233) > -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@ws.apache.org For additional commands, e-mail: dev-h...@ws.apache.org