// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.io; /** * This is an abstract task for uploading or saving a data layer. * @since 2025 */ public abstract class AbstractIOTask implements Runnable { /** indicates whether the task has been canceled */ private boolean canceled; /** indicates whether the task has been failed */ private boolean failed; /** the last exception caught */ private Exception lastException; /** * Contructs a new {@code AbstractIOTask}. */ public AbstractIOTask() { canceled = false; failed = false; lastException = null; } /** * Replies true if the task has been canceled * * @return true if the task has been canceled */ public boolean isCanceled() { return canceled; } /** * Set whether this task has been canceled * * @param canceled true, if the task has been canceled; false otherwise */ protected void setCanceled(boolean canceled) { this.canceled = canceled; } /** * Replies true if the task has been failed * * @return true if the task has been failed */ public boolean isFailed() { return failed || lastException != null; } /** * Sets whether the task has been failed * * @param failed whether the task has been failed */ protected void setFailed(boolean failed) { this.failed = failed; } /** * Replies the last exception caught * * @return the last exception caught; null, if no exception was caught */ public Exception getLastException() { return lastException; } /** * Sets the last exception caught * * @param lastException the last exception */ protected void setLastException(Exception lastException) { this.lastException = lastException; } /** * Replies true if this task was successful, i.e. if it wasn't * canceled and didn't fail * * @return true if this task was successful */ public boolean isSuccessful() { return !isCanceled() && !isFailed(); } /** * Cancel the task */ public abstract void cancel(); }