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

com.zipwhip.concurrent.DefaultObservableFuture Maven / Gradle / Ivy

package com.zipwhip.concurrent;

import com.zipwhip.events.ObservableHelper;
import com.zipwhip.events.Observer;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;

/**
 *
 */
public class DefaultObservableFuture implements ObservableFuture {

    private boolean cancelled;
    private boolean success;
    private Throwable cause;
    private ObservableHelper> observableHelper;
    private CountDownLatch doneCountDownLatch = new CountDownLatch(1);
    private V result;
    private Object sender;

    public DefaultObservableFuture(Object sender) {
        this(sender, null);
    }

    public DefaultObservableFuture(Object sender, Executor executor) {
        this.sender = sender;
        observableHelper = new ObservableHelper>(executor);
    }

    @Override
    public boolean isDone() {
        return isCancelled() || isSuccess() || (cause != null);
    }

    @Override
    public boolean isCancelled() {
        return cancelled;
    }

    @Override
    public boolean isSuccess() {
        return success;
    }

    @Override
    public Throwable getCause() {
        return cause;
    }

    @Override
    public synchronized boolean cancel() {
        if (isCancelled()) {
            return false;
        }

        cancelled = true;
        success = false;
        doneCountDownLatch.countDown();

        notifyObservers();

        return true;
    }

    @Override
    public boolean setSuccess(V result) {
        if (isDone()) {
            return false;
        }

        this.result = result;
        cancelled = false;
        success = true;
        doneCountDownLatch.countDown();

        notifyObservers();

        return true;
    }

    @Override
    public boolean setFailure(Throwable cause) {
        if (isDone()){
            return false;
        }

        this.cause = cause;
        this.success = false;
        this.cancelled = false;
        this.doneCountDownLatch.countDown();

        notifyObservers();

        return true;
    }

    @Override
    public V getResult() {
        return result;
    }

    @Override
    public void addObserver(Observer> observer) {
        if (isDone()){
            notifyObserver(observer);
            return;
        }

        observableHelper.addObserver(observer);
    }

    @Override
    public void removeObserver(Observer> observer) {
        if (isDone()){
            notifyObserver(observer);
            return;
        }

        observableHelper.removeObserver(observer);
    }

    @Override
    public void await() throws InterruptedException {
        doneCountDownLatch.await();
    }

    @Override
    public void awaitUninterruptibly() {

        try {
            doneCountDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean await(long timeout, TimeUnit unit) throws InterruptedException {

        doneCountDownLatch.await(timeout, unit);

        return this.isDone();
    }

    @Override
    public boolean awaitUninterruptibly(long timeout, TimeUnit unit) {

        try {
            doneCountDownLatch.await(timeout, unit);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return this.isDone();
    }

    private void notifyObserver(Observer> observer) {
        observableHelper.notifyObserver(observer, this.sender, this);
    }

    private void notifyObservers() {
        observableHelper.notifyObservers(this.sender, this);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy