001package org.kuali.common.util.wait;
002
003import org.apache.commons.lang3.StringUtils;
004import org.kuali.common.util.Assert;
005import org.kuali.common.util.FormatUtils;
006import org.kuali.common.util.base.Threads;
007import org.kuali.common.util.condition.Condition;
008import org.slf4j.Logger;
009import org.slf4j.LoggerFactory;
010
011public class DefaultWaitService implements WaitService {
012
013        private static final Logger logger = LoggerFactory.getLogger(DefaultWaitService.class);
014
015        @Override
016        public WaitResult wait(WaitContext context, Condition condition) {
017                long start = System.currentTimeMillis();
018                long timeout = start + context.getTimeoutMillis();
019                Threads.sleep(context.getInitialPauseMillis());
020                while (!condition.isTrue()) {
021                        long now = System.currentTimeMillis();
022                        Assert.isTrue(now <= timeout, "Timed out waiting");
023                        String elapsed = StringUtils.leftPad(FormatUtils.getTime(now - start), 7, " ");
024                        String timeoutString = StringUtils.leftPad(FormatUtils.getTime(timeout - now), 7, " ");
025                        logger.info("[elapsed: {}  timeout: {}]", elapsed, timeoutString);
026                        Threads.sleep(context.getSleepMillis());
027                }
028                return new WaitResult.Builder(start, System.currentTimeMillis()).build();
029        }
030
031}