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

com.bytex.snamp.configuration.impl.SerializableSupervisorConfiguration Maven / Gradle / Ivy

package com.bytex.snamp.configuration.impl;

import com.bytex.snamp.SpecialUse;
import com.bytex.snamp.Stateful;
import com.bytex.snamp.configuration.ScriptletConfiguration;
import com.bytex.snamp.configuration.SupervisorConfiguration;
import com.bytex.snamp.configuration.SupervisorInfo;

import javax.annotation.Nonnull;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.time.Duration;
import java.util.Map;
import java.util.Objects;

import static com.google.common.base.Strings.isNullOrEmpty;
import static com.google.common.base.Strings.nullToEmpty;

/**
 * Represents serializable configuration of the supervisor.
 * @author Roman Sakno
 * @version 2.0
 * @since 2.0
 */
final class SerializableSupervisorConfiguration extends AbstractEntityConfiguration implements SupervisorConfiguration {
    private static final long serialVersionUID = 976676415940627332L;

    final static class SerializableDiscoveryConfiguration implements ResourceDiscoveryConfiguration, Modifiable, Stateful, Externalizable{
        private static final long serialVersionUID = -2331867913948707000L;
        private transient boolean modified;
        private String template;

        @SpecialUse(SpecialUse.Case.SERIALIZATION)
        public SerializableDiscoveryConfiguration() {
            template = "";
        }

        void clear(){
            template = "";
            modified = true;
        }

        void load(final ResourceDiscoveryInfo other){
            setConnectionStringTemplate(other.getConnectionStringTemplate());
        }

        @Override
        public boolean isModified() {
            return modified;
        }

        @Override
        public void reset() {
            modified = false;
        }

        @Override
        public String getConnectionStringTemplate() {
            return template;
        }

        @Override
        public void setConnectionStringTemplate(final String value) {
            template = nullToEmpty(value);
            modified = true;
        }

        @Override
        public void writeExternal(final ObjectOutput out) throws IOException {
            out.writeUTF(template);
        }

        @Override
        public void readExternal(final ObjectInput in) throws IOException {
            template = in.readUTF();
        }

        @Override
        public int hashCode() {
            return template.hashCode();
        }

        private boolean equals(final ResourceDiscoveryConfiguration other) {
            return other.getConnectionStringTemplate().equals(getConnectionStringTemplate());
        }

        @Override
        public boolean equals(final Object other) {
            return other instanceof ResourceDiscoveryConfiguration && equals((ResourceDiscoveryConfiguration) other);
        }
    }

    final static class SerializableAutoScalingConfiguration implements AutoScalingConfiguration, Modifiable, Stateful, Externalizable {
        private static final long serialVersionUID = 972896691097935578L;
        private transient boolean modified;
        private boolean enabled;
        private Duration cooldownTime;
        private int scalingSize;
        private int minSize;
        private int maxSize;
        private final SerializableScriptlets policies;

        @SpecialUse(SpecialUse.Case.SERIALIZATION)
        public SerializableAutoScalingConfiguration() {
            cooldownTime = Duration.ZERO;
            scalingSize = 1;
            minSize = 0;
            maxSize = Integer.MAX_VALUE;
            policies = new SerializableScriptlets();
        }

        @Override
        public boolean isModified() {
            return modified || policies.isModified();
        }

        @Override
        public void reset() {
            policies.reset();
            modified = false;
        }

        @Override
        public void setEnabled(final boolean value) {
            enabled = value;
            modified = true;
        }

        @Override
        public void setCooldownTime(@Nonnull final Duration value) {
            cooldownTime = Objects.requireNonNull(value);
            modified = true;
        }

        @Override
        public void setScalingSize(final int value) {
            if (value < 1)
                throw new IllegalArgumentException("Scaling size cannot be less than 1");
            scalingSize = value;
            modified = true;
        }

        @Override
        public void setMaxClusterSize(final int value) {
            if(value < 1)
                throw new IllegalArgumentException("Maximum cluster size cannot be less than 1");
            maxSize = value;
            modified = true;
        }

        @Override
        public void setMinClusterSize(final int value) {
            if(value < 0)
                throw new IllegalArgumentException("Minimum cluster size cannot be less than 0");
            minSize = value;
            modified = true;
        }

