001package io.prometheus.client.exporter;
002
003import javax.xml.bind.DatatypeConverter;
004
005/**
006 * This class delegates to either javax.xml.bind.DatatypeConverter (for Java < 8) or java.util.Base64 (Java 8+)
007 * to perform Base64 encoding of a String.
008 *
009 * This code requires Java 8+ for compilation.
010 */
011public class Base64 {
012
013    private static final boolean HAS_JAVA_UTIL_BASE64 = hasJavaUtilBase64();
014
015    private static boolean hasJavaUtilBase64() {
016        try {
017            Class.forName("java.util.Base64");
018            // Java 8+
019            return true;
020        } catch (Throwable t) {
021            // Java < 8
022            return false;
023        }
024    }
025
026    private Base64() {}
027
028    /**
029     * Encodes a byte[] to a String using Base64.
030     *
031     * Passing a null argument will cause a NullPointerException to be thrown.
032     *
033     * @param src string to be encoded
034     * @return String in Base64 encoding
035     */
036    @SuppressWarnings("all")
037    public static String encodeToString(byte[] src) {
038        if (src == null) {
039            throw new NullPointerException();
040        }
041
042        if (HAS_JAVA_UTIL_BASE64) {
043            return java.util.Base64.getEncoder().encodeToString(src);
044        } else {
045            return DatatypeConverter.printBase64Binary(src);
046        }
047    }
048}