All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.objectfabric.Utils Maven / Gradle / Ivy

There is a newer version: 0.9.1
Show newest version
/**
 * This file is part of ObjectFabric (http://objectfabric.org).
 *
 * ObjectFabric is licensed under the Apache License, Version 2.0, the terms
 * of which may be found at http://www.apache.org/licenses/LICENSE-2.0.html.
 * 
 * Copyright ObjectFabric Inc.
 * 
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

package org.objectfabric;

abstract class Utils {

    static final char[] HEX = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    static final byte[] XEH = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15 };

    static final int TIME_HEX = Tick.TIME_BITS / 8 * 2;

    static final int PEER_HEX = UID.LENGTH * 2;

    static final char FILE_SEPARATOR = Platform.get().fileSeparator();

    private Utils() {
    }

    static int nextPowerOf2(int value) {
        value--;
        value |= value >> 1;
        value |= value >> 2;
        value |= value >> 4;
        value |= value >> 8;
        value |= value >> 16;
        value++;
        return value;
    }

    static void replace(StringBuilder sb, String a, String b) {
        int index = 0;
        boolean one = false;

        for (;;) {
            index = sb.indexOf(a, index);

            if (index == -1)
                break;

            sb.replace(index, index + a.length(), b);
            index += b.length();
            one = true;
        }

        Debug.assertAlways(one);
    }

    static String padLeft(String stringToPad, int size, char pad) {
        StringBuilder strb = new StringBuilder(size);

        while (strb.length() < (size - stringToPad.length()))
            if (strb.length() < size - stringToPad.length())
                strb.insert(strb.length(), pad);

        return strb.append(stringToPad).toString();
    }

    static String padLeft(String stringToPad, int size) {
        return padLeft(stringToPad, size, ' ');
    }

    static String padRight(String stringToPad, int size, char pad) {
        StringBuilder strb = new StringBuilder(stringToPad);

        while (strb.length() < size)
            if (strb.length() < size)
                strb.append(pad);

        return strb.toString();
    }

    static String padRight(String stringToPad, int size) {
        return padRight(stringToPad, size, ' ');
    }

    static String getWithFirstLetterDown(String s) {
        return s.substring(0, 1).toLowerCase() + s.substring(1);
    }

    static String getWithFirstLetterUp(String s) {
        return s.substring(0, 1).toUpperCase() + s.substring(1);
    }

    static String getNameAsConstant(String name) {
        StringBuffer sb = new StringBuffer(name.length());

        for (int i = 0; i < name.length(); i++) {
            char c = name.charAt(i);

            if (Character.isUpperCase(c))
                if (sb.length() > 0)
                    sb.append('_');

            sb.append(Character.toUpperCase(c));
        }

        return sb.toString();
    }

    // HEX

    static final void getBytesHex(byte[] source, int offset, int length, char[] target, int offsetHex) {
        for (int i = 0; i < length; i++) {
            target[offsetHex + (i << 1) + 0] = HEX[(source[i + offset] >>> 4) & 0xf];
            target[offsetHex + (i << 1) + 1] = HEX[(source[i + offset] >>> 0) & 0xf];
        }
    }

    static final byte[] getBytes(String hex, int hexOffset, int byteCount) {
        byte[] result = new byte[byteCount];

        for (int i = 0; i < result.length; i++) {
            int a = XEH[hex.charAt(hexOffset + (i << 1) + 0) - '0'] << 4;
            int b = XEH[hex.charAt(hexOffset + (i << 1) + 1) - '0'] << 0;
            result[i] = (byte) (a | b);
        }

        return result;
    }

    static final void getTimeHex(long source, char[] target) {
        for (int i = 0; i < TIME_HEX; i++)
            target[i] = HEX[(int) (source >>> ((TIME_HEX - 1 - i) << 2)) & 0xf];
    }

    static final long getTime(String hex) {
        long result = 0;

        for (int i = 0; i < TIME_HEX; i++)
            result |= (long) XEH[hex.charAt(i) - '0'] << ((TIME_HEX - 1 - i) << 2);

        return result;
    }

    static String getTickHex(long value) {
        char[] chars = ThreadContext.get().PathCache;
        getTimeHex(Tick.time(value), chars);
        getBytesHex(Peer.get(Tick.peer(value)).uid(), 0, UID.LENGTH, chars, TIME_HEX);
        return new String(chars);
    }

    static long getTick(String hex) {
        long time = getTime(hex);
        Peer peer = Peer.get(new UID(getBytes(hex, TIME_HEX, UID.LENGTH)));
        return Tick.get(peer.index(), time);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy