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 * There is a new data source
016 *
017 * @author Taylor Smock
018 * @since 15609
019 */
020public class DataSourceAddedEvent extends AbstractDataSourceChangeEvent {
021    private Set<DataSource> current;
022    private Set<DataSource> removed;
023    private final 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 newDataSources The data sources that are being added
031     */
032    public DataSourceAddedEvent(DataSet source, Set<DataSource> old, Stream<DataSource> newDataSources) {
033        super(source, old);
034        CheckParameterUtil.ensureParameterNotNull(newDataSources, "newDataSources");
035        this.added = newDataSources.collect(Collectors.toCollection(LinkedHashSet::new));
036    }
037
038    @Override
039    public Set<DataSource> getDataSources() {
040        if (current == null) {
041            current = new LinkedHashSet<>(getOldDataSources());
042            current.addAll(added);
043        }
044        return current;
045    }
046
047    @Override
048    public synchronized Set<DataSource> getRemoved() {
049        if (removed == null) {
050            removed = getOldDataSources().stream().filter(s -> !getDataSources().contains(s))
051                    .collect(Collectors.toCollection(LinkedHashSet::new));
052        }
053        return removed;
054    }
055
056    @Override
057    public synchronized Set<DataSource> getAdded() {
058        return added;
059    }
060
061    @Override
062    public String toString() {
063        return "DataSourceAddedEvent [current=" + current + ", removed=" + removed + ", added=" + added + ']';
064    }
065}
066