- Timestamp:
- 2008-12-15T00:45:00+01:00 (15 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 * This list contain all successfulprocessed objects. The caller of54 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.