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

com.ardikars.common.util.Strings Maven / Gradle / Ivy

The newest version!
/**
 * Copyright 2017-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.ardikars.common.util;

import com.ardikars.common.annotation.Helper;
import com.ardikars.common.annotation.Incubating;

import java.nio.charset.Charset;

/**
 * Stirngs utility.
 *
 * @author Ardika Rommy Sanjaya
 * @since 1.0.0
 */
@Helper
public final class Strings {

    /**
     * Default charset (UTF-8).
     */
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    private Strings() { }

    /**
     * Get length.
     * @param dataLength data length.
     * @param offset offset.
     * @param length length.
     * @return length.
     */
    private static int length(final int dataLength, final int offset, final int length) {
        int l;
        if (dataLength != length && offset != 0) {
            l = offset + length;
        } else {
            l = length;
        }
        return l;
    }

    /**
     * Byte to hex value.
     * @param value value.
     * @return hex format.
     * @since 1.0.0
     */
    public static String toHexString(final byte value) {
        String str = Integer.toHexString((value) & 0xff);
        if ((str.length() & 1) == 1) {
            return "0" + str;
        }
        return str;
    }

    /**
     * Byte array to hex stream.
     * @param data byte array.
     * @return hex stream.
     * @since 1.0.0
     */
    public static String toHexString(final byte[] data) {
        return toHexString(data, 0, data.length);
    }

    /**
     * Byte array to hex stream.
     * @param data byte array.
     * @param offset offset.
     * @param length length.
     * @return hex stream.
     * @since 1.0.0
     */
    public static String toHexString(final byte[] data, final int offset, final int length) {
        Validate.notInBounds(data, offset, length);
        StringBuilder sb = new StringBuilder(length);
        int l = length(data.length, offset, length);
        for (int i = offset; i < l; i++) {
            sb.append(toHexString(data[i]));
        }
        return sb.toString();
    }

    /**
     * Short to hex stream.
     * @param value short array.
     * @return hex stream.
     * @since 1.0.0
     */
    public static String toHexString(final short value) {
        String str = Integer.toHexString((value) & 0xFFFF);
        if ((str.length() & 1) == 1) {
            return "0" + str;
        }
        return str;
    }

    /**
     * Short array to hex stream.
     * @param values short array.
     * @return hex stream.
     * @since 1.0.0
     */
    public static String toHexString(final short[] values) {
        return toHexString(values, 0, values.length);
    }

    /**
     * Short array to hex stream.
     * @param data short array.
     * @param offset offset.
     * @param length length.
     * @return hex stream.
     * @since 1.0.0
     */
    public static String toHexString(final short[] data, final int offset, final int length) {
        Validate.notInBounds(data, offset, length);
        StringBuilder sb = new StringBuilder(length);
        int l = length(data.length, offset, length);
        for (int i = offset; i < l; i++) {
            sb.append(toHexString(data[i]));
        }
        return sb.toString();
    }

    /**
     * Int to hex stream.
     * @param value integer value.
     * @return hex stream.
     * @since 1.0.0
     */
    public static String toHexString(final int value) {
        String str = Integer.toHexString(value);
        if ((str.length() & 1) == 1) {
            return "0" + str;
        }
        return str;
    }

    /**
     * Int array to hex stream.
     * @param values int array.
     * @return hex stream.
     * @since 1.0.0
     */
    public static String toHexString(final int[] values) {
        return toHexString(values, 0, values.length);
    }

    /**
     * Int array to hex stream.
     * @param data int array.
     * @param offset offset.
     * @param length length.
     * @return hex stream.
     * @since 1.0.0
     */
    public static String toHexString(final int[] data, final int offset, final int length) {
        Validate.notInBounds(data, offset, length);
        StringBuilder sb = new StringBuilder(length);
        int l = length(data.length, offset, length);
        for (int i = offset; i < l; i++) {
            sb.append(toHexString(data[i]));
        }
        return sb.toString();
    }

    /**
     * Float to hex stream.
     * @param value float array.
     * @return hex stream.
     */
    public static String toHexString(final float value) {
        String str = Float.toHexString(value);
        if ((str.length() & 1) == 1) {
            return "0" + str;
        }
        return str;
    }

    /**
     * Float array to hex stream.
     * @param data float array.
     * @return hex stream.
     */
    public static String toHexString(final float[] data) {
        return toHexString(data, 0, data.length);
    }

    /**
     * Float array to hex stream.
     * @param data float array.
     * @param offset offset.
     * @param length length.
     * @return hex stream.
     */
    public static String toHexString(final float[] data, final int offset, final int length) {
        Validate.notInBounds(data, offset, length);
        StringBuilder sb = new StringBuilder(length);
        int l = length(data.length, offset, length);
        for (int i = offset; i < l; i++) {
            sb.append(toHexString(data[i]));
        }
        return sb.toString();
    }

    /**
     * Long to hex stream.
     * @param value long.
     * @return hex stream.
     */
    public static String toHexString(final long value) {
        String str = Long.toHexString(value);
        if ((str.length() & 1) == 1) {
            return "0" + str;
        }
        return str;
    }

    /**
     * Long array to hex stream.
     * @param data long array.
     * @return hex stream.
     */
    public static String toHexString(final long[] data) {
        return toHexString(data, 0, data.length);
    }

    /**
     * Long array to hex stream.
     * @param data long array.
     * @param offset offset.
     * @param length length.
     * @return hex stream.
     */
    public static String toHexString(final long[] data, final  int offset, final int length) {
        Validate.notInBounds(data, offset, length);
        StringBuilder sb = new StringBuilder(length);
        int l = length(data.length, offset, length);
        for (int i = offset; i < l; i++) {
            sb.append(toHexString(data[i]));
        }
        return sb.toString();
    }

    /**
     * Double to hex stream.
     * @param value double value.
     * @return hex stream.
     */
    public static String toHexString(final double value) {
        String str = Double.toHexString(value);
        if ((str.length() & 1) == 1) {
            return "0" + str;
        }
        return str;
    }

    /**
     * Double array to hex stream.
     * @param data double array.
     * @return hex stream.
     */
    public static String toHexString(final double[] data) {
        return toHexString(data, 0, data.length);
    }

    /**
     * Double array to hex stream.
     * @param data double array.
     * @param offset offset.
     * @param length length.
     * @return hex stream.
     */
    public static String toHexString(final double[] data, final int offset, final int length) {
        Validate.notInBounds(data, offset, length);
        StringBuilder sb = new StringBuilder(length);
        int l = length(data.length, offset, length);
        for (int i = offset; i < l; i++) {
            sb.append(toHexString(data[i]));
        }
        return sb.toString();
    }

    /**
     * String to hex string.
     * @param value string.
     * @return hex string.
     */
    public static String toHexString(final String value) {
        Validate.notIllegalArgument(value != null && !value.isEmpty(),
                new IllegalArgumentException("Value should be not null and empty."));
        return toHexString(value.getBytes(DEFAULT_CHARSET));
    }

    /**
     * String hex string.
     * @param value string.
     * @param charset charset.
     * @return hex string.
     */
    @Incubating
    public static String toHexString(final String value, Charset charset) {
        Validate.notIllegalArgument(value != null && !value.isEmpty(),
                new IllegalArgumentException("Value should be not null and empty."));
        Validate.notIllegalArgument(charset != null,
                new IllegalArgumentException("Charset should be not null."));
        return toHexString(value.getBytes(charset));
    }

    public static ToStringBuilder toStringBuilder(Object obj) {
        return toStringBuilder(obj, "{", "}", "=", ",", false);
    }

    public static ToStringBuilder toStringJsonBuilder(Object obj) {
        return toStringBuilder("", "{", "}", ":", ",", true);
    }

    public static ToStringBuilder toStringBuilder(Object obj, String start, String end, String delimiter, String separator, boolean quoteString) {
        return toStringBuilder(obj.getClass().getSimpleName(), start, end, delimiter, separator, quoteString);
    }

    public static ToStringBuilder toStringBuilder(String name, String start, String end, String delimiter, String separator, boolean quoteString) {
        return new ToStringBuilder(name, start, end, delimiter, separator, quoteString);
    }

    public static final class ToStringBuilder {

        private final String name;
        private final String start;
        private final String end;
        private final String delimiter;
        private final String separator;
        private final boolean quoteString;
        private final ValueHolder holderHead = new ValueHolder();
        private ValueHolder holderTail = holderHead;

        private ToStringBuilder(String name, String start, String end, String delimiter, String separator, boolean quoteString) {
            this.name = name;
            this.start = start;
            this.end = end;
            this.delimiter = delimiter;
            this.separator = separator;
            this.quoteString = quoteString;
        }

        public ToStringBuilder add(String name, Object value) {
            Validate.notIllegalArgument(name != null && !name.isEmpty());
            ValueHolder valueHolder = addHolder();
            valueHolder.name = name;
            valueHolder.value = value;
            return this;
        }

        @Override
        public String toString() {
            String nextSeparator = "";
            StringBuilder builder = new StringBuilder(32).append(name).append(start);
            for (ValueHolder valueHolder = holderHead.next;
                valueHolder != null;
                valueHolder = valueHolder.next) {
                Object value = valueHolder.value;
                if (value != null) {
                    builder.append(nextSeparator);
                    nextSeparator = separator;
                    if (valueHolder.name != null) {
                        if (quoteString) {
                            builder.append('\"').append(valueHolder.name).append('\"').append(delimiter);
                        } else {
                            builder.append(valueHolder.name).append(delimiter);
                        }
                    }
                    if (value.getClass().isArray()) {
                        String arrayString;
                        if (value instanceof byte[]) {
                            byte[] array = (byte[]) value;
                            arrayString = Strings.toHexString(array);
                        } else if (value instanceof short[]) {
                            arrayString = Strings.toHexString((short[]) value);
                        } else if (value instanceof int[]) {
                            arrayString = Strings.toHexString((int[]) value);
                        } else if (value instanceof float[]) {
                            arrayString = Strings.toHexString((float[]) value);
                        } else if (value instanceof long[]) {
                            arrayString = Strings.toHexString((long[]) value);
                        } else if (value instanceof double[]) {
                            arrayString = Strings.toHexString((double[]) value);
                        } else {
                            arrayString = Arrays.toString(value);
                        }
                        if (quoteString) {
                            builder.append('\"').append(arrayString).append('\"');
                        } else {
                            builder.append(arrayString);
                        }
                    } else {
                        if (quoteString && value instanceof CharSequence) {
                            builder.append("\"").append(value).append("\"");
                        } else {
                            builder.append(value);
                        }
                    }
                }
            }
            return builder.append(end).toString();
        }

        private static final class ValueHolder {

            private String name;
            private Object value;
            private ValueHolder next;

        }

        private ValueHolder addHolder() {
            ValueHolder valueHolder = new ValueHolder();
            holderTail = holderTail.next = valueHolder;
            return valueHolder;
        }

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy