MessageId.java 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package com.dianping.cat.message.internal;
  2. import java.util.List;
  3. import org.unidal.helper.Splitters;
  4. public class MessageId {
  5. private static final long VERSION1_THRESHOLD = 1325347200000L; // Jan. 1 2012
  6. private String m_domain;
  7. private String m_ipAddressInHex;
  8. private long m_timestamp;
  9. private int m_index;
  10. public static MessageId parse(String messageId) {
  11. List<String> list = Splitters.by('-').split(messageId);
  12. int len = list.size();
  13. if (len >= 4) {
  14. String ipAddressInHex = list.get(len - 3);
  15. long timestamp = Long.parseLong(list.get(len - 2));
  16. int index = Integer.parseInt(list.get(len - 1));
  17. String domain;
  18. if (len > 4) { // allow domain contains '-'
  19. StringBuilder sb = new StringBuilder();
  20. for (int i = 0; i < len - 3; i++) {
  21. if (i > 0) {
  22. sb.append('-');
  23. }
  24. sb.append(list.get(i));
  25. }
  26. domain = sb.toString();
  27. } else {
  28. domain = list.get(0);
  29. }
  30. return new MessageId(domain, ipAddressInHex, timestamp, index);
  31. }
  32. throw new RuntimeException("Invalid message id format: " + messageId);
  33. }
  34. MessageId(String domain, String ipAddressInHex, long timestamp, int index) {
  35. m_domain = domain;
  36. m_ipAddressInHex = ipAddressInHex;
  37. m_timestamp = timestamp;
  38. m_index = index;
  39. }
  40. public String getDomain() {
  41. return m_domain;
  42. }
  43. public int getIndex() {
  44. return m_index;
  45. }
  46. public String getIpAddress() {
  47. StringBuilder sb = new StringBuilder();
  48. String local = m_ipAddressInHex;
  49. int length = local.length();
  50. for (int i = 0; i < length; i += 2) {
  51. char first = local.charAt(i);
  52. char next = local.charAt(i + 1);
  53. int temp = 0;
  54. if (first >= '0' && first <= '9') {
  55. temp += (first - '0') << 4;
  56. } else {
  57. temp += ((first - 'a') + 10) << 4;
  58. }
  59. if (next >= '0' && next <= '9') {
  60. temp += next - '0';
  61. } else {
  62. temp += (next - 'a') + 10;
  63. }
  64. if (sb.length() > 0) {
  65. sb.append('.');
  66. }
  67. sb.append(temp);
  68. }
  69. return sb.toString();
  70. }
  71. public String getIpAddressInHex() {
  72. return m_ipAddressInHex;
  73. }
  74. public long getTimestamp() {
  75. if (m_timestamp > VERSION1_THRESHOLD) {
  76. return m_timestamp;
  77. } else {
  78. return m_timestamp * 3600 * 1000L;
  79. }
  80. }
  81. public int getVersion() {
  82. if (m_timestamp > VERSION1_THRESHOLD) {
  83. return 1;
  84. } else {
  85. return 2;
  86. }
  87. }
  88. @Override
  89. public String toString() {
  90. StringBuilder sb = new StringBuilder(m_domain.length() + 32);
  91. sb.append(m_domain);
  92. sb.append('-');
  93. sb.append(m_ipAddressInHex);
  94. sb.append('-');
  95. sb.append(m_timestamp);
  96. sb.append('-');
  97. sb.append(m_index);
  98. return sb.toString();
  99. }
  100. }