package com.skripko.object; import com.sun.istack.internal.Nullable; import java.util.concurrent.*; import static com.skripko.common.SelenideUtils.print; public class Transaction { private long timeout = 20; private Option option; public enum Option { SOFT_ERROR } public Transaction(long timeout, Option... option) { this.timeout = timeout; if (option.length > 0 && option[0] == Option.SOFT_ERROR) { this.option = option[0]; } } /** * One can adjust timeout settings through public static member * And setup SOFT_ERROR configuration for task execution * * @param task * @return As you wish) */ @Nullable public Object executeWithTimeLimit(Callable task) { ExecutorService service = Executors.newSingleThreadExecutor(); try { Future<Boolean> oneTaskResult = service.submit(task); return oneTaskResult.get(timeout, TimeUnit.SECONDS); } catch (Throwable th) { if (option == Option.SOFT_ERROR) { print("> Soft transaction throwable message: " + th.getMessage()); return null; } else { throw new RuntimeException(th); } } finally { service.shutdown(); } } }