001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.io;
003    
004    /**
005     * This is an abstract task for uploading or saving a data layer.
006     *
007     */
008    public abstract class AbstractIOTask implements Runnable {
009    
010        /** indicates whether the task has been canceled */
011        private boolean canceled;
012        /** indicates whether the task has been failed */
013        private boolean failed;
014        /** the last exception caught */
015        private Exception lastException;
016    
017        public AbstractIOTask() {
018            canceled = false;
019            failed = false;
020            lastException = null;
021        }
022    
023        /**
024         * Replies true if the task has been canceled
025         *
026         * @return true if the task has been canceled
027         */
028        public boolean isCanceled() {
029            return canceled;
030        }
031    
032        /**
033         * Set whether this task has been canceled
034         *
035         * @param canceled true, if the task has been canceled; false otherwise
036         */
037        protected void setCanceled(boolean canceled) {
038            this.canceled = canceled;
039        }
040    
041        /**
042         * Replies true if the task has been failed
043         *
044         * @return true if the task has been failed
045         */
046        public boolean isFailed() {
047            return failed || lastException != null;
048        }
049    
050        /**
051         * Sets whether the task has been failed
052         *
053         * @param failed whether the task has been failed
054         */
055        protected void setFailed(boolean failed) {
056            this.failed = failed;
057        }
058    
059        /**
060         * Replies the last exception caught
061         *
062         * @return the last exception caught; null, if no exception was caught
063         */
064        public Exception getLastException() {
065            return lastException;
066        }
067    
068        /**
069         * Sets the last exception caught
070         *
071         * @param lastException the last exception
072         */
073        protected void setLastException(Exception lastException) {
074            this.lastException = lastException;
075        }
076    
077        /**
078         * Replies true if this  task was successful, i.e. if it wasn't
079         * canceled and didn't fail
080         *
081         * @return true if this  task was successful
082         */
083        public boolean isSuccessful() {
084            return !isCanceled() && !isFailed();
085        }
086    
087        /**
088         * Runs the task
089         */
090        public abstract void run();
091    
092        /**
093         * Cancel the task
094         */
095        public abstract void cancel();
096    }