1 package net.sf.panoptes.view.swing.configurator; 2 3 import java.awt.Component ; 4 import java.awt.event.ActionEvent ; 5 import java.awt.event.ActionListener ; 6 import java.beans.BeanInfo ; 7 import java.beans.Introspector ; 8 import java.beans.MethodDescriptor ; 9 import java.beans.PropertyDescriptor ; 10 import java.lang.reflect.Method ; 11 import java.util.ArrayList ; 12 import java.util.Map ; 13 14 import javax.management.MBeanOperationInfo ; 15 import javax.swing.DefaultCellEditor ; 16 import javax.swing.JButton ; 17 import javax.swing.JCheckBox ; 18 import javax.swing.JComponent ; 19 import javax.swing.JFrame ; 20 import javax.swing.JLabel ; 21 import javax.swing.JPanel ; 22 import javax.swing.JScrollPane ; 23 import javax.swing.JTabbedPane ; 24 import javax.swing.JTable ; 25 import javax.swing.UIManager ; 26 import javax.swing.table.AbstractTableModel ; 27 import javax.swing.table.TableCellRenderer ; 28 import javax.swing.table.TableColumn ; 29 30 import net.sf.panoptes.component.jmx.model.MBeanLinkNode; 31 import net.sf.panoptes.model.node.Node; 32 import net.sf.panoptes.swing.DefaultFormBuilder; 33 import net.sf.panoptes.swing.Operation; 34 import net.sf.panoptes.view.swing.MainWindowSwing; 35 import net.sf.panoptes.view.swing.editors.MethodInvocationDialog; 36 import net.sf.panoptes.view.swing.tables.ContextTableModel; 37 import net.sf.panoptes.view.swing.tables.DefaultNodeTableCellRenderer; 38 39 import org.apache.commons.beanutils.PropertyUtils; 40 import org.apache.commons.logging.Log; 41 import org.apache.commons.logging.LogFactory; 42 43 import com.jgoodies.forms.layout.FormLayout; 44 46 55 public class JavaBeanInspector implements SwingConfigurator { 56 57 private Object bean = null; 58 private BeanInfo beanInfo; 59 60 JTable opTable; 61 JTable attTable; 62 JPanel panel = null; 63 private ContextTableModel physicalContextModel; 64 private JLabel objectNameLabel = new JLabel (); 65 private JLabel mbeanClassLabel = new JLabel (); 66 67 private ArrayList contextKeys = new ArrayList (); 68 69 private Log log = LogFactory.getLog(getClass()); 70 private JFrame frame; 71 72 public JComponent build(ConfiguratorFrame frame, Map attributes) { 73 JTabbedPane tabs = new JTabbedPane (); 74 tabs.addTab("Inspection", createAttOpPanel()); 75 tabs.addTab("Context", createContextPanel()); 76 return tabs; 77 78 } 79 80 private JPanel createContextPanel() { 81 82 DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout("pref:grow", "")); 83 builder.setDefaultDialogBorder(); 84 builder.appendSeparator("Context information"); 85 86 physicalContextModel = new ContextTableModel(); 87 JTable contextTable = new JTable (physicalContextModel); 88 89 contextTable.getColumnModel().getColumn(1).setCellRenderer( 90 new DefaultNodeTableCellRenderer()); 91 contextTable.sizeColumnsToFit(1); 92 builder.append(new JScrollPane (contextTable)); 93 return builder.getPanel(); 94 95 } 96 97 private JPanel createAttOpPanel() { 98 FormLayout layout = 99 new FormLayout( 100 "left:max(40dlu;pref), 3dlu, left:10dlu:grow", 101 "pref, pref, pref, 20dlu, 80dlu:grow, pref, 80dlu:grow"); 102 DefaultFormBuilder builder = new DefaultFormBuilder(layout); 103 builder.setDefaultDialogBorder(); 104 105 builder.appendSeparator("MBean Information"); 106 builder.append("ObjectName:", objectNameLabel); 107 builder.append("MBean Class:", mbeanClassLabel); 108 109 TableColumn tc; 110 111 builder.appendSeparator("Attributes"); 112 attTable = new JTable (new AbstractTableModel () { 113 public int getColumnCount() { 114 return 3; 115 } 116 117 public int getRowCount() { 118 if (bean == null) 119 return 0; 120 else 121 return beanInfo.getPropertyDescriptors().length; 122 } 123 124 public String getColumnName(int columnIndex) { 125 switch (columnIndex) { 126 case 0 : 127 return "Name"; 128 case 1 : 129 return "Value"; 130 case 2 : 131 return "Type"; 132 default : 133 return "Uknown column"; 134 } 135 136 } 137 138 public Object getValueAt(int rowIndex, int columnIndex) { 139 PropertyDescriptor property = beanInfo.getPropertyDescriptors()[rowIndex]; 140 switch (columnIndex) { 141 case 0 : 142 return property.getName(); 143 case 1 : 144 Object val; 145 try { 146 val = PropertyUtils.getProperty(bean, property.getName()); 147 } catch (Exception e) { 148 log.error("Unable to get property", e); 149 return "Unable to get value"; 150 } 151 return val == null ? "null" : val.toString(); 152 case 2 : 153 return ""; 154 default : 155 return "Unknown column"; 156 } 157 } 158 }); 159 160 builder.append(new JScrollPane (attTable), 3); 161 builder.nextLine(); 162 163 builder.appendSeparator("Operations"); 164 opTable = new JTable (new AbstractTableModel () { 165 public int getColumnCount() { 166 return 4; 167 } 168 169 public boolean isCellEditable(int rowIndex, int columnIndex) { 170 return columnIndex == 3; 171 } 172 173 public int getRowCount() { 174 if (bean == null) 175 return 0; 176 else 177 return beanInfo.getMethodDescriptors().length; 178 } 179 180 public String getColumnName(int columnIndex) { 181 switch (columnIndex) { 182 case 0 : 183 return "Name"; 184 case 1 : 185 return "Parameters"; 186 case 2 : 187 return "Return type"; 188 case 3 : 189 return ""; 190 default : 191 return "Uknown column"; 192 } 193 194 } 195 196 public Object getValueAt(int rowIndex, int columnIndex) { 197 MethodDescriptor method = beanInfo.getMethodDescriptors()[rowIndex]; 198 switch (columnIndex) { 199 case 0 : 200 return method.getName(); 201 case 1 : 202 Class [] params = method.getMethod().getParameterTypes(); 203 StringBuffer s = new StringBuffer (); 204 if (params.length == 0) 205 s = new StringBuffer ("void"); 206 else 207 for (int j = 0; j < params.length; j++) { 208 s.append(params[j].toString() + ", "); 209 } 210 return s.toString(); 211 212 case 2 : 213 return method.getMethod().getReturnType().toString(); 214 case 3 : 215 return method.getMethod(); 216 default : 217 return "Unknown column"; 218 } 219 } 220 }); 221 opTable.getColumnModel().getColumn(3).setCellRenderer(new ButtonRenderer()); 222 opTable.getColumnModel().getColumn(3).setCellEditor(new ButtonEditor(new JCheckBox ())); 223 224 builder.append(new JScrollPane (opTable), 3); 225 panel = builder.getPanel(); 226 return panel; 227 228 } 229 230 public void setNode(Operation op, Node node) throws ConfiguratorException { 231 try { 232 bean = node.getBean(); 233 beanInfo = Introspector.getBeanInfo(bean.getClass()); 234 235 ((AbstractTableModel ) attTable.getModel()).fireTableDataChanged(); 236 ((AbstractTableModel ) opTable.getModel()).fireTableDataChanged(); 237 238 physicalContextModel.setContext(node.getContext()); 239 } catch (Exception e) { 240 throw new ConfiguratorException("Unable to inspect MBean", e); 241 } 242 243 } 244 245 class ButtonRenderer extends JButton implements TableCellRenderer { 246 247 public ButtonRenderer() { 248 setOpaque(true); 249 } 250 251 public Component getTableCellRendererComponent( 252 JTable table, 253 Object value, 254 boolean isSelected, 255 boolean hasFocus, 256 int row, 257 int column) { 258 if (isSelected) { 259 setForeground(table.getSelectionForeground()); 260 setBackground(table.getSelectionBackground()); 261 } else { 262 setForeground(table.getForeground()); 263 setBackground(UIManager.getColor("Button.background")); 264 } 265 setText("Invoke"); 266 return this; 267 } 268 } 269 270 class ButtonEditor extends DefaultCellEditor { 271 protected JButton button; 272 private String label; 273 private boolean isPushed; 274 Method op = null; 275 276 public ButtonEditor(JCheckBox checkBox) { 277 super(checkBox); 278 button = new JButton (); 279 button.setOpaque(true); 280 button.addActionListener(new ActionListener () { 281 public void actionPerformed(ActionEvent e) { 282 fireEditingStopped(); 283 } 284 }); 285 } 286 287 public Component getTableCellEditorComponent( 288 JTable table, 289 Object value, 290 boolean isSelected, 291 int row, 292 int column) { 293 if (isSelected) { 294 button.setForeground(table.getSelectionForeground()); 295 button.setBackground(table.getSelectionBackground()); 296 } else { 297 button.setForeground(table.getForeground()); 298 button.setBackground(table.getBackground()); 299 } 300 op = (Method ) value; 301 label = "Invoke"; 302 button.setText(label); 303 isPushed = true; 304 return button; 305 } 306 307 public Object getCellEditorValue() { 308 if (isPushed) { 309 MethodInvocationDialog dlg = 310 new MethodInvocationDialog( 311 MainWindowSwing.getInstance(), 312 "Invoke " + op.getName(), 313 bean, 314 op); 315 dlg.pack(); 316 dlg.show(); 317 } 318 isPushed = false; 319 return new String (label); 320 } 321 322 public boolean stopCellEditing() { 323 isPushed = false; 324 return super.stopCellEditing(); 325 } 326 327 protected void fireEditingStopped() { 328 super.fireEditingStopped(); 329 } 330 } 331 } 332 | Popular Tags |