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 CLEAR_CACHE_EACH_ITER = JMeterUtils.getResString("clear_cache_each_iteration"); |
62 |
public static final String OPTIONS = JMeterUtils.getResString("option"); |
63 |
private static final String ADD_COMMAND = JMeterUtils.getResString("add"); // $NON-NLS-1$ |
64 |
private static final String DELETE_COMMAND = JMeterUtils.getResString("delete"); // $NON-NLS-1$ |
65 |
private static final String SYS_RES_COMMAND = JMeterUtils.getResString("use_system_dns_resolver"); // $NON-NLS-1$ |
66 |
private static final String CUST_RES_COMMAND = JMeterUtils.getResString("use_custom_dns_resolver"); // $NON-NLS-1$ |
67 |
|
68 |
private JTable dnsServersTable; |
69 |
private JPanel dnsServersPanel; |
70 |
private JPanel dnsServButPanel; |
71 |
private PowerTableModel dnsServersTableModel; |
72 |
private JRadioButton sysResButton; |
73 |
private JRadioButton custResButton; |
74 |
private JButton deleteButton; |
75 |
private JButton addButton; |
76 |
|
77 |
private static final String[] COLUMN_RESOURCE_NAMES = { |
78 |
(JMeterUtils.getResString("dns_hostname_or_ip")), //$NON-NLS-1$ |
79 |
}; |
80 |
private static final Class<?>[] columnClasses = { |
81 |
String.class }; |
82 |
|
83 |
private JCheckBox clearEachIteration; |
84 |
|
85 |
/** |
86 |
* Default constructor. |
87 |
*/ |
88 |
public DNSCachePanel() { |
89 |
init(); |
90 |
} |
91 |
|
92 |
@Override |
93 |
public String getLabelResource() { |
94 |
return "dns_cache_manager_title"; |
95 |
} |
96 |
|
97 |
/** |
98 |
* Modifies a given TestElement to mirror the data in the gui components. |
99 |
* |
100 |
* @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(org.apache.jmeter.testelement.TestElement) |
101 |
*/ |
102 |
@Override |
103 |
public void modifyTestElement(TestElement dnsRes) { |
104 |
GuiUtils.stopTableEditing(dnsServersTable); |
105 |
dnsRes.clear(); |
106 |
configureTestElement(dnsRes); |
107 |
if (dnsRes instanceof DNSCacheManager) { |
108 |
DNSCacheManager dnsCacheManager = (DNSCacheManager) dnsRes; |
109 |
for (int i = 0; i < dnsServersTableModel.getRowCount(); i++) { |
110 |
String server = (String) dnsServersTableModel.getRowData(i)[0]; |
111 |
dnsCacheManager.addServer(server); |
112 |
} |
113 |
dnsCacheManager.setClearEachIteration(clearEachIteration.isSelected()); |
114 |
dnsCacheManager.setIsCustomResolver(custResButton.isSelected()); |
115 |
} |
116 |
|
117 |
} |
118 |
|
119 |
/** |
120 |
* Implements JMeterGUIComponent.clearGui |
121 |
*/ |
122 |
@Override |
123 |
public void clearGui() { |
124 |
super.clearGui(); |
125 |
clearEachIteration.setSelected(true); |
126 |
dnsServersTableModel.clearData(); |
127 |
deleteButton.setEnabled(custResButton.isSelected() && dnsServersTable.getColumnCount() > 0); |
128 |
|
129 |
} |
130 |
|
131 |
private void populateTable(DNSCacheManager resolver) { |
132 |
dnsServersTableModel.clearData(); |
133 |
PropertyIterator iter = resolver.getServers().iterator(); |
134 |
while (iter.hasNext()) { |
135 |
addServerToTable((String) iter.next().getObjectValue()); |
136 |
} |
137 |
} |
138 |
|
139 |
@Override |
140 |
public TestElement createTestElement() { |
141 |
DNSCacheManager dnsCacheManager = new DNSCacheManager(); |
142 |
modifyTestElement(dnsCacheManager); |
143 |
return dnsCacheManager; |
144 |
} |
145 |
|
146 |
@Override |
147 |
public void configure(TestElement el) { |
148 |
super.configure(el); |
149 |
|
150 |
populateTable((DNSCacheManager) el); |
151 |
clearEachIteration.setSelected(el.getPropertyAsBoolean(DNSCacheManager.CLEAR_CACHE_EACH_ITER, |
152 |
DNSCacheManager.DEFAULT_CLEAR_CACHE_EACH_ITER)); |
153 |
custResButton.setSelected(el.getPropertyAsBoolean(DNSCacheManager.IS_CUSTOM_RESOLVER, |
154 |
DNSCacheManager.DEFAULT_IS_CUSTOM_RESOLVER)); |
155 |
} |
156 |
|
157 |
private void init() { |
158 |
dnsServersTableModel = new PowerTableModel(COLUMN_RESOURCE_NAMES, columnClasses); |
159 |
|
160 |
clearEachIteration = new JCheckBox(JMeterUtils.getResString("clear_cache_each_iteration"), true); //$NON-NLS-1$ |
161 |
setLayout(new BorderLayout()); |
162 |
setBorder(makeBorder()); |
163 |
JPanel northPanel = new JPanel(); |
164 |
northPanel.setLayout(new VerticalLayout(5, VerticalLayout.BOTH)); |
165 |
northPanel.add(makeTitlePanel()); |
166 |
JPanel optionsPane = new JPanel(); |
167 |
optionsPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), OPTIONS)); // $NON-NLS-1$ |
168 |
optionsPane.setLayout(new VerticalLayout(5, VerticalLayout.BOTH)); |
169 |
optionsPane.add(clearEachIteration, BorderLayout.WEST); |
170 |
optionsPane.add(createChooseResPanel(), BorderLayout.SOUTH); |
171 |
northPanel.add(optionsPane); |
172 |
add(northPanel, BorderLayout.NORTH); |
173 |
|
174 |
dnsServersPanel = createDnsServersTablePanel(); |
175 |
add(dnsServersPanel, BorderLayout.CENTER); |
176 |
|
177 |
} |
178 |
|
179 |
public JPanel createDnsServersTablePanel() { |
180 |
// create the JTable that holds header per row |
181 |
dnsServersTable = new JTable(dnsServersTableModel); |
182 |
dnsServersTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
183 |
dnsServersTable.setPreferredScrollableViewportSize(new Dimension(400, 100)); |
184 |
|
185 |
JPanel panel = new JPanel(new BorderLayout(0, 5)); |
186 |
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), |
187 |
JMeterUtils.getResString("dns_servers"))); // $NON-NLS-1$ |
188 |
JScrollPane dnsServScrollPane = new JScrollPane(dnsServersTable); |
189 |
panel.add(dnsServScrollPane, BorderLayout.CENTER); |
190 |
dnsServButPanel = createButtonPanel(); |
191 |
panel.add(dnsServButPanel, BorderLayout.SOUTH); |
192 |
return panel; |
193 |
} |
194 |
|
195 |
private JPanel createChooseResPanel() { |
196 |
JPanel chooseResPanel = new JPanel(new BorderLayout(0, 5)); |
197 |
sysResButton = new JRadioButton(); |
198 |
sysResButton.setSelected(true); |
199 |
sysResButton.setText(SYS_RES_COMMAND); |
200 |
sysResButton.setToolTipText(SYS_RES_COMMAND); |
201 |
sysResButton.setEnabled(true); |
202 |
sysResButton.addActionListener(this); |
203 |
|
204 |
custResButton = new JRadioButton(); |
205 |
custResButton.setSelected(false); |
206 |
custResButton.setText(CUST_RES_COMMAND); |
207 |
custResButton.setToolTipText(CUST_RES_COMMAND); |
208 |
custResButton.setEnabled(true); |
209 |
custResButton.addActionListener(this); |
210 |
|
211 |
ButtonGroup buttonGroup; |
212 |
buttonGroup = new ButtonGroup(); |
213 |
buttonGroup.add(sysResButton); |
214 |
buttonGroup.add(custResButton); |
215 |
|
216 |
chooseResPanel.add(sysResButton, BorderLayout.WEST); |
217 |
chooseResPanel.add(custResButton, BorderLayout.CENTER); |
218 |
return chooseResPanel; |
219 |
} |
220 |
|
221 |
private JPanel createButtonPanel() { |
222 |
boolean tableEmpty = (dnsServersTableModel.getRowCount() == 0); |
223 |
|
224 |
addButton = createButton("add", 'A', ADD_COMMAND, custResButton.isSelected()); // $NON-NLS-1$ |
225 |
deleteButton = createButton("delete", 'D', DELETE_COMMAND, !tableEmpty); // $NON-NLS-1$ |
226 |
|
227 |
JPanel buttonPanel = new JPanel(); |
228 |
buttonPanel.add(addButton, BorderLayout.WEST); |
229 |
buttonPanel.add(deleteButton, BorderLayout.LINE_END); |
230 |
return buttonPanel; |
231 |
} |
232 |
|
233 |
private JButton createButton(String resName, char mnemonic, String command, boolean enabled) { |
234 |
JButton button = new JButton(JMeterUtils.getResString(resName)); |
235 |
button.setMnemonic(mnemonic); |
236 |
button.setActionCommand(command); |
237 |
button.setEnabled(enabled); |
238 |
button.addActionListener(this); |
239 |
return button; |
240 |
} |
241 |
|
242 |
private void addServerToTable(String dnsServer) { |
243 |
dnsServersTableModel.addRow(new Object[] { |
244 |
dnsServer }); |
245 |
} |
246 |
|
247 |
@Override |
248 |
public void actionPerformed(ActionEvent e) { |
249 |
String action = e.getActionCommand(); |
250 |
dnsServersTable.setEnabled(custResButton.isSelected()); |
251 |
Color greyColor = new Color(240, 240, 240); |
252 |
Color blueColor = new Color(184, 207, 229); |
253 |
dnsServersTable.setBackground(sysResButton.isSelected() ? greyColor : Color.WHITE); |
254 |
dnsServersTable.setSelectionBackground(sysResButton.isSelected() ? greyColor : blueColor); |
255 |
addButton.setEnabled(custResButton.isSelected()); |
256 |
deleteButton.setEnabled(custResButton.isSelected()); |
257 |
if (custResButton.isSelected() && (dnsServersTableModel.getRowCount() > 0)) { |
258 |
deleteButton.setEnabled(true); |
259 |
addButton.setEnabled(true); |
260 |
} |
261 |
|
262 |
if (action.equals(DELETE_COMMAND)) { |
263 |
if (dnsServersTableModel.getRowCount() > 0) { |
264 |
// If a table cell is being edited, we must cancel the editing |
265 |
// before deleting the row. |
266 |
if (dnsServersTable.isEditing()) { |
267 |
TableCellEditor cellEditor = dnsServersTable.getCellEditor(dnsServersTable.getEditingRow(), |
268 |
dnsServersTable.getEditingColumn()); |
269 |
cellEditor.cancelCellEditing(); |
270 |
} |
271 |
|
272 |
int rowSelected = dnsServersTable.getSelectedRow(); |
273 |
|
274 |
if (rowSelected != -1) { |
275 |
dnsServersTableModel.removeRow(rowSelected); |
276 |
dnsServersTableModel.fireTableDataChanged(); |
277 |
|
278 |
if (dnsServersTableModel.getRowCount() == 0) { |
279 |
deleteButton.setEnabled(false); |
280 |
} |
281 |
|
282 |
else { |
283 |
int rowToSelect = rowSelected; |
284 |
|
285 |
if (rowSelected >= dnsServersTableModel.getRowCount()) { |
286 |
rowToSelect = rowSelected - 1; |
287 |
} |
288 |
|
289 |
dnsServersTable.setRowSelectionInterval(rowToSelect, rowToSelect); |
290 |
} |
291 |
} |
292 |
} |
293 |
} else if (action.equals(ADD_COMMAND)) { |
294 |
// If a table cell is being edited, we should accept the current |
295 |
// value and stop the editing before adding a new row. |
296 |
GuiUtils.stopTableEditing(dnsServersTable); |
297 |
|
298 |
dnsServersTableModel.addNewRow(); |
299 |
dnsServersTableModel.fireTableDataChanged(); |
300 |
|
301 |
if (!deleteButton.isEnabled()) { |
302 |
deleteButton.setEnabled(true); |
303 |
} |
304 |
|
305 |
// Highlight (select) the appropriate row. |
306 |
int rowToSelect = dnsServersTableModel.getRowCount() - 1; |
307 |
dnsServersTable.setRowSelectionInterval(rowToSelect, rowToSelect); |
308 |
} |
309 |
} |
310 |
} |