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 }