001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.plugins.streetside.history.commands;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.util.Arrays;
007import java.util.concurrent.ConcurrentSkipListSet;
008
009import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage;
010import org.openstreetmap.josm.plugins.streetside.utils.StreetsideUtils;
011
012/**
013 * Command joined when joining two images into the same sequence.
014 *
015 * @author nokutu
016 *
017 */
018public class CommandJoin extends StreetsideExecutableCommand {
019
020  private final StreetsideAbstractImage a;
021  private final StreetsideAbstractImage b;
022
023  /**
024   * Main constructor.
025   *
026   * @param a the first image, that is joined with the second one
027   * @param b the second image, that is joined with the first one
028   * @throws IllegalArgumentException if the images are already in the same sequence
029   * @throws NullPointerException if {@code a} or {@code b} is null
030   */
031  public CommandJoin(final StreetsideAbstractImage a, final StreetsideAbstractImage b) {
032    super(new ConcurrentSkipListSet<>(Arrays.asList(a, b))); // throws NPE if a or b is null
033    if (a.getSequence() == b.getSequence()) {
034      throw new IllegalArgumentException("Both images must be in different sequences for joining.");
035    }
036    this.a = a;
037    this.b = b;
038  }
039
040  @Override
041  public void execute() {
042    redo();
043  }
044
045  @Override
046  public void undo() {
047    StreetsideUtils.unjoin(a, b);
048  }
049
050  @Override
051  public void redo() {
052    StreetsideUtils.join(a, b);
053  }
054
055  @Override
056  public void sum(StreetsideCommand command) {
057  }
058
059  @Override
060  public String toString() {
061    return tr("2 images joined");
062  }
063}