Changeset 8750 in josm for trunk/src/org


Ignore:
Timestamp:
2015-09-11T21:55:13+02:00 (5 years ago)
Author:
wiktorn
Message:

Improve resposiveness of preferences window by moving expensive IO operations out of EDT thread

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/preferences/imagery/CacheContentsPanel.java

    r8734 r8750  
    3535import javax.swing.table.TableCellRenderer;
    3636import javax.swing.table.TableColumn;
     37import javax.swing.table.TableModel;
    3738
    3839import org.apache.commons.jcs.access.CacheAccess;
     
    142143    public CacheContentsPanel() {
    143144        super(new GridBagLayout());
    144         CacheAccess<String, BufferedImageCacheEntry> cache = TMSLayer.getCache();
    145         add(
    146                 new JLabel(tr("TMS cache, total cache size: {0} bytes", getCacheSize(cache))),
    147                 GBC.eol().insets(5, 5, 0, 0)
    148                 );
    149         add(
    150                 new JScrollPane(getTableForCache(cache)),
    151                 GBC.eol().fill(GBC.BOTH));
    152 
    153         cache = WMSLayer.getCache();
    154         add(
    155                 new JLabel(tr("WMS cache, total cache size: {0} bytes", getCacheSize(cache))),
    156                 GBC.eol().insets(5, 5, 0, 0));
    157         add(
    158                 new JScrollPane(getTableForCache(cache)),
    159                 GBC.eol().fill(GBC.BOTH));
    160 
    161         cache = WMTSLayer.getCache();
    162         add(
    163                 new JLabel(tr("WMTS cache, total cache size: {0} bytes", getCacheSize(cache))),
    164                 GBC.eol().insets(5, 5, 0, 0));
    165 
    166         add(
    167                 new JScrollPane(getTableForCache(cache)),
    168                 GBC.eol().fill(GBC.BOTH));
    169 
     145        executor.submit(new Runnable() {
     146            @Override
     147            public void run() {
     148                addToPanel(TMSLayer.getCache(), "TMS");
     149                addToPanel(WMSLayer.getCache(), "WMS");
     150                addToPanel(WMTSLayer.getCache(), "WMTS");
     151            }
     152        });
    170153        executor.shutdown();
     154    }
     155
     156    private void addToPanel(final CacheAccess<String, BufferedImageCacheEntry> cache, final String name) {
     157        final Long cacheSize = getCacheSize(cache);
     158        final TableModel tableModel = getTableModel(cache);
     159
     160        GuiHelper.runInEDT(new Runnable() {
     161            @Override
     162            public void run() {
     163                add(
     164                        new JLabel(tr("{0} cache, total cache size: {1} bytes", name, cacheSize)),
     165                        GBC.eol().insets(5, 5, 0, 0));
     166
     167                add(
     168                        new JScrollPane(getTableForCache(cache, tableModel)),
     169                        GBC.eol().fill(GBC.BOTH));
     170            }
     171        });
    171172    }
    172173
     
    187188    }
    188189
    189     private static Map<String, Integer> getCacheStats(CacheAccess<String, BufferedImageCacheEntry> cache) {
     190    private static String[][] getCacheStats(CacheAccess<String, BufferedImageCacheEntry> cache) {
    190191        Set<String> keySet = cache.getCacheControl().getKeySet();
    191192        Map<String, int[]> temp = new ConcurrentHashMap<>(); // use int[] as a Object reference to int, gives better performance
     
    204205        }
    205206
    206         // convert to standard Map<String, Integer>
    207         Map<String, Integer> ret = new ConcurrentHashMap<>();
     207        List<Pair<String, Integer>> sortedStats = new ArrayList<>();
    208208        for (Entry<String, int[]> e: temp.entrySet()) {
    209             ret.put(e.getKey(), e.getValue()[0]);
     209            sortedStats.add(new Pair<>(e.getKey(), e.getValue()[0]));
     210        }
     211        Collections.sort(sortedStats, new Comparator<Pair<String, Integer>>() {
     212            @Override
     213            public int compare(Pair<String, Integer> o1, Pair<String, Integer> o2) {
     214                return -1 * o1.b.compareTo(o2.b);
     215            }
     216        });
     217        String[][] ret = new String[sortedStats.size()][3];
     218        int index = 0;
     219        for(Pair<String, Integer> e: sortedStats) {
     220            ret[index] = new String[]{e.a, e.b.toString(), tr("Clear")};
     221            index++;
    210222        }
    211223        return ret;
    212224    }
    213225
    214     private void backgroundUpdateModel(final CacheAccess<String, BufferedImageCacheEntry> cache, final DefaultTableModel tableModel) {
    215         // fetch statistics in background thread as this may take some time
    216         executor.submit(new Runnable() {
    217             @Override
    218             public void run() {
    219                 final List<Pair<String, Integer>> sortedStats = new ArrayList<>();
    220                 for (Entry<String, Integer> e: getCacheStats(cache).entrySet()) {
    221                     sortedStats.add(new Pair<>(e.getKey(), e.getValue()));
    222                 }
    223                 Collections.sort(sortedStats, new Comparator<Pair<String, Integer>>() {
    224                     @Override
    225                     public int compare(Pair<String, Integer> o1, Pair<String, Integer> o2) {
    226                         return -1 * o1.b.compareTo(o2.b);
    227                     }
    228                 });
    229                 // once statistics are ready, update the model in EDT thread
    230                 GuiHelper.runInEDT(new Runnable() {
    231                     @Override
    232                     public void run() {
    233                         tableModel.removeRow(0);
    234                         for (Pair<String, Integer> e: sortedStats) {
    235                             tableModel.addRow(new String[]{e.a, e.b.toString(), tr("Clear")});
    236                         }
    237                     }
    238                 });
    239             }
    240         });
    241     }
    242 
    243     private JTable getTableForCache(final CacheAccess<String, BufferedImageCacheEntry> cache) {
    244         final DefaultTableModel tableModel = new DefaultTableModel(
    245                 new String[][]{{tr("Loading data"), tr("Please wait"), ""}},
    246                 new String[]{"Cache name", "Object Count", "Clear"}) {
    247             @Override
    248             public boolean isCellEditable(int row, int column) {
    249                 return column == 2;
    250             }
    251         };
    252 
    253         backgroundUpdateModel(cache, tableModel);
    254 
     226    private JTable getTableForCache(final CacheAccess<String, BufferedImageCacheEntry> cache, final TableModel tableModel) {
    255227        final JTable ret = new JTable(tableModel);
    256228
     
    269241        return ret;
    270242    }
     243
     244    private DefaultTableModel getTableModel(final CacheAccess<String, BufferedImageCacheEntry> cache) {
     245        final DefaultTableModel tableModel = new DefaultTableModel(
     246                getCacheStats(cache),
     247                new String[]{"Cache name", "Object Count", "Clear"}) {
     248            @Override
     249            public boolean isCellEditable(int row, int column) {
     250                return column == 2;
     251            }
     252        };
     253        return tableModel;
     254    }
    271255}
Note: See TracChangeset for help on using the changeset viewer.