// License: GPL. For details, see LICENSE file. package org.openstreetmap.hot.sds; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.ActionEvent; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Writer; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.IPrimitive; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.gui.layer.OsmDataLayer; import org.openstreetmap.josm.tools.Utils; public class SdsSaveAction extends SdsDiskAccessAction { public SdsSaveAction() { super(tr("Save..."), "sds_save", tr("Save the current separate data store information to a file."), null); } @Override public void actionPerformed(ActionEvent e) { if (!isEnabled()) return; doSave(); } public boolean doSave() { Layer layer = null; if (Main.getLayerManager().getActiveLayer() instanceof OsmDataLayer) layer = Main.getLayerManager().getActiveLayer(); if (layer == null) return false; return doSave(layer); } public boolean doSave(Layer iLayer) { if (iLayer == null) return false; if (!(iLayer instanceof OsmDataLayer)) return false; OsmDataLayer layer = (OsmDataLayer) iLayer; File file = createAndOpenSaveFileChooser(tr("Save SDS file")); if (file == null) return false; File tmpFile = null; try { if (file.exists()) { tmpFile = new File(file.getPath() + "~"); Utils.copyFile(file, tmpFile); } OutputStream out = new FileOutputStream(file); Writer writer = new OutputStreamWriter(out, "UTF-8"); layer.data.getReadLock().lock(); try (SdsWriter w = new SdsWriter(new PrintWriter(writer))) { w.header(); for (IPrimitive p : layer.data.allNonDeletedPrimitives()) { w.write(p, p.getKeys()); } w.footer(); } finally { layer.data.getReadLock().unlock(); } // FIXME - how to close? if (!Main.pref.getBoolean("save.keepbackup", false) && (tmpFile != null)) { tmpFile.delete(); } } catch (IOException e) { Main.error(e); JOptionPane.showMessageDialog( Main.parent, tr("<html>An error occurred while saving.<br>Error is:<br>{0}</html>", e.getMessage()), tr("Error"), JOptionPane.ERROR_MESSAGE ); try { // if the file save failed, then the tempfile will not // be deleted. So, restore the backup if we made one. if (tmpFile != null && tmpFile.exists()) { Utils.copyFile(tmpFile, file); } } catch (IOException e2) { Main.error(e2); JOptionPane.showMessageDialog( Main.parent, tr("<html>An error occurred while restoring backup file.<br>Error is:<br>{0}</html>", e2.getMessage()), tr("Error"), JOptionPane.ERROR_MESSAGE ); } } return true; } }