Index: src/org/openstreetmap/josm/io/OsmApi.java =================================================================== --- src/org/openstreetmap/josm/io/OsmApi.java (revision 1545) +++ src/org/openstreetmap/josm/io/OsmApi.java (working copy) @@ -22,6 +22,8 @@ import java.util.Properties; import java.util.HashMap; import java.util.StringTokenizer; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.xml.parsers.SAXParserFactory; @@ -47,6 +49,9 @@ * */ public class OsmApi extends OsmConnection { + + /** the logger */ + static private final Logger logger = Logger.getLogger(OsmApi.class.getName()); /** * Object describing current changeset @@ -411,16 +416,8 @@ continue; } } - - // populate return fields. - responseBody.setLength(0); - BufferedReader in = new BufferedReader(new InputStreamReader(activeConnection.getInputStream())); - String s; - while((s = in.readLine()) != null) { - responseBody.append(s); - responseBody.append("\n"); - } - + + statusMessage.setLength(0); statusMessage.append (activeConnection.getResponseMessage()); // Look for a detailed error message from the server @@ -430,11 +427,25 @@ if (serverErrorTranslations.containsKey(er)) er = serverErrorTranslations.get(er); statusMessage.append(er); } - activeConnection.disconnect(); - if (retCode != 200) { + // abort by throwing an exception if the return code is not 200 OK + if (retCode != HttpURLConnection.HTTP_OK) { throw new OsmTransferException(statusMessage.toString()); } + + + // read the response body + // + responseBody.setLength(0); + BufferedReader in = new BufferedReader(new InputStreamReader(activeConnection.getInputStream())); + String s; + while((s = in.readLine()) != null) { + responseBody.append(s); + responseBody.append("\n"); + } + + activeConnection.disconnect(); + return responseBody.toString(); } catch (UnknownHostException e) { throw new OsmTransferException(tr("Unknown host")+": "+e.getMessage(), e); @@ -449,7 +460,7 @@ } catch (Exception e) { if (e instanceof OsmTransferException) throw (OsmTransferException) e; throw new OsmTransferException(e); - } + } } } } Index: src/org/openstreetmap/josm/io/OsmServerWriter.java =================================================================== --- src/org/openstreetmap/josm/io/OsmServerWriter.java (revision 1545) +++ src/org/openstreetmap/josm/io/OsmServerWriter.java (working copy) @@ -118,6 +118,7 @@ } if (useChangesets) api.stopChangeset(); } catch (OsmTransferException e) { + try { if (useChangesets) api.stopChangeset(); } catch (Exception ee) { @@ -138,10 +139,32 @@ } private void dealWithTransferException (OsmTransferException e) { - Main.pleaseWaitDlg.currentAction.setText(tr("Transfer aborted due to error (will wait for 5 seconds):") + e.getMessage()); - try { - Thread.sleep(5000); + + // warn user if the API replies a 409 Conflict. The text line in + // Main.pleaseWaitDlg.currentAction is easily overread and + // data may be lost + // + if (e.getMessage().startsWith("Conflict")) { + JOptionPane.showMessageDialog( + null, + tr("The server reported one or more conflicts between the\n" + + "data you tried to upload and the data on the server.\n" + + "Your data has NOT been saved on the server.\n" + + "Please reload the data and resolve any conflicts using\n" + + "the merge tool."), + tr("Conflict in changeset"), + JOptionPane.ERROR_MESSAGE + ); + } else { + // any other error. display a text in please wait dialog + // FIXME: why Thread.sleep(50000)? JOSM wan't retry after 5s. Why not a + // normal warning dialog the user has to close with a mouse click? + // + Main.pleaseWaitDlg.currentAction.setText(tr("Transfer aborted due to error (will wait for 5 seconds):") + e.getMessage()); + try { + Thread.sleep(5000); + } + catch (InterruptedException ex) {} } - catch (InterruptedException ex) {} } }