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 this |
4 |
* work for additional information regarding copyright ownership. The ASF |
5 |
* licenses this file to You under the Apache License, Version 2.0 (the |
6 |
* "License"); you may not use this file except in compliance with the License. |
7 |
* 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, WITHOUT |
13 |
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
14 |
* License for the specific language governing permissions and limitations under |
15 |
* the License. |
16 |
*/ |
17 |
|
18 |
package org.apache.jmeter.protocol.http.gui; |
19 |
|
20 |
import java.awt.BorderLayout; |
21 |
import java.awt.Color; |
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.ButtonGroup; |
28 |
import javax.swing.JButton; |
29 |
import javax.swing.JCheckBox; |
30 |
import javax.swing.JPanel; |
31 |
import javax.swing.JRadioButton; |
32 |
import javax.swing.JScrollPane; |
33 |
import javax.swing.JTable; |
34 |
import javax.swing.ListSelectionModel; |
35 |
import javax.swing.table.TableCellEditor; |
36 |
|
37 |
import org.apache.jmeter.config.gui.AbstractConfigGui; |
38 |
import org.apache.jmeter.gui.util.PowerTableModel; |
39 |
import org.apache.jmeter.protocol.http.control.DNSCacheManager; |
40 |
import org.apache.jmeter.testelement.TestElement; |
41 |
import org.apache.jmeter.testelement.property.PropertyIterator; |
42 |
import org.apache.jmeter.util.JMeterUtils; |
43 |
import org.apache.jorphan.gui.GuiUtils; |
44 |
import org.apache.jorphan.gui.layout.VerticalLayout; |
45 |
|
46 |
/** |
47 |
* This gui part of @see |
48 |
* {@link org.apache.jmeter.protocol.http.control.DNSCacheManager}. Using |
49 |
* radiobuttons, user can switch between using system DNS resolver and custom |
50 |
* resolver. Custom resolver functionality is provided by dnsjava library. |
51 |
* "DNS servers" may contain one or more IP/Name of dns server for resolving |
52 |
* name DNS servers are chosen via round-robin. If table is empty - system |
53 |
* resolver is used. |
54 |
* |
55 |
* @since 2.12 |
56 |
*/ |
57 |
public class DNSCachePanel extends AbstractConfigGui implements ActionListener { |
58 |
|
59 |
private static final long serialVersionUID = 2120L; |
60 |
|
61 |
public static final String OPTIONS = JMeterUtils.getResString("option"); |
62 |
|
63 |
private static final String ADD_COMMAND = JMeterUtils.getResString("add"); // $NON-NLS-1$ |
64 |
|
65 |
private static final String DELETE_COMMAND = JMeterUtils.getResString("delete"); // $NON-NLS-1$ |
66 |
|
67 |
private static final String SYS_RES_COMMAND = JMeterUtils.getResString("use_system_dns_resolver"); // $NON-NLS-1$ |
68 |
|
69 |
private static final String CUST_RES_COMMAND = JMeterUtils.getResString("use_custom_dns_resolver"); // $NON-NLS-1$ |
70 |
|
71 |
private JTable dnsServersTable; |
72 |
|
73 |
private JPanel dnsServersPanel; |
74 |
|
75 |
private JPanel dnsServButPanel; |
76 |
|
77 |
private PowerTableModel dnsServersTableModel; |
78 |
|
79 |
private JRadioButton sysResButton; |
80 |
|
81 |
private JRadioButton custResButton; |
82 |
|
83 |
private JButton deleteButton; |
84 |
|
85 |
private JButton addButton; |
86 |
|
87 |
private ButtonGroup providerDNSradioGroup = new ButtonGroup(); |
88 |
|
89 |
private static final String[] COLUMN_RESOURCE_NAMES = { |
90 |
(JMeterUtils.getResString("dns_hostname_or_ip")), //$NON-NLS-1$ |
91 |
}; |
92 |
private static final Class<?>[] columnClasses = { |
93 |
String.class }; |
94 |
|
95 |
private JCheckBox clearEachIteration; |
96 |
|
97 |
/** |
98 |
* Default constructor. |
99 |
*/ |
100 |
public DNSCachePanel() { |
101 |
init(); |
102 |
} |
103 |
|
104 |
@Override |
105 |
public String getLabelResource() { |
106 |
return "dns_cache_manager_title"; |
107 |
} |
108 |
|
109 |
/** |
110 |
* Modifies a given TestElement to mirror the data in the gui components. |
111 |
* |
112 |
* @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(org.apache.jmeter.testelement.TestElement) |
113 |
*/ |
114 |
@Override |
115 |
public void modifyTestElement(TestElement dnsRes) { |
116 |
GuiUtils.stopTableEditing(dnsServersTable); |
117 |
dnsRes.clear(); |
118 |
configureTestElement(dnsRes); |
119 |
if (dnsRes instanceof DNSCacheManager) { |
120 |
DNSCacheManager dnsCacheManager = (DNSCacheManager) dnsRes; |
121 |
for (int i = 0; i < dnsServersTableModel.getRowCount(); i++) { |
122 |
String server = (String) dnsServersTableModel.getRowData(i)[0]; |
123 |
dnsCacheManager.addServer(server); |
124 |
} |
125 |
dnsCacheManager.setClearEachIteration(clearEachIteration.isSelected()); |
126 |
if (providerDNSradioGroup.isSelected(custResButton.getModel())) { |
127 |
dnsCacheManager.setCustomResolver(true); |
128 |
} else { |
129 |
dnsCacheManager.setCustomResolver(false); |
130 |
} |
131 |
} |
132 |
} |
133 |
|
134 |
/** |
135 |
* Implements JMeterGUIComponent.clearGui |
136 |
*/ |
137 |
@Override |
138 |
public void clearGui() { |
139 |
super.clearGui(); |
140 |
clearEachIteration.setSelected(DNSCacheManager.DEFAULT_CLEAR_CACHE_EACH_ITER); |
141 |
providerDNSradioGroup.setSelected(sysResButton.getModel(), true); |
142 |
dnsServersTableModel.clearData(); |
143 |
deleteButton.setEnabled(false); |
144 |
|
145 |
} |
146 |
|
147 |
private void populateTable(DNSCacheManager resolver) { |
148 |
dnsServersTableModel.clearData(); |
149 |
PropertyIterator iter = resolver.getServers().iterator(); |
150 |
while (iter.hasNext()) { |
151 |
addServerToTable((String) iter.next().getObjectValue()); |
152 |
} |
153 |
} |
154 |
|
155 |
@Override |
156 |
public TestElement createTestElement() { |
157 |
DNSCacheManager dnsCacheManager = new DNSCacheManager(); |
158 |
modifyTestElement(dnsCacheManager); |
159 |
return dnsCacheManager; |
160 |
} |
161 |
|
162 |
@Override |
163 |
public void configure(TestElement el) { |
164 |
super.configure(el); |
165 |
|
166 |
DNSCacheManager dnsCacheManager = (DNSCacheManager) el; |
167 |
populateTable(dnsCacheManager); |
168 |
clearEachIteration.setSelected(dnsCacheManager.isClearEachIteration()); |
169 |
if (dnsCacheManager.isCustomResolver()) { |
170 |
providerDNSradioGroup.setSelected(custResButton.getModel(), true); |
171 |
deleteButton.setEnabled(dnsServersTable.getColumnCount() > 0); |
172 |
addButton.setEnabled(true); |
173 |
} else { |
174 |
providerDNSradioGroup.setSelected(sysResButton.getModel(), true); |
175 |
} |
176 |
} |
177 |
|
178 |
private void init() { |
179 |
dnsServersTableModel = new PowerTableModel(COLUMN_RESOURCE_NAMES, columnClasses); |
180 |
|
181 |
clearEachIteration = new JCheckBox(JMeterUtils.getResString("clear_cache_each_iteration"), true); //$NON-NLS-1$ |
182 |
setLayout(new BorderLayout()); |
183 |
setBorder(makeBorder()); |
184 |
JPanel northPanel = new JPanel(); |
185 |
northPanel.setLayout(new VerticalLayout(5, VerticalLayout.BOTH)); |
186 |
northPanel.add(makeTitlePanel()); |
187 |
JPanel optionsPane = new JPanel(); |
188 |
optionsPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), OPTIONS)); // $NON-NLS-1$ |
189 |
optionsPane.setLayout(new VerticalLayout(5, VerticalLayout.BOTH)); |
190 |
optionsPane.add(clearEachIteration, BorderLayout.WEST); |
191 |
optionsPane.add(createChooseResPanel(), BorderLayout.SOUTH); |
192 |
northPanel.add(optionsPane); |
193 |
add(northPanel, BorderLayout.NORTH); |
194 |
|
195 |
dnsServersPanel = createDnsServersTablePanel(); |
196 |
add(dnsServersPanel, BorderLayout.CENTER); |
197 |
|
198 |
} |
199 |
|
200 |
public JPanel createDnsServersTablePanel() { |
201 |
// create the JTable that holds header per row |
202 |
dnsServersTable = new JTable(dnsServersTableModel); |
203 |
dnsServersTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
204 |
dnsServersTable.setPreferredScrollableViewportSize(new Dimension(400, 100)); |
205 |
|
206 |
JPanel panel = new JPanel(new BorderLayout(0, 5)); |
207 |
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), |
208 |
JMeterUtils.getResString("dns_servers"))); // $NON-NLS-1$ |
209 |
JScrollPane dnsServScrollPane = new JScrollPane(dnsServersTable); |
210 |
panel.add(dnsServScrollPane, BorderLayout.CENTER); |
211 |
dnsServButPanel = createButtonPanel(); |
212 |
panel.add(dnsServButPanel, BorderLayout.SOUTH); |
213 |
return panel; |
214 |
} |
215 |
|
216 |
private JPanel createChooseResPanel() { |
217 |
JPanel chooseResPanel = new JPanel(new BorderLayout(0, 5)); |
218 |
sysResButton = new JRadioButton(); |
219 |
sysResButton.setSelected(true); |
220 |
sysResButton.setText(SYS_RES_COMMAND); |
221 |
sysResButton.setToolTipText(SYS_RES_COMMAND); |
222 |
sysResButton.setEnabled(true); |
223 |
sysResButton.addActionListener(this); |
224 |
|
225 |
custResButton = new JRadioButton(); |
226 |
custResButton.setSelected(false); |
227 |
custResButton.setText(CUST_RES_COMMAND); |
228 |
custResButton.setToolTipText(CUST_RES_COMMAND); |
229 |
custResButton.setEnabled(true); |
230 |
custResButton.addActionListener(this); |
231 |
|
232 |
providerDNSradioGroup.add(sysResButton); |
233 |
providerDNSradioGroup.add(custResButton); |
234 |
|
235 |
chooseResPanel.add(sysResButton, BorderLayout.WEST); |
236 |
chooseResPanel.add(custResButton, BorderLayout.CENTER); |
237 |
return chooseResPanel; |
238 |
} |
239 |
|
240 |
private JPanel createButtonPanel() { |
241 |
boolean tableEmpty = (dnsServersTableModel.getRowCount() == 0); |
242 |
|
243 |
addButton = createButton("add", 'A', ADD_COMMAND, custResButton.isSelected()); // $NON-NLS-1$ |
244 |
deleteButton = createButton("delete", 'D', DELETE_COMMAND, !tableEmpty); // $NON-NLS-1$ |
245 |
|
246 |
JPanel buttonPanel = new JPanel(); |
247 |
buttonPanel.add(addButton, BorderLayout.WEST); |
248 |
buttonPanel.add(deleteButton, BorderLayout.LINE_END); |
249 |
return buttonPanel; |
250 |
} |
251 |
|
252 |
private JButton createButton(String resName, char mnemonic, String command, boolean enabled) { |
253 |
JButton button = new JButton(JMeterUtils.getResString(resName)); |
254 |
button.setMnemonic(mnemonic); |
255 |
button.setActionCommand(command); |
256 |
button.setEnabled(enabled); |
257 |
button.addActionListener(this); |
258 |
return button; |
259 |
} |
260 |
|
261 |
private void addServerToTable(String dnsServer) { |
262 |
dnsServersTableModel.addRow(new Object[] { |
263 |
dnsServer }); |
264 |
} |
265 |
|
266 |
@Override |
267 |
public void actionPerformed(ActionEvent e) { |
268 |
String action = e.getActionCommand(); |
269 |
dnsServersTable.setEnabled(custResButton.isSelected()); |
270 |
Color greyColor = new Color(240, 240, 240); |
271 |
Color blueColor = new Color(184, 207, 229); |
272 |
dnsServersTable.setBackground(sysResButton.isSelected() ? greyColor : Color.WHITE); |
273 |
dnsServersTable.setSelectionBackground(sysResButton.isSelected() ? greyColor : blueColor); |
274 |
addButton.setEnabled(custResButton.isSelected()); |
275 |
deleteButton.setEnabled(custResButton.isSelected()); |
276 |
if (custResButton.isSelected() && (dnsServersTableModel.getRowCount() > 0)) { |
277 |
deleteButton.setEnabled(true); |
278 |
addButton.setEnabled(true); |
279 |
} |
280 |
|
281 |
if (action.equals(DELETE_COMMAND)) { |
282 |
if (dnsServersTableModel.getRowCount() > 0) { |
283 |
// If a table cell is being edited, we must cancel the editing |
284 |
// before deleting the row. |
285 |
if (dnsServersTable.isEditing()) { |
286 |
TableCellEditor cellEditor = dnsServersTable.getCellEditor(dnsServersTable.getEditingRow(), |
287 |
dnsServersTable.getEditingColumn()); |
288 |
cellEditor.cancelCellEditing(); |
289 |
} |
290 |
|
291 |
int rowSelected = dnsServersTable.getSelectedRow(); |
292 |
|
293 |
if (rowSelected != -1) { |
294 |
dnsServersTableModel.removeRow(rowSelected); |
295 |
dnsServersTableModel.fireTableDataChanged(); |
296 |
|
297 |
if (dnsServersTableModel.getRowCount() == 0) { |
298 |
deleteButton.setEnabled(false); |
299 |
} |
300 |
|
301 |
else { |
302 |
int rowToSelect = rowSelected; |
303 |
|
304 |
if (rowSelected >= dnsServersTableModel.getRowCount()) { |
305 |
rowToSelect = rowSelected - 1; |
306 |
} |
307 |
|
308 |
dnsServersTable.setRowSelectionInterval(rowToSelect, rowToSelect); |
309 |
} |
310 |
} |
311 |
} |
312 |
} else if (action.equals(ADD_COMMAND)) { |
313 |
// If a table cell is being edited, we should accept the current |
314 |
// value and stop the editing before adding a new row. |
315 |
GuiUtils.stopTableEditing(dnsServersTable); |
316 |
|
317 |
dnsServersTableModel.addNewRow(); |
318 |
dnsServersTableModel.fireTableDataChanged(); |
319 |
|
320 |
if (!deleteButton.isEnabled()) { |
321 |
deleteButton.setEnabled(true); |
322 |
} |
323 |
|
324 |
// Highlight (select) the appropriate row. |
325 |
int rowToSelect = dnsServersTableModel.getRowCount() - 1; |
326 |
dnsServersTable.setRowSelectionInterval(rowToSelect, rowToSelect); |
327 |
} |
328 |
} |
329 |
} |