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

org.smallibs.concurrent.promise.impl.PromisesSet Maven / Gradle / Ivy

/*
 * HPAS
 * https://github.com/d-plaindoux/hpas
 *
 * Copyright (c) 2016-2017 Didier Plaindoux
 * Licensed under the LGPL2 license.
 */

package org.smallibs.concurrent.promise.impl;

import org.smallibs.concurrent.promise.Promise;
import org.smallibs.data.Try;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class PromisesSet extends SolvablePromise> {

    private final Strategy strategy;
    private final Promise[] promises;
    private final AtomicInteger activePromises;
    private final List collectedResult;

    public PromisesSet(Strategy strategy, Promise... promises) {
        this.strategy = strategy;
        this.promises = promises;
        this.activePromises = new AtomicInteger(this.promises.length);
        this.collectedResult = new ArrayList<>();

        if (this.promises.length == 0) {
            solve(Try.success(this.collectedResult));
            return;
        }

        Arrays.asList(this.promises).forEach(promise -> {
            promise.onSuccess(t -> {
                activePromises.decrementAndGet();
                manageSuccess(t);
            });
            promise.onFailure(e -> {
                activePromises.decrementAndGet();
                manageError(e);
            });
        });

    }

    private final void manageSuccess(T t) {
        this.collectedResult.add(t);

        switch (strategy) {
            case STOP_ON_SUCCESS:
                solve(Try.success(this.collectedResult));

                Arrays.asList(promises).forEach(promise -> {
                    promise.getFuture().cancel(true);
                });
                break;
            default:
                if (activePromises.get() == 0) {
                    solve(Try.success(this.collectedResult));
                }
                break;
        }
    }

    private final void manageError(Throwable t) {
        switch (strategy) {
            case STOP_ON_ERROR:
                solve(Try.failure(t));

                Arrays.asList(promises).forEach(promise -> {
                    promise.getFuture().cancel(true);
                });
                break;
            case STOP_ON_SUCCESS:
                if (activePromises.get() == 0) {
                    solve(Try.failure(t));
                }
                break;
            default:
                if (activePromises.get() == 0) {
                    solve(Try.success(this.collectedResult));
                }
                break;
        }
    }

    public enum Strategy {
        NO_STOP,
        STOP_ON_ERROR,
        STOP_ON_SUCCESS
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy