// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.osm; import static org.openstreetmap.josm.tools.I18n.marktr; import static org.openstreetmap.josm.tools.I18n.tr; import java.text.MessageFormat; import java.util.Arrays; import java.util.Collection; /** * OSM primitive type. * @since 1670 */ public enum OsmPrimitiveType { /** Node type */ NODE(marktr(/* ICON(data/) */"node"), Node.class, NodeData.class), /** Way type */ WAY(marktr(/* ICON(data/) */"way"), Way.class, WayData.class), /** Relation type */ RELATION(marktr(/* ICON(data/) */"relation"), Relation.class, RelationData.class), /** Closed way: only for display, no real type */ CLOSEDWAY(marktr(/* ICON(data/) */"closedway"), null, WayData.class), /** Multipolygon: only for display, no real type */ MULTIPOLYGON(marktr(/* ICON(data/) */"multipolygon"), null, RelationData.class); private static final Collection<OsmPrimitiveType> DATA_VALUES = Arrays.asList(NODE, WAY, RELATION); private final String apiTypeName; private final Class<? extends OsmPrimitive> osmClass; private final Class<? extends PrimitiveData> dataClass; OsmPrimitiveType(String apiTypeName, Class<? extends OsmPrimitive> osmClass, Class<? extends PrimitiveData> dataClass) { this.apiTypeName = apiTypeName; this.osmClass = osmClass; this.dataClass = dataClass; } public String getAPIName() { return apiTypeName; } public Class<? extends OsmPrimitive> getOsmClass() { return osmClass; } public Class<? extends PrimitiveData> getDataClass() { return dataClass; } public static OsmPrimitiveType fromApiTypeName(String typeName) { for (OsmPrimitiveType type : OsmPrimitiveType.values()) { if (type.getAPIName().equals(typeName)) return type; } throw new IllegalArgumentException(MessageFormat.format( "Parameter ''{0}'' is not a valid type name. Got ''{1}''.", "typeName", typeName)); } /** * Determines the OSM primitive type of the given object. * @param obj the OSM object to inspect * @return the OSM primitive type of {@code obj} * @throws IllegalArgumentException if {@code obj} is null or of unknown type */ public static OsmPrimitiveType from(IPrimitive obj) { if (obj instanceof INode) return NODE; if (obj instanceof IWay) return WAY; if (obj instanceof IRelation) return RELATION; throw new IllegalArgumentException("Unknown type: "+obj); } public static OsmPrimitiveType from(String value) { if (value == null) return null; for (OsmPrimitiveType type: values()) { if (type.getAPIName().equalsIgnoreCase(value)) return type; } return null; } public static Collection<OsmPrimitiveType> dataValues() { return DATA_VALUES; } public OsmPrimitive newInstance(long uniqueId, boolean allowNegative) { switch (this) { case NODE: return new Node(uniqueId, allowNegative); case WAY: return new Way(uniqueId, allowNegative); case RELATION: return new Relation(uniqueId, allowNegative); default: throw new AssertionError(); } } @Override public String toString() { return tr(getAPIName()); } }