Revision 45716 trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/java/org/gvsig/app/extension/dispose/DisposableManagementExtension.java
DisposableManagementExtension.java | ||
---|---|---|
34 | 34 |
import java.util.Collections; |
35 | 35 |
import java.util.List; |
36 | 36 |
import java.util.Set; |
37 |
|
|
38 | 37 |
import javax.swing.JScrollPane; |
39 | 38 |
import javax.swing.JTable; |
40 | 39 |
import javax.swing.JTextPane; |
... | ... | |
44 | 43 |
import javax.swing.table.AbstractTableModel; |
45 | 44 |
import javax.swing.table.DefaultTableColumnModel; |
46 | 45 |
import javax.swing.table.TableColumn; |
47 |
import javax.swing.table.TableColumnModel; |
|
48 |
|
|
49 | 46 |
import org.gvsig.andami.plugins.Extension; |
50 | 47 |
import org.gvsig.tools.ToolsLocator; |
51 | 48 |
import org.gvsig.tools.dispose.Disposable; |
... | ... | |
55 | 52 |
import org.gvsig.tools.swing.api.ToolsSwingLocator; |
56 | 53 |
import org.gvsig.tools.swing.api.ToolsSwingUtils; |
57 | 54 |
import org.gvsig.tools.swing.api.windowmanager.WindowManager; |
55 |
import org.gvsig.tools.util.LabeledValue; |
|
58 | 56 |
import org.slf4j.Logger; |
59 | 57 |
import org.slf4j.LoggerFactory; |
60 | 58 |
|
... | ... | |
148 | 146 |
this.disposablesTable.setColumnModel(columnModel); |
149 | 147 |
|
150 | 148 |
this.disposablesTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
151 |
|
|
149 |
|
|
152 | 150 |
this.infoTextArea = new JTextPane(); |
153 | 151 |
this.infoTextArea.setContentType("text/html"); |
154 |
|
|
152 |
|
|
155 | 153 |
JScrollPane listScroller = new JScrollPane(this.disposablesTable); |
156 | 154 |
JScrollPane infoScroller = new JScrollPane(this.infoTextArea); |
157 | 155 |
this.splitPanel.setLeftComponent(listScroller); |
... | ... | |
161 | 159 |
// dim.height = dim.height / 2; |
162 | 160 |
// this.disposablesTable.setPreferredSize(dim); |
163 | 161 |
// this.splitPanel.invalidate(); |
164 |
|
|
165 | 162 |
this.closeButton.addActionListener((ActionEvent arg0) -> { |
166 | 163 |
closeWindow(); |
167 | 164 |
}); |
... | ... | |
189 | 186 |
}); |
190 | 187 |
this.refreshButton.setEnabled(true); |
191 | 188 |
} |
192 |
|
|
189 |
|
|
193 | 190 |
private TableColumn createTableColumn(int col, int size, String name) { |
194 | 191 |
TableColumn tableColumn = new TableColumn(col, size); |
195 | 192 |
tableColumn.setHeaderValue(name); |
... | ... | |
203 | 200 |
private void ListItemSelected() { |
204 | 201 |
DisposablesTableModel model = (DisposablesTableModel) this.disposablesTable.getModel(); |
205 | 202 |
DisposableInfo info = model.get(this.disposablesTable.getSelectedRow()); |
206 |
if( info==null ) {
|
|
203 |
if (info == null) {
|
|
207 | 204 |
this.infoTextArea.setText(""); |
208 | 205 |
} else { |
209 | 206 |
this.infoTextArea.setText(toHTML(info)); |
... | ... | |
219 | 216 |
this.messageLabel.setText("Pending " + disposables.size()); |
220 | 217 |
this.infoTextArea.setText(""); |
221 | 218 |
} |
222 |
|
|
219 |
|
|
223 | 220 |
private void updateMemoryUsage() { |
224 | 221 |
Runtime rt = Runtime.getRuntime(); |
225 |
this.lblTotalMemory.setText(String.valueOf(rt.totalMemory()/1024));
|
|
226 |
this.lblMaxMemory.setText(String.valueOf(rt.maxMemory()/1024));
|
|
227 |
this.lblFreeMemory.setText(String.valueOf(rt.freeMemory()/1024));
|
|
222 |
this.lblTotalMemory.setText(String.valueOf(rt.totalMemory() / 1024));
|
|
223 |
this.lblMaxMemory.setText(String.valueOf(rt.maxMemory() / 1024));
|
|
224 |
this.lblFreeMemory.setText(String.valueOf(rt.freeMemory() / 1024));
|
|
228 | 225 |
this.lblActiveThreads.setText(String.valueOf(Thread.activeCount())); |
229 |
|
|
226 |
|
|
230 | 227 |
int objectPendingFinalizationCount = -1; |
231 | 228 |
try { |
232 |
MemoryMXBean memBean = ManagementFactory.getMemoryMXBean() ;
|
|
229 |
MemoryMXBean memBean = ManagementFactory.getMemoryMXBean(); |
|
233 | 230 |
objectPendingFinalizationCount = memBean.getObjectPendingFinalizationCount(); |
234 |
} catch(ThreadDeath th) { |
|
235 |
|
|
231 |
} catch (ThreadDeath th) {
|
|
232 |
|
|
236 | 233 |
} |
237 | 234 |
this.lblObjectPendingFinalization.setText(String.valueOf(objectPendingFinalizationCount)); |
238 | 235 |
} |
239 | 236 |
|
240 | 237 |
private class DisposablesTableModel extends AbstractTableModel { |
241 | 238 |
|
242 |
private List<DisposableInfo> disposables;
|
|
239 |
private List<DisposableInfo> disposables; |
|
243 | 240 |
private final String[] columnNames; |
244 | 241 |
private final Class[] columnClass; |
245 |
|
|
242 |
|
|
246 | 243 |
public DisposablesTableModel() { |
247 | 244 |
this(Collections.EMPTY_LIST); |
248 | 245 |
} |
249 |
|
|
246 |
|
|
250 | 247 |
public DisposablesTableModel(List<DisposableInfo> disposables) { |
251 | 248 |
this.disposables = disposables; |
252 |
this.columnNames = new String[] {"Refs.", "Class", "Code", "Full class", "To str."};
|
|
253 |
this.columnClass = new Class[] {Integer.class, String.class, Integer.class, String.class, String.class};
|
|
249 |
this.columnNames = new String[]{"Refs.", "Class", "Code", "Full class", "To str."}; |
|
250 |
this.columnClass = new Class[]{Integer.class, String.class, Integer.class, String.class, String.class}; |
|
254 | 251 |
} |
255 |
|
|
252 |
|
|
256 | 253 |
public DisposableInfo get(int rowIndex) { |
257 | 254 |
try { |
258 | 255 |
return this.disposables.get(rowIndex); |
259 |
} catch(Throwable th) { |
|
256 |
} catch (Throwable th) {
|
|
260 | 257 |
return null; |
261 | 258 |
} |
262 | 259 |
} |
263 |
|
|
260 |
|
|
264 | 261 |
@Override |
265 | 262 |
public int getRowCount() { |
266 | 263 |
return this.disposables.size(); |
... | ... | |
284 | 281 |
@Override |
285 | 282 |
public Object getValueAt(int rowIndex, int columnIndex) { |
286 | 283 |
DisposableInfo info = this.disposables.get(rowIndex); |
287 |
switch(columnIndex) { |
|
284 |
switch (columnIndex) {
|
|
288 | 285 |
case 0: |
289 | 286 |
return info.getReferencesCount(); |
290 | 287 |
case 1: |
291 | 288 |
try { |
292 |
return info.getDisposable().getClass().getSimpleName();
|
|
293 |
} catch(Throwable th) {
|
|
294 |
return "(unknown)";
|
|
295 |
}
|
|
289 |
return info.getDisposable().getClass().getSimpleName(); |
|
290 |
} catch (Throwable th) {
|
|
291 |
return "(unknown)"; |
|
292 |
} |
|
296 | 293 |
case 2: |
297 | 294 |
try { |
298 |
return info.getDisposable().hashCode();
|
|
299 |
} catch(Throwable th) {
|
|
300 |
return -1;
|
|
301 |
}
|
|
295 |
return info.getDisposable().hashCode(); |
|
296 |
} catch (Throwable th) {
|
|
297 |
return -1; |
|
298 |
} |
|
302 | 299 |
case 3: |
303 | 300 |
try { |
304 |
return info.getDisposable().getClass().getName();
|
|
305 |
} catch(Throwable th) {
|
|
306 |
return "(unknown)";
|
|
307 |
}
|
|
301 |
return info.getDisposable().getClass().getName(); |
|
302 |
} catch (Throwable th) {
|
|
303 |
return "(unknown)"; |
|
304 |
} |
|
308 | 305 |
case 4: |
309 | 306 |
try { |
310 |
return info.getDisposable().toString();
|
|
311 |
} catch(Throwable th) {
|
|
312 |
return "(unknown)";
|
|
313 |
}
|
|
307 |
return info.getDisposable().toString(); |
|
308 |
} catch (Throwable th) {
|
|
309 |
return "(unknown)"; |
|
310 |
} |
|
314 | 311 |
} |
315 | 312 |
return null; |
316 | 313 |
} |
317 | 314 |
} |
318 | 315 |
|
319 |
public String toHTML(DisposableInfo disposableInfo) {
|
|
316 |
public String toHTML(DisposableInfo disposableInfo) { |
|
320 | 317 |
StringBuilder buffer = new StringBuilder(); |
321 | 318 |
Disposable disposable = disposableInfo.getDisposable(); |
322 | 319 |
|
... | ... | |
325 | 322 |
buffer.append("<b>References</b>: ").append(disposableInfo.getReferencesCount()).append("<br>\n"); |
326 | 323 |
buffer.append("<b>toString</b>: ").append(disposable.toString()).append("<br>\n"); |
327 | 324 |
|
328 |
buffer.append("<b>First binded from (stack)</b>:<br>\n"); |
|
329 |
StackTraceElement[] stackFirstTrace = null; |
|
330 |
StackTraceElement[] stackLastTrace = null; |
|
331 | 325 |
try { |
332 |
stackFirstTrace = disposableInfo |
|
333 |
.getFirstBindDisposableStackTrace(); |
|
334 |
for (StackTraceElement stackTrace1 : stackFirstTrace) { |
|
335 |
buffer.append(" ").append(stackTrace1.toString().replaceAll("[<]", "<").replace("[>]", ">")).append("<br>\n"); |
|
336 |
} |
|
337 |
stackLastTrace = disposableInfo |
|
338 |
.getLastBindDisposableStackTrace(); |
|
339 |
if(stackLastTrace != stackFirstTrace){ |
|
340 |
buffer.append("<b>Last binded from (stack)</b>:<br>\n"); |
|
341 |
for (StackTraceElement stackTrace1 : stackLastTrace) { |
|
326 |
List<LabeledValue<StackTraceElement[]>> allStackTraces = disposableInfo.getAllStackTrace(); |
|
327 |
for (int i = 0; i < allStackTraces.size(); i++) { |
|
328 |
LabeledValue<StackTraceElement[]> trace = allStackTraces.get(i); |
|
329 |
buffer.append("<b>#"); |
|
330 |
buffer.append(i + 1); |
|
331 |
buffer.append(" "); |
|
332 |
buffer.append(trace.getLabel()); |
|
333 |
buffer.append(" from (stack)</b>:<br>\n"); |
|
334 |
for (StackTraceElement stackTrace1 : trace.getValue()) { |
|
342 | 335 |
buffer.append(" ").append(stackTrace1.toString().replaceAll("[<]", "<").replace("[>]", ">")).append("<br>\n"); |
343 | 336 |
} |
344 | 337 |
} |
338 |
|
|
345 | 339 |
} catch (Exception ex) { |
346 | 340 |
buffer.append("<br>\n<br>\nError showing stack.<br>\n").append(ex.getMessage()); |
347 | 341 |
} |
Also available in: Unified diff