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