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

com.exasol.containers.slc.SlcConfiguration Maven / Gradle / Ivy

package com.exasol.containers.slc;

import static java.util.function.Predicate.not;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toMap;

import java.util.*;
import java.util.stream.Collector;

import com.exasol.errorreporting.ExaError;

/**
 * This class represents the configuration of a Script Language Container (SLC) in an Exasol database with
 * system/session parameter {@code SCRIPT_LANGUAGES}. See Exasol
 * documentation for details about the syntax.
 */
class SlcConfiguration {
    private final Map entries;

    private SlcConfiguration(final Map entries) {
        this.entries = entries;
    }

    /**
     * Parse a SLC configuration from a string in format {@code alias1=value1 alias2=value2 ...}.
     * 
     * @param value the configuration string
     * @return parsed configuration
     */
    static SlcConfiguration parse(final String value) {
        final Map entries = Arrays.stream(value.split(" ")) //
                .filter(not(String::isBlank)) //
                .map(SlcConfiguration::parseEntry) //
                .collect(toLinkedHashMap());
        return new SlcConfiguration(entries);
    }

    private static Collector, ?, LinkedHashMap> toLinkedHashMap() {
        return toMap(entry -> entry.get(0), entry -> entry.get(1), SlcConfiguration::failForDuplicateKeys,
                LinkedHashMap::new);
    }

    private static String failForDuplicateKeys(final String a, final String b) {
        throw new IllegalArgumentException(ExaError.messageBuilder("E-ETC-31")
                .message("Found two entries with the same key: {{value 1}}, {{value 2}}", a, b).toString());
    }

    private static List parseEntry(final String entry) {
        final int index = entry.indexOf("=");
        if (index == -1) {
            throw new IllegalArgumentException(ExaError.messageBuilder("E-ETC-28")
                    .message("Invalid entry in SLC configuration: {{entry}}", entry).toString());
        }
        final String key = entry.substring(0, index).trim();
        if (key.isEmpty()) {
            throw new IllegalArgumentException(ExaError.messageBuilder("E-ETC-29")
                    .message("Invalid key in SLC configuration: {{entry}}", entry).toString());
        }
        final String value = entry.substring(index + 1).trim();
        if (value.isEmpty()) {
            throw new IllegalArgumentException(ExaError.messageBuilder("E-ETC-30")
                    .message("Invalid value in SLC configuration: {{entry}}", entry).toString());
        }
        return List.of(key, value);
    }

    /**
     * Format the configuration as a string in format {@code alias1=value1 alias2=value2 ...}.
     * 
     * @return formatted configuration
     */
    String format() {
        return this.entries.entrySet().stream() //
                .map(entry -> entry.getKey() + "=" + entry.getValue()) //
                .collect(joining(" "));
    }

    /**
     * Set an alias to a configuration. If the alias already exists, it will be overwritten.
     * 
     * @param alias         alias
     * @param configuration configuration
     */
    void setAlias(final String alias, final String configuration) {
        this.entries.put(alias.trim(), configuration.trim());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy