001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.data.osm; 003 004import java.io.IOException; 005import java.io.ObjectInputStream; 006import java.io.ObjectOutputStream; 007import java.io.Serializable; 008import java.util.ArrayList; 009import java.util.Arrays; 010import java.util.Collection; 011import java.util.List; 012import java.util.Map; 013 014/** 015 * This class can be used to save properties of OsmPrimitive. 016 * 017 * The main difference between PrimitiveData 018 * and OsmPrimitive is that PrimitiveData is not part of the dataset and changes in PrimitiveData are not 019 * reported by events 020 */ 021public abstract class PrimitiveData extends AbstractPrimitive implements Serializable { 022 023 private static final long serialVersionUID = -1044837092478109138L; 024 025 /** 026 * Constructs a new {@code PrimitiveData}. 027 */ 028 public PrimitiveData() { 029 id = OsmPrimitive.generateUniqueId(); 030 } 031 032 public PrimitiveData(PrimitiveData data) { 033 cloneFrom(data); 034 } 035 036 public void setId(long id) { 037 this.id = id; 038 } 039 040 public void setVersion(int version) { 041 this.version = version; 042 } 043 044 /** 045 * override to make it public 046 */ 047 @Override 048 public void setIncomplete(boolean incomplete) { 049 super.setIncomplete(incomplete); 050 } 051 052 public abstract PrimitiveData makeCopy(); 053 054 @Override 055 public String toString() { 056 StringBuilder builder = new StringBuilder(); 057 builder.append(id).append(Arrays.toString(keys)).append(getFlagsAsString()); 058 return builder.toString(); 059 } 060 061 @SuppressWarnings("unchecked") 062 public static <T extends PrimitiveData> List<T> getFilteredList(Collection<T> list, OsmPrimitiveType type) { 063 List<T> ret = new ArrayList<>(); 064 for (PrimitiveData p: list) { 065 if (type.getDataClass().isInstance(p)) { 066 ret.add((T) p); 067 } 068 } 069 return ret; 070 } 071 072 @Override 073 protected final void keysChangedImpl(Map<String, String> originalKeys) { 074 } 075 076 private void writeObject(ObjectOutputStream oos) throws IOException { 077 // since super class is not Serializable 078 oos.writeLong(id); 079 oos.writeLong(user == null ? -1 : user.getId()); 080 oos.writeInt(version); 081 oos.writeInt(changesetId); 082 oos.writeInt(timestamp); 083 oos.defaultWriteObject(); 084 } 085 086 private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { 087 // since super class is not Serializable 088 id = ois.readLong(); 089 final long userId = ois.readLong(); 090 user = userId == -1 ? null : User.getById(userId); 091 version = ois.readInt(); 092 changesetId = ois.readInt(); 093 timestamp = ois.readInt(); 094 ois.defaultReadObject(); 095 } 096}