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 | } |