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}