Changeset 1137 in josm for trunk/src/org
- Timestamp:
- 2008-12-15T00:45:00+01:00 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java
r1071 r1137 50 50 public class OsmServerWriter extends OsmConnection implements Visitor { 51 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 52 /** 53 * This list contains all successfully processed objects. The caller of 54 * upload* has to check this after the call and update its dataset. 55 * 56 * If a server connection error occurs, this may contain fewer entries 57 * than where passed in the list to upload*. 58 */ 59 public Collection<OsmPrimitive> processed; 60 61 /** 62 * Whether the operation should be aborted as soon as possible. 63 */ 64 // use the inherited variable 65 // private boolean cancel = false; 66 67 /** 68 * Object describing current changeset 69 */ 70 private Changeset changeset; 71 72 /** 73 * Send the dataset to the server. Ask the user first and does nothing if he 74 * does not want to send the data. 75 */ 76 private static final int MSECS_PER_SECOND = 1000; 77 private static final int SECONDS_PER_MINUTE = 60; 78 private static final int MSECS_PER_MINUTE = MSECS_PER_SECOND * SECONDS_PER_MINUTE; 79 80 long uploadStartTime; 81 82 public String timeLeft(int progress, int list_size) { 83 long now = System.currentTimeMillis(); 84 long elapsed = now - uploadStartTime; 85 if (elapsed == 0) 86 elapsed = 1; 87 float uploads_per_ms = (float)progress / elapsed; 88 float uploads_left = list_size - progress; 89 int ms_left = (int)(uploads_left / uploads_per_ms); 90 int minutes_left = ms_left / MSECS_PER_MINUTE; 91 int seconds_left = (ms_left / MSECS_PER_SECOND) % SECONDS_PER_MINUTE ; 92 String time_left_str = Integer.toString(minutes_left) + ":"; 93 if (seconds_left < 10) 94 time_left_str += "0"; 95 time_left_str += Integer.toString(seconds_left); 96 return time_left_str; 97 } 98 99 public void uploadOsm(Collection<OsmPrimitive> list) throws SAXException { 100 processed = new LinkedList<OsmPrimitive>(); 101 initAuthentication(); 102 103 Main.pleaseWaitDlg.progress.setMaximum(list.size()); 104 Main.pleaseWaitDlg.progress.setValue(0); 105 106 106 // controls whether or not we open and close a changeset. API 0.6 requires changesets. 107 107 boolean useChangesets = Main.pref.get("osm-server.version", "0.5").equals("0.6"); 108 108 109 109 // controls whether or not we try and uplaod the whole bunch in one go … … 111 111 Main.pref.get("osm-server.version", "0.5").equals("0.6")); 112 112 113 String comment = null; 114 while (useChangesets && comment == null) { 115 comment = JOptionPane.showInputDialog(Main.parent, tr("Provide a brief comment as to the changes to you are uploading:"), 116 tr("Commit comment"), JOptionPane.QUESTION_MESSAGE); 117 if( comment == null ) 118 return; 119 /* Don't let people just hit enter */ 120 if( comment.trim().length() >= 3 ) 121 break; 122 comment = null; 123 } 124 try { 125 if (useChangesets && !startChangeset(10, comment)) 126 return; 127 } 128 catch (OsmTransferException ex) { 129 dealWithTransferException(ex); 130 return; 131 } 132 133 try { 113 String comment = null; 114 while (useChangesets && comment == null) { 115 comment = JOptionPane.showInputDialog(Main.parent, 116 tr("Provide a brief comment as to the changes to you are uploading:"), 117 tr("Commit comment"), JOptionPane.QUESTION_MESSAGE); 118 if (comment == null) 119 return; 120 /* Don't let people just hit enter */ 121 if( comment.trim().length() >= 3 ) 122 break; 123 comment = null; 124 } 125 try { 126 if (useChangesets && !startChangeset(10, comment)) 127 return; 128 } 129 catch (OsmTransferException ex) { 130 dealWithTransferException(ex); 131 return; 132 } 133 134 try { 134 135 if (useDiffUploads) { 135 136 uploadDiff(10, list); … … 149 150 } 150 151 } 151 if (useChangesets) 152 stopChangeset(10); 153 } catch (RuntimeException e) { 154 try { 155 if (useChangesets) 156 stopChangeset(10); 157 } 158 catch (OsmTransferException ex) { 159 dealWithTransferException(ex); 160 } 161 e.printStackTrace(); 162 throw new SAXException(tr("An error occoured: {0}",e.getMessage())); 163 } 164 catch (OsmTransferException e) { 165 try { 166 if( useChangesets ) stopChangeset(10); 167 } 168 catch (OsmTransferException ex) { 169 dealWithTransferException(ex); 170 } 171 dealWithTransferException(e); 172 } 173 } 174 175 /* FIXME: This code is terrible, please fix it!!!! */ 176 177 /* Ok, this needs some explanation: The problem is that the code for 178 * retrying requests is intertwined with the code that generates the 179 * actual request. This means that for the retry code for the 180 * changeset stuff, it's basically a copy/cut/change slightly 181 * process. What actually needs to happen is that the retrying needs 182 * to be split from the creation of the requests and the retry loop 183 * handled in one place (preferably without recursion). While at you 184 * can fix the issue where hitting cancel doesn't do anything while 185 * retrying. - Mv0 Apr 2008 186 * 187 * Cancelling has an effect now, maybe it does not always catch on. Florian Heer, Aug 08 188 */ 189 private boolean startChangeset(int retries, String comment) throws OsmTransferException { 190 Main.pleaseWaitDlg.currentAction.setText(tr("Opening changeset...")); 191 changeset = new Changeset(); 192 changeset.put( "created_by", "JOSM" ); 193 changeset.put( "comment", comment ); 194 try { 195 if (cancel) 196 return false; // assume cancel 197 String version = Main.pref.get("osm-server.version", "0.6"); 198 URL url = new URL( 199 Main.pref.get("osm-server.url") + 200 "/" + version + 201 "/" + "changeset" + 202 "/" + "create"); 203 System.out.print("upload to: "+url+ "..." ); 204 activeConnection = (HttpURLConnection)url.openConnection(); 205 activeConnection.setConnectTimeout(15000); 206 activeConnection.setRequestMethod("PUT"); 207 addAuth(activeConnection); 208 209 activeConnection.setDoOutput(true); 210 OutputStream out = activeConnection.getOutputStream(); 211 OsmWriter.output(out, changeset); 212 out.close(); 213 214 activeConnection.connect(); 215 System.out.println("connected"); 216 217 int retCode = activeConnection.getResponseCode(); 218 if (retCode == 200) 219 changeset.id = readId(activeConnection.getInputStream()); 220 System.out.println("got return: "+retCode+" with id "+changeset.id); 221 String retMsg = activeConnection.getResponseMessage(); 222 activeConnection.disconnect(); 223 if (retCode == 404) 224 { 225 System.out.println("Server does not support changesets, continuing"); 226 return true; 227 } 228 if (retCode != 200 && retCode != 412) { 152 if (useChangesets) stopChangeset(10); 153 } catch (RuntimeException e) { 154 try { 155 if (useChangesets) stopChangeset(10); 156 } 157 catch (OsmTransferException ex) { 158 dealWithTransferException(ex); 159 } 160 e.printStackTrace(); 161 throw new SAXException(tr("An error occoured: {0}",e.getMessage())); 162 } 163 catch (OsmTransferException e) { 164 try { 165 if (useChangesets) stopChangeset(10); 166 } 167 catch (OsmTransferException ex) { 168 dealWithTransferException(ex); 169 } 170 dealWithTransferException(e); 171 } 172 } 173 174 /* FIXME: This code is terrible, please fix it!!!! */ 175 176 /* Ok, this needs some explanation: The problem is that the code for 177 * retrying requests is intertwined with the code that generates the 178 * actual request. This means that for the retry code for the 179 * changeset stuff, it's basically a copy/cut/change slightly 180 * process. What actually needs to happen is that the retrying needs 181 * to be split from the creation of the requests and the retry loop 182 * handled in one place (preferably without recursion). While at you 183 * can fix the issue where hitting cancel doesn't do anything while 184 * retrying. - Mv0 Apr 2008 185 * 186 * Cancelling has an effect now, maybe it does not always catch on. Florian Heer, Aug 08 187 */ 188 private boolean startChangeset(int retries, String comment) throws OsmTransferException { 189 Main.pleaseWaitDlg.currentAction.setText(tr("Opening changeset...")); 190 changeset = new Changeset(); 191 changeset.put( "created_by", "JOSM" ); 192 changeset.put( "comment", comment ); 193 try { 194 if (cancel) 195 return false; // assume cancel 196 String version = Main.pref.get("osm-server.version", "0.6"); 197 URL url = new URL( 198 Main.pref.get("osm-server.url") + 199 "/" + version + 200 "/" + "changeset" + 201 "/" + "create"); 202 System.out.print("upload to: "+url+ "..." ); 203 activeConnection = (HttpURLConnection)url.openConnection(); 204 activeConnection.setConnectTimeout(15000); 205 activeConnection.setRequestMethod("PUT"); 206 addAuth(activeConnection); 207 208 activeConnection.setDoOutput(true); 209 OutputStream out = activeConnection.getOutputStream(); 210 OsmWriter.output(out, changeset); 211 out.close(); 212 213 activeConnection.connect(); 214 System.out.println("connected"); 215 216 int retCode = activeConnection.getResponseCode(); 217 if (retCode == 200) 218 changeset.id = readId(activeConnection.getInputStream()); 219 System.out.println("got return: "+retCode+" with id "+changeset.id); 220 String retMsg = activeConnection.getResponseMessage(); 221 activeConnection.disconnect(); 222 if (retCode == 404) { 223 throw new OsmTransferException(tr("Server does not support changesets")); 224 } 225 if (retCode != 200 && retCode != 412) { 229 226 230 231 232 233 234 235 236 227 if (retries >= 0) { 228 retries--; 229 System.out.print("backing off for 10 seconds..."); 230 Thread.sleep(10000); 231 System.out.println("retrying ("+retries+" left)"); 232 return startChangeset(retries, comment); 233 } 237 234 238 // Look for a detailed error message from the server 239 if (activeConnection.getHeaderField("Error") != null) 240 retMsg += "\n" + activeConnection.getHeaderField("Error"); 241 242 // Report our error 243 ByteArrayOutputStream o = new ByteArrayOutputStream(); 244 OsmWriter.output(o, changeset); 245 System.out.println(new String(o.toByteArray(), "UTF-8").toString()); 246 //throw new RuntimeException(retCode+" "+retMsg); 247 throw new OsmTransferException (retCode + " " + retMsg); 248 249 } 250 } catch (UnknownHostException e) { 251 //throw new RuntimeException(tr("Unknown host")+": "+e.getMessage(), e); 252 throw new OsmTransferException(tr("Unknown host")+": "+e.getMessage(), e); 253 } catch(SocketTimeoutException e) { 254 System.out.println(" timed out, retries left: " + retries); 255 if (cancel) 256 return false; // assume cancel 257 if (retries-- > 0) 258 startChangeset(retries, comment); 259 else 260 // throw new RuntimeException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 261 throw new OsmTransferException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 262 } 263 catch (ConnectException e) { 264 System.out.println(" timed out, retries left: " + retries); 265 if (cancel) 266 return false; // assume cancel 267 if (retries-- > 0) 268 startChangeset(retries, comment); 269 else 270 // throw new RuntimeException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 271 throw new OsmTransferException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 272 } 273 274 catch (Exception e) { 275 if (cancel) 276 return false; // assume cancel 277 if (e instanceof OsmTransferException) 278 throw (OsmTransferException)e; 279 if (e instanceof RuntimeException) 280 throw (RuntimeException)e; 281 throw new RuntimeException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 282 } 283 return true; 284 } 235 // Look for a detailed error message from the server 236 retMsg += "\n" + readString(activeConnection.getInputStream()); 237 238 // Report our error 239 ByteArrayOutputStream o = new ByteArrayOutputStream(); 240 OsmWriter.output(o, changeset); 241 System.out.println(new String(o.toByteArray(), "UTF-8").toString()); 242 throw new OsmTransferException (retCode + " " + retMsg); 243 } 244 } catch (UnknownHostException e) { 245 throw new OsmTransferException(tr("Unknown host")+": "+e.getMessage(), e); 246 } catch(SocketTimeoutException e) { 247 System.out.println(" timed out, retries left: " + retries); 248 if (cancel) 249 return false; // assume cancel 250 if (retries-- > 0) 251 startChangeset(retries, comment); 252 else 253 throw new OsmTransferException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 254 } 255 catch (ConnectException e) { 256 System.out.println(" timed out, retries left: " + retries); 257 if (cancel) 258 return false; // assume cancel 259 if (retries-- > 0) 260 startChangeset(retries, comment); 261 else 262 throw new OsmTransferException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 263 } 264 265 catch (Exception e) { 266 if (cancel) 267 return false; // assume cancel 268 if (e instanceof OsmTransferException) 269 throw (OsmTransferException)e; 270 if (e instanceof RuntimeException) 271 throw (RuntimeException)e; 272 throw new RuntimeException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 273 } 274 return true; 275 } 285 276 286 277 private void uploadDiff(int retries, Collection<OsmPrimitive> list) throws OsmTransferException { … … 344 335 } else { 345 336 // Look for a detailed error message from the server 346 if (activeConnection.getHeaderField("Error") != null) 347 retMsg += "\n" + activeConnection.getHeaderField("Error"); 337 retMsg += "\n" + readString(activeConnection.getInputStream()); 348 338 349 339 // Report our error … … 351 341 OsmWriter.output(o, changeset); 352 342 System.out.println(new String(o.toByteArray(), "UTF-8").toString()); 353 //throw new RuntimeException(retCode+" "+retMsg);354 343 throw new OsmTransferException(retCode+" "+retMsg); 355 344 } 356 345 } 357 346 } catch (UnknownHostException e) { 358 //throw new RuntimeException(tr("Unknown host")+": "+e.getMessage(), e);359 347 throw new OsmTransferException(tr("Unknown host")+": "+e.getMessage(), e); 360 348 } catch(SocketTimeoutException e) { … … 365 353 stopChangeset(retries); 366 354 else 367 //throw new RuntimeException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e);368 355 throw new OsmTransferException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 369 356 } catch(ConnectException e) { … … 374 361 stopChangeset(retries); 375 362 else 376 //throw new RuntimeException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e);377 363 throw new OsmTransferException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 378 364 } catch (Exception e) { … … 388 374 389 375 390 private void stopChangeset(int retries) throws OsmTransferException { 391 Main.pleaseWaitDlg.currentAction.setText(tr("Closing changeset...")); 392 try { 393 if (cancel) 394 return; // assume cancel 395 String version = Main.pref.get("osm-server.version", "0.6"); 396 URL url = new URL( 397 Main.pref.get("osm-server.url") + 398 "/" + version + 399 "/" + "changeset" + 400 "/" + changeset.id + 401 "/close" ); 402 System.out.print("upload to: "+url+ "..." ); 403 activeConnection = (HttpURLConnection)url.openConnection(); 404 activeConnection.setConnectTimeout(15000); 405 activeConnection.setRequestMethod("PUT"); 406 addAuth(activeConnection); 407 408 activeConnection.setDoOutput(true); 409 OutputStream out = activeConnection.getOutputStream(); 410 OsmWriter.output(out, changeset); 411 out.close(); 412 413 activeConnection.connect(); 414 System.out.println("connected"); 415 416 int retCode = activeConnection.getResponseCode(); 417 if (retCode == 200) 418 changeset.id = readId(activeConnection.getInputStream()); 419 System.out.println("got return: "+retCode+" with id "+changeset.id); 420 String retMsg = activeConnection.getResponseMessage(); 421 activeConnection.disconnect(); 422 if (retCode == 404) 423 { 424 System.out.println("Server does not support changesets, continuing"); 425 return; 426 } 427 if (retCode != 200 && retCode != 412) { 428 if (retries >= 0) { 429 retries--; 430 System.out.print("backing off for 10 seconds..."); 431 Thread.sleep(10000); 432 System.out.println("retrying ("+retries+" left)"); 433 stopChangeset(retries); 434 } else { 435 // Look for a detailed error message from the server 436 if (activeConnection.getHeaderField("Error") != null) 437 retMsg += "\n" + activeConnection.getHeaderField("Error"); 438 439 // Report our error 440 ByteArrayOutputStream o = new ByteArrayOutputStream(); 441 OsmWriter.output(o, changeset); 442 System.out.println(new String(o.toByteArray(), "UTF-8").toString()); 443 //throw new RuntimeException(retCode+" "+retMsg); 444 throw new OsmTransferException(retCode+" "+retMsg); 445 } 446 } 447 } catch (UnknownHostException e) { 448 //throw new RuntimeException(tr("Unknown host")+": "+e.getMessage(), e); 449 throw new OsmTransferException(tr("Unknown host")+": "+e.getMessage(), e); 450 } catch(SocketTimeoutException e) { 451 System.out.println(" timed out, retries left: " + retries); 452 if (cancel) 453 return; // assume cancel 454 if (retries-- > 0) 455 stopChangeset(retries); 456 else 457 //throw new RuntimeException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 458 throw new OsmTransferException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 459 } catch(ConnectException e) { 460 System.out.println(" timed out, retries left: " + retries); 461 if (cancel) 462 return; // assume cancel 463 if (retries-- > 0) 464 stopChangeset(retries); 465 else 466 //throw new RuntimeException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 467 throw new OsmTransferException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 468 } catch (Exception e) { 469 if (cancel) 470 return; // assume cancel 471 if (e instanceof OsmTransferException) 472 throw (OsmTransferException)e; 473 if (e instanceof RuntimeException) 474 throw (RuntimeException)e; 475 throw new RuntimeException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 476 } 477 } 478 479 /** 480 * Upload a single node. 481 */ 482 public void visit(Node n) { 483 if (n.deleted) { 484 sendRequest("DELETE", "node", n, true); 485 } else { 486 sendRequest("PUT", "node", n, true); 487 } 488 processed.add(n); 489 } 490 491 /** 492 * Upload a whole way with the complete node id list. 493 */ 494 public void visit(Way w) { 495 if (w.deleted) { 496 sendRequest("DELETE", "way", w, true); 497 } else { 498 sendRequest("PUT", "way", w, true); 499 } 500 processed.add(w); 501 } 502 503 /** 504 * Upload an relation with all members. 505 */ 506 public void visit(Relation e) { 507 if (e.deleted) { 508 sendRequest("DELETE", "relation", e, true); 509 } else { 510 sendRequest("PUT", "relation", e, true); 511 } 512 processed.add(e); 513 } 514 /** 515 * Read a long from the input stream and return it. 516 */ 517 private long readId(InputStream inputStream) throws IOException { 518 BufferedReader in = new BufferedReader(new InputStreamReader( 519 inputStream)); 520 String s = in.readLine(); 521 if (s == null) 522 return 0; 523 try { 524 return Long.parseLong(s); 525 } catch (NumberFormatException e) { 526 return 0; 527 } 528 } 529 530 /** 531 * Send the request. The objects id will be replaced if it was 0 before 532 * (on add requests). 533 * 534 * @param requestMethod The http method used when talking with the server. 535 * @param urlSuffix The suffix to add at the server url. 536 * @param osm The primitive to encode to the server. 537 * @param body the body to be sent 538 */ 539 private void sendRequestRetry(String requestMethod, String urlSuffix, 540 OsmPrimitive osm, OsmWriterInterface body, int retries) throws OsmTransferException { 541 try { 542 if (cancel) 543 return; // assume cancel 544 String version = Main.pref.get("osm-server.version", "0.5"); 545 URL url = new URL( 546 new URL(Main.pref.get("osm-server.url") + 547 "/" + version + "/"), 548 urlSuffix + 549 "/" + (osm.id==0 ? "create" : osm.id), 550 new MyHttpHandler()); 551 System.out.print("upload to: "+url+ "..." ); 552 activeConnection = (HttpURLConnection)url.openConnection(); 553 activeConnection.setConnectTimeout(15000); 554 activeConnection.setRequestMethod(requestMethod); 555 addAuth(activeConnection); 556 if (body != null) { 557 activeConnection.setDoOutput(true); 558 OutputStream out = activeConnection.getOutputStream(); 559 OsmWriter.output(out, body); 560 out.close(); 561 } 562 activeConnection.connect(); 563 System.out.println("connected"); 564 565 int retCode = activeConnection.getResponseCode(); 566 /* When creating new, the returned value is the new id, otherwise it is the new version */ 567 if (retCode == 200) { 568 if (osm.id == 0) { 569 osm.id = readId(activeConnection.getInputStream()); 570 osm.version = 1; 571 } else { 572 int read_version = (int)readId(activeConnection.getInputStream()); 573 if (read_version > 0) 574 osm.version = read_version; 575 } 576 } else { 577 System.out.println("got return: "+retCode+" with id "+osm.id); 578 } 579 activeConnection.disconnect(); 580 if (retCode == 410 && requestMethod.equals("DELETE")) 581 return; // everything fine.. was already deleted. 582 else if (retCode != 200) { 583 if (retries >= 0 && retCode != 412) { 584 retries--; 585 System.out.print("backing off for 10 seconds..."); 586 Thread.sleep(10000); 587 System.out.println("retrying ("+retries+" left)"); 588 sendRequestRetry(requestMethod, urlSuffix, osm, body, retries); 589 } else { 590 String retMsg = activeConnection.getResponseMessage(); 591 // Look for a detailed error message from the server 592 if (activeConnection.getHeaderField("Error") != null) 593 retMsg += "\n" + activeConnection.getHeaderField("Error"); 594 595 // Report our error 596 ByteArrayOutputStream o = new ByteArrayOutputStream(); 597 OsmWriter.output(o, body); 598 System.out.println(new String(o.toByteArray(), "UTF-8").toString()); 599 //throw new RuntimeException(retCode+" "+retMsg); 600 throw new OsmTransferException(retCode+" "+retMsg); 601 } 602 } 603 } catch (UnknownHostException e) { 604 //throw new RuntimeException(tr("Unknown host")+": "+e.getMessage(), e); 605 throw new OsmTransferException(tr("Unknown host")+": "+e.getMessage(), e); 606 } catch(SocketTimeoutException e) { 607 System.out.println(" timed out, retries left: " + retries); 608 if (cancel) 609 return; // assume cancel 610 if (retries-- > 0) 611 sendRequestRetry(requestMethod, urlSuffix, osm, body, retries); 612 else 613 //throw new RuntimeException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 614 throw new OsmTransferException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 615 } catch(ConnectException e) { 616 System.out.println(" timed out, retries left: " + retries); 617 if (cancel) 618 return; // assume cancel 619 if (retries-- > 0) 620 sendRequestRetry(requestMethod, urlSuffix, osm, body, retries); 621 else 622 //throw new RuntimeException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 623 throw new OsmTransferException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 624 } catch (Exception e) { 625 if (cancel) 626 return; // assume cancel 627 if (e instanceof OsmTransferException) 628 throw (OsmTransferException)e; 629 if (e instanceof RuntimeException) 630 throw (RuntimeException)e; 631 throw new RuntimeException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 632 } 633 } 634 635 private void sendRequest(String requestMethod, String urlSuffix, 636 OsmPrimitive osm, boolean addBody) { 637 XmlWriter.OsmWriterInterface body = null; 638 if (addBody) { 639 body = new OsmWriter.Single(osm, true, changeset); 640 } 641 try { 642 sendRequestRetry(requestMethod, urlSuffix, osm, body, 10); 643 } 644 catch (OsmTransferException e) { 645 dealWithTransferException (e); 646 } 647 } 648 649 private void dealWithTransferException (OsmTransferException e) { 650 Main.pleaseWaitDlg.currentAction.setText(tr("Transfer aborted due to error (will wait now 5 seconds):") + e.getMessage()); 651 cancel = true; 652 try { 653 Thread.sleep(5000); 654 } 655 catch (InterruptedException ex) {} 656 } 376 private void stopChangeset(int retries) throws OsmTransferException { 377 Main.pleaseWaitDlg.currentAction.setText(tr("Closing changeset...")); 378 try { 379 if (cancel) 380 return; // assume cancel 381 String version = Main.pref.get("osm-server.version", "0.6"); 382 URL url = new URL( 383 Main.pref.get("osm-server.url") + 384 "/" + version + 385 "/" + "changeset" + 386 "/" + changeset.id + 387 "/close" ); 388 System.out.print("upload to: "+url+ "..." ); 389 activeConnection = (HttpURLConnection)url.openConnection(); 390 activeConnection.setConnectTimeout(15000); 391 activeConnection.setRequestMethod("PUT"); 392 addAuth(activeConnection); 393 394 activeConnection.setDoOutput(true); 395 OutputStream out = activeConnection.getOutputStream(); 396 OsmWriter.output(out, changeset); 397 out.close(); 398 399 activeConnection.connect(); 400 System.out.println("connected"); 401 402 int retCode = activeConnection.getResponseCode(); 403 System.out.println("got return: "+retCode); 404 String retMsg = activeConnection.getResponseMessage(); 405 activeConnection.disconnect(); 406 if (retCode == 404) { 407 System.out.println("Server does not support changesets, or the changeset could not be found, continuing"); 408 return; 409 } 410 if (retCode != 200 && retCode != 412) { 411 if (retries >= 0) { 412 retries--; 413 System.out.print("backing off for 10 seconds..."); 414 Thread.sleep(10000); 415 System.out.println("retrying ("+retries+" left)"); 416 stopChangeset(retries); 417 } else { 418 // Look for a detailed error message from the server 419 retMsg += readString(activeConnection.getInputStream()); 420 421 // Report our error 422 ByteArrayOutputStream o = new ByteArrayOutputStream(); 423 OsmWriter.output(o, changeset); 424 System.out.println(new String(o.toByteArray(), "UTF-8").toString()); 425 throw new OsmTransferException(retCode+" "+retMsg); 426 } 427 } 428 } catch (UnknownHostException e) { 429 throw new OsmTransferException(tr("Unknown host")+": "+e.getMessage(), e); 430 } catch(SocketTimeoutException e) { 431 System.out.println(" timed out, retries left: " + retries); 432 if (cancel) 433 return; // assume cancel 434 if (retries-- > 0) 435 stopChangeset(retries); 436 else 437 throw new OsmTransferException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 438 } catch(ConnectException e) { 439 System.out.println(" timed out, retries left: " + retries); 440 if (cancel) 441 return; // assume cancel 442 if (retries-- > 0) 443 stopChangeset(retries); 444 else 445 throw new OsmTransferException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 446 } catch (Exception e) { 447 if (cancel) 448 return; // assume cancel 449 if (e instanceof OsmTransferException) 450 throw (OsmTransferException)e; 451 if (e instanceof RuntimeException) 452 throw (RuntimeException)e; 453 throw new RuntimeException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 454 } 455 } 456 457 /** 458 * Upload a single node. 459 */ 460 public void visit(Node n) { 461 if (n.deleted) { 462 sendRequest("DELETE", "node", n, true); 463 } else { 464 sendRequest("PUT", "node", n, true); 465 } 466 processed.add(n); 467 } 468 469 /** 470 * Upload a whole way with the complete node id list. 471 */ 472 public void visit(Way w) { 473 if (w.deleted) { 474 sendRequest("DELETE", "way", w, true); 475 } else { 476 sendRequest("PUT", "way", w, true); 477 } 478 processed.add(w); 479 } 480 481 /** 482 * Upload an relation with all members. 483 */ 484 public void visit(Relation e) { 485 if (e.deleted) { 486 sendRequest("DELETE", "relation", e, true); 487 } else { 488 sendRequest("PUT", "relation", e, true); 489 } 490 processed.add(e); 491 } 492 493 /** 494 * Read a long from the input stream and return it. 495 */ 496 private long readId(InputStream inputStream) throws IOException { 497 BufferedReader in = new BufferedReader(new InputStreamReader( 498 inputStream)); 499 String s = in.readLine(); 500 if (s == null) 501 return 0; 502 try { 503 return Long.parseLong(s); 504 } catch (NumberFormatException e) { 505 return 0; 506 } 507 } 508 509 /** 510 * Consume the input stream and return it as a string. 511 */ 512 private String readString(InputStream inputStream) throws IOException { 513 BufferedReader in = new BufferedReader(new InputStreamReader( 514 inputStream)); 515 StringBuffer sb = new StringBuffer(); 516 String s; 517 while((s = in.readLine()) != null) { 518 sb.append(s); 519 sb.append("\n"); 520 } 521 return sb.toString(); 522 } 523 524 /** 525 * Send the request. The objects id will be replaced if it was 0 before 526 * (on add requests). 527 * 528 * @param requestMethod The http method used when talking with the server. 529 * @param urlSuffix The suffix to add at the server url. 530 * @param osm The primitive to encode to the server. 531 * @param body the body to be sent 532 */ 533 private void sendRequestRetry(String requestMethod, String urlSuffix, 534 OsmPrimitive osm, OsmWriterInterface body, int retries) throws OsmTransferException { 535 try { 536 if (cancel) 537 return; // assume cancel 538 String version = Main.pref.get("osm-server.version", "0.5"); 539 URL url = new URL( 540 new URL(Main.pref.get("osm-server.url") + 541 "/" + version + "/"), 542 urlSuffix + 543 "/" + (osm.id==0 ? "create" : osm.id), 544 new MyHttpHandler()); 545 System.out.print("upload to: "+url+ "..." ); 546 activeConnection = (HttpURLConnection)url.openConnection(); 547 activeConnection.setConnectTimeout(15000); 548 activeConnection.setRequestMethod(requestMethod); 549 addAuth(activeConnection); 550 if (body != null) { 551 activeConnection.setDoOutput(true); 552 OutputStream out = activeConnection.getOutputStream(); 553 OsmWriter.output(out, body); 554 out.close(); 555 } 556 activeConnection.connect(); 557 System.out.println("connected"); 558 559 int retCode = activeConnection.getResponseCode(); 560 /* When creating new, the returned value is the new id, otherwise it is the new version */ 561 if (retCode == 200) { 562 if (osm.id == 0) { 563 osm.id = readId(activeConnection.getInputStream()); 564 osm.version = 1; 565 } else { 566 int read_version = (int)readId(activeConnection.getInputStream()); 567 if (read_version > 0) 568 osm.version = read_version; 569 } 570 } else { 571 System.out.println("got return: "+retCode+" with id "+osm.id); 572 } 573 activeConnection.disconnect(); 574 if (retCode == 410 && requestMethod.equals("DELETE")) 575 return; // everything fine.. was already deleted. 576 else if (retCode != 200) { 577 if (retries >= 0 && retCode != 412) { 578 retries--; 579 System.out.print("backing off for 10 seconds..."); 580 Thread.sleep(10000); 581 System.out.println("retrying ("+retries+" left)"); 582 sendRequestRetry(requestMethod, urlSuffix, osm, body, retries); 583 } else { 584 String retMsg = activeConnection.getResponseMessage(); 585 // Look for a detailed error message from the server 586 if (activeConnection.getHeaderField("Error") != null) 587 retMsg += "\n" + activeConnection.getHeaderField("Error"); 588 589 // Report our error 590 ByteArrayOutputStream o = new ByteArrayOutputStream(); 591 OsmWriter.output(o, body); 592 System.out.println(new String(o.toByteArray(), "UTF-8").toString()); 593 throw new OsmTransferException(retCode+" "+retMsg); 594 } 595 } 596 } catch (UnknownHostException e) { 597 throw new OsmTransferException(tr("Unknown host")+": "+e.getMessage(), e); 598 } catch(SocketTimeoutException e) { 599 System.out.println(" timed out, retries left: " + retries); 600 if (cancel) 601 return; // assume cancel 602 if (retries-- > 0) 603 sendRequestRetry(requestMethod, urlSuffix, osm, body, retries); 604 else 605 throw new OsmTransferException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 606 } catch(ConnectException e) { 607 System.out.println(" timed out, retries left: " + retries); 608 if (cancel) 609 return; // assume cancel 610 if (retries-- > 0) 611 sendRequestRetry(requestMethod, urlSuffix, osm, body, retries); 612 else 613 throw new OsmTransferException (e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 614 } catch (Exception e) { 615 if (cancel) 616 return; // assume cancel 617 if (e instanceof OsmTransferException) 618 throw (OsmTransferException)e; 619 if (e instanceof RuntimeException) 620 throw (RuntimeException)e; 621 throw new RuntimeException(e.getMessage()+ " " + e.getClass().getCanonicalName(), e); 622 } 623 } 624 625 private void sendRequest(String requestMethod, String urlSuffix, 626 OsmPrimitive osm, boolean addBody) { 627 XmlWriter.OsmWriterInterface body = null; 628 if (addBody) { 629 body = new OsmWriter.Single(osm, true, changeset); 630 } 631 try { 632 sendRequestRetry(requestMethod, urlSuffix, osm, body, 10); 633 } 634 catch (OsmTransferException e) { 635 dealWithTransferException (e); 636 } 637 } 638 639 private void dealWithTransferException (OsmTransferException e) { 640 Main.pleaseWaitDlg.currentAction.setText(tr("Transfer aborted due to error (will wait for 5 seconds):") + e.getMessage()); 641 cancel = true; 642 try { 643 Thread.sleep(5000); 644 } 645 catch (InterruptedException ex) {} 646 } 657 647 }
Note:
See TracChangeset
for help on using the changeset viewer.