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}