001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.data.osm; 003 004 import static org.openstreetmap.josm.tools.I18n.marktr; 005 import static org.openstreetmap.josm.tools.I18n.tr; 006 007 import java.text.MessageFormat; 008 import java.util.Arrays; 009 import java.util.Collection; 010 011 public enum OsmPrimitiveType { 012 013 NODE (marktr(/* ICON(data/) */"node"), Node.class, NodeData.class), 014 WAY (marktr(/* ICON(data/) */"way"), Way.class, WayData.class), 015 RELATION (marktr(/* ICON(data/) */"relation"), Relation.class, RelationData.class), 016 017 /* only for display, no real type */ 018 CLOSEDWAY (marktr(/* ICON(data/) */"closedway"), null, WayData.class), 019 MULTIPOLYGON (marktr(/* ICON(data/) */"multipolygon"), null, RelationData.class); 020 021 private final static Collection<OsmPrimitiveType> DATA_VALUES = Arrays.asList(NODE, WAY, RELATION); 022 023 private final String apiTypeName; 024 private final Class<? extends OsmPrimitive> osmClass; 025 private final Class<? extends PrimitiveData> dataClass; 026 027 OsmPrimitiveType(String apiTypeName, Class<? extends OsmPrimitive> osmClass, Class<? extends PrimitiveData> dataClass) { 028 this.apiTypeName = apiTypeName; 029 this.osmClass = osmClass; 030 this.dataClass = dataClass; 031 } 032 033 public String getAPIName() { 034 return apiTypeName; 035 } 036 037 public Class<? extends OsmPrimitive> getOsmClass() { 038 return osmClass; 039 } 040 041 public Class<? extends PrimitiveData> getDataClass() { 042 return dataClass; 043 } 044 045 public static OsmPrimitiveType fromApiTypeName(String typeName) { 046 for (OsmPrimitiveType type : OsmPrimitiveType.values()) { 047 if (type.getAPIName().equals(typeName)) return type; 048 } 049 throw new IllegalArgumentException(MessageFormat.format("Parameter ''{0}'' is not a valid type name. Got ''{1}''.", "typeName", typeName)); 050 } 051 052 public static OsmPrimitiveType from(IPrimitive obj) { 053 if (obj instanceof INode) return NODE; 054 if (obj instanceof IWay) return WAY; 055 if (obj instanceof IRelation) return RELATION; 056 throw new IllegalArgumentException(); 057 } 058 059 public static OsmPrimitiveType from(String value) { 060 if (value == null) return null; 061 for (OsmPrimitiveType type: values()){ 062 if (type.getAPIName().equalsIgnoreCase(value)) 063 return type; 064 } 065 return null; 066 } 067 068 public static Collection<OsmPrimitiveType> dataValues() { 069 return DATA_VALUES; 070 } 071 072 public OsmPrimitive newInstance(long uniqueId, boolean allowNegative) { 073 switch (this) { 074 case NODE: 075 return new Node(uniqueId, allowNegative); 076 case WAY: 077 return new Way(uniqueId, allowNegative); 078 case RELATION: 079 return new Relation(uniqueId, allowNegative); 080 default: 081 throw new AssertionError(); 082 } 083 } 084 085 @Override 086 public String toString() { 087 return tr(getAPIName()); 088 } 089 }