com.epam.commons.Timer Maven / Gradle / Ivy
package com.epam.commons;
/*
* Copyright 2004-2016 EPAM Systems
*
* This file is part of JDI project.
*
* JDI is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JDI 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with JDI. If not, see .
*/
import com.epam.commons.linqinterfaces.JAction;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.function.BooleanSupplier;
import java.util.function.Function;
import java.util.function.Supplier;
import static java.lang.System.currentTimeMillis;
/**
* Created by 12345 on 28.09.2014.
*/
public class Timer {
private Long start = currentTimeMillis();
private long timeoutInMSec = 5 * 1000L;
private long retryTimeoutInMSec = 100;
public Timer() {
}
public Timer(long timeoutInMSec, long retryTimeoutInMSec) {
this();
this.timeoutInMSec = timeoutInMSec;
this.retryTimeoutInMSec = retryTimeoutInMSec;
}
public Timer(long timeoutInMSec) {
this();
this.timeoutInMSec = timeoutInMSec;
}
public void restart() { start = currentTimeMillis(); }
public static String nowTime() {
return nowTime("HH:mm:ss.SSS");
}
public static String nowTimeShort() {
return nowTime("mm:ss.SSS");
}
public static String nowDate() {
return nowTime("yyyy-MM-dd HH:mm:ss");
}
public static String nowTime(String timeFormat) {
return new SimpleDateFormat(timeFormat).format(new Date());
}
public static String nowMSecs() {
return Long.toString(currentTimeMillis());
}
public static void sleep(long mSec) {
try {
Thread.sleep(mSec);
} catch (InterruptedException ignore) {
}
}
public static T getByCondition(Supplier getFunc, Function conditionFunc) {
return new Timer().getResultByCondition(getFunc, conditionFunc);
}
public static T getResultAction(Supplier getFunc) {
return new Timer().getResultByCondition(getFunc, result -> true);
}
public static boolean alwaysDoneAction(JAction action) {
return new Timer().wait(() -> {
action.invoke();
return true;
});
}
public static boolean waitCondition(BooleanSupplier condition) {
return new Timer().wait(condition);
}
public Timer setTimeout(long timeoutInMSec) {
this.timeoutInMSec = timeoutInMSec;
return this;
}
public Timer setRetryTimeout(long retryTimeoutInMSec) {
this.retryTimeoutInMSec = retryTimeoutInMSec;
return this;
}
public Long timePassedInMSec() {
Long now = currentTimeMillis();
return now - start;
}
public boolean timeoutPassed() {
return timePassedInMSec() > timeoutInMSec;
}
public boolean wait(BooleanSupplier waitCase) {
Throwable exception = null;
while (!timeoutPassed())
try {
if (waitCase.getAsBoolean())
return true;
sleep(retryTimeoutInMSec);
} catch (Exception | Error ex) { exception = ex; }
if (exception != null)
throw new RuntimeException(exception);
return false;
}
public T getResult(Supplier getFunc) {
return getResultByCondition(getFunc, result -> true);
}
public T getResultByCondition(Supplier getFunc, Function conditionFunc) {
Throwable exception = null;
do {
try {
T result = getFunc.get();
if (result != null && conditionFunc.apply(result))
return result;
} catch (Exception | Error ex) { exception = ex; }
sleep(retryTimeoutInMSec);
} while (!timeoutPassed());
if (exception != null)
throw new RuntimeException(exception);
return null;
}
private static int i = 1;
private static int getNum() { return i = i++;}
public static void logTime() {
System.out.println(i++ + ": " + Timer.nowTime());
}
}