--- /dev/null 2017-11-08 15:40:09.000000000 -0800 +++ new/core/JemmyCore/src/org/jemmy/timing/Waiter.java 2017-11-08 15:40:09.000000000 -0800 @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2007, 2017 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.jemmy.timing; + +import org.jemmy.JemmyException; +import org.jemmy.TimeoutExpiredException; +import org.jemmy.env.Timeout; + +/** + * + * @author shura + */ +public class Waiter { + /** + * + */ + public static final Timeout DEFAULT_DELTA = new Timeout("default.wait.delta", 100); + private long waitTime; + private long delta; + + /** + * + * @param waitTime + * @param delta + */ + public Waiter(Timeout waitTime, Timeout delta) { + this.waitTime = waitTime.getValue(); + this.delta = delta.getValue(); + } + + /** + * + * @param waitTime + */ + public Waiter(Timeout waitTime) { + this.waitTime = waitTime.getValue(); + this.delta = DEFAULT_DELTA.getValue(); + } + + /** + * + * @param + * @param state + * @return + */ + public T waitState(State state) { + long start = System.currentTimeMillis(); + T res; + while( System.currentTimeMillis() < start + waitTime) { + res = state.reached(); + if(res != null) { + return res; + } + try { + Thread.sleep(delta); + } catch (InterruptedException ex) { + throw new JemmyException("Wait interrupted for: ", state); + } + } + return null; + } + + /** + * + * @param + * @param value + * @param state + * @return + */ + public T waitValue(final T value, final State state) { + State st = new State() { + public T reached() { + T res = state.reached(); + if(res != null && res.equals(value)) { + return res; + } else { + return null; + } + } + }; + return waitState(st); + } + + /** + * + * @param + * @param state + * @return + */ + public T ensureState(State state) { + T res = waitState(state); + if(res == null) { + throw new TimeoutExpiredException("State '" + state + "' has not been reached in " + waitTime + " milliseconds"); + } + return res; + } + /** + * + * @param + * @param value + * @param state + * @return + */ + public T ensureValue(T value, State state) { + T res = waitValue(value, state); + if (res == null) { + throw new TimeoutExpiredException("State '" + state + "' has not been reached in " + waitTime + " milliseconds"); + } + return res; + } +}