##### Coverage Report - com.ctrip.framework.apollo.biz.utils.ReleaseKeyGenerator

Classes in this File | Line Coverage | Branch Coverage | Complexity
ReleaseKeyGenerator |
95% | 19/20
N/A | N/A
| 1.0;1

1 |  |
     package com.ctrip.framework.apollo.biz.utils;
2 |  |
3 |  |
     import com.google.common.base.Joiner;
4 |  |
5 |  |
     import com.ctrip.framework.apollo.biz.entity.Namespace;
6 |  |
     import com.ctrip.framework.apollo.core.utils.ByteUtil;
7 |  |
     import com.ctrip.framework.apollo.core.utils.MachineUtil;
8 |  |
9 |  |
     import java.security.SecureRandom;
10 |  |
     import java.text.DateFormat;
11 |  |
     import java.text.SimpleDateFormat;
12 |  |
     import java.util.Date;
13 |  |
     import java.util.Objects;
14 |  |
     import java.util.concurrent.atomic.AtomicInteger;
15 |  |
16 |  |
     /**
17 |  |
      * @author Jason Song(song_s@ctrip.com)
18 |  |
      */
19 | 0 |
     public class ReleaseKeyGenerator {
20 | 1 |
       private static final DateFormat TIMESTAMP_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss");
21 | 1 |
       private static final AtomicInteger releaseCounter = new AtomicInteger(new SecureRandom().nextInt());
22 | 1 |
       private static final Joiner KEY_JOINER = Joiner.on("-");
23 |  |
24 |  |
       /**
25 |  |
        * Generate the release key in the format: timestamp+appId+cluster+namespace+hash(ipAsInt+counter)
26 |  |
        *
27 |  |
        * @param namespace the namespace of the release
28 |  |
        * @return the unique release key
29 |  |
        */
30 |  |
       public static String generateReleaseKey(Namespace namespace) {
31 | 99788 |
         String hexIdString =
32 | 99790 |
             ByteUtil.toHexString(
33 | 299348 |
                 toByteArray(Objects.hash(namespace.getAppId(), namespace.getClusterName(),
34 | 199605 |
                     namespace.getNamespaceName()), MachineUtil.getMachineIdentifier(),
35 | 99789 |
                             releaseCounter.incrementAndGet()));
36 |  |
37 | 99910 |
         return KEY_JOINER.join(TIMESTAMP_FORMAT.format(new Date()), hexIdString);
38 |  |
       }
39 |  |
40 |  |
       /**
41 |  |
        * Concat machine id, counter and key to byte array
42 |  |
        * Only retrieve lower 3 bytes of the id and counter and 2 bytes of the keyHashCode
43 |  |
        */
44 |  |
       private static byte[] toByteArray(int keyHashCode, int machineIdentifier, int counter) {
45 | 99734 |
         byte[] bytes = new byte[8];
46 | 99782 |
         bytes[0] = ByteUtil.int1(keyHashCode);
47 | 99782 |
         bytes[1] = ByteUtil.int0(keyHashCode);
48 | 99787 |
         bytes[2] = ByteUtil.int2(machineIdentifier);
49 | 99936 |
         bytes[3] = ByteUtil.int1(machineIdentifier);
50 | 99936 |
         bytes[4] = ByteUtil.int0(machineIdentifier);
51 | 99929 |
         bytes[5] = ByteUtil.int2(counter);
52 | 99963 |
         bytes[6] = ByteUtil.int1(counter);
53 | 99955 |
         bytes[7] = ByteUtil.int0(counter);
54 | 99945 |
         return bytes;
55 |  |
       }
56 |  |
     }