001 package tecgraf.openbus.opendreams; 002 003 /** 004 * A classe <code>TStamp</code> representa um time stamp unico no sistema. 005 */ 006 public class TStamp { 007 private final int NCHARS = 9; /* Numero de caractres da string de tempo */ 008 /* 009 * String de conversao <=> Base64 Encoding Table 010 * 011 * Referencia: http://www.faqs.org/rfcs/rfc3548.html 012 * 013 * The "URL and Filename safe" Base 64 Alphabet 014 * 015 * Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 016 * 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 017 * 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 018 * 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 - (minus) 12 019 * M 29 d 46 u 63 _ (understrike) 13 N 30 e 47 v 14 O 31 f 48 w 15 P 32 g 49 x 020 * 16 Q 33 h 50 y 021 */ 022 private final String str_conv = 023 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; 024 025 private static Long lastStamp = 0l; 026 027 private String uniq_id; 028 private long tstamp; 029 030 @Override 031 public String toString() { 032 return uniq_id; 033 } 034 035 public long toLong() { 036 return tstamp; 037 } 038 039 public TStamp() { 040 this.tstamp = System.currentTimeMillis(); 041 042 synchronized (lastStamp) { 043 if (tstamp <= lastStamp) { 044 tstamp = ++lastStamp; 045 } 046 lastStamp = tstamp; 047 } 048 this.uniq_id = ""; 049 /* 050 * Cada caracter corresponde a 6 bits O primeiro caracter corresponde aos 6 051 * bits mais significativos 052 */ 053 long tempo_us = tstamp; 054 for (int i = NCHARS - 1; i >= 0; i--) { 055 /* 0x3F hex = 63 dec = 00111111 bin */ 056 uniq_id = str_conv.charAt((int) (tempo_us & 0x3F)) + uniq_id; 057 tempo_us = tempo_us >> 6; 058 } 059 } 060 061 public TStamp(String uniq_id) { 062 /* 063 * Zera o numero que contem o timestamp em usec 064 */ 065 this.uniq_id = uniq_id; 066 tstamp = 0; 067 068 /* 069 * Transforma da base64 p/ base10 070 */ 071 for (int i = 0; i < NCHARS; i++) { 072 tstamp = tstamp << 6; 073 for (int j = 0; j <= 63; j++) { 074 if (uniq_id.charAt(i) == str_conv.charAt(j)) { 075 tstamp = tstamp + j; 076 break; 077 } 078 } 079 } 080 } 081 }