001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.plugins.streetside; 003 004import java.util.Collection; 005import java.util.List; 006import java.util.concurrent.CopyOnWriteArrayList; 007 008import org.openstreetmap.josm.plugins.streetside.model.UserProfile; 009 010/** 011 * Class that stores a sequence of {@link StreetsideAbstractImage} objects. 012 * 013 * @author nokutu 014 * @see StreetsideAbstractImage 015 */ 016 017public class StreetsideSequence { 018 019 020 /** 021 * Unique identifier. Used only for {@link StreetsideImage} sequences. 022 */ 023 private String id; 024 private UserProfile user; 025 026 private double la; 027 private double lo; 028 029 /** 030 * Epoch time when the sequence was created 031 */ 032 private long cd; 033 034 /** 035 * The images in the sequence. 036 */ 037 private List<StreetsideAbstractImage> images; 038 039 public StreetsideSequence(String id, Long ca) { 040 this.id = id; 041 cd = ca; 042 images = new CopyOnWriteArrayList<>(); 043 } 044 045 public StreetsideSequence(String id, double la, double lo) { 046 this.id = id; 047 this.la = la; 048 this.lo = lo; 049 images = new CopyOnWriteArrayList<>(); 050 } 051 052 /** 053 * No argument constructor for StreetsideSequence - necessary for JSON serialization 054 */ 055 public StreetsideSequence() { 056 images = new CopyOnWriteArrayList<>(); 057 } 058 059 public StreetsideSequence(String id, double la, double lo, long ca) { 060 this.id = id; 061 this.la = la; 062 this.lo = lo; 063 cd = ca; 064 images = new CopyOnWriteArrayList<>(); 065} 066 067public StreetsideSequence(String id) { 068 this.id = id; 069 images = new CopyOnWriteArrayList<>(); 070} 071 072 /** 073 * Adds a new {@link StreetsideAbstractImage} object to the database. 074 * 075 * @param image The {@link StreetsideAbstractImage} object to be added 076 */ 077 public synchronized void add(StreetsideAbstractImage image) { 078 images.add(image); 079 image.setSequence(this); 080 } 081 082 /** 083 * Adds a set of {@link StreetsideAbstractImage} objects to the database. 084 * 085 * @param images The set of {@link StreetsideAbstractImage} objects to be added. 086 */ 087 public synchronized void add(final Collection<? extends StreetsideAbstractImage> images) { 088 this.images.addAll(images); 089 images.forEach(img -> img.setSequence(this)); 090 } 091 092 /** 093 * Returns the next {@link StreetsideAbstractImage} in the sequence of a given 094 * {@link StreetsideAbstractImage} object. 095 * 096 * @param image The {@link StreetsideAbstractImage} object whose next image is 097 * going to be returned. 098 * 099 * @return The next {@link StreetsideAbstractImage} object in the sequence. 100 * 101 * @throws IllegalArgumentException if the given {@link StreetsideAbstractImage} object doesn't belong 102 * the this sequence. 103 */ 104 public StreetsideAbstractImage next(StreetsideAbstractImage image) { 105 int i = images.indexOf(image); 106 if (i == -1) { 107 throw new IllegalArgumentException(); 108 } 109 if (i == images.size() - 1) { 110 return null; 111 } 112 return images.get(i + 1); 113 } 114 115 /** 116 * Returns the previous {@link StreetsideAbstractImage} in the sequence of a 117 * given {@link StreetsideAbstractImage} object. 118 * 119 * @param image The {@link StreetsideAbstractImage} object whose previous image is 120 * going to be returned. 121 * 122 * @return The previous {@link StreetsideAbstractImage} object in the sequence. 123 * 124 * @throws IllegalArgumentException if the given {@link StreetsideAbstractImage} object doesn't belong 125 * the this sequence. 126 */ 127 public StreetsideAbstractImage previous(StreetsideAbstractImage image) { 128 int i = images.indexOf(image); 129 if (i < 0) { 130 throw new IllegalArgumentException(); 131 } 132 if (i == 0) { 133 return null; 134 } 135 return images.get(i - 1); 136 } 137 138 /** 139 * Removes a {@link StreetsideAbstractImage} object from the database. 140 * 141 * @param image The {@link StreetsideAbstractImage} object to be removed. 142 */ 143 public void remove(StreetsideAbstractImage image) { 144 images.remove(image); 145 } 146 147 /** 148 * @param id the id to set 149 */ 150 public void setId(String id) { 151 this.id = id; 152 } 153 154 /** 155 * @return the la 156 */ 157 public double getLa() { 158 return la; 159 } 160 161 /** 162 * @param la the la to set 163 */ 164 public void setLa(double la) { 165 this.la = la; 166 } 167 168 /** 169 * @return the lo 170 */ 171 public double getLo() { 172 return lo; 173 } 174 175 /** 176 * @param lo the lo to set 177 */ 178 public void setLo(double lo) { 179 this.lo = lo; 180 } 181 182 /** 183 * Returns the Epoch time when the sequence was captured. 184 * 185 * Negative values mean, no value is set. 186 * 187 * @return A long containing the Epoch time when the sequence was captured. 188 */ 189 public long getCd() { 190 return cd; 191 } 192 193 /** 194 * Returns all {@link StreetsideAbstractImage} objects contained by this 195 * object. 196 * 197 * @return A {@link List} object containing all the 198 * {@link StreetsideAbstractImage} objects that are part of the 199 * sequence. 200 */ 201 public List<StreetsideAbstractImage> getImages() { 202 return images; 203 } 204 205 /** 206 * Returns the unique identifier of the sequence. 207 * 208 * @return A {@code String} containing the unique identifier of the sequence. 209 * null means that the sequence has been created locally for imported 210 * images. 211 */ 212 public String getId() { 213 return id; 214 } 215 216 public UserProfile getUser() { 217 return user; 218 } 219}