001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.data.osm; 003 004 import java.io.Serializable; 005 import java.util.regex.Matcher; 006 import java.util.regex.Pattern; 007 008 public class SimplePrimitiveId implements PrimitiveId, Serializable { 009 private final long id; 010 private final OsmPrimitiveType type; 011 012 public SimplePrimitiveId(long id, OsmPrimitiveType type) { 013 this.id = id; 014 this.type = type; 015 } 016 017 public OsmPrimitiveType getType() { 018 return type; 019 } 020 021 public long getUniqueId() { 022 return id; 023 } 024 025 public boolean isNew() { 026 return id <= 0; 027 } 028 029 @Override 030 public int hashCode() { 031 final int prime = 31; 032 int result = 1; 033 result = prime * result + (int) (id ^ (id >>> 32)); 034 result = prime * result + ((type == null) ? 0 : type.hashCode()); 035 return result; 036 } 037 038 @Override 039 public boolean equals(Object obj) { 040 if (this == obj) 041 return true; 042 if (obj == null) 043 return false; 044 if (getClass() != obj.getClass()) 045 return false; 046 SimplePrimitiveId other = (SimplePrimitiveId) obj; 047 if (id != other.id) 048 return false; 049 if (type == null) { 050 if (other.type != null) 051 return false; 052 } else if (!type.equals(other.type)) 053 return false; 054 return true; 055 } 056 057 @Override 058 public String toString() { 059 return type + " " + id; 060 } 061 062 /** 063 * Parses a {@code OsmPrimitiveType} from the string {@code s}. 064 * @param s the string to be parsed, e.g., {@code n1}, {@code node1}, 065 * {@code w1}, {@code way1}, {@code r1}, {@code rel1}, {@code relation1}. 066 * @return the parsed {@code OsmPrimitiveType} 067 * @throws IllegalArgumentException if the string does not match the pattern 068 */ 069 public static SimplePrimitiveId fromString(String s) { 070 final Pattern p = Pattern.compile("((n(ode)?|w(ay)?|r(el(ation)?)?)/?)(\\d+)"); 071 final Matcher m = p.matcher(s); 072 if (m.matches()) { 073 return new SimplePrimitiveId(Long.parseLong(m.group(m.groupCount())), 074 s.charAt(0) == 'n' ? OsmPrimitiveType.NODE 075 : s.charAt(0) == 'w' ? OsmPrimitiveType.WAY 076 : OsmPrimitiveType.RELATION); 077 } else { 078 throw new IllegalArgumentException("The string " + s + " does not match the pattern " + p); 079 } 080 } 081 }