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

io.debezium.relational.SystemVariables Maven / Gradle / Ivy

/*
 * Copyright Debezium Authors.
 *
 * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
 */
package io.debezium.relational;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;

/**
 * Encapsulates a set of a database's system variables.
 *
 * @author Randall Hauch
 */
public class SystemVariables {

    /**
     * Interface that is used for enums defining the customized scope values for specific DBMSs.
     */
    public interface Scope {
        int priority();
    }

    public enum DefaultScope implements Scope {
        DEFAULT_SCOPE(100);

        private int priority;

        DefaultScope(int priority) {
            this.priority = priority;
        }

        @Override
        public int priority() {
            return priority;
        }
    }

    private final Map> systemVariables = new ConcurrentHashMap<>();

    /**
     * Create an instance.
     */
    public SystemVariables() {
        systemVariables.put(DefaultScope.DEFAULT_SCOPE, new ConcurrentHashMap<>());
    }

    public SystemVariables(Scope[] scopes) {
        for (Scope scope : scopes) {
            systemVariables.put(scope, new ConcurrentHashMap<>());
        }
    }

    public SystemVariables(List scopes) {
        for (Scope scope : scopes) {
            systemVariables.put(scope, new ConcurrentHashMap<>());
        }
    }

    /**
     * Set the variable with the specified scope.
     *
     * @param scope the variable scope; may be null if the session scope is to be used
     * @param name  the name of the variable; may not be null
     * @param value the variable value; may be null if the value for the named variable is to be removed
     * @return this object for method chaining purposes; never null
     */
    public SystemVariables setVariable(Scope scope, String name, String value) {
        name = variableName(name);
        if (value != null) {
            forScope(scope).put(name, value);
        }
        else {
            forScope(scope).remove(name);
        }
        return this;
    }

    /**
     * Get the variable with the specified name and scope.
     *
     * @param name  the name of the variable; may not be null
     * @param scope the variable scope; may not be null
     * @return the variable value; may be null if the variable is not currently set
     */
    public String getVariable(String name, Scope scope) {
        name = variableName(name);
        return forScope(scope).get(name);
    }

    /**
     * Get the variable with the specified name, from the highest priority scope that contain it.
     *
     * @param name the name of the variable; may not be null
     * @return the variable value; may be null if the variable is not currently set
     */
    public String getVariable(String name) {
        List> orderedSystemVariablesByPriority = getOrderedSystemVariablesByScopePriority();

        name = variableName(name);

        for (ConcurrentMap variablesByScope : orderedSystemVariablesByPriority) {
            String variableName = variablesByScope.get(name);
            if (variableName != null) {
                return variableName;
            }
        }
        return null;
    }

    private List> getOrderedSystemVariablesByScopePriority() {
        return systemVariables.entrySet().stream()
                .sorted(Comparator.comparingInt(entry -> entry.getKey().priority()))
                .map(Map.Entry::getValue)
                .collect(Collectors.toList());
    }

    private String variableName(String name) {
        return name.toLowerCase();
    }

    protected ConcurrentMap forScope(Scope scope) {
        if (scope != null) {
            return systemVariables.computeIfAbsent(scope, entities -> new ConcurrentHashMap<>());
        }
        // return most prior scope variables if scope is not defined
        List> orderedSystemVariablesByScopePriority = getOrderedSystemVariablesByScopePriority();
        return orderedSystemVariablesByScopePriority.isEmpty() ? null : orderedSystemVariablesByScopePriority.get(0);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy