// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.io;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import javax.swing.JOptionPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.ExtensionFileFilter;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.tools.Utils;
public class OsmExporter extends FileExporter {
/**
* Constructs a new {@code OsmExporter}.
*/
public OsmExporter() {
super(OsmImporter.FILE_FILTER);
}
public OsmExporter(ExtensionFileFilter filter) {
super(filter);
}
@Override
public boolean acceptFile(File pathname, Layer layer) {
if (!(layer instanceof OsmDataLayer))
return false;
return super.acceptFile(pathname, layer);
}
@Override
public void exportData(File file, Layer layer) throws IOException {
exportData(file, layer, false);
}
public void exportData(File file, Layer layer, boolean noBackup) throws IllegalArgumentException {
if (layer instanceof OsmDataLayer) {
save(file, (OsmDataLayer) layer, noBackup);
} else
throw new IllegalArgumentException(MessageFormat.format("Expected instance of OsmDataLayer. Got ''{0}''.", layer
.getClass().getName()));
}
protected OutputStream getOutputStream(File file) throws FileNotFoundException, IOException {
return Compression.getCompressedFileOutputStream(file);
}
private void save(File file, OsmDataLayer layer, boolean noBackup) {
File tmpFile = null;
try {
// use a tmp file because if something errors out in the
// process of writing the file, we might just end up with
// a truncated file. That can destroy lots of work.
if (file.exists()) {
tmpFile = new File(file.getPath() + "~");
Utils.copyFile(file, tmpFile);
}
// create outputstream and wrap it with gzip or bzip, if necessary
try (
OutputStream out = getOutputStream(file);
Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, layer.data.getVersion());
) {
layer.data.getReadLock().lock();
try {
w.writeLayer(layer);
} finally {
layer.data.getReadLock().unlock();
}
}
if (noBackup || !Main.pref.getBoolean("save.keepbackup", false)) {
if (tmpFile != null) {
tmpFile.delete();
}
}
layer.onPostSaveToFile();
} catch (IOException e) {
Main.error(e);
JOptionPane.showMessageDialog(
Main.parent,
tr("An error occurred while saving.
Error is:
{0}", 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("An error occurred while restoring backup file.
Error is:
{0}", e2.getMessage()),
tr("Error"),
JOptionPane.ERROR_MESSAGE
);
}
}
}
}