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

com.microsoft.azure.kusto.data.format.CslStringFormat Maven / Gradle / Ivy

package com.microsoft.azure.kusto.data.format;

import com.microsoft.azure.kusto.data.Ensure;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;

import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class CslStringFormat extends CslFormat {
    public static final Set KUSTO_LITERAL_PREFIX = Stream.of("H", "h").collect(Collectors.toCollection(HashSet::new));
    public static final Set KUSTO_MULTILINE_QUOTE_DELIMITERS = Stream.of("```", "~~~").collect(Collectors.toCollection(HashSet::new));
    public static final Set KUSTO_ESCAPE_SEQUENCES = Stream.of("\\\"", "'", "@\\\"", "@'").collect(Collectors.toCollection(HashSet::new));

    private final String value;

    public CslStringFormat(String value) {
        this.value = value;
    }

    @Override
    public String getType() {
        return null;
    }

    @Override
    public String getValue() {
        return value;
    }

    @Override
    String getValueAsString() {
        Ensure.stringIsNotBlank(value, "value");

        return value;
    }

    public static String parseStringLiteral(String value) {
        String result = value;
        if (KUSTO_LITERAL_PREFIX.contains(result.substring(0, 1))) {
            result = result.substring(1);
        }

        String multilineString = parseMultilineString(result);
        if (StringUtils.isNotBlank(multilineString)) {
            return multilineString;
        }

        return unescapeString(result);
    }

    private static String parseMultilineString(String quotedString) {
        for (String quoteDelimiter : KUSTO_MULTILINE_QUOTE_DELIMITERS) {
            if (quotedString.startsWith(quoteDelimiter)) {
                int twiceQuoteLen = quoteDelimiter.length() * 2;
                if (quotedString.length() >= twiceQuoteLen && quotedString.endsWith(quoteDelimiter)) {
                    return quotedString.substring(quoteDelimiter.length(), quotedString.length() - twiceQuoteLen);
                } else {
                    return quotedString.substring(quoteDelimiter.length());
                }
            }
        }

        return null;
    }

    private static String unescapeString(String escapedString) {
        for (String escapeSequence : KUSTO_ESCAPE_SEQUENCES) {
            if (escapedString.startsWith(escapeSequence)) {
                int escapeSequenceLength = escapeSequence.length() + 1;
                if (escapedString.length() >= escapeSequenceLength && escapedString.endsWith(escapeSequence)) {
                    String unescapedString = escapedString.substring(escapeSequence.length(), escapedString.length() - escapeSequence.length());
                    if ("\\\"".equals(escapeSequence) || "'".equals(escapeSequence)) {
                        return StringEscapeUtils.unescapeJava(unescapedString);
                    } else if (escapeSequence.startsWith("@")) {
                        String quote = escapeSequence.substring(1);
                        return escapedString.replaceAll(quote + quote, quote);
                    }
                }
            }
        }

        return escapedString;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy