001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.osm.event;
003
004import java.util.LinkedHashSet;
005import java.util.Set;
006import java.util.stream.Collectors;
007import java.util.stream.Stream;
008
009import org.openstreetmap.josm.data.DataSource;
010import org.openstreetmap.josm.data.osm.AbstractDataSourceChangeEvent;
011import org.openstreetmap.josm.data.osm.DataSet;
012import org.openstreetmap.josm.tools.CheckParameterUtil;
013
014/**
015 * A data source was removed
016 *
017 * @author Taylor Smock
018 * @since 15609
019 */
020public class DataSourceRemovedEvent extends AbstractDataSourceChangeEvent {
021    private Set<DataSource> current;
022    private final Set<DataSource> removed;
023    private Set<DataSource> added;
024
025    /**
026     * Create a Data Source change event
027     *
028     * @param source             The DataSet that is originating the change
029     * @param old                The previous set of DataSources
030     * @param removedDataSources The data sources that are being removed
031     */
032    public DataSourceRemovedEvent(DataSet source, Set<DataSource> old, Stream<DataSource> removedDataSources) {
033        super(source, old);
034        CheckParameterUtil.ensureParameterNotNull(removedDataSources, "removedDataSources");
035        this.removed = removedDataSources.collect(Collectors.toCollection(LinkedHashSet::new));
036    }
037
038    @Override
039    public Set<DataSource> getDataSources() {
040        if (current == null) {
041            current = getOldDataSources().stream().filter(s -> !removed.contains(s))
042                    .collect(Collectors.toCollection(LinkedHashSet::new));
043        }
044        return current;
045    }
046
047    @Override
048    public synchronized Set<DataSource> getRemoved() {
049        return removed;
050    }
051
052    @Override
053    public synchronized Set<DataSource> getAdded() {
054        if (added == null) {
055            added = getDataSources().stream().filter(s -> !getOldDataSources().contains(s))
056                    .collect(Collectors.toCollection(LinkedHashSet::new));
057        }
058        return added;
059    }
060
061    @Override
062    public String toString() {
063        return "DataSourceAddedEvent [current=" + current + ", removed=" + removed + ", added=" + added + ']';
064    }
065}
066