source: josm/trunk/src/org/openstreetmap/josm/io/ChangesetClosedException.java@ 14447

Last change on this file since 14447 was 13207, checked in by Don-vip, 7 years ago

enable PMD rule PreserveStackTrace + add missing jars to run new PMD rule designer

  • Property svn:eol-style set to native
File size: 5.6 KB
RevLine 
[2512]1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.text.ParseException;
7import java.util.Date;
8import java.util.regex.Matcher;
9import java.util.regex.Pattern;
10
[12620]11import org.openstreetmap.josm.tools.Logging;
[7299]12import org.openstreetmap.josm.tools.date.DateUtils;
[6248]13
[2569]14/**
15 * A ChangesetClosedException is thrown if the server replies with a HTTP
[5266]16 * return code 409 (Conflict) with the error header {@link #ERROR_HEADER_PATTERN}.
[2569]17 *
18 * Depending on the context the exception is thrown in we have to react differently.
19 * <ul>
20 * <li>if it is thrown when we try to update a changeset, the changeset was most
21 * likely closed before, either explicitly by the user or because of a timeout</li>
22 * <li>if it is thrown when we try to upload data to the changeset, the changeset
23 * was most likely closed because we reached the servers capability limit for the size
24 * of a changeset.</li>
25 * </ul>
26 */
[2512]27public class ChangesetClosedException extends OsmTransferException {
[2569]28 /** the error header pattern for in case of HTTP response 409 indicating
29 * that a changeset was closed
30 */
[6889]31 public static final String ERROR_HEADER_PATTERN = "The changeset (\\d+) was closed at (.*)";
[2512]32
[8836]33 public enum Source {
[2569]34 /**
35 * The exception was thrown when a changeset was updated. This most likely means
36 * that the changeset was closed before.
37 */
38 UPDATE_CHANGESET,
39 /**
40 * The exception was thrown when data was uploaded to the changeset. This most
41 * likely means that the servers capability limits for a changeset have been
42 * exceeded.
43 */
44 UPLOAD_DATA,
45 /**
46 * Unspecified source
47 */
48 UNSPECIFIED
49 }
50
51 /**
[5266]52 * Replies true if <code>errorHeader</code> matches with {@link #ERROR_HEADER_PATTERN}
[2711]53 *
[2569]54 * @param errorHeader the error header
[5266]55 * @return true if <code>errorHeader</code> matches with {@link #ERROR_HEADER_PATTERN}
[2569]56 */
[6889]57 public static boolean errorHeaderMatchesPattern(String errorHeader) {
[2569]58 if (errorHeader == null)
59 return false;
60 Pattern p = Pattern.compile(ERROR_HEADER_PATTERN);
61 Matcher m = p.matcher(errorHeader);
62 return m.matches();
63 }
64
[2512]65 /** the changeset id */
66 private long changesetId;
67 /** the date on which the changeset was closed */
68 private Date closedOn;
[2569]69 /** the source */
70 private Source source;
[2512]71
[6890]72 protected final void parseErrorHeader(String errorHeader) {
[2569]73 Pattern p = Pattern.compile(ERROR_HEADER_PATTERN);
[2512]74 Matcher m = p.matcher(errorHeader);
75 if (m.matches()) {
76 changesetId = Long.parseLong(m.group(1));
77 try {
[7299]78 closedOn = DateUtils.newOsmApiDateTimeFormat().parse(m.group(2));
[8510]79 } catch (ParseException ex) {
[12620]80 Logging.error(tr("Failed to parse date ''{0}'' replied by server.", m.group(2)));
81 Logging.error(ex);
[2512]82 }
83 } else {
[12620]84 Logging.error(tr("Unexpected format of error header for conflict in changeset update. Got ''{0}''", errorHeader));
[2512]85 }
86 }
87
[2569]88 /**
89 * Creates the exception with the given <code>errorHeader</code>
[2711]90 *
[2569]91 * @param errorHeader the error header
92 */
[2512]93 public ChangesetClosedException(String errorHeader) {
94 super(errorHeader);
95 parseErrorHeader(errorHeader);
[2569]96 this.source = Source.UNSPECIFIED;
[2512]97 }
98
[2569]99 /**
[13207]100 * Creates the exception with the given error header and source.
[2711]101 *
[2569]102 * @param errorHeader the error header
103 * @param source the source for the exception
104 */
105 public ChangesetClosedException(String errorHeader, Source source) {
[13207]106 this(errorHeader, source, null);
107 }
108
109 /**
110 * Creates the exception with the given error header, source and cause.
111 *
112 * @param errorHeader the error header
113 * @param source the source for the exception
114 * @param cause The cause (which is saved for later retrieval by the {@link #getCause} method).
115 * A null value is permitted, and indicates that the cause is nonexistent or unknown.
116 * @since 13207
117 */
118 public ChangesetClosedException(String errorHeader, Source source, Throwable cause) {
119 super(errorHeader, cause);
[2569]120 parseErrorHeader(errorHeader);
121 this.source = source == null ? Source.UNSPECIFIED : source;
122 }
123
124 /**
[2599]125 * Creates the exception
[2711]126 *
[2599]127 * @param changesetId the id if the closed changeset
128 * @param closedOn the date the changeset was closed on
129 * @param source the source for the exception
130 */
131 public ChangesetClosedException(long changesetId, Date closedOn, Source source) {
132 super("");
133 this.source = source == null ? Source.UNSPECIFIED : source;
134 this.changesetId = changesetId;
[11878]135 this.closedOn = DateUtils.cloneDate(closedOn);
[2599]136 }
137
138 /**
[2569]139 * Replies the id of the changeset which was closed
[2711]140 *
[2569]141 * @return the id of the changeset which was closed
142 */
[2512]143 public long getChangesetId() {
144 return changesetId;
145 }
146
[2569]147 /**
148 * Replies the date the changeset was closed
[2711]149 *
[2569]150 * @return the date the changeset was closed. May be null if the date isn't known.
151 */
[2512]152 public Date getClosedOn() {
[11878]153 return DateUtils.cloneDate(closedOn);
[2512]154 }
[2569]155
156 /**
157 * Replies the source where the exception was thrown
[2711]158 *
[2569]159 * @return the source
160 */
161 public Source getSource() {
162 return source;
163 }
[2599]164
165 public void setSource(Source source) {
166 this.source = source == null ? Source.UNSPECIFIED : source;
167 }
[2512]168}
Note: See TracBrowser for help on using the repository browser.