PageRenderTime 52ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/plugins/src/kg/apc/jmeter/vizualizers/DbMonGui.java

http://jmeter-plugins.googlecode.com/
Java | 237 lines | 197 code | 36 blank | 4 comment | 11 complexity | c4c5564bff1ea8d0738fbd2ea73f7608 MD5 | raw file
Possible License(s): Apache-2.0
  1. package kg.apc.jmeter.vizualizers;
  2. import java.awt.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.text.SimpleDateFormat;
  6. import javax.swing.*;
  7. import kg.apc.charting.AbstractGraphRow;
  8. import kg.apc.jmeter.JMeterPluginsUtils;
  9. import kg.apc.jmeter.dbmon.DbMonCollector;
  10. import kg.apc.jmeter.dbmon.DbMonSampleResult;
  11. import kg.apc.jmeter.graphs.AbstractOverTimeVisualizer;
  12. import kg.apc.jmeter.gui.ButtonPanelAddCopyRemove;
  13. import org.apache.jmeter.gui.util.PowerTableModel;
  14. import org.apache.jmeter.samplers.SampleResult;
  15. import org.apache.jmeter.testelement.TestElement;
  16. import org.apache.jmeter.testelement.property.CollectionProperty;
  17. import org.apache.jmeter.testelement.property.JMeterProperty;
  18. import org.apache.jmeter.testelement.property.NullProperty;
  19. import org.apache.jorphan.logging.LoggingManager;
  20. import org.apache.log.Logger;
  21. /**
  22. *
  23. * @author Marten Bohlin
  24. */
  25. public class DbMonGui
  26. extends AbstractOverTimeVisualizer {
  27. private static final Logger log = LoggingManager.getLoggerForClass();
  28. private PowerTableModel tableModel;
  29. private JTable grid;
  30. private JTextArea errorTextArea;
  31. private JScrollPane errorPane;
  32. public static final String[] columnIdentifiers = new String[]{
  33. "JDBC pool variable name", "Chart label", "Delta", "SQL query (must return a single numeric value)"
  34. };
  35. public static final Class[] columnClasses = new Class[]{
  36. String.class, String.class, Boolean.class, String.class
  37. };
  38. private static Object[] defaultValues = new Object[]{
  39. "", "", false, ""
  40. };
  41. public DbMonGui() {
  42. super();
  43. setGranulation(1000);
  44. graphPanel.getGraphObject().setYAxisLabel("Query results");
  45. graphPanel.getGraphObject().getChartSettings().setExpendRows(true);
  46. }
  47. @Override
  48. protected JSettingsPanel createSettingsPanel() {
  49. return new JSettingsPanel(this,
  50. JSettingsPanel.GRADIENT_OPTION
  51. | JSettingsPanel.LIMIT_POINT_OPTION
  52. | JSettingsPanel.MAXY_OPTION
  53. | JSettingsPanel.RELATIVE_TIME_OPTION
  54. | JSettingsPanel.AUTO_EXPAND_OPTION
  55. | JSettingsPanel.MARKERS_OPTION_DISABLED);
  56. }
  57. @Override
  58. public String getWikiPage() {
  59. return "DbMon";
  60. }
  61. @Override
  62. public String getLabelResource() {
  63. return getClass().getSimpleName();
  64. }
  65. @Override
  66. public String getStaticLabel() {
  67. return JMeterPluginsUtils.prefixLabel("DbMon Samples Collector");
  68. }
  69. @Override
  70. protected JPanel getGraphPanelContainer() {
  71. JPanel panel = new JPanel(new BorderLayout());
  72. JPanel innerTopPanel = new JPanel(new BorderLayout());
  73. errorPane = new JScrollPane();
  74. errorPane.setMinimumSize(new Dimension(100, 50));
  75. errorPane.setPreferredSize(new Dimension(100, 50));
  76. errorTextArea = new JTextArea();
  77. errorTextArea.setForeground(Color.red);
  78. errorTextArea.setBackground(new Color(255, 255, 153));
  79. errorTextArea.setEditable(false);
  80. errorPane.setViewportView(errorTextArea);
  81. registerPopup();
  82. innerTopPanel.add(createSamplerPanel(), BorderLayout.NORTH);
  83. innerTopPanel.add(errorPane, BorderLayout.SOUTH);
  84. innerTopPanel.add(getFilePanel(), BorderLayout.CENTER);
  85. panel.add(innerTopPanel, BorderLayout.NORTH);
  86. errorPane.setVisible(false);
  87. return panel;
  88. }
  89. private void addErrorMessage(String msg, long time) {
  90. errorPane.setVisible(true);
  91. SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
  92. String newLine = "";
  93. if (errorTextArea.getText().length() != 0) {
  94. newLine = "\n";
  95. }
  96. errorTextArea.setText(errorTextArea.getText() + newLine + formatter.format(time) + " - ERROR: " + msg);
  97. errorTextArea.setCaretPosition(errorTextArea.getDocument().getLength());
  98. updateGui();
  99. }
  100. public void clearErrorMessage() {
  101. errorTextArea.setText("");
  102. errorPane.setVisible(false);
  103. }
  104. private void registerPopup() {
  105. JPopupMenu popup = new JPopupMenu();
  106. JMenuItem hideMessagesMenu = new JMenuItem("Hide Error Panel");
  107. hideMessagesMenu.addActionListener(new HideAction());
  108. popup.add(hideMessagesMenu);
  109. errorTextArea.setComponentPopupMenu(popup);
  110. }
  111. @Override
  112. public void clearData() {
  113. clearErrorMessage();
  114. super.clearData();
  115. }
  116. private Component createSamplerPanel() {
  117. JPanel panel = new JPanel(new BorderLayout(5, 5));
  118. panel.setBorder(BorderFactory.createTitledBorder("Database Samplers"));
  119. panel.setPreferredSize(new Dimension(150, 150));
  120. JScrollPane scroll = new JScrollPane(createGrid());
  121. scroll.setPreferredSize(scroll.getMinimumSize());
  122. panel.add(scroll, BorderLayout.CENTER);
  123. panel.add(new ButtonPanelAddCopyRemove(grid, tableModel, defaultValues), BorderLayout.SOUTH);
  124. grid.getTableHeader().setReorderingAllowed(false);
  125. return panel;
  126. }
  127. private JTable createGrid() {
  128. grid = new JTable();
  129. createTableModel();
  130. grid.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  131. grid.setMinimumSize(new Dimension(200, 100));
  132. grid.getColumnModel().getColumn(0).setPreferredWidth(200);
  133. grid.getColumnModel().getColumn(1).setPreferredWidth(120);
  134. grid.getColumnModel().getColumn(2).setPreferredWidth(50);
  135. grid.getColumnModel().getColumn(3).setPreferredWidth(500);
  136. return grid;
  137. }
  138. private void createTableModel() {
  139. tableModel = new PowerTableModel(columnIdentifiers, columnClasses);
  140. grid.setModel(tableModel);
  141. }
  142. @Override
  143. public TestElement createTestElement() {
  144. TestElement te = new DbMonCollector();
  145. modifyTestElement(te);
  146. te.setComment(JMeterPluginsUtils.getWikiLinkText(getWikiPage()));
  147. return te;
  148. }
  149. @Override
  150. public void modifyTestElement(TestElement te) {
  151. super.modifyTestElement(te);
  152. if (grid.isEditing()) {
  153. grid.getCellEditor().stopCellEditing();
  154. }
  155. if (te instanceof DbMonCollector) {
  156. DbMonCollector dmte = (DbMonCollector) te;
  157. CollectionProperty rows = JMeterPluginsUtils.tableModelRowsToCollectionProperty(tableModel, DbMonCollector.DATA_PROPERTY);
  158. dmte.setData(rows);
  159. }
  160. super.configureTestElement(te);
  161. }
  162. @Override
  163. public void configure(TestElement te) {
  164. super.configure(te);
  165. DbMonCollector dmte = (DbMonCollector) te;
  166. JMeterProperty dbmonValues = dmte.getSamplerSettings();
  167. if (!(dbmonValues instanceof NullProperty)) {
  168. JMeterPluginsUtils.collectionPropertyToTableModelRows((CollectionProperty) dbmonValues, tableModel, columnClasses);
  169. } else {
  170. log.warn("Received null property instead of collection");
  171. }
  172. }
  173. @Override
  174. public void add(SampleResult res) {
  175. if (res.isSuccessful()) {
  176. if(isSampleIncluded(res)) {
  177. super.add(res);
  178. addDbMonRecord(res.getSampleLabel(), normalizeTime(res.getStartTime()), DbMonSampleResult.getValue(res));
  179. updateGui(null);
  180. }
  181. } else {
  182. addErrorMessage(res.getResponseMessage(), res.getStartTime());
  183. }
  184. }
  185. private void addDbMonRecord(String rowName, long time, double value) {
  186. AbstractGraphRow row = model.get(rowName);
  187. if (row == null) {
  188. row = getNewRow(model, AbstractGraphRow.ROW_AVERAGES, rowName,
  189. AbstractGraphRow.MARKER_SIZE_NONE, false, false, false, true, true);
  190. }
  191. row.add(time, value);
  192. }
  193. private class HideAction
  194. implements ActionListener {
  195. @Override
  196. public void actionPerformed(ActionEvent e) {
  197. errorPane.setVisible(false);
  198. updateGui();
  199. }
  200. }
  201. }