Search in sources :

Example 1 with Nullable

use of zipkin.internal.Nullable in project zipkin by openzipkin.

the class PseudoAddressRecordSet method textToNumericFormatV6.

@Nullable
private static byte[] textToNumericFormatV6(String ipString) {
    // An address can have [2..8] colons, and N colons make N+1 parts.
    String[] parts = ipString.split(":", IPV6_PART_COUNT + 2);
    if (parts.length < 3 || parts.length > IPV6_PART_COUNT + 1) {
        return null;
    }
    // Disregarding the endpoints, find "::" with nothing in between.
    // This indicates that a run of zeroes has been skipped.
    int skipIndex = -1;
    for (int i = 1; i < parts.length - 1; i++) {
        if (parts[i].length() == 0) {
            if (skipIndex >= 0) {
                // Can't have more than one ::
                return null;
            }
            skipIndex = i;
        }
    }
    // Number of parts to copy from above/before the "::"
    int partsHi;
    // Number of parts to copy from below/after the "::"
    int partsLo;
    if (skipIndex >= 0) {
        // If we found a "::", then check if it also covers the endpoints.
        partsHi = skipIndex;
        partsLo = parts.length - skipIndex - 1;
        if (parts[0].length() == 0 && --partsHi != 0) {
            // ^: requires ^::
            return null;
        }
        if (parts[parts.length - 1].length() == 0 && --partsLo != 0) {
            // :$ requires ::$
            return null;
        }
    } else {
        // Otherwise, allocate the entire address to partsHi. The endpoints
        // could still be empty, but parseHextet() will check for that.
        partsHi = parts.length;
        partsLo = 0;
    }
    // If we found a ::, then we must have skipped at least one part.
    // Otherwise, we must have exactly the right number of parts.
    int partsSkipped = IPV6_PART_COUNT - (partsHi + partsLo);
    if (!(skipIndex >= 0 ? partsSkipped >= 1 : partsSkipped == 0)) {
        return null;
    }
    // Now parse the hextets into a byte array.
    ByteBuffer rawBytes = ByteBuffer.allocate(2 * IPV6_PART_COUNT);
    try {
        for (int i = 0; i < partsHi; i++) {
            rawBytes.putShort(parseHextet(parts[i]));
        }
        for (int i = 0; i < partsSkipped; i++) {
            rawBytes.putShort((short) 0);
        }
        for (int i = partsLo; i > 0; i--) {
            rawBytes.putShort(parseHextet(parts[parts.length - i]));
        }
    } catch (NumberFormatException ex) {
        return null;
    }
    return rawBytes.array();
}
Also used : ByteBuffer(java.nio.ByteBuffer) Nullable(zipkin.internal.Nullable)

Aggregations

ByteBuffer (java.nio.ByteBuffer)1 Nullable (zipkin.internal.Nullable)1