Changeset 9412 in josm


Ignore:
Timestamp:
2016-01-11T18:49:59+01:00 (9 years ago)
Author:
simon04
Message:

see #8824 - Allow to cancel updating of imagery entries in the preferences

Location:
trunk/src/org/openstreetmap/josm
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java

    r8870 r9412  
    1717import org.openstreetmap.josm.Main;
    1818import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
     19import org.openstreetmap.josm.gui.PleaseWaitRunnable;
    1920import org.openstreetmap.josm.io.CachedFile;
    2021import org.openstreetmap.josm.io.OfflineAccessException;
    2122import org.openstreetmap.josm.io.OnlineResource;
    2223import org.openstreetmap.josm.io.imagery.ImageryReader;
     24import org.openstreetmap.josm.tools.Utils;
    2325import org.xml.sax.SAXException;
     26
     27import static org.openstreetmap.josm.tools.I18n.tr;
    2428
    2529/**
     
    7377            Collections.sort(layers);
    7478        }
    75         loadDefaults(false);
     79        loadDefaults(false, true);
    7680    }
    7781
     
    8488     *
    8589     * @param clearCache if true, clear the cache and start a fresh download.
    86      */
    87     public void loadDefaults(boolean clearCache) {
    88         defaultLayers.clear();
    89         defaultLayerIds.clear();
    90         for (String source : getImageryLayersSites()) {
     90     * @param quiet whether not the loading should be performed using a {@link PleaseWaitRunnable} in the background
     91     */
     92    public void loadDefaults(boolean clearCache, boolean quiet) {
     93        final DefaultEntryLoader loader = new DefaultEntryLoader(clearCache);
     94        if (quiet) {
     95            loader.realRun();
     96            loader.finish();
     97        } else {
     98            Main.worker.execute(new DefaultEntryLoader(clearCache));
     99        }
     100    }
     101
     102    /**
     103     * Loader/updater of the available imagery entries
     104     */
     105    class DefaultEntryLoader extends PleaseWaitRunnable {
     106
     107        private final boolean clearCache;
     108        private final List<ImageryInfo> newLayers = new ArrayList<>();
     109        private transient ImageryReader reader;
     110        private transient boolean canceled;
     111
     112        DefaultEntryLoader(boolean clearCache) {
     113            super(tr("Update default entries"));
     114            this.clearCache = clearCache;
     115        }
     116
     117        @Override
     118        protected void cancel() {
     119            canceled = true;
     120            Utils.close(reader);
     121        }
     122
     123        @Override
     124        protected void realRun() {
     125            for (String source : getImageryLayersSites()) {
     126                if (canceled) {
     127                    return;
     128                }
     129                loadSource(source);
     130            }
     131        }
     132
     133        protected void loadSource(String source) {
    91134            boolean online = true;
    92135            try {
     
    100143            }
    101144            try {
    102                 ImageryReader reader = new ImageryReader(source);
     145                reader = new ImageryReader(source);
    103146                Collection<ImageryInfo> result = reader.parse();
    104                 defaultLayers.addAll(result);
     147                newLayers.addAll(result);
    105148            } catch (IOException ex) {
    106149                Main.error(ex, false);
     
    109152            }
    110153        }
    111         while (defaultLayers.remove(null)) {
    112             // Do nothing
    113         }
    114         Collections.sort(defaultLayers);
    115         buildIdMap(defaultLayers, defaultLayerIds);
    116         updateEntriesFromDefaults();
    117         buildIdMap(layers, layerIds);
     154
     155        @Override
     156        protected void finish() {
     157            defaultLayers.clear();
     158            defaultLayers.addAll(newLayers);
     159            defaultLayerIds.clear();
     160            Collections.sort(defaultLayers);
     161            buildIdMap(defaultLayers, defaultLayerIds);
     162            updateEntriesFromDefaults();
     163            buildIdMap(layers, layerIds);
     164        }
    118165    }
    119166
  • trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java

    r9231 r9412  
    636636             */
    637637            ReloadAction() {
    638                 putValue(SHORT_DESCRIPTION, tr("reload defaults"));
     638                putValue(SHORT_DESCRIPTION, tr("Update default entries"));
    639639                putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
    640640            }
     
    642642            @Override
    643643            public void actionPerformed(ActionEvent evt) {
    644                 layerInfo.loadDefaults(true);
     644                layerInfo.loadDefaults(true, false);
    645645                defaultModel.fireTableDataChanged();
    646646                defaultTable.getSelectionModel().clearSelection();
  • trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java

    r9406 r9412  
    22package org.openstreetmap.josm.io.imagery;
    33
     4import java.io.BufferedReader;
     5import java.io.Closeable;
    46import java.io.IOException;
    5 import java.io.InputStream;
    67import java.util.ArrayList;
    78import java.util.Arrays;
     
    2829import org.xml.sax.helpers.DefaultHandler;
    2930
    30 public class ImageryReader {
     31public class ImageryReader implements Closeable {
    3132
    3233    private final String source;
     34    private transient CachedFile cachedFile;
    3335
    3436    private enum State {
     
    5355        Parser parser = new Parser();
    5456        try {
    55             try (InputStream in = new CachedFile(source)
    56                     .setMaxAge(1*CachedFile.DAYS)
     57            cachedFile = new CachedFile(source);
     58            try (BufferedReader in = cachedFile
     59                    .setMaxAge(CachedFile.DAYS)
    5760                    .setCachingStrategy(CachedFile.CachingStrategy.IfModifiedSince)
    58                     .getInputStream()) {
    59                 InputSource is = new InputSource(UTFInputStreamReader.create(in));
     61                    .getContentReader()) {
     62                InputSource is = new InputSource(in);
    6063                Utils.parseSafeSAX(is, parser);
    6164                return parser.entries;
     
    355358        }
    356359    }
     360
     361    @Override
     362    public void close() throws IOException {
     363        Utils.close(cachedFile);
     364    }
    357365}
Note: See TracChangeset for help on using the changeset viewer.