@Override public void canceled() { try { wrappedTask.canceled(); } catch (Exception ex) { // we should show exception messages immediately showExecutionError(ex); } }
@Override public Map<String, Object> getParams() { return wrappedTask.getParams(); }
@ExecutedOnUIThread protected final void process(List<T> chunks) { runnableTask.progress(chunks); // Notify listeners for (BackgroundTask.ProgressListener<T, V> listener : runnableTask.getProgressListeners()) { listener.onProgress(chunks); } }
V result = future.get(); runnableTask.done(result); for (BackgroundTask.ProgressListener<T, V> listener : runnableTask.getProgressListeners()) { listener.onDone(result); handled = runnableTask.handleException((Exception) e.getCause());
@Override public final boolean cancel() { checkState(started, "Task is not running. Task: " + taskExecutor.getTask().toString()); boolean canceled = taskExecutor.cancelExecution(); if (canceled) { removeAfterDetachListener(); BackgroundTask<T, V> task = taskExecutor.getTask(); task.canceled(); // Notify listeners for (BackgroundTask.ProgressListener listener : task.getProgressListeners()) { listener.onCancel(); } if (log.isTraceEnabled()) { Screen ownerFrame = getTask().getOwnerScreen(); if (ownerFrame != null) { String windowClass = ownerFrame.getClass().getCanonicalName(); log.trace("Task was cancelled. Task: {}. User: {}. Frame: {}", taskExecutor.getTask(), getUserSession().getId(), windowClass); } else { log.trace("Task was cancelled. Task: {}. User: {}", taskExecutor.getTask(), getUserSession().getId()); } } } else { log.trace("Task wasn't cancelled. Execution is already cancelled. Task: {}", taskExecutor.getTask()); } return canceled; }
@Override public boolean handleException(Exception ex) { boolean handled = wrappedTask.handleException(ex); if (handled || wrappedTask.getOwnerScreen() == null) { Screens screens = getScreenContext().getScreens(); screens.remove(screen); } else { Screens screens = getScreenContext().getScreens(); screens.remove(screen); showExecutionError(ex); log.error("Exception occurred in background task", ex); handled = true; } return handled; }
@Override public V run(TaskLifeCycle<T> lifeCycle) throws Exception { return wrappedTask.run(lifeCycle); }
Screen ownerFrame = getTask().getOwnerScreen(); if (log.isTraceEnabled()) { if (ownerFrame != null) { boolean handled = task.handleTimeoutException(); if (!handled) { log.error("Unhandled timeout exception in background task. Task: " + task.toString());
@Override public void progress(List<T> changes) { wrappedTask.progress(changes); }
/** * Show modal window with message which will last until task completes. * Optionally cancel button can be displayed. By pressing cancel button user can cancel task execution. * * @param task background task containing long operation * @param title window title, optional * @param message window message, optional * @param total total number of items, that will be processed * @param cancelAllowed show or not cancel button * @param percentProgress show progress in percents * @param <V> task result type */ public static <T extends Number, V> void show(BackgroundTask<T, V> task, @Nullable String title, @Nullable String message, Number total, boolean cancelAllowed, boolean percentProgress) { if (task.getOwnerScreen() == null) { throw new IllegalArgumentException("Task without owner cannot be run"); } Map<String, Object> params = new HashMap<>(); params.put("task", task); params.put("title", title); params.put("message", message); params.put("total", total); params.put("cancelAllowed", cancelAllowed); params.put("percentProgress", percentProgress); Screens screens = UiControllerUtils.getScreenContext(task.getOwnerScreen()).getScreens(); WindowInfo windowInfo = AppBeans.get(WindowConfig.class).getWindowInfo("backgroundWorkProgressWindow"); ((WindowManager)screens).openWindow(windowInfo, OpenType.DIALOG, params); }
@Override public void done(V result) { Screens screens = getScreenContext().getScreens(); screens.remove(screen); try { wrappedTask.done(result); } catch (Exception ex) { // we should show exception messages immediately showExecutionError(ex); } }
public long getTimeoutMs() { return taskExecutor.getTask().getTimeoutMilliseconds(); } }
wrapperTask.addProgressListener(new BackgroundTask.ProgressListenerAdapter<T, V>() { @Override public void onProgress(List<T> changes) {
try { return runnableTask.run(new TaskLifeCycle<T>() { @SafeVarargs @Override
@Override public boolean handleTimeoutException() { boolean handled = wrappedTask.handleTimeoutException(); if (handled || wrappedTask.getOwnerScreen() == null) { Screens screens = getScreenContext().getScreens(); screens.remove(screen); } else { Screens screens = getScreenContext().getScreens(); screens.remove(screen); Notifications notifications = getScreenContext().getNotifications(); Messages messages = AppBeans.get(Messages.NAME); notifications.create(Notifications.NotificationType.WARNING) .withCaption(messages.getMessage(LocalizedTaskWrapper.class, "backgroundWorkProgress.timeout")) .withDescription(messages.getMessage(LocalizedTaskWrapper.class, "backgroundWorkProgress.timeoutMessage")) .show(); handled = true; } return handled; }
/** * Show modal window with message which will last until task completes. * Optionally cancel button can be displayed. By pressing cancel button user can cancel task execution. * * @param task background task containing long operation * @param title window title, optional * @param message window message, optional * @param cancelAllowed show or not cancel button * @param <T> task progress unit * @param <V> task result type */ public static <T, V> void show(BackgroundTask<T, V> task, @Nullable String title, @Nullable String message, boolean cancelAllowed) { if (task.getOwnerScreen() == null) { throw new IllegalArgumentException("Task without owner cannot be run"); } Map<String, Object> params = new HashMap<>(); params.put("task", task); params.put("title", title); params.put("message", message); params.put("cancelAllowed", cancelAllowed); Screens screens = UiControllerUtils.getScreenContext(task.getOwnerScreen()).getScreens(); WindowInfo windowInfo = AppBeans.get(WindowConfig.class).getWindowInfo("backgroundWorkWindow"); ((WindowManager)screens).openWindow(windowInfo, OpenType.DIALOG, params); }
@Override public void canceled() { super.canceled(); reportService.cancelReportExecution(userSessionId, report.getId()); } };
private WebTaskExecutor(AppUI ui, BackgroundTask<T, V> runnableTask) { this.runnableTask = runnableTask; this.ui = ui; this.params = runnableTask.getParams() != null ? Collections.unmodifiableMap(runnableTask.getParams()) : Collections.emptyMap(); // copy security context this.securityContext = new SecurityContext(AppContext.getSecurityContextNN().getSession()); UserSession userSession = userSessionSource.getUserSession(); this.userLogin = userSession.getUser().getLogin(); this.future = new FutureTask<V>(this) { @Override protected void done() { WebTaskExecutor.this.ui.access(() -> handleDone() ); } }; }
/** * Cancel without events for tasks */ public final void kill() { uiAccessor.access(() -> { Screen ownerFrame = getTask().getOwnerScreen(); removeAfterDetachListener(); if (log.isTraceEnabled()) { if (ownerFrame != null) { String windowClass = ownerFrame.getClass().getCanonicalName(); log.trace("Task killed. Task: {}. User: {}. Frame: {}", taskExecutor.getTask(), getUserSession().getId(), windowClass); } else { log.trace("Task killed. Task: {}. User: {}", taskExecutor.getTask(), getUserSession().getId()); } } taskExecutor.cancelExecution(); }); }
public TaskHandlerImpl(UIAccessor uiAccessor, TaskExecutor<T, V> taskExecutor, WatchDog watchDog) { this.uiAccessor = uiAccessor; this.taskExecutor = taskExecutor; this.watchDog = watchDog; this.events = AppBeans.get(Events.NAME); UserSessionSource sessionSource = AppBeans.get(UserSessionSource.NAME); this.userSession = sessionSource.getUserSession(); BackgroundTask<T, V> task = taskExecutor.getTask(); if (task.getOwnerScreen() != null) { Screen ownerFrame = task.getOwnerScreen(); afterDetachSubscription = addAfterDetachListener(ownerFrame, e -> ownerWindowRemoved(e.getSource())); // remove close listener on done taskExecutor.setFinalizer(() -> { log.trace("Start task finalizer. Task: {}", taskExecutor.getTask()); removeAfterDetachListener(); log.trace("Finish task finalizer. Task: {}", taskExecutor.getTask()); }); } }