        @Override
        public int getMaxClusterSize() {
            return maxSize;
        }

        @Override
        public int getMinClusterSize() {
            return minSize;
        }

        @Override
        public boolean isEnabled() {
            return enabled;
        }

        @Nonnull
        @Override
        public Duration getCooldownTime() {
            return cooldownTime;
        }

        @Override
        public int getScalingSize() {
            return scalingSize;
        }

        @Nonnull
        @Override
        public SerializableScriptlets getPolicies() {
            return policies;
        }

        @Override
        public void writeExternal(final ObjectOutput out) throws IOException {
            out.writeBoolean(enabled);
            out.writeObject(cooldownTime);
            out.writeInt(scalingSize);
            out.writeInt(minSize);
            out.writeInt(maxSize);
            policies.writeExternal(out);
        }

        @Override
        public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
            enabled = in.readBoolean();
            cooldownTime = (Duration) in.readObject();
            scalingSize = in.readInt();
            minSize = in.readInt();
            maxSize = in.readInt();
            policies.readExternal(in);
        }

        void clear() {
            enabled = false;
            cooldownTime = Duration.ZERO;
            scalingSize = 1;
            minSize = 0;
            maxSize = Integer.MAX_VALUE;
            policies.clear();
        }

        void load(final AutoScalingInfo autoScalingConfig) {
            enabled = autoScalingConfig.isEnabled();
            cooldownTime = autoScalingConfig.getCooldownTime();
            scalingSize = autoScalingConfig.getScalingSize();
            policies.load(autoScalingConfig.getPolicies());
            maxSize = autoScalingConfig.getMaxClusterSize();
            minSize = autoScalingConfig.getMinClusterSize();
        }
    }

    final static class SerializableHealthCheckConfiguration implements HealthCheckConfiguration, Modifiable, Stateful, Externalizable{
        private static final long serialVersionUID = -4851867914948707006L;
        private final SerializableScriptlets checkers;
        private final SerializableScriptletConfiguration trigger;

        @SpecialUse(SpecialUse.Case.SERIALIZATION)
        public SerializableHealthCheckConfiguration(){
            checkers = new SerializableScriptlets();
            trigger = new SerializableScriptletConfiguration();
        }

        @Override
        public boolean isModified() {
            return checkers.isModified() || trigger.isModified();
        }

        void load(final HealthCheckInfo configuration){
            trigger.load(configuration.getTrigger());
            checkers.load(configuration.getAttributeCheckers());
        }

        /**
         * Resets internal state of the object.
         */
        @Override
        public void reset() {
            checkers.reset();
            trigger.reset();
        }

        /**
         * Gets map of attribute checkers where key is attribute name.
         *
         * @return Map of attribute checkers.
         */
        @Override
        @Nonnull
        public SerializableScriptlets getAttributeCheckers() {
            return checkers;
        }

        /**
         * Gets trigger called when status of the component will be changed.
         *
         * @return Trigger configuration.
         */
        @Override
        @Nonnull
        public SerializableScriptletConfiguration getTrigger() {
            return trigger;
        }

        @Override
        public void writeExternal(final ObjectOutput out) throws IOException {
            trigger.writeExternal(out);
            checkers.writeExternal(out);
        }

        @Override
        public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
            trigger.readExternal(in);
            checkers.readExternal(in);
        }

        @Override
        public int hashCode() {
            return Objects.hash(trigger, checkers);
        }

        private boolean equals(final HealthCheckConfiguration other) {
            return other.getTrigger().equals(trigger) &&
                    other.getAttributeCheckers().equals(checkers);
        }

        @Override
        public boolean equals(final Object other) {
            return other instanceof HealthCheckConfiguration && equals((HealthCheckConfiguration) other);
        }

        void clear() {
            checkers.clear();
            ScriptletConfiguration.fillByDefault(trigger);
        }
    }

    private SerializableHealthCheckConfiguration healthCheckConfig;
    private SerializableDiscoveryConfiguration discoveryConfig;
    private String supervisorType;
    private SerializableAutoScalingConfiguration autoScalingConfig;

    @SpecialUse(SpecialUse.Case.SERIALIZATION)
    public SerializableSupervisorConfiguration() {
        healthCheckConfig = new SerializableHealthCheckConfiguration();
        discoveryConfig = new SerializableDiscoveryConfiguration();
        supervisorType = DEFAULT_TYPE;
        autoScalingConfig = new SerializableAutoScalingConfiguration();
    }

    /**
     * Gets supervisor type.
     *
     * @return Supervisor type.
     */
    @Override
    public String getType() {
        return isNullOrEmpty(supervisorType) ? DEFAULT_TYPE : supervisorType;
    }

    /**
     * Sets supervisor type.
     *
     * @param value Supervisor type.
     */
    @Override
    public void setType(final String value) {
        supervisorType = nullToEmpty(value);
        markAsModified();
    }

    @Override
    public void writeExternal(final ObjectOutput out) throws IOException {
        out.writeUTF(supervisorType);
        healthCheckConfig.writeExternal(out);
        discoveryConfig.writeExternal(out);
        autoScalingConfig.writeExternal(out);
        super.writeExternal(out);
    }

    @Override
    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
        supervisorType = in.readUTF();
        healthCheckConfig = new SerializableHealthCheckConfiguration();
        healthCheckConfig.readExternal(in);
        discoveryConfig = new SerializableDiscoveryConfiguration();
        discoveryConfig.readExternal(in);
        autoScalingConfig = new SerializableAutoScalingConfiguration();
        autoScalingConfig.readExternal(in);
        super.readExternal(in);
    }

    /**
     * Gets configuration of the health check.
     *
     * @return Configuration of the health checks.
     */
    @Override
    @Nonnull
    public SerializableHealthCheckConfiguration getHealthCheckConfig() {
        return healthCheckConfig;
    }

    @Nonnull
    @Override
    public SerializableDiscoveryConfiguration getDiscoveryConfig() {
        return discoveryConfig;
    }

    /**
     * Gets configuration of elasticity management process.
     *
     * @return Elasticity manager.
     */
    @Nonnull
    @Override
    public SerializableAutoScalingConfiguration getAutoScalingConfig() {
        return autoScalingConfig;
    }

    void setHealthCheckConfig(@Nonnull final SerializableHealthCheckConfiguration value){
        healthCheckConfig = Objects.requireNonNull(value);
    }

    void setDiscoveryConfig(@Nonnull final SerializableDiscoveryConfiguration value){
        discoveryConfig = Objects.requireNonNull(value);
    }

    void setAutoScalingConfig(@Nonnull final SerializableAutoScalingConfiguration value){
        autoScalingConfig = Objects.requireNonNull(value);
    }

    @Override
    public void clear() {
        super.clear();
        healthCheckConfig.clear();
        discoveryConfig.clear();
        autoScalingConfig.clear();
    }

    @Override
    public boolean isModified() {
        return super.isModified() || healthCheckConfig.isModified() || discoveryConfig.isModified() || autoScalingConfig.isModified();
    }

    @Override
    public void reset() {
        super.reset();
        healthCheckConfig.reset();
        discoveryConfig.reset();
        autoScalingConfig.reset();
    }

    private void loadParameters(final Map parameters) {
        super.clear();
        super.putAll(parameters);
    }

    private void load(final SupervisorInfo other) {
        healthCheckConfig.load(other.getHealthCheckConfig());
        discoveryConfig.load(other.getDiscoveryConfig());
        autoScalingConfig.load(other.getAutoScalingConfig());
        loadParameters(other);
    }

    @Override
    public void load(final Map parameters) {
        if(parameters instanceof SupervisorInfo)
            load((SupervisorInfo) parameters);
        else
            loadParameters(parameters);
    }

    private boolean equals(final SupervisorInfo other) {
        return other.getHealthCheckConfig().equals(healthCheckConfig) &&
                other.getDiscoveryConfig().equals(discoveryConfig) &&
                other.getAutoScalingConfig().equals(autoScalingConfig) &&
                super.equals(other);
    }

    @Override
    public boolean equals(final Object other) {
        return other instanceof SupervisorInfo && equals((SupervisorInfo) other);
    }

    @Override
    public int hashCode() {
        return super.hashCode() ^ Objects.hash(healthCheckConfig, discoveryConfig);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy