001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.io;
003
004 import java.net.HttpURLConnection;
005 import java.util.regex.Matcher;
006 import java.util.regex.Pattern;
007
008 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
009
010 /**
011 * Represents an exception thrown by the OSM API if JOSM tries to update or delete a primitive
012 * which is already deleted on the server.
013 *
014 */
015 public class OsmApiPrimitiveGoneException extends OsmApiException{
016 /**
017 * The regexp pattern for the error header replied by the OSM API
018 */
019 static public final String ERROR_HEADER_PATTERN = "The (\\S+) with the id (\\d+) has already been deleted";
020 /** the type of the primitive which is gone on the server */
021 private OsmPrimitiveType type;
022 /** the id of the primitive */
023 private long id;
024
025 public OsmApiPrimitiveGoneException(String errorHeader, String errorBody) {
026 super(HttpURLConnection.HTTP_GONE, errorHeader, errorBody);
027 if (errorHeader == null) return;
028 Pattern p = Pattern.compile(ERROR_HEADER_PATTERN);
029 Matcher m = p.matcher(errorHeader);
030 if (m.matches()) {
031 type = OsmPrimitiveType.from(m.group(1));
032 id = Long.parseLong(m.group(2));
033 }
034 }
035
036 /**
037 * Replies true if we know what primitive this exception was thrown for
038 *
039 * @return true if we know what primitive this exception was thrown for
040 */
041 public boolean isKnownPrimitive() {
042 return id > 0 && type != null;
043 }
044
045 /**
046 * Replies the type of the primitive this exception was thrown for. null,
047 * if the type is not known.
048 *
049 * @return the type of the primitive this exception was thrown for
050 */
051 public OsmPrimitiveType getPrimitiveType() {
052 return type;
053 }
054
055 /**
056 * Replies the id of the primitive this exception was thrown for. 0, if
057 * the id is not known.
058 *
059 * @return the id of the primitive this exception was thrown for
060 */
061 public long getPrimitiveId() {
062 return id;
063 }
064 }