Line 0
Link Here
|
|
|
1 |
/* |
2 |
* Licensed to the Apache Software Foundation (ASF) under one or more |
3 |
* contributor license agreements. See the NOTICE file distributed with |
4 |
* this work for additional information regarding copyright ownership. |
5 |
* The ASF licenses this file to You under the Apache License, Version 2.0 |
6 |
* (the "License"); you may not use this file except in compliance with |
7 |
* the License. You may obtain a copy of the License at |
8 |
* |
9 |
* http://www.apache.org/licenses/LICENSE-2.0 |
10 |
* |
11 |
* Unless required by applicable law or agreed to in writing, software |
12 |
* distributed under the License is distributed on an "AS IS" BASIS, |
13 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 |
* See the License for the specific language governing permissions and |
15 |
* limitations under the License. |
16 |
* |
17 |
*/ |
18 |
|
19 |
package org.apache.jmeter.protocol.jms.control.gui; |
20 |
|
21 |
import java.awt.BorderLayout; |
22 |
import java.awt.Dimension; |
23 |
import java.awt.event.ActionEvent; |
24 |
import java.awt.event.ActionListener; |
25 |
|
26 |
import javax.swing.BorderFactory; |
27 |
import javax.swing.DefaultCellEditor; |
28 |
import javax.swing.JButton; |
29 |
import javax.swing.JComboBox; |
30 |
import javax.swing.JPanel; |
31 |
import javax.swing.JScrollPane; |
32 |
import javax.swing.JTable; |
33 |
import javax.swing.ListSelectionModel; |
34 |
import javax.swing.table.AbstractTableModel; |
35 |
import javax.swing.table.TableCellEditor; |
36 |
import javax.swing.table.TableColumn; |
37 |
|
38 |
import org.apache.jmeter.config.gui.AbstractConfigGui; |
39 |
import org.apache.jmeter.gui.util.HeaderAsPropertyRenderer; |
40 |
import org.apache.jmeter.protocol.jms.sampler.JMSProperties; |
41 |
import org.apache.jmeter.protocol.jms.sampler.JMSProperty; |
42 |
import org.apache.jmeter.testelement.TestElement; |
43 |
import org.apache.jmeter.util.JMeterUtils; |
44 |
import org.apache.jorphan.gui.GuiUtils; |
45 |
import org.apache.jorphan.logging.LoggingManager; |
46 |
import org.apache.log.Logger; |
47 |
|
48 |
/** |
49 |
* Handles input for Jms Properties |
50 |
* @since 2.10.1 |
51 |
*/ |
52 |
public class JMSPropertiesPanel extends AbstractConfigGui implements ActionListener { |
53 |
|
54 |
private static final long serialVersionUID = -2893899384410289131L; |
55 |
|
56 |
private static final Logger log = LoggingManager.getLoggerForClass(); |
57 |
|
58 |
private static final String ADD_COMMAND = "Add"; //$NON-NLS-1$ |
59 |
|
60 |
private static final String DELETE_COMMAND = "Delete"; //$NON-NLS-1$ |
61 |
|
62 |
private static final int COL_NAME = 0; |
63 |
private static final int COL_VALUE = 1; |
64 |
private static final int COL_TYPE = 2; |
65 |
|
66 |
private InnerTableModel tableModel; |
67 |
|
68 |
private JTable jmsPropertiesTable; |
69 |
|
70 |
private JButton addButton; |
71 |
|
72 |
private JButton deleteButton; |
73 |
|
74 |
|
75 |
/** |
76 |
* Default Constructor. |
77 |
*/ |
78 |
public JMSPropertiesPanel() { |
79 |
tableModel = new InnerTableModel(); |
80 |
init(); |
81 |
} |
82 |
|
83 |
@Override |
84 |
public TestElement createTestElement() { |
85 |
JMSProperties jmsProperties = tableModel.jmsProperties; |
86 |
configureTestElement(jmsProperties); |
87 |
return (TestElement) jmsProperties.clone(); |
88 |
} |
89 |
|
90 |
/** |
91 |
* Modifies a given TestElement to mirror the data in the gui components. |
92 |
* |
93 |
* @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(TestElement) |
94 |
*/ |
95 |
@Override |
96 |
public void modifyTestElement(TestElement el) { |
97 |
GuiUtils.stopTableEditing(jmsPropertiesTable); |
98 |
JMSProperties jmsProperties = (JMSProperties) el; |
99 |
jmsProperties.clear(); |
100 |
jmsProperties.addTestElement((TestElement) tableModel.jmsProperties.clone()); |
101 |
configureTestElement(el); |
102 |
} |
103 |
|
104 |
/** |
105 |
* Clear GUI |
106 |
*/ |
107 |
@Override |
108 |
public void clearGui() { |
109 |
super.clearGui(); |
110 |
|
111 |
tableModel.clearData(); |
112 |
deleteButton.setEnabled(false); |
113 |
} |
114 |
|
115 |
/** |
116 |
* Configures GUI from el |
117 |
* @param el {@link TestElement} |
118 |
*/ |
119 |
@Override |
120 |
public void configure(TestElement el) { |
121 |
super.configure(el); |
122 |
tableModel.jmsProperties.clear(); |
123 |
tableModel.jmsProperties.addTestElement((JMSProperties) el.clone()); |
124 |
if (tableModel.getRowCount() != 0) { |
125 |
deleteButton.setEnabled(true); |
126 |
} |
127 |
} |
128 |
|
129 |
@Override |
130 |
public String getLabelResource() { |
131 |
return "jms_properties_title"; //$NON-NLS-1$ |
132 |
} |
133 |
|
134 |
/** |
135 |
* Shows the main properties panel for this object. |
136 |
*/ |
137 |
private void init() {// called from ctor, so must not be overridable |
138 |
setLayout(new BorderLayout()); |
139 |
setBorder(makeBorder()); |
140 |
add(createPropertiesPanel(), BorderLayout.CENTER); |
141 |
} |
142 |
|
143 |
@Override |
144 |
public void actionPerformed(ActionEvent e) { |
145 |
String action = e.getActionCommand(); |
146 |
|
147 |
if (action.equals(DELETE_COMMAND)) { |
148 |
if (tableModel.getRowCount() > 0) { |
149 |
// If a table cell is being edited, we must cancel the editing |
150 |
// before deleting the row. |
151 |
if (jmsPropertiesTable.isEditing()) { |
152 |
TableCellEditor cellEditor = jmsPropertiesTable.getCellEditor(jmsPropertiesTable.getEditingRow(), jmsPropertiesTable |
153 |
.getEditingColumn()); |
154 |
cellEditor.cancelCellEditing(); |
155 |
} |
156 |
|
157 |
int rowSelected = jmsPropertiesTable.getSelectedRow(); |
158 |
|
159 |
if (rowSelected != -1) { |
160 |
tableModel.removeRow(rowSelected); |
161 |
tableModel.fireTableDataChanged(); |
162 |
|
163 |
// Disable the DELETE and SAVE buttons if no rows remaining |
164 |
// after delete. |
165 |
if (tableModel.getRowCount() == 0) { |
166 |
deleteButton.setEnabled(false); |
167 |
} |
168 |
|
169 |
// Table still contains one or more rows, so highlight |
170 |
// (select) the appropriate one. |
171 |
else { |
172 |
int rowToSelect = rowSelected; |
173 |
|
174 |
if (rowSelected >= tableModel.getRowCount()) { |
175 |
rowToSelect = rowSelected - 1; |
176 |
} |
177 |
|
178 |
jmsPropertiesTable.setRowSelectionInterval(rowToSelect, rowToSelect); |
179 |
} |
180 |
} |
181 |
} |
182 |
} else if (action.equals(ADD_COMMAND)) { |
183 |
// If a table cell is being edited, we should accept the current |
184 |
// value and stop the editing before adding a new row. |
185 |
GuiUtils.stopTableEditing(jmsPropertiesTable); |
186 |
|
187 |
tableModel.addNewRow(); |
188 |
tableModel.fireTableDataChanged(); |
189 |
|
190 |
// Enable the DELETE and SAVE buttons if they are currently |
191 |
// disabled. |
192 |
if (!deleteButton.isEnabled()) { |
193 |
deleteButton.setEnabled(true); |
194 |
} |
195 |
|
196 |
// Highlight (select) the appropriate row. |
197 |
int rowToSelect = tableModel.getRowCount() - 1; |
198 |
jmsPropertiesTable.setRowSelectionInterval(rowToSelect, rowToSelect); |
199 |
} |
200 |
} |
201 |
|
202 |
public JPanel createPropertiesPanel() { |
203 |
// create the JTable that holds JMSProperty per row |
204 |
jmsPropertiesTable = new JTable(tableModel); |
205 |
jmsPropertiesTable.getTableHeader().setDefaultRenderer(new HeaderAsPropertyRenderer()); |
206 |
jmsPropertiesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
207 |
jmsPropertiesTable.setPreferredScrollableViewportSize(new Dimension(100, 70)); |
208 |
|
209 |
|
210 |
TableColumn mechanismColumn = jmsPropertiesTable.getColumnModel().getColumn(COL_TYPE); |
211 |
mechanismColumn.setCellEditor(new TypeCellEditor()); |
212 |
|
213 |
JPanel panel = new JPanel(new BorderLayout(0, 5)); |
214 |
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), |
215 |
JMeterUtils.getResString("jms_props"))); //$NON-NLS-1$ |
216 |
panel.add(new JScrollPane(jmsPropertiesTable)); |
217 |
panel.add(createButtonPanel(), BorderLayout.SOUTH); |
218 |
return panel; |
219 |
} |
220 |
|
221 |
private JButton createButton(String resName, char mnemonic, String command, boolean enabled) { |
222 |
JButton button = new JButton(JMeterUtils.getResString(resName)); |
223 |
button.setMnemonic(mnemonic); |
224 |
button.setActionCommand(command); |
225 |
button.setEnabled(enabled); |
226 |
button.addActionListener(this); |
227 |
return button; |
228 |
} |
229 |
|
230 |
private JPanel createButtonPanel() { |
231 |
boolean tableEmpty = (tableModel.getRowCount() == 0); |
232 |
|
233 |
addButton = createButton("add", 'A', ADD_COMMAND, true); //$NON-NLS-1$ |
234 |
deleteButton = createButton("delete", 'D', DELETE_COMMAND, !tableEmpty); //$NON-NLS-1$ |
235 |
|
236 |
// Button Panel |
237 |
JPanel buttonPanel = new JPanel(); |
238 |
buttonPanel.add(addButton); |
239 |
buttonPanel.add(deleteButton); |
240 |
return buttonPanel; |
241 |
} |
242 |
|
243 |
private static class InnerTableModel extends AbstractTableModel { |
244 |
private static final long serialVersionUID = 4638155137475747946L; |
245 |
final JMSProperties jmsProperties; |
246 |
|
247 |
public InnerTableModel() { |
248 |
jmsProperties = new JMSProperties(); |
249 |
} |
250 |
|
251 |
public void addNewRow() { |
252 |
jmsProperties.addJmsProperty(new JMSProperty("","",String.class.getName())); |
253 |
} |
254 |
|
255 |
public void clearData() { |
256 |
jmsProperties.clear(); |
257 |
fireTableDataChanged(); |
258 |
} |
259 |
|
260 |
public void removeRow(int row) { |
261 |
jmsProperties.removeJmsProperty(row); |
262 |
} |
263 |
|
264 |
@Override |
265 |
public boolean isCellEditable(int row, int column) { |
266 |
// all table cells are editable |
267 |
return true; |
268 |
} |
269 |
|
270 |
@Override |
271 |
public Class<?> getColumnClass(int column) { |
272 |
return getValueAt(0, column).getClass(); |
273 |
} |
274 |
|
275 |
/** |
276 |
* Required by table model interface. |
277 |
*/ |
278 |
@Override |
279 |
public int getRowCount() { |
280 |
return jmsProperties.getJmsPropertyCount(); |
281 |
} |
282 |
|
283 |
/** |
284 |
* Required by table model interface. |
285 |
*/ |
286 |
@Override |
287 |
public int getColumnCount() { |
288 |
return 3; |
289 |
} |
290 |
|
291 |
/** |
292 |
* Required by table model interface. |
293 |
*/ |
294 |
@Override |
295 |
public String getColumnName(int column) { |
296 |
switch(column) { |
297 |
case COL_NAME: |
298 |
return "name"; |
299 |
case COL_VALUE: |
300 |
return "value"; |
301 |
case COL_TYPE: |
302 |
return "jms_properties_type"; |
303 |
default: |
304 |
return null; |
305 |
} |
306 |
} |
307 |
|
308 |
/** |
309 |
* Required by table model interface. |
310 |
*/ |
311 |
@Override |
312 |
public Object getValueAt(int row, int column) { |
313 |
JMSProperty property = jmsProperties.getJmsProperty(row); |
314 |
|
315 |
switch (column){ |
316 |
case COL_NAME: |
317 |
return property.getName(); |
318 |
case COL_VALUE: |
319 |
return property.getValue(); |
320 |
case COL_TYPE: |
321 |
return property.getType(); |
322 |
default: |
323 |
return null; |
324 |
} |
325 |
} |
326 |
|
327 |
@Override |
328 |
public void setValueAt(Object value, int row, int column) { |
329 |
JMSProperty property = jmsProperties.getJmsProperty(row); |
330 |
if(log.isDebugEnabled()) { |
331 |
log.debug("Setting jms property value: " + value); |
332 |
} |
333 |
switch (column){ |
334 |
case COL_NAME: |
335 |
property.setName((String)value); |
336 |
break; |
337 |
case COL_VALUE: |
338 |
property.setValue((String) value); |
339 |
break; |
340 |
case COL_TYPE: |
341 |
property.setType((String) value); |
342 |
break; |
343 |
default: |
344 |
break; |
345 |
} |
346 |
} |
347 |
} |
348 |
|
349 |
private static class TypeCellEditor extends DefaultCellEditor { |
350 |
|
351 |
/** |
352 |
* |
353 |
*/ |
354 |
private static final long serialVersionUID = 1L; |
355 |
|
356 |
public TypeCellEditor() { |
357 |
super(new JComboBox(new Object[]{ |
358 |
Boolean.class.getName(), |
359 |
Byte.class.getName(), |
360 |
Short.class.getName(), |
361 |
Integer.class.getName(), |
362 |
Long.class.getName(), |
363 |
Float.class.getName(), |
364 |
Double.class.getName(), |
365 |
String.class.getName() |
366 |
})); |
367 |
} |
368 |
} |
369 |
} |