// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.osm; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * This class can be used to save properties of OsmPrimitive. The main difference between PrimitiveData * and OsmPrimitive is that PrimitiveData is not part of the dataset and changes in PrimitiveData are not * reported by events * */ public abstract class PrimitiveData implements Tagged, PrimitiveId { // Useful? //private boolean disabled; //private boolean filtered; //private boolean selected; //private boolean highlighted; public PrimitiveData() { id = OsmPrimitive.generateUniqueId(); } public PrimitiveData(PrimitiveData data) { this.keys.putAll(data.keys); this.modified = data.modified; this.visible = data.visible; this.deleted = data.deleted; this.id = data.id; this.user = data.user; this.version = data.version; this.timestamp = data.timestamp; this.incomplete = data.incomplete; } private final Map<String, String> keys = new HashMap<String, String>(); private boolean modified; private boolean visible = true; private boolean deleted; private boolean incomplete; private long id; private User user; private int version; private Date timestamp = new Date(); private int changesetId; public boolean isModified() { return modified; } public void setModified(boolean modified) { this.modified = modified; } public boolean isVisible() { return visible; } public void setVisible(boolean visible) { this.visible = visible; } public boolean isDeleted() { return deleted; } public void setDeleted(boolean deleted) { this.deleted = deleted; } public long getId() { return id > 0 ? id : 0; } public void setId(long id) { this.id = id; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } public Date getTimestamp() { return timestamp; } public void setTimestamp(Date timestamp) { this.timestamp = timestamp; } public int getChangesetId() { return changesetId; } public void setChangesetId(int changesetId) { this.changesetId = changesetId; } public Map<String, String> getKeys() { return keys; } public boolean isIncomplete() { return incomplete; } public void setIncomplete(boolean incomplete) { this.incomplete = incomplete; } public void clearOsmId() { id = OsmPrimitive.generateUniqueId(); } public abstract PrimitiveData makeCopy(); @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append(id).append(keys); if (modified) { builder.append("M"); } if (visible) { builder.append("V"); } if (deleted) { builder.append("D"); } if (incomplete) { builder.append("I"); } return builder.toString(); } // Tagged implementation public String get(String key) { return keys.get(key); } public boolean hasKeys() { return !keys.isEmpty(); } public Collection<String> keySet() { return keys.keySet(); } public void put(String key, String value) { keys.put(key, value); } public void remove(String key) { keys.remove(key); } public void removeAll() { keys.clear(); } public void setKeys(Map<String, String> keys) { this.keys.clear(); this.keys.putAll(keys); } @SuppressWarnings("unchecked") static public <T extends PrimitiveData> List<T> getFilteredList(Collection<T> list, OsmPrimitiveType type) { List<T> ret = new ArrayList<T>(); for(PrimitiveData p: list) { if (type.getDataClass().isInstance(p)) { ret.add((T)p); } } return ret; } protected void setKeysAsList(String... keys) { assert keys.length % 2 == 0; for (int i=0; i<keys.length/2; i++) { this.keys.put(keys[i * 2], keys[i * 2 + 1]); } } /** * PrimitiveId implementation. Returns the same value as getId() */ public long getUniqueId() { return id; } /** * Returns a PrimitiveId object for this primitive * * @return the PrimitiveId for this primitive */ public PrimitiveId getPrimitiveId() { return new SimplePrimitiveId(getUniqueId(), getType()); } public boolean isNew() { return id <= 0; } public abstract OsmPrimitiveType getType(); }