001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.io;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import org.openstreetmap.josm.actions.SaveAction;
007import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
008import org.openstreetmap.josm.gui.progress.ProgressMonitor;
009import org.openstreetmap.josm.tools.CheckParameterUtil;
010
011/**
012 * SaveLayerTask saves the data managed by an {@link org.openstreetmap.josm.gui.layer.OsmDataLayer} to the
013 * {@link org.openstreetmap.josm.gui.layer.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 */
027class 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}