001/**
002 * Copyright 2010-2014 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.common.util.wait;
017
018import static org.kuali.common.util.base.Precondition.checkMin;
019
020import org.kuali.common.util.FormatUtils;
021
022public final class WaitContext {
023
024        private final long timeoutMillis;
025        private final long sleepMillis;
026        private final long initialPauseMillis;
027
028        public static WaitContext create(long timeoutMillis) {
029                return builder(timeoutMillis).build();
030        }
031
032        public static Builder builder(long timeoutMillis) {
033                return new Builder(timeoutMillis);
034        }
035
036        public static class Builder implements org.apache.commons.lang3.builder.Builder<WaitContext> {
037
038                // Required
039                private final long timeoutMillis;
040
041                // Optional
042                private long sleepMillis = FormatUtils.getMillis("1s"); // 1 second
043                private long initialPauseMillis = 0;
044
045                public Builder(long timeoutMillis) {
046                        this.timeoutMillis = timeoutMillis;
047                }
048
049                public Builder initialPauseMillis(long initialPauseMillis) {
050                        this.initialPauseMillis = initialPauseMillis;
051                        return this;
052                }
053
054                public Builder sleepMillis(long sleepMillis) {
055                        this.sleepMillis = sleepMillis;
056                        return this;
057                }
058
059                @Override
060                public WaitContext build() {
061                        WaitContext instance = new WaitContext(this);
062                        validate(instance);
063                        return instance;
064                }
065
066                private static void validate(WaitContext instance) {
067                        checkMin(instance.timeoutMillis, 0, "timeoutMillis");
068                        checkMin(instance.sleepMillis, 0, "sleepMillis");
069                        checkMin(instance.initialPauseMillis, 0, "initialPauseMillis");
070                }
071
072        }
073
074        private WaitContext(Builder builder) {
075                this.timeoutMillis = builder.timeoutMillis;
076                this.sleepMillis = builder.sleepMillis;
077                this.initialPauseMillis = builder.initialPauseMillis;
078        }
079
080        public long getTimeoutMillis() {
081                return timeoutMillis;
082        }
083
084        public long getSleepMillis() {
085                return sleepMillis;
086        }
087
088        public long getInitialPauseMillis() {
089                return initialPauseMillis;
090        }
091
092}