Index: src/org/openstreetmap/josm/actions/ApiPreconditionChecker.java =================================================================== --- src/org/openstreetmap/josm/actions/ApiPreconditionChecker.java (revision 0) +++ src/org/openstreetmap/josm/actions/ApiPreconditionChecker.java (revision 0) @@ -0,0 +1,78 @@ +// License: GPL. For details, see LICENSE file. +package org.openstreetmap.josm.actions; + +import static org.openstreetmap.josm.tools.I18n.tr; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; + +import javax.swing.JOptionPane; + +import org.openstreetmap.josm.Main; +import org.openstreetmap.josm.actions.UploadAction.UploadHook; +import org.openstreetmap.josm.data.osm.OsmPrimitive; +import org.openstreetmap.josm.data.osm.Way; +import org.openstreetmap.josm.io.OsmApi; +import org.openstreetmap.josm.io.OsmApiInitializationException; + +public class ApiPreconditionChecker implements UploadHook { + + public boolean checkUpload(Collection add, Collection update, + Collection delete) { + OsmApi api = OsmApi.getOsmApi(); + try { + api.initialize(); + long maxNodes = api.capabilities.getLong("waynodes","maximum"); + + if( !checkMaxNodes(add, maxNodes)) + return false; + if( !checkMaxNodes(update, maxNodes)) + return false; + if( !checkMaxNodes(delete, maxNodes)) + return false; + + long maxElements = api.capabilities.getLong("changesets", "maximum_elements"); + if(add.size() + update.size() + delete.size() > maxElements) { + JOptionPane.showMessageDialog(Main.parent,tr("Maximum number of changes exceeded ({0}).", maxElements)); + + return false; + } + } catch (OsmApiInitializationException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(Main.parent,tr("Network error. Unable to get server capabilities.")); + + return false; + } + + return true; + } + + private boolean checkMaxNodes(Collection add, long maxNodes) { + for (OsmPrimitive osmPrimitive : add) { + for (Entry e : osmPrimitive.keys.entrySet()) { + if(e.getValue().length() > 255) { + JOptionPane.showMessageDialog(Main.parent,tr("Id {0} tag {1} is too long.", osmPrimitive.id, e.getKey())); + List newNodes = new LinkedList(); + newNodes.add(osmPrimitive); + + Main.ds.setSelected(newNodes); + return false; + } + } + + if (osmPrimitive instanceof Way && + ((Way)osmPrimitive).nodes.size() > maxNodes) { + JOptionPane.showMessageDialog(Main.parent,tr("Way id {1} exceeds maximum way nodes ({0}).", maxNodes, osmPrimitive.id)); + List newNodes = new LinkedList(); + newNodes.add(osmPrimitive); + + Main.ds.setSelected(newNodes); + return false; + } + } + return true; + } + +} Index: src/org/openstreetmap/josm/actions/UploadAction.java =================================================================== --- src/org/openstreetmap/josm/actions/UploadAction.java (revision 1690) +++ src/org/openstreetmap/josm/actions/UploadAction.java (working copy) @@ -80,6 +80,11 @@ Shortcut.registerShortcut("file:upload", tr("File: {0}", tr("Upload to OSM...")), KeyEvent.VK_U, Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY), true); /** + * Checks server capabilities before upload. + */ + uploadHooks.add(new ApiPreconditionChecker()); + + /** * Displays a screen where the actions that would be taken are displayed and * give the user the possibility to cancel the upload. */