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

ru.taskurotta.recipes.pcollection.decider.CollectionOfPromiseDeciderImpl Maven / Gradle / Ivy

package ru.taskurotta.recipes.pcollection.decider;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Required;
import ru.taskurotta.annotation.Asynchronous;
import ru.taskurotta.annotation.Wait;
import ru.taskurotta.core.Promise;
import ru.taskurotta.recipes.pcollection.PromiseCollectionArbiter;
import ru.taskurotta.recipes.pcollection.model.ModelObjectVO;
import ru.taskurotta.recipes.pcollection.worker.CollectionConsumerClient;
import ru.taskurotta.recipes.pcollection.worker.CollectionProducerClient;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * User: dimadin
 * Date: 22.07.13 11:36
 */
public class CollectionOfPromiseDeciderImpl implements CollectionOfPromiseDecider {

    private static final Logger logger = LoggerFactory.getLogger(CollectionOfPromiseDeciderImpl.class);

    private CollectionProducerClient producer;
    private CollectionConsumerClient consumer;
    private CollectionOfPromiseDeciderImpl selfAsync;
    private PromiseCollectionArbiter arbiter;

    @Override
    public void execute(int size) {
        arbiter.notify("execute");
        Promise array = producer.produceArray(Promise.asPromise(size));
        Promise> list = producer.produceList(Promise.asPromise(size));

        List waitList = new ArrayList();
        waitList.add(array);
        waitList.add(list);

        //Any method in the commented list below should work:
        //Promise  waitComplete = selfAsync.waitForSeparate(array, list);
        Promise waitComplete = selfAsync.waitForList(waitList);

        Promise compareResult = selfAsync.isContainSameElements(array, list);
        selfAsync.logResult(compareResult, array, list);


        Promise pArray = consumer.consumeArray(array, waitComplete);
        Promise pCollection = consumer.consumeCollection(list, waitComplete);

    }

    @Asynchronous
    public void logResult(Promise compareResult, Promise array, Promise> list) {
        arbiter.notify("logResult");
        logger.info("Compare result is[{}], array[{}], list[{}]", compareResult.get(), Arrays.asList(array.get()), list.get());
    }

    @Asynchronous
    public Promise waitForSeparate(Promise array, Promise> list) {
        arbiter.notify("waitFor");
        StringBuilder sb = new StringBuilder();

        sb.append(array.get());
        sb.append(list.get());
        logger.debug("Wait separate args complete with result [{}]", sb);
        return Promise.asPromise(Boolean.TRUE);
    }

    @Asynchronous
    public Promise waitForList(@Wait List waitFor) { //require all promises in list to be initialized
        arbiter.notify("waitFor");
        StringBuilder sb = new StringBuilder();

        for (Promise item : waitFor) {
            sb.append(item.get());
        }
        logger.debug("Wait list complete with result [{}]", sb);
        return Promise.asPromise(Boolean.TRUE);
    }

    @Asynchronous
    public Promise isContainSameElements(Promise pArray, Promise> pList) {
        arbiter.notify("isContainSameElements");
        ModelObjectVO[] oArray = pArray.get();
        List oList = pList.get();

        if (oArray == null || oList == null) {
            logger.error("Cannot compare null values!");
//            return Boolean.valueOf(Boolean.FALSE);
            return Promise.asPromise(Boolean.FALSE);
        }

        boolean result = (oArray.length == oList.size());

        if (result) {
            for (ModelObjectVO mo : oArray) {
                if (!oList.contains(mo)) {
                    result = false;
                    break;
                }
            }
        }

        logger.debug("isContainSameElements result is: {}", result);
//        return Boolean.valueOf(result);
        return Promise.asPromise(Boolean.valueOf(result));
    }

    @Required
    public void setSelfAsync(CollectionOfPromiseDeciderImpl selfAsync) {
        this.selfAsync = selfAsync;
    }

    @Required
    public void setProducer(CollectionProducerClient producer) {
        this.producer = producer;
    }

    @Required
    public void setConsumer(CollectionConsumerClient consumer) {
        this.consumer = consumer;
    }

    @Required
    public void setArbiter(PromiseCollectionArbiter arbiter) {
        this.arbiter = arbiter;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy