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