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

com.bytex.snamp.cluster.HazelcastBox Maven / Gradle / Ivy

package com.bytex.snamp.cluster;

import com.bytex.snamp.core.SharedBox;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IAtomicReference;

import java.io.Serializable;
import java.util.Optional;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;

/**
 * Represents distributed Box service.
 * @author Roman Sakno
 * @version 2.0
 * @since 2.0
 */
final class HazelcastBox extends HazelcastSharedObject> implements SharedBox {

    HazelcastBox(final HazelcastInstance hazelcast, final String boxName){
        super(hazelcast, boxName, HazelcastInstance::getAtomicReference);
    }

    @Override
    public Serializable get() {
        return getDistributedObject().get();
    }

    @Override
    public void reset() {
        getDistributedObject().clear();
    }

    @Override
    public void set(final Serializable value) {
        getDistributedObject().set(value);
    }

    @Override
    public Serializable setIfAbsent(final Supplier valueProvider) {
        Serializable current;
        do {
            current = get();
            if (current == null)
                current = valueProvider.get();
            else
                break;
        } while (!getDistributedObject().compareAndSet(null, current));
        return current;
    }

    @Override
    public Serializable accumulateAndGet(final Serializable right, final BinaryOperator operator) {
        Serializable prev, next;
        do{
            next = operator.apply(prev = getDistributedObject().get(), right);
        } while (!getDistributedObject().compareAndSet(prev, next));
        return next;
    }

    @Override
    public Serializable updateAndGet(final UnaryOperator operator) {
        Serializable prev, next;
        do{
            next = operator.apply(prev = getDistributedObject().get());
        } while (!getDistributedObject().compareAndSet(prev, next));
        return next;
    }

    @Override
    public Serializable getAndSet(final Serializable newValue) {
        return getDistributedObject().getAndSet(newValue);
    }

    @Override
    public Serializable getOrDefault(final Supplier defaultProvider) {
        final Object current = get();
        return current == null ? defaultProvider.get() : get();
    }

    @Override
    public  Optional map(final Function mapper) {
        return Optional.ofNullable(get()).map(mapper);
    }

    /**
     * Determines whether this container has stored value.
     *
     * @return {@literal true}, if this container has stored value.
     */
    @Override
    public boolean hasValue() {
        return !getDistributedObject().isNull();
    }

    @Override
    public void accept(final Serializable value) {
        getDistributedObject().set(value);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy