alibaba/transmittable-thread-local

View on GitHub
ttl2-compatible/src/main/java/com/alibaba/ttl/threadpool/agent/TtlAgentHelper.java

Summary

Maintainability
C
1 day
Test Coverage
package com.alibaba.ttl.threadpool.agent;

import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.Nullable;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

import java.util.*;

/**
 * @author Jerry Lee (oldratlee at gmail dot com)
 * @since 3.0.0
 */
final class TtlAgentHelper {

    // ======== Option Getter Methods ========

    static boolean isBooleanOptionSet(
        @Nullable final Map<String, String> kvs, @NonNull String key,
        boolean defaultValueIfKeyAbsent
    ) {
        return isBooleanOptionSet(kvs, key, defaultValueIfKeyAbsent, true);
    }

    static boolean isBooleanOptionSet(
        @Nullable final Map<String, String> kvs, @NonNull String key,
        boolean defaultValueIfKeyAbsent, boolean defaultValueIfValueAbsent
    ) {
        final String value;

        final Properties properties = System.getProperties();
        if (properties.containsKey(key)) {
            value = properties.getProperty(key).trim();
        } else {
            if (kvs == null) return defaultValueIfKeyAbsent;

            final boolean containsKey = kvs.containsKey(key);
            if (!containsKey) return defaultValueIfKeyAbsent;

            value = kvs.get(key).trim();
        }

        // if value is blank
        if (value.isEmpty()) return defaultValueIfValueAbsent;

        return !"false".equalsIgnoreCase(value);
    }

    @NonNull
    static String getStringOptionValue(
        @Nullable final Map<String, String> kvs, @NonNull String key,
        @NonNull String defaultValue
    ) {
        final String value;

        final Properties properties = System.getProperties();
        if (properties.containsKey(key)) {
            value = properties.getProperty(key).trim();
        } else {
            if (kvs == null) return defaultValue;

            final boolean containsKey = kvs.containsKey(key);
            if (!containsKey) return defaultValue;

            value = kvs.get(key).trim();
        }

        // if value is blank
        if (value.isEmpty()) return defaultValue;

        return value;
    }

    @NonNull
    @SuppressWarnings("unchecked")
    static List<String> getOptionStringListValues(@Nullable final Map<String, String> kvs, @NonNull String key) {
        final String value;

        final Properties properties = System.getProperties();
        if (properties.containsKey(key)) {
            value = properties.getProperty(key);
        } else {
            if (kvs == null) return Collections.EMPTY_LIST;

            value = kvs.get(key);
        }

        return splitListStringToStringList(value);
    }

    // ======== Simple Parse Util Methods ========

    /**
     * Split {@code json} like String({@code "k1:v1,k2:v2"}) to KV map({@code "k1"->"v1", "k2"->"v2"}).
     */
    @NonNull
    static Map<String, String> splitCommaColonStringToKV(@Nullable final String commaColonString) {
        final Map<String, String> ret = new HashMap<>();
        if (commaColonString == null || commaColonString.trim().length() == 0) return ret;

        final String[] splitKvArray = commaColonString.trim().split("\\s*,\\s*");
        for (String kvString : splitKvArray) {
            final String[] kv = kvString.trim().split("\\s*:\\s*");
            if (kv.length == 0) continue;

            if (kv.length == 1) ret.put(kv[0], "");
            else ret.put(kv[0], kv[1]);
        }

        return ret;
    }

    /**
     * Split String {@code "v1|v2|v3"} to String List({@code [v1, v2, v3]}).
     */
    @NonNull
    static List<String> splitListStringToStringList(@Nullable String listString) {
        final List<String> ret = new ArrayList<>();
        if (listString == null || listString.trim().length() == 0) return ret;

        final String[] split = listString.trim().split("\\s*\\|\\s*");
        for (String s : split) {
            if (s.length() == 0) continue;

            ret.add(s);
        }

        return ret;
    }


    @SuppressFBWarnings("CT_CONSTRUCTOR_THROW")
    private TtlAgentHelper() {
        throw new InstantiationError("Must not instantiate this class");
    }
}