Subject: [PATCH] Remote Control: export data
---
Index: core/src/org/openstreetmap/josm/io/remotecontrol/handler/ExportHandler.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/core/src/org/openstreetmap/josm/io/remotecontrol/handler/ExportHandler.java b/core/src/org/openstreetmap/josm/io/remotecontrol/handler/ExportHandler.java
new file mode 100644
--- /dev/null	(date 1751500813598)
+++ b/core/src/org/openstreetmap/josm/io/remotecontrol/handler/ExportHandler.java	(date 1751500813598)
@@ -0,0 +1,78 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io.remotecontrol.handler;
+
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.io.OsmWriter;
+import org.openstreetmap.josm.io.OsmWriterFactory;
+import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
+
+import java.io.*;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+/**
+ * Export map data into .osm format
+ * For instance, {@code /export]}.
+ */
+public class ExportHandler extends RequestHandler {
+
+    /**
+     * The remote control command name used to export data from JOSM.
+     */
+    public static final String command = "export";
+
+    @Override
+    public String[] getMandatoryParams() {
+        return new String[]{};
+    }
+
+    @Override
+    public String[] getOptionalParams() {
+        return new String[] {};
+    }
+
+    @Override
+    public String getUsage() {
+        return "export data from JOSM";
+    }
+
+    @Override
+    public String[] getUsageExamples() {
+        return new String[] {"/export"};
+    }
+
+    @Override
+    protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException {
+        Layer layer = MainApplication.getLayerManager().getActiveLayer();
+        if (!(layer instanceof OsmDataLayer)) {
+            content = "";
+            return;
+        }
+        OsmDataLayer osmLayer = (OsmDataLayer) layer;
+        StringWriter sw = new StringWriter();
+        OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(sw), false, osmLayer.data.getVersion());
+        osmLayer.data.getReadLock().lock();
+        try {
+            w.write(osmLayer.data);
+        } finally {
+            osmLayer.data.getReadLock().unlock();
+        }
+        contentType = "application/xml";
+        content = sw.toString();
+    }
+
+    @Override
+    public String getPermissionMessage() {
+        return tr("Remote Control has been asked to export data from JOSM");
+    }
+
+    @Override
+    public PermissionPrefWithDefault getPermissionPref() {
+        return PermissionPrefWithDefault.EXPORT_DATA;
+    }
+
+    @Override
+    protected void validateRequest() throws RequestHandlerBadRequestException {}
+}
Index: core/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/core/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java b/core/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java
--- a/core/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java	(revision 19417)
+++ b/core/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java	(date 1746578273572)
@@ -26,6 +26,9 @@
     /** Import data from URL */
     public static final PermissionPrefWithDefault IMPORT_DATA =
             new PermissionPrefWithDefault("remotecontrol.permission.import", true, tr("Import data from URL"));
+    /** Export data from JOSM */
+    public static final PermissionPrefWithDefault EXPORT_DATA =
+            new PermissionPrefWithDefault("remotecontrol.permission.export", false, tr("Export data from JOSM"));
     /** Open local files */
     public static final PermissionPrefWithDefault OPEN_FILES =
             new PermissionPrefWithDefault("remotecontrol.permission.open-files", false, tr("Open local files"));
Index: core/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/core/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java b/core/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
--- a/core/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 19417)
+++ b/core/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(date 1750774966672)
@@ -37,6 +37,7 @@
 import org.openstreetmap.josm.io.remotecontrol.handler.FeaturesHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.ImageryHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.ImportHandler;
+import org.openstreetmap.josm.io.remotecontrol.handler.ExportHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.LoadAndZoomHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.LoadDataHandler;
 import org.openstreetmap.josm.io.remotecontrol.handler.LoadObjectHandler;
@@ -172,6 +173,7 @@
             addRequestHandlerClass(LoadObjectHandler.command, LoadObjectHandler.class, true);
             addRequestHandlerClass(LoadDataHandler.command, LoadDataHandler.class, true);
             addRequestHandlerClass(ImportHandler.command, ImportHandler.class, true);
+            addRequestHandlerClass(ExportHandler.command, ExportHandler.class, true);
             addRequestHandlerClass(OpenFileHandler.command, OpenFileHandler.class, true);
             PermissionPrefWithDefault.addPermissionPref(PermissionPrefWithDefault.ALLOW_WEB_RESOURCES);
             addRequestHandlerClass(ImageryHandler.command, ImageryHandler.class, true);
@@ -332,7 +334,7 @@
                 handler.setSender(sender);
                 handler.handle();
                 sendHeader(out, "200 OK", handler.getContentType(), false);
-                out.write("Content-length: " + handler.getContent().length()
+                out.write("Content-length: " + handler.getContent().getBytes().length
                         + "\r\n");
                 out.write("\r\n");
                 out.write(handler.getContent());
