Changeset 13114 in josm
- Timestamp:
- 2017-11-12T02:05:48+01:00 (7 years ago)
- Location:
- trunk/src/org/openstreetmap/josm/gui
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/io/importexport/NoteImporter.java
r12671 r13114 25 25 public class NoteImporter extends FileImporter { 26 26 27 private static final ExtensionFileFilter FILE_FILTER = ExtensionFileFilter.newFilterWithArchiveExtensions( 27 /** 28 * The Notes file filter (*.osn files). 29 * @since 13114 30 */ 31 public static final ExtensionFileFilter FILE_FILTER = ExtensionFileFilter.newFilterWithArchiveExtensions( 28 32 "osn", "osn", tr("Note Files"), true); 29 33 -
trunk/src/org/openstreetmap/josm/gui/layer/AutosaveTask.java
r12856 r13114 31 31 import org.openstreetmap.josm.actions.OpenFileAction.OpenFileTask; 32 32 import org.openstreetmap.josm.data.osm.DataSet; 33 import org.openstreetmap.josm.data.osm.NoteData; 34 import org.openstreetmap.josm.data.osm.NoteData.NoteDataUpdateListener; 33 35 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; 34 36 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter; … … 38 40 import org.openstreetmap.josm.gui.MainApplication; 39 41 import org.openstreetmap.josm.gui.Notification; 42 import org.openstreetmap.josm.gui.io.importexport.NoteExporter; 43 import org.openstreetmap.josm.gui.io.importexport.NoteImporter; 40 44 import org.openstreetmap.josm.gui.io.importexport.OsmExporter; 41 45 import org.openstreetmap.josm.gui.io.importexport.OsmImporter; … … 50 54 51 55 /** 52 * Saves data layers periodically so they can be recovered in case of a crash. 56 * Saves data and note layers periodically so they can be recovered in case of a crash. 53 57 * 54 58 * There are 2 directories … … 68 72 * @since 10386 (new LayerChangeListener interface) 69 73 */ 70 public class AutosaveTask extends TimerTask implements LayerChangeListener, Listener { 74 public class AutosaveTask extends TimerTask implements LayerChangeListener, Listener, NoteDataUpdateListener { 71 75 72 76 private static final char[] ILLEGAL_CHARACTERS = {'/', '\n', '\r', '\t', '\0', '\f', '`', '?', '*', '\\', '<', '>', '|', '\"', ':'}; … … 99 103 public static final BooleanProperty PROP_NOTIFICATION = new BooleanProperty("autosave.notification", false); 100 104 101 protected static final class AutosaveLayerInfo { 102 private final OsmDataLayerlayer;105 protected static final class AutosaveLayerInfo<T extends AbstractModifiableLayer> { 106 private final T layer; 103 107 private String layerName; 104 108 private String layerFileName; 105 109 private final Deque<File> backupFiles = new LinkedList<>(); 106 110 107 AutosaveLayerInfo( OsmDataLayerlayer) {111 AutosaveLayerInfo(T layer) { 108 112 this.layer = layer; 109 113 } … … 112 116 private final DataSetListenerAdapter datasetAdapter = new DataSetListenerAdapter(this); 113 117 private final Set<DataSet> changedDatasets = new HashSet<>(); 114 private final List<AutosaveLayerInfo> layersInfo = new ArrayList<>(); 118 private final Set<NoteData> changedNoteData = new HashSet<>(); 119 private final List<AutosaveLayerInfo<?>> layersInfo = new ArrayList<>(); 115 120 private final Object layersLock = new Object(); 116 121 private final Deque<File> deletedLayers = new LinkedList<>(); … … 167 172 } 168 173 169 private void setLayerFileName(AutosaveLayerInfo layer) { 174 private void setLayerFileName(AutosaveLayerInfo<?> layer) { 170 175 int index = 0; 171 176 while (true) { 172 177 String filename = getFileName(layer.layer.getName(), index); 173 178 boolean foundTheSame = false; 174 for (AutosaveLayerInfo info: layersInfo) { 179 for (AutosaveLayerInfo<?> info: layersInfo) { 175 180 if (info != layer && filename.equals(info.layerFileName)) { 176 181 foundTheSame = true; … … 188 193 } 189 194 190 protected File getNewLayerFile(AutosaveLayerInfo layer, Date now, int startIndex) { 195 protected File getNewLayerFile(AutosaveLayerInfo<?> layer, Date now, int startIndex) { 191 196 int index = startIndex; 192 197 while (true) { 193 198 String filename = String.format("%1$s_%2$tY%2$tm%2$td_%2$tH%2$tM%2$tS%2$tL%3$s", 194 199 layer.layerFileName, now, index == 0 ? "" : ('_' + Integer.toString(index))); 195 File result = new File(autosaveDir, filename + '.' + Config.getPref().get("autosave.extension", "osm")); 200 File result = new File(autosaveDir, filename + '.' + 201 (layer.layer instanceof NoteLayer ? 202 Config.getPref().get("autosave.notes.extension", "osn") : 203 Config.getPref().get("autosave.extension", "osm"))); 196 204 try { 197 205 if (index > PROP_INDEX_LIMIT.get()) … … 220 228 } 221 229 222 private void savelayer(AutosaveLayerInfo info) { 230 private void savelayer(AutosaveLayerInfo<?> info) { 223 231 if (!info.layer.getName().equals(info.layerName)) { 224 232 setLayerFileName(info); 225 233 info.layerName = info.layer.getName(); 226 234 } 227 if (changedDatasets.remove(info.layer.data)) { 228 File file = getNewLayerFile(info, new Date(), 0); 229 if (file != null) { 230 info.backupFiles.add(file); 231 new OsmExporter().exportData(file, info.layer, true /* no backup with appended ~ */); 232 } 235 try { 236 if (info.layer instanceof OsmDataLayer) { 237 OsmDataLayer dataLayer = (OsmDataLayer) info.layer; 238 if (changedDatasets.remove(dataLayer.data)) { 239 File file = getNewLayerFile(info, new Date(), 0); 240 if (file != null) { 241 info.backupFiles.add(file); 242 new OsmExporter().exportData(file, info.layer, true /* no backup with appended ~ */); 243 } 244 } 245 } else if (info.layer instanceof NoteLayer) { 246 NoteLayer noteLayer = (NoteLayer) info.layer; 247 if (changedNoteData.remove(noteLayer.getNoteData())) { 248 File file = getNewLayerFile(info, new Date(), 0); 249 if (file != null) { 250 info.backupFiles.add(file); 251 new NoteExporter().exportData(file, info.layer); 252 } 253 } 254 } 255 } catch (IOException e) { 256 Logging.error(e); 233 257 } 234 258 while (info.backupFiles.size() > PROP_FILES_PER_LAYER.get()) { … … 244 268 synchronized (layersLock) { 245 269 try { 246 for (AutosaveLayerInfo info: layersInfo) { 270 for (AutosaveLayerInfo<?> info: layersInfo) { 247 271 savelayer(info); 248 272 } 249 273 changedDatasets.clear(); 274 changedNoteData.clear(); 250 275 if (PROP_NOTIFICATION.get() && !layersInfo.isEmpty()) { 251 276 GuiHelper.runInEDT(this::displayNotification); … … 273 298 synchronized (layersLock) { 274 299 layer.data.addDataSetListener(datasetAdapter); 275 layersInfo.add(new AutosaveLayerInfo(layer)); 300 layersInfo.add(new AutosaveLayerInfo<>(layer)); 301 } 302 } 303 304 private void registerNewlayer(NoteLayer layer) { 305 synchronized (layersLock) { 306 layer.getNoteData().addNoteDataUpdateListener(this); 307 layersInfo.add(new AutosaveLayerInfo<>(layer)); 276 308 } 277 309 } … … 281 313 if (e.getAddedLayer() instanceof OsmDataLayer) { 282 314 registerNewlayer((OsmDataLayer) e.getAddedLayer()); 315 } else if (e.getAddedLayer() instanceof NoteLayer) { 316 registerNewlayer((NoteLayer) e.getAddedLayer()); 283 317 } 284 318 } … … 290 324 OsmDataLayer osmLayer = (OsmDataLayer) e.getRemovedLayer(); 291 325 osmLayer.data.removeDataSetListener(datasetAdapter); 292 Iterator<AutosaveLayerInfo> it = layersInfo.iterator(); 293 while (it.hasNext()) { 294 AutosaveLayerInfo info = it.next(); 295 if (info.layer == osmLayer) { 296 297 savelayer(info); 298 File lastFile = info.backupFiles.pollLast(); 299 if (lastFile != null) { 300 moveToDeletedLayersFolder(lastFile); 301 } 302 for (File file: info.backupFiles) { 303 if (Utils.deleteFile(file)) { 304 Utils.deleteFile(getPidFile(file)); 305 } 306 } 307 308 it.remove(); 326 cleanupLayer(osmLayer); 327 } 328 } else if (e.getRemovedLayer() instanceof NoteLayer) { 329 synchronized (layersLock) { 330 NoteLayer noteLayer = (NoteLayer) e.getRemovedLayer(); 331 noteLayer.getNoteData().removeNoteDataUpdateListener(this); 332 cleanupLayer(noteLayer); 333 } 334 } 335 } 336 337 private void cleanupLayer(AbstractModifiableLayer removedLayer) { 338 Iterator<AutosaveLayerInfo<?>> it = layersInfo.iterator(); 339 while (it.hasNext()) { 340 AutosaveLayerInfo<?> info = it.next(); 341 if (info.layer == removedLayer) { 342 343 savelayer(info); 344 File lastFile = info.backupFiles.pollLast(); 345 if (lastFile != null) { 346 moveToDeletedLayersFolder(lastFile); 347 } 348 for (File file: info.backupFiles) { 349 if (Utils.deleteFile(file)) { 350 Utils.deleteFile(getPidFile(file)); 309 351 } 310 352 } 353 354 it.remove(); 311 355 } 312 356 } … … 316 360 public void processDatasetEvent(AbstractDatasetChangedEvent event) { 317 361 changedDatasets.add(event.getDataset()); 362 } 363 364 @Override 365 public void noteDataUpdated(NoteData data) { 366 changedNoteData.add(data); 367 } 368 369 @Override 370 public void selectedNoteChanged(NoteData noteData) { 371 // Do nothing 318 372 } 319 373 … … 329 383 public List<File> getUnsavedLayersFiles() { 330 384 List<File> result = new ArrayList<>(); 331 File[] files = autosaveDir.listFiles(OsmImporter.FILE_FILTER); 385 File[] files = autosaveDir.listFiles((FileFilter) 386 pathname -> OsmImporter.FILE_FILTER.accept(pathname) || NoteImporter.FILE_FILTER.accept(pathname)); 332 387 if (files == null) 333 388 return result;
Note:
See TracChangeset
for help on using the changeset viewer.