| 1 | /* |
| 2 | * $Id: LogManagerPanel.java,v 1.2 2005/12/01 06:10:00 hastings Exp $ |
| 3 | * |
| 4 | * (c) Copyright, Moebius Solutions, Inc., 2004 |
| 5 | * |
| 6 | * All Rights Reserved |
| 7 | * |
| 8 | * This material may be reproduced by or for the U. S. Government |
| 9 | * pursuant to the copyright license under the clause at |
| 10 | * DFARS 252.227-7014 (OCT 2001). |
| 11 | */ |
| 12 | |
| 13 | package com.moesol.ui.log.manager; |
| 14 | |
| 15 | import java.awt.Dimension; |
| 16 | import java.awt.event.ActionListener; |
| 17 | import java.beans.EventHandler; |
| 18 | import java.util.Enumeration; |
| 19 | import java.util.Vector; |
| 20 | import java.util.logging.Handler; |
| 21 | import java.util.logging.Level; |
| 22 | import java.util.logging.LogManager; |
| 23 | import java.util.logging.Logger; |
| 24 | |
| 25 | import javax.swing.BoxLayout; |
| 26 | import javax.swing.DefaultCellEditor; |
| 27 | import javax.swing.JButton; |
| 28 | import javax.swing.JComboBox; |
| 29 | import javax.swing.JPanel; |
| 30 | import javax.swing.JScrollPane; |
| 31 | import javax.swing.JTable; |
| 32 | import javax.swing.table.AbstractTableModel; |
| 33 | import javax.swing.table.TableColumn; |
| 34 | |
| 35 | /** |
| 36 | * @author robert |
| 37 | */ |
| 38 | public class LogManagerPanel extends JPanel { |
| 39 | private static final long serialVersionUID = 6532034117695529289L; |
| 40 | private static final int NAME_COLUMN = 0; |
| 41 | private static final int LEVEL_COLUMN = 1; |
| 42 | private static final int HANDLER_LEVEL_COLUMN = 2; |
| 43 | |
| 44 | private LoggerTableModel m_table_model = new LoggerTableModel(); |
| 45 | private JTable m_table = new JTable(); |
| 46 | private JButton m_reload = new JButton("Reload"); |
| 47 | |
| 48 | /** Create the UI, calls build */ |
| 49 | public LogManagerPanel() { |
| 50 | setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); |
| 51 | build(); |
| 52 | } |
| 53 | |
| 54 | private static class LoggerTableModel extends AbstractTableModel { |
| 55 | private static final long serialVersionUID = 2127550014380299934L; |
| 56 | |
| 57 | /** |
| 58 | * @return 3 |
| 59 | * @see javax.swing.table.TableModel#getColumnCount() |
| 60 | */ |
| 61 | public int getColumnCount() { |
| 62 | return 3; |
| 63 | } |
| 64 | |
| 65 | /** |
| 66 | * @return number of rows |
| 67 | * @see javax.swing.table.TableModel#getRowCount() |
| 68 | */ |
| 69 | public int getRowCount() { |
| 70 | return getLoggers().size(); |
| 71 | } |
| 72 | |
| 73 | |
| 74 | /** |
| 75 | * |
| 76 | * @param row |
| 77 | * @param col |
| 78 | * @return Object value at {@code row, col}. |
| 79 | */ |
| 80 | public Object getValueAt(int row, int col) { |
| 81 | switch (col) { |
| 82 | case NAME_COLUMN: return getLoggerName(row); |
| 83 | case LEVEL_COLUMN: return getLoggerLevel(row); |
| 84 | case HANDLER_LEVEL_COLUMN: return getHandlerLevel(row); |
| 85 | default: assert (false); return null; |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | /** |
| 90 | * @param rowIndex |
| 91 | * @param columnIndex |
| 92 | * @return true if the cell is editable. |
| 93 | */ |
| 94 | public boolean isCellEditable(int rowIndex, int columnIndex) { |
| 95 | switch (columnIndex) { |
| 96 | case NAME_COLUMN: return false; |
| 97 | case LEVEL_COLUMN: return true; |
| 98 | case HANDLER_LEVEL_COLUMN: return true; |
| 99 | default: assert(false); return false; |
| 100 | } |
| 101 | } |
| 102 | |
| 103 | /** |
| 104 | * @param aValue |
| 105 | * @param rowIndex |
| 106 | * @param columnIndex |
| 107 | */ |
| 108 | public void setValueAt(Object aValue, int rowIndex, int columnIndex) { |
| 109 | switch (columnIndex) { |
| 110 | case LEVEL_COLUMN: |
| 111 | setLoggerLevel(aValue, rowIndex); |
| 112 | break; |
| 113 | case HANDLER_LEVEL_COLUMN: |
| 114 | setHandlerLevel(aValue, rowIndex); |
| 115 | break; |
| 116 | default: |
| 117 | throw new AssertionError("bad column index"); |
| 118 | } |
| 119 | } |
| 120 | |
| 121 | private void setLoggerLevel(Object aValue, int rowIndex) { |
| 122 | Level level = (Level)aValue; |
| 123 | Logger target = getLoggerAt(rowIndex); |
| 124 | |
| 125 | target.setLevel(level); |
| 126 | } |
| 127 | |
| 128 | private void setHandlerLevel(Object aValue, int rowIndex) { |
| 129 | Level level = (Level)aValue; |
| 130 | Logger target = getLoggerAt(rowIndex); |
| 131 | |
| 132 | Handler[] h = target.getHandlers(); |
| 133 | for (int i = 0; i < h.length; i++) { |
| 134 | h[i].setLevel(level); |
| 135 | } |
| 136 | } |
| 137 | /** |
| 138 | * @param column |
| 139 | * @return name of {@code column}. |
| 140 | */ |
| 141 | public String getColumnName(int column) { |
| 142 | switch (column) { |
| 143 | case NAME_COLUMN: return "Logger"; |
| 144 | case LEVEL_COLUMN: return "Level"; |
| 145 | case HANDLER_LEVEL_COLUMN: return "Handler"; |
| 146 | default: assert(false); return null; |
| 147 | } |
| 148 | } |
| 149 | private Object getLoggerName(int row) { |
| 150 | String name = (String)getLoggers().get(row); |
| 151 | if (name.equals("")) { |
| 152 | return "<annonymous>"; |
| 153 | } |
| 154 | return name; |
| 155 | } |
| 156 | private Object getLoggerLevel(int row) { |
| 157 | return getLoggerAt(row).getLevel(); |
| 158 | } |
| 159 | private Object getHandlerLevel(int row) { |
| 160 | Handler[] h = getLoggerAt(row).getHandlers(); |
| 161 | if (h.length == 0) { |
| 162 | return null; |
| 163 | } |
| 164 | return h[0].getLevel(); |
| 165 | } |
| 166 | |
| 167 | private Logger getLoggerAt(int row) { |
| 168 | return Logger.getLogger((String)getLoggers().get(row)); |
| 169 | } |
| 170 | |
| 171 | private Vector getLoggers() { |
| 172 | if (m_loggers_cache == null) { |
| 173 | buildLoggersCache(); |
| 174 | } |
| 175 | return m_loggers_cache; |
| 176 | } |
| 177 | private void buildLoggersCache() { |
| 178 | m_loggers_cache = new Vector(); |
| 179 | Enumeration e = LogManager.getLogManager().getLoggerNames(); |
| 180 | while (e.hasMoreElements()) { |
| 181 | m_loggers_cache.add(e.nextElement()); |
| 182 | } |
| 183 | } |
| 184 | |
| 185 | public void reload() { |
| 186 | buildLoggersCache(); |
| 187 | fireTableDataChanged(); |
| 188 | } |
| 189 | |
| 190 | private Vector m_loggers_cache; |
| 191 | } |
| 192 | |
| 193 | /** Create the UI */ |
| 194 | public void build() { |
| 195 | TableSorter sorter = new TableSorter(m_table_model); |
| 196 | m_table.setModel(sorter); |
| 197 | sorter.setTableHeader(m_table.getTableHeader()); |
| 198 | |
| 199 | JComboBox comboBox = new JComboBox(); |
| 200 | comboBox.addItem(Level.ALL); |
| 201 | comboBox.addItem(Level.SEVERE); |
| 202 | comboBox.addItem(Level.WARNING); |
| 203 | comboBox.addItem(Level.INFO); |
| 204 | comboBox.addItem(Level.CONFIG); |
| 205 | comboBox.addItem(Level.FINE); |
| 206 | comboBox.addItem(Level.FINER); |
| 207 | comboBox.addItem(Level.FINEST); |
| 208 | comboBox.addItem(Level.OFF); |
| 209 | comboBox.addItem(null); |
| 210 | |
| 211 | TableColumn level_colum; |
| 212 | level_colum = m_table.getColumnModel().getColumn(LEVEL_COLUMN); |
| 213 | level_colum.setCellEditor(new DefaultCellEditor(comboBox)); |
| 214 | level_colum = m_table.getColumnModel().getColumn(HANDLER_LEVEL_COLUMN); |
| 215 | level_colum.setCellEditor(new DefaultCellEditor(comboBox)); |
| 216 | |
| 217 | JScrollPane scrollPane = new JScrollPane(m_table); |
| 218 | m_table.setPreferredScrollableViewportSize(new Dimension(500, 70)); |
| 219 | add(scrollPane); |
| 220 | add(m_reload); |
| 221 | m_reload.addActionListener( |
| 222 | (ActionListener)EventHandler.create(ActionListener.class, this, "reload")); |
| 223 | } |
| 224 | public void reload() { |
| 225 | m_table_model.reload(); |
| 226 | } |
| 227 | } |