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