001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.io;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import org.openstreetmap.josm.actions.SaveAction;
007    import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
008    import org.openstreetmap.josm.gui.progress.ProgressMonitor;
009    import org.openstreetmap.josm.tools.CheckParameterUtil;
010    
011    /**
012     * SaveLayerTask saves the data managed by an {@link OsmDataLayer} to the
013     * {@link OsmDataLayer#getAssociatedFile()}.
014     *
015     * <pre>
016     *     ExecutorService executorService = ...
017     *     SaveLayerTask task = new SaveLayerTask(layer, monitor);
018     *     Future<?> taskFuture = executorServce.submit(task)
019     *     try {
020     *        // wait for the task to complete
021     *        taskFuture.get();
022     *     } catch(Exception e) {
023     *        e.printStackTracek();
024     *     }
025     * </pre>
026     */
027    class SaveLayerTask extends AbstractIOTask {
028        private SaveLayerInfo layerInfo;
029        private ProgressMonitor parentMonitor;
030    
031        /**
032         *
033         * @param layerInfo information about the layer to be saved to save. Must not be null.
034         * @param monitor the monitor. Set to {@link NullProgressMonitor#INSTANCE} if null
035         * @throws IllegalArgumentException thrown if layer is null
036         */
037        protected SaveLayerTask(SaveLayerInfo layerInfo, ProgressMonitor monitor) {
038            CheckParameterUtil.ensureParameterNotNull(layerInfo, "layerInfo");
039            if (monitor == null) {
040                monitor = NullProgressMonitor.INSTANCE;
041            }
042            this.layerInfo =  layerInfo;
043            this.parentMonitor = monitor;
044        }
045    
046        @Override
047        public void run() {
048            try {
049                parentMonitor.subTask(tr("Saving layer to ''{0}'' ...", layerInfo.getFile().toString()));
050                if (!SaveAction.doSave(layerInfo.getLayer(), layerInfo.getFile())) {
051                    setFailed(true);
052                    return;
053                }
054                if (!isCanceled()) {
055                    layerInfo.getLayer().onPostSaveToFile();
056                }
057            } catch(Exception e) {
058                e.printStackTrace();
059                setLastException(e);
060            }
061        }
062    
063        @Override
064        public void cancel() {
065            setCanceled(true);
066        }
067    }