/* * Copyright (C) 2012 United States Government as represented by the Administrator of the * National Aeronautics and Space Administration. * All Rights Reserved. */ package org.jgrasstools.nww.utils.cache; import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import java.util.Formatter; import java.util.List; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import gov.nasa.worldwind.Configuration; import gov.nasa.worldwind.cache.BasicDataFileStore; import gov.nasa.worldwind.cache.FileStore; import gov.nasa.worldwindx.jgt.FileStoreDataSet; /** * The DataCacheViewer is a tool that allows the user to view and delete cached WorldWind files based on how old they * are. The utility shows the various directories in the cache root, how large they each are, when they were last used, * and how many files exist in them that are older than a day, week, month or year. It also allows the user to delete * all files older than a specified number of days, weeks, months or years. * * @author tag * @version $Id: DataCacheViewer.java 1171 2013-02-11 21:45:02Z dcollins $ */ @SuppressWarnings("unchecked") public class DataCacheViewer { protected JPanel panel; protected CacheTable table; protected JButton delBtn; protected JSpinner ageSpinner; protected JComboBox ageUnit; protected JLabel deleteSizeLabel; public DataCacheViewer( File cacheRoot ) { this.panel = new JPanel(new BorderLayout(5, 5)); JLabel rootLabel = new JLabel("Cache Root: " + cacheRoot.getPath()); rootLabel.setBorder(new EmptyBorder(10, 15, 10, 10)); this.panel.add(rootLabel, BorderLayout.NORTH); this.table = new CacheTable(); this.table.setDataSets(cacheRoot.getPath(), FileStoreDataSet.getDataSets(cacheRoot)); JScrollPane sp = new JScrollPane(table); this.panel.add(sp, BorderLayout.CENTER); JPanel pa = new JPanel(new BorderLayout(10, 10)); pa.add(new JLabel("Delete selected data older than"), BorderLayout.WEST); this.ageSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 10000, 1)); this.ageSpinner.setToolTipText("0 selects the entire dataset regardless of age"); JPanel pas = new JPanel(); pas.add(this.ageSpinner); pa.add(pas, BorderLayout.CENTER); this.ageUnit = new JComboBox(new String[]{"Hours", "Days", "Weeks", "Months", "Years"}); this.ageUnit.setSelectedItem("Months"); this.ageUnit.setEditable(false); pa.add(this.ageUnit, BorderLayout.EAST); JPanel pb = new JPanel(new BorderLayout(5, 10)); this.deleteSizeLabel = new JLabel("Total to delete: 0 MB"); pb.add(this.deleteSizeLabel, BorderLayout.WEST); this.delBtn = new JButton("Delete"); this.delBtn.setEnabled(false); JPanel pbb = new JPanel(); pbb.add(this.delBtn); pb.add(pbb, BorderLayout.CENTER); JPanel pc = new JPanel(new BorderLayout(5, 10)); pc.add(pa, BorderLayout.WEST); pc.add(pb, BorderLayout.EAST); JPanel ctlPanel = new JPanel(new BorderLayout(10, 10)); ctlPanel.setBorder(new EmptyBorder(10, 10, 20, 10)); ctlPanel.add(pc, BorderLayout.CENTER); this.panel.add(ctlPanel, BorderLayout.SOUTH); this.ageUnit.addItemListener(new ItemListener(){ public void itemStateChanged( ItemEvent e ) { update(); } }); this.ageSpinner.addChangeListener(new ChangeListener(){ public void stateChanged( ChangeEvent e ) { update(); } }); this.table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){ public void valueChanged( ListSelectionEvent e ) { update(); } }); this.delBtn.addActionListener(new ActionListener(){ public void actionPerformed( ActionEvent e ) { panel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); Thread t = new Thread(new Runnable(){ public void run() { try { List<FileStoreDataSet> dataSets = table.getSelectedDataSets(); int age = Integer.parseInt(ageSpinner.getValue().toString()); String unit = getUnitKey(); for( FileStoreDataSet ds : dataSets ) { ds.deleteOutOfScopeFiles(unit, age, false); if (ds.getSize() == 0) { table.deleteDataSet(ds); ds.delete(false); } } } finally { update(); SwingUtilities.invokeLater(new Runnable(){ public void run() { panel.setCursor(Cursor.getDefaultCursor()); } }); } } }); t.start(); } }); } public JPanel getPanel() { return panel; } protected void update() { java.util.List<FileStoreDataSet> dataSets = this.table.getSelectedDataSets(); int age = Integer.parseInt(this.ageSpinner.getValue().toString()); if (dataSets.size() == 0) { this.deleteSizeLabel.setText("Total to delete: 0 MB"); this.delBtn.setEnabled(false); return; } String unit = this.getUnitKey(); long totalSize = 0; for( FileStoreDataSet ds : dataSets ) { totalSize += ds.getOutOfScopeSize(unit, age); } Formatter formatter = new Formatter(); formatter.format("%5.1f", ((float) totalSize) / 1e6); this.deleteSizeLabel.setText("Total to delete: " + formatter.toString() + " MB"); this.delBtn.setEnabled(true); } protected String getUnitKey() { String unit = null; String unitString = (String) this.ageUnit.getSelectedItem(); if (unitString.equals("Hours")) unit = FileStoreDataSet.HOUR; else if (unitString.equals("Days")) unit = FileStoreDataSet.DAY; else if (unitString.equals("Weeks")) unit = FileStoreDataSet.WEEK; else if (unitString.equals("Months")) unit = FileStoreDataSet.MONTH; else if (unitString.equals("Years")) unit = FileStoreDataSet.YEAR; return unit; } static { if (Configuration.isMacOS()) { System.setProperty("com.apple.mrj.application.apple.menu.about.name", "World Wind Cache Cleaner"); } } public static void main( String[] args ) { SwingUtilities.invokeLater(new Runnable(){ public void run() { JFrame frame = new JFrame(); frame.setPreferredSize(new Dimension(800, 300)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); FileStore store = new BasicDataFileStore(); File cacheRoot = store.getWriteLocation(); DataCacheViewer viewerPanel = new DataCacheViewer(cacheRoot); frame.getContentPane().add(viewerPanel.panel, BorderLayout.CENTER); frame.pack(); // Center the application on the screen. Dimension prefSize = frame.getPreferredSize(); Dimension parentSize; java.awt.Point parentLocation = new java.awt.Point(0, 0); parentSize = Toolkit.getDefaultToolkit().getScreenSize(); int x = parentLocation.x + (parentSize.width - prefSize.width) / 2; int y = parentLocation.y + (parentSize.height - prefSize.height) / 2; frame.setLocation(x, y); frame.setVisible(true); } }); } }