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 }