source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/imagery/CacheContentsPanel.java@ 12620

Last change on this file since 12620 was 12620, checked in by Don-vip, 7 years ago

see #15182 - deprecate all Main logging methods and introduce suitable replacements in Logging for most of them

  • Property svn:eol-style set to native
File size: 5.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences.imagery;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.GridBagLayout;
7import java.awt.event.ActionEvent;
8import java.util.ArrayList;
9import java.util.Comparator;
10import java.util.List;
11import java.util.Map;
12import java.util.Map.Entry;
13import java.util.Set;
14import java.util.concurrent.ConcurrentHashMap;
15
16import javax.swing.AbstractAction;
17import javax.swing.JLabel;
18import javax.swing.JPanel;
19import javax.swing.JScrollPane;
20import javax.swing.JTable;
21import javax.swing.table.DefaultTableModel;
22import javax.swing.table.TableColumn;
23import javax.swing.table.TableModel;
24
25import org.apache.commons.jcs.access.CacheAccess;
26import org.apache.commons.jcs.engine.stats.behavior.ICacheStats;
27import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
28import org.apache.commons.jcs.engine.stats.behavior.IStats;
29import org.openstreetmap.josm.Main;
30import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
31import org.openstreetmap.josm.gui.layer.TMSLayer;
32import org.openstreetmap.josm.gui.layer.WMSLayer;
33import org.openstreetmap.josm.gui.layer.WMTSLayer;
34import org.openstreetmap.josm.gui.util.GuiHelper;
35import org.openstreetmap.josm.gui.widgets.ButtonColumn;
36import org.openstreetmap.josm.tools.GBC;
37import org.openstreetmap.josm.tools.Logging;
38import org.openstreetmap.josm.tools.Pair;
39
40/**
41 * Panel for cache content management.
42 *
43 * @author Wiktor Niesiobędzki
44 *
45 */
46public class CacheContentsPanel extends JPanel {
47
48 /**
49 * Creates cache content panel
50 */
51 public CacheContentsPanel() {
52 super(new GridBagLayout());
53 Main.worker.submit(() -> {
54 addToPanel(TMSLayer.getCache(), "TMS");
55 addToPanel(WMSLayer.getCache(), "WMS");
56 addToPanel(WMTSLayer.getCache(), "WMTS");
57 });
58 }
59
60 private void addToPanel(final CacheAccess<String, BufferedImageCacheEntry> cache, final String name) {
61 final Long cacheSize = getCacheSize(cache);
62 final TableModel tableModel = getTableModel(cache);
63
64 GuiHelper.runInEDT(() -> {
65 add(new JLabel(tr("{0} cache, total cache size: {1} bytes", name, cacheSize)),
66 GBC.eol().insets(5, 5, 0, 0));
67 add(new JScrollPane(getTableForCache(cache, tableModel)),
68 GBC.eol().fill(GBC.BOTH));
69 });
70 }
71
72 private static Long getCacheSize(CacheAccess<String, BufferedImageCacheEntry> cache) {
73 ICacheStats stats = cache.getStatistics();
74 for (IStats cacheStats: stats.getAuxiliaryCacheStats()) {
75 for (IStatElement<?> statElement: cacheStats.getStatElements()) {
76 if ("Data File Length".equals(statElement.getName())) {
77 Object val = statElement.getData();
78 if (val instanceof Long) {
79 return (Long) val;
80 }
81 }
82 }
83 }
84 return Long.valueOf(-1);
85 }
86
87 public static String[][] getCacheStats(CacheAccess<String, BufferedImageCacheEntry> cache) {
88 Set<String> keySet = cache.getCacheControl().getKeySet();
89 Map<String, int[]> temp = new ConcurrentHashMap<>(); // use int[] as a Object reference to int, gives better performance
90 for (String key: keySet) {
91 String[] keyParts = key.split(":", 2);
92 if (keyParts.length == 2) {
93 int[] counter = temp.get(keyParts[0]);
94 if (counter == null) {
95 temp.put(keyParts[0], new int[]{1});
96 } else {
97 counter[0]++;
98 }
99 } else {
100 Logging.warn("Could not parse the key: {0}. No colon found", key);
101 }
102 }
103
104 List<Pair<String, Integer>> sortedStats = new ArrayList<>();
105 for (Entry<String, int[]> e: temp.entrySet()) {
106 sortedStats.add(new Pair<>(e.getKey(), e.getValue()[0]));
107 }
108 sortedStats.sort(Comparator.comparing(o -> o.b, Comparator.reverseOrder()));
109 String[][] ret = new String[sortedStats.size()][3];
110 int index = 0;
111 for (Pair<String, Integer> e: sortedStats) {
112 ret[index] = new String[]{e.a, e.b.toString(), tr("Clear")};
113 index++;
114 }
115 return ret;
116 }
117
118 private static JTable getTableForCache(final CacheAccess<String, BufferedImageCacheEntry> cache, final TableModel tableModel) {
119 final JTable ret = new JTable(tableModel);
120
121 ButtonColumn buttonColumn = new ButtonColumn(
122 new AbstractAction() {
123 @Override
124 public void actionPerformed(ActionEvent e) {
125 int row = ret.convertRowIndexToModel(ret.getEditingRow());
126 tableModel.setValueAt("0", row, 1);
127 cache.remove(ret.getValueAt(row, 0).toString() + ':');
128 }
129 });
130 TableColumn tableColumn = ret.getColumnModel().getColumn(2);
131 tableColumn.setCellRenderer(buttonColumn);
132 tableColumn.setCellEditor(buttonColumn);
133 return ret;
134 }
135
136 private static DefaultTableModel getTableModel(final CacheAccess<String, BufferedImageCacheEntry> cache) {
137 return new DefaultTableModel(
138 getCacheStats(cache),
139 new String[]{tr("Cache name"), tr("Object Count"), tr("Clear")}) {
140 @Override
141 public boolean isCellEditable(int row, int column) {
142 return column == 2;
143 }
144 };
145 }
146}
Note: See TracBrowser for help on using the repository browser.