View | Details | Raw Unified | Return to bug 59174
Collapse All | Expand All

(-)a/src/core/org/apache/jmeter/resources/messages.properties (-1 / +4 lines)
Lines 23-28 Link Here
23
about=About Apache JMeter
23
about=About Apache JMeter
24
active_threads_tooltip=Running threads
24
active_threads_tooltip=Running threads
25
add=Add
25
add=Add
26
add_host=Add static host
26
add_as_child=Add as Child
27
add_as_child=Add as Child
27
add_from_clipboard=Add from Clipboard
28
add_from_clipboard=Add from Clipboard
28
add_from_suggested_excludes=Add suggested Excludes
29
add_from_suggested_excludes=Add suggested Excludes
Lines 249-254 delay=Startup delay (seconds) Link Here
249
delayed_start=Delay Thread creation until needed
250
delayed_start=Delay Thread creation until needed
250
delete=Delete
251
delete=Delete
251
delete_parameter=Delete Variable
252
delete_parameter=Delete Variable
253
delete_host=Delete static host
252
delete_test=Delete Test
254
delete_test=Delete Test
253
delete_user=Delete User
255
delete_user=Delete User
254
deltest=Deletion test
256
deltest=Deletion test
Lines 260-265 disable=Disable Link Here
260
dn=DN
262
dn=DN
261
dns_cache_manager_title=DNS Cache Manager
263
dns_cache_manager_title=DNS Cache Manager
262
dns_hostname_or_ip=Hostname or IP address
264
dns_hostname_or_ip=Hostname or IP address
265
dns_hosts=Static Hosttable
263
dns_servers=DNS Servers
266
dns_servers=DNS Servers
264
domain=Domain
267
domain=Domain
265
done=Done
268
done=Done
Lines 1348-1351 xpath_tidy_report_errors=Report errors Link Here
1348
xpath_tidy_show_warnings=Show warnings
1351
xpath_tidy_show_warnings=Show warnings
1349
you_must_enter_a_valid_number=You must enter a valid number
1352
you_must_enter_a_valid_number=You must enter a valid number
1350
zh_cn=Chinese (Simplified)
1353
zh_cn=Chinese (Simplified)
1351
zh_tw=Chinese (Traditional)
1354
zh_tw=Chinese (Traditional)
(-)a/src/protocol/http/org/apache/jmeter/protocol/http/control/DNSCacheManager.java (-1 / +69 lines)
Lines 23-28 import java.net.UnknownHostException; Link Here
23
import java.util.ArrayList;
23
import java.util.ArrayList;
24
import java.util.Arrays;
24
import java.util.Arrays;
25
import java.util.LinkedHashMap;
25
import java.util.LinkedHashMap;
26
import java.util.List;
26
import java.util.Map;
27
import java.util.Map;
27
28
28
import org.apache.http.conn.DnsResolver;
29
import org.apache.http.conn.DnsResolver;
Lines 33-38 import org.apache.jmeter.testelement.TestIterationListener; Link Here
33
import org.apache.jmeter.testelement.property.BooleanProperty;
34
import org.apache.jmeter.testelement.property.BooleanProperty;
34
import org.apache.jmeter.testelement.property.CollectionProperty;
35
import org.apache.jmeter.testelement.property.CollectionProperty;
35
import org.apache.jmeter.testelement.property.JMeterProperty;
36
import org.apache.jmeter.testelement.property.JMeterProperty;
37
import org.apache.jmeter.testelement.property.PropertyIterator;
38
import org.apache.jmeter.testelement.property.TestElementProperty;
36
import org.apache.jmeter.threads.JMeterContextService;
39
import org.apache.jmeter.threads.JMeterContextService;
37
import org.apache.jorphan.logging.LoggingManager;
40
import org.apache.jorphan.logging.LoggingManager;
38
import org.apache.log.Logger;
41
import org.apache.log.Logger;
Lines 57-62 import org.xbill.DNS.Type; Link Here
57
 */
60
 */
58
61
59
public class DNSCacheManager extends ConfigTestElement implements TestIterationListener, Serializable, DnsResolver {
62
public class DNSCacheManager extends ConfigTestElement implements TestIterationListener, Serializable, DnsResolver {
63
60
    private static final long serialVersionUID = 2120L;
64
    private static final long serialVersionUID = 2120L;
61
65
62
    private static final Logger log = LoggingManager.getLoggerForClass();
66
    private static final Logger log = LoggingManager.getLoggerForClass();
Lines 72-77 public class DNSCacheManager extends ConfigTestElement implements TestIterationL Link Here
72
76
73
    public static final String SERVERS = "DNSCacheManager.servers"; // $NON-NLS-1$
77
    public static final String SERVERS = "DNSCacheManager.servers"; // $NON-NLS-1$
74
78
79
    public static final String HOSTS = "DNSCacheManager.hosts"; // $NON-NLS-1$
80
75
    public static final String IS_CUSTOM_RESOLVER = "DNSCacheManager.isCustomResolver"; // $NON-NLS-1$
81
    public static final String IS_CUSTOM_RESOLVER = "DNSCacheManager.isCustomResolver"; // $NON-NLS-1$
76
    //-- JMX tag values
82
    //-- JMX tag values
77
83
Lines 79-84 public class DNSCacheManager extends ConfigTestElement implements TestIterationL Link Here
79
85
80
    public static final String DEFAULT_SERVERS = ""; // $NON-NLS-1$
86
    public static final String DEFAULT_SERVERS = ""; // $NON-NLS-1$
81
87
88
    public static final String DEFAULT_HOSTS = ""; // $NON-NLS-1$
89
82
    public static final boolean DEFAULT_IS_CUSTOM_RESOLVER = false;
90
    public static final boolean DEFAULT_IS_CUSTOM_RESOLVER = false;
83
91
84
    private final transient Cache lookupCache;
92
    private final transient Cache lookupCache;
Lines 89-94 public class DNSCacheManager extends ConfigTestElement implements TestIterationL Link Here
89
97
90
    public DNSCacheManager() {
98
    public DNSCacheManager() {
91
        setProperty(new CollectionProperty(SERVERS, new ArrayList<String>()));
99
        setProperty(new CollectionProperty(SERVERS, new ArrayList<String>()));
100
        setProperty(new CollectionProperty(HOSTS, new ArrayList<StaticHost>()));
92
        //disabling cache
101
        //disabling cache
93
        lookupCache = new Cache();
102
        lookupCache = new Cache();
94
        lookupCache.setMaxCache(0);
103
        lookupCache.setMaxCache(0);
Lines 129-135 public class DNSCacheManager extends ConfigTestElement implements TestIterationL Link Here
129
     */
138
     */
130
    @Override
139
    @Override
131
    public InetAddress[] resolve(String host) throws UnknownHostException {
140
    public InetAddress[] resolve(String host) throws UnknownHostException {
132
        if (cache.containsKey(host)) {
141
        log.debug("Resolve host: " + host);
142
        if (isStaticHost(host)) {
143
            return fromStaticHost(host);
144
        } else if (cache.containsKey(host)) {
133
            if (log.isDebugEnabled()) {
145
            if (log.isDebugEnabled()) {
134
                log.debug("Cache hit thr#" + JMeterContextService.getContext().getThreadNum() + ": " + host + "=>"
146
                log.debug("Cache hit thr#" + JMeterContextService.getContext().getThreadNum() + ": " + host + "=>"
135
                        + Arrays.toString(cache.get(host)));
147
                        + Arrays.toString(cache.get(host)));
Lines 146-151 public class DNSCacheManager extends ConfigTestElement implements TestIterationL Link Here
146
        }
158
        }
147
    }
159
    }
148
160
161
    private boolean isStaticHost(String host) {
162
        CollectionProperty property = (CollectionProperty) getProperty(HOSTS);
163
        PropertyIterator iterator = property.iterator();
164
        while (iterator.hasNext()) {
165
            TestElementProperty possibleEntry = (TestElementProperty) iterator.next();
166
            if (log.isDebugEnabled()) {
167
                log.debug("Look for "  + host + " at " + possibleEntry.getObjectValue() + " : " + possibleEntry.getObjectValue().getClass());
168
            }
169
            StaticHost entry = (StaticHost) possibleEntry.getObjectValue();
170
            if (entry.getName().equalsIgnoreCase(host)) {
171
                if (log.isDebugEnabled()) {
172
                    log.debug("Found static host: " + host + " => " + entry.getAddress());
173
                }
174
                return true;
175
            }
176
        }
177
        if (log.isDebugEnabled()) {
178
            log.debug("No static host found for " + host);
179
        }
180
        return false;
181
    }
182
183
    private InetAddress[] fromStaticHost(String host) {
184
        CollectionProperty property = (CollectionProperty) getProperty(HOSTS);
185
        PropertyIterator iterator = property.iterator();
186
        while (iterator.hasNext()) {
187
            StaticHost entry = (StaticHost) ((TestElementProperty)iterator.next()).getObjectValue();
188
            if (entry.getName().equals(host)) {
189
                List<InetAddress> addresses = new ArrayList<>();
190
                for (String address : Arrays.asList(entry.getAddress().split("\\s*,\\s*"))) {
191
                    try {
192
                        addresses.add(InetAddress.getByName(address));
193
                    } catch (UnknownHostException e) {
194
                        log.warn("Couldn't resolve static address " + address + " for host " + host, e);
195
                    }
196
                }
197
                return addresses.toArray(new InetAddress[addresses.size()]);
198
            }
199
        }
200
        return new InetAddress[0];
201
    }
202
149
    /**
203
    /**
150
     * Sends DNS request via system or custom DNS resolver
204
     * Sends DNS request via system or custom DNS resolver
151
     */
205
     */
Lines 197-202 public class DNSCacheManager extends ConfigTestElement implements TestIterationL Link Here
197
    public void clear() {
251
    public void clear() {
198
        super.clear();
252
        super.clear();
199
        clearServers(); // ensure data is set up OK initially
253
        clearServers(); // ensure data is set up OK initially
254
        clearHosts();
200
    }
255
    }
201
256
202
    /**
257
    /**
Lines 215-220 public class DNSCacheManager extends ConfigTestElement implements TestIterationL Link Here
215
        return (CollectionProperty) getProperty(SERVERS);
270
        return (CollectionProperty) getProperty(SERVERS);
216
    }
271
    }
217
272
273
    private void clearHosts() {
274
        log.debug("Clear all hosts from store");
275
        setProperty(new CollectionProperty(HOSTS, new ArrayList<StaticHost>()));
276
    }
277
278
    public void addHost(String dnsHost, String addresses) {
279
        getHosts().addItem(new StaticHost(dnsHost, addresses));
280
    }
281
282
    public CollectionProperty getHosts() {
283
        return (CollectionProperty) getProperty(HOSTS);
284
    }
285
218
    /**
286
    /**
219
     * Clean DNS cache each iteration
287
     * Clean DNS cache each iteration
220
     * 
288
     * 
(-)a/src/protocol/http/org/apache/jmeter/protocol/http/control/StaticHost.java (+62 lines)
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.control;
19
20
import java.io.Serializable;
21
22
import org.apache.jmeter.testelement.AbstractTestElement;
23
24
public class StaticHost extends AbstractTestElement implements Serializable {
25
26
    private static final long serialVersionUID = 1L;
27
28
    private static final String SNAME = "StaticHost.Name";
29
    private static final String SADDRESS = "StaticHost.Address";
30
31
    public StaticHost() {
32
        this("", "");
33
    }
34
35
    public StaticHost(String name, String address) {
36
        setProperty(SNAME, name);
37
        setProperty(SADDRESS, address);
38
    }
39
40
    @Override
41
    public void setName(String name) {
42
        setProperty(SNAME, name);
43
    }
44
45
    @Override
46
    public String getName() {
47
        return getPropertyAsString(SNAME);
48
    }
49
50
    public void setAddress(String address) {
51
        setProperty(SADDRESS, address);
52
    }
53
54
    public String getAddress() {
55
        return getPropertyAsString(SADDRESS);
56
    }
57
58
    @Override
59
    public String toString() {
60
        return String.format("StaticHost(%s, %s)", getName(), getAddress());
61
    }
62
}
(-)a/src/protocol/http/org/apache/jmeter/protocol/http/gui/DNSCachePanel.java (-41 / +136 lines)
Lines 36-46 import javax.swing.ListSelectionModel; Link Here
36
import org.apache.jmeter.config.gui.AbstractConfigGui;
36
import org.apache.jmeter.config.gui.AbstractConfigGui;
37
import org.apache.jmeter.gui.util.PowerTableModel;
37
import org.apache.jmeter.gui.util.PowerTableModel;
38
import org.apache.jmeter.protocol.http.control.DNSCacheManager;
38
import org.apache.jmeter.protocol.http.control.DNSCacheManager;
39
import org.apache.jmeter.protocol.http.control.StaticHost;
39
import org.apache.jmeter.testelement.TestElement;
40
import org.apache.jmeter.testelement.TestElement;
40
import org.apache.jmeter.testelement.property.JMeterProperty;
41
import org.apache.jmeter.testelement.property.JMeterProperty;
41
import org.apache.jmeter.util.JMeterUtils;
42
import org.apache.jmeter.util.JMeterUtils;
42
import org.apache.jorphan.gui.GuiUtils;
43
import org.apache.jorphan.gui.GuiUtils;
43
import org.apache.jorphan.gui.layout.VerticalLayout;
44
import org.apache.jorphan.gui.layout.VerticalLayout;
45
import org.slf4j.Logger;
46
import org.slf4j.LoggerFactory;
44
47
45
/**
48
/**
46
 * This gui part of @see
49
 * This gui part of @see
Lines 55-72 import org.apache.jorphan.gui.layout.VerticalLayout; Link Here
55
 */
58
 */
56
public class DNSCachePanel extends AbstractConfigGui implements ActionListener {
59
public class DNSCachePanel extends AbstractConfigGui implements ActionListener {
57
60
61
    private static final Logger LOGGER = LoggerFactory.getLogger(DNSCacheManager.class);
62
58
    private static final long serialVersionUID = 2120L;
63
    private static final long serialVersionUID = 2120L;
59
64
60
    public static final String OPTIONS = JMeterUtils.getResString("option");
65
    public static final String OPTIONS = JMeterUtils.getResString("option");
61
66
62
    private static final String ADD_COMMAND = JMeterUtils.getResString("add"); // $NON-NLS-1$
67
    private static final String ADD_COMMAND = JMeterUtils.getResString("add"); // $NON-NLS-1$
63
68
69
    private static final String ADD_HOST_COMMAND = JMeterUtils.getResString("add_host"); // $NON-NLS-1$
70
64
    private static final String DELETE_COMMAND = JMeterUtils.getResString("delete"); // $NON-NLS-1$
71
    private static final String DELETE_COMMAND = JMeterUtils.getResString("delete"); // $NON-NLS-1$
65
72
73
    private static final String DELETE_HOST_COMMAND = JMeterUtils.getResString("delete_host"); // $NON-NLS-1$
74
66
    private static final String SYS_RES_COMMAND = JMeterUtils.getResString("use_system_dns_resolver"); // $NON-NLS-1$
75
    private static final String SYS_RES_COMMAND = JMeterUtils.getResString("use_system_dns_resolver"); // $NON-NLS-1$
67
76
68
    private static final String CUST_RES_COMMAND = JMeterUtils.getResString("use_custom_dns_resolver"); // $NON-NLS-1$
77
    private static final String CUST_RES_COMMAND = JMeterUtils.getResString("use_custom_dns_resolver"); // $NON-NLS-1$
69
78
79
    private JTable dnsHostsTable;
80
81
    private JPanel dnsHostsPanel;
82
    private JPanel dnsHostsButPanel;
83
70
    private JTable dnsServersTable;
84
    private JTable dnsServersTable;
71
85
72
    private JPanel dnsServersPanel;
86
    private JPanel dnsServersPanel;
Lines 74-79 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
74
    private JPanel dnsServButPanel;
88
    private JPanel dnsServButPanel;
75
89
76
    private PowerTableModel dnsServersTableModel;
90
    private PowerTableModel dnsServersTableModel;
91
    private PowerTableModel dnsHostsTableModel;
77
92
78
    private JRadioButton sysResButton;
93
    private JRadioButton sysResButton;
79
94
Lines 83-88 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
83
98
84
    private JButton addButton;
99
    private JButton addButton;
85
100
101
    private JButton addHostButton;
102
    private JButton deleteHostButton;
103
86
    private ButtonGroup providerDNSradioGroup = new ButtonGroup();
104
    private ButtonGroup providerDNSradioGroup = new ButtonGroup();
87
105
88
    private static final String[] COLUMN_RESOURCE_NAMES = {
106
    private static final String[] COLUMN_RESOURCE_NAMES = {
Lines 91-96 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
91
    private static final Class<?>[] columnClasses = {
109
    private static final Class<?>[] columnClasses = {
92
        String.class };
110
        String.class };
93
111
112
    private static final String[] HOSTS_COLUMN_RESOURCE_NAMES = { "host", JMeterUtils.getResString("dns_hostname_or_ip") };
113
    private static final Class<?>[] HOSTS_COLUMN_CLASSES = { String.class, String.class };
114
94
    private JCheckBox clearEachIteration;
115
    private JCheckBox clearEachIteration;
95
116
96
    /**
117
    /**
Lines 121-126 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
121
                String server = (String) dnsServersTableModel.getRowData(i)[0];
142
                String server = (String) dnsServersTableModel.getRowData(i)[0];
122
                dnsCacheManager.addServer(server);
143
                dnsCacheManager.addServer(server);
123
            }
144
            }
145
            for (int i = 0; i < dnsHostsTableModel.getRowCount(); i++) {
146
                String host = (String) dnsHostsTableModel.getRowData(i)[0];
147
                String addresses = (String) dnsHostsTableModel.getRowData(i)[1];
148
                dnsCacheManager.addHost(host, addresses);
149
            }
124
            dnsCacheManager.setClearEachIteration(clearEachIteration.isSelected());
150
            dnsCacheManager.setClearEachIteration(clearEachIteration.isSelected());
125
            if (providerDNSradioGroup.isSelected(custResButton.getModel())) {
151
            if (providerDNSradioGroup.isSelected(custResButton.getModel())) {
126
                dnsCacheManager.setCustomResolver(true);
152
                dnsCacheManager.setCustomResolver(true);
Lines 140-145 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
140
        providerDNSradioGroup.setSelected(sysResButton.getModel(), true);
166
        providerDNSradioGroup.setSelected(sysResButton.getModel(), true);
141
        dnsServersTableModel.clearData();
167
        dnsServersTableModel.clearData();
142
        deleteButton.setEnabled(false);
168
        deleteButton.setEnabled(false);
169
        dnsHostsTableModel.clearData();
170
        deleteHostButton.setEnabled(false);
143
171
144
    }
172
    }
145
173
Lines 150-155 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
150
        }
178
        }
151
    }
179
    }
152
180
181
    private void populateHostsTable(DNSCacheManager resolver) {
182
        dnsHostsTableModel.clearData();
183
        for (JMeterProperty hostEntry : resolver.getHosts()) {
184
            addHostToTable((StaticHost) hostEntry.getObjectValue());
185
        }
186
    }
187
153
    @Override
188
    @Override
154
    public TestElement createTestElement() {
189
    public TestElement createTestElement() {
155
        DNSCacheManager dnsCacheManager = new DNSCacheManager();
190
        DNSCacheManager dnsCacheManager = new DNSCacheManager();
Lines 163-173 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
163
198
164
        DNSCacheManager dnsCacheManager = (DNSCacheManager) el;
199
        DNSCacheManager dnsCacheManager = (DNSCacheManager) el;
165
        populateTable(dnsCacheManager);
200
        populateTable(dnsCacheManager);
201
        populateHostsTable(dnsCacheManager);
166
        clearEachIteration.setSelected(dnsCacheManager.isClearEachIteration());
202
        clearEachIteration.setSelected(dnsCacheManager.isClearEachIteration());
167
        if (dnsCacheManager.isCustomResolver()) {
203
        if (dnsCacheManager.isCustomResolver()) {
168
            providerDNSradioGroup.setSelected(custResButton.getModel(), true);
204
            providerDNSradioGroup.setSelected(custResButton.getModel(), true);
169
            deleteButton.setEnabled(dnsServersTable.getColumnCount() > 0);
205
            deleteButton.setEnabled(dnsServersTable.getColumnCount() > 0);
206
            deleteHostButton.setEnabled(dnsHostsTable.getColumnCount() > 0);
170
            addButton.setEnabled(true);
207
            addButton.setEnabled(true);
208
            addHostButton.setEnabled(true);
171
        } else {
209
        } else {
172
            providerDNSradioGroup.setSelected(sysResButton.getModel(), true);
210
            providerDNSradioGroup.setSelected(sysResButton.getModel(), true);
173
        }
211
        }
Lines 175-180 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
175
213
176
    private void init() { // WARNING: called from ctor so must not be overridden (i.e. must be private or final)
214
    private void init() { // WARNING: called from ctor so must not be overridden (i.e. must be private or final)
177
        dnsServersTableModel = new PowerTableModel(COLUMN_RESOURCE_NAMES, columnClasses);
215
        dnsServersTableModel = new PowerTableModel(COLUMN_RESOURCE_NAMES, columnClasses);
216
        dnsHostsTableModel = new PowerTableModel(HOSTS_COLUMN_RESOURCE_NAMES, HOSTS_COLUMN_CLASSES);
178
217
179
        clearEachIteration = new JCheckBox(JMeterUtils.getResString("clear_cache_each_iteration"), true); //$NON-NLS-1$
218
        clearEachIteration = new JCheckBox(JMeterUtils.getResString("clear_cache_each_iteration"), true); //$NON-NLS-1$
180
        setLayout(new BorderLayout());
219
        setLayout(new BorderLayout());
Lines 190-197 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
190
        northPanel.add(optionsPane);
229
        northPanel.add(optionsPane);
191
        add(northPanel, BorderLayout.NORTH);
230
        add(northPanel, BorderLayout.NORTH);
192
231
232
        JPanel tables = new JPanel();
233
        tables.setLayout(new VerticalLayout(2, VerticalLayout.BOTH));
193
        dnsServersPanel = createDnsServersTablePanel();
234
        dnsServersPanel = createDnsServersTablePanel();
194
        add(dnsServersPanel, BorderLayout.CENTER);
235
        dnsHostsPanel = createDnsHostsTablePanel();
236
        tables.add(dnsServersPanel);
237
        tables.add(dnsHostsPanel);
238
        add(tables, BorderLayout.CENTER);
239
195
240
196
    }
241
    }
197
242
Lines 212-217 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
212
        return panel;
257
        return panel;
213
    }
258
    }
214
259
260
    public JPanel createDnsHostsTablePanel() {
261
        // create the JTable that holds header per row
262
        dnsHostsTable = new JTable(dnsHostsTableModel);
263
        JMeterUtils.applyHiDPI(dnsHostsTable);
264
        dnsHostsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
265
        dnsHostsTable.setPreferredScrollableViewportSize(new Dimension(400, 100));
266
267
        JPanel panel = new JPanel(new BorderLayout(0, 5));
268
        panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
269
                JMeterUtils.getResString("dns_Hosts"))); // $NON-NLS-1$
270
        JScrollPane dnsHostsScrollPane = new JScrollPane(dnsHostsTable);
271
        panel.add(dnsHostsScrollPane, BorderLayout.CENTER);
272
        dnsHostsButPanel = createHostsButtonPanel();
273
        panel.add(dnsHostsButPanel, BorderLayout.SOUTH);
274
        return panel;
275
    }
276
215
    private JPanel createChooseResPanel() {
277
    private JPanel createChooseResPanel() {
216
        JPanel chooseResPanel = new JPanel(new BorderLayout(0, 5));
278
        JPanel chooseResPanel = new JPanel(new BorderLayout(0, 5));
217
        sysResButton = new JRadioButton();
279
        sysResButton = new JRadioButton();
Lines 248-253 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
248
        return buttonPanel;
310
        return buttonPanel;
249
    }
311
    }
250
312
313
    private JPanel createHostsButtonPanel() {
314
        boolean tableEmpty = dnsHostsTableModel.getRowCount() == 0;
315
316
        addHostButton = createButton("add_host", 'H', ADD_HOST_COMMAND, custResButton.isSelected()); // $NON-NLS-1$
317
        deleteHostButton = createButton("delete_host", 'X', DELETE_HOST_COMMAND, !tableEmpty); // $NON-NLS-1$
318
319
        JPanel buttonPanel = new JPanel();
320
        buttonPanel.add(addHostButton, BorderLayout.WEST);
321
        buttonPanel.add(deleteHostButton, BorderLayout.LINE_END);
322
        return buttonPanel;
323
    }
324
251
    private JButton createButton(String resName, char mnemonic, String command, boolean enabled) {
325
    private JButton createButton(String resName, char mnemonic, String command, boolean enabled) {
252
        JButton button = new JButton(JMeterUtils.getResString(resName));
326
        JButton button = new JButton(JMeterUtils.getResString(resName));
253
        button.setMnemonic(mnemonic);
327
        button.setMnemonic(mnemonic);
Lines 262-324 public class DNSCachePanel extends AbstractConfigGui implements ActionListener { Link Here
262
            dnsServer });
336
            dnsServer });
263
    }
337
    }
264
338
339
    private void addHostToTable(StaticHost hostEntry) {
340
        LOGGER.debug("Adding entry {}", hostEntry);
341
        dnsHostsTableModel.addRow(new Object[] {
342
            hostEntry.getName(), hostEntry.getAddress() });
343
    }
344
265
    @Override
345
    @Override
266
    public void actionPerformed(ActionEvent e) {
346
    public void actionPerformed(ActionEvent e) {
267
        String action = e.getActionCommand();
347
        String action = e.getActionCommand();
268
        dnsServersTable.setEnabled(custResButton.isSelected());
348
349
        enableTable(custResButton.isSelected(), sysResButton.isSelected(), dnsServersTable, dnsServersTableModel,
350
                addButton, deleteButton);
351
        enableTable(custResButton.isSelected(), sysResButton.isSelected(), dnsHostsTable, dnsHostsTableModel,
352
                addHostButton, deleteHostButton);
353
354
        if (action.equals(DELETE_COMMAND)) {
355
            deleteTableRow(dnsServersTable, dnsServersTableModel, deleteButton);
356
        } else if (action.equals(ADD_COMMAND)) {
357
            addTableRow(dnsServersTable, dnsServersTableModel, deleteButton);
358
        } else if (DELETE_HOST_COMMAND.equals(action)) {
359
            deleteTableRow(dnsHostsTable, dnsHostsTableModel, deleteHostButton);
360
        } else if (ADD_HOST_COMMAND.equals(action)) {
361
            addTableRow(dnsHostsTable, dnsHostsTableModel, deleteHostButton);
362
        }
363
    }
364
365
    private void enableTable(boolean custEnabled, boolean sysEnabled, JTable table, PowerTableModel model,
366
            JButton addButton, JButton deleteButton) {
367
        table.setEnabled(custEnabled);
269
        Color greyColor = new Color(240, 240, 240);
368
        Color greyColor = new Color(240, 240, 240);
270
        Color blueColor = new Color(184, 207, 229);
369
        Color blueColor = new Color(184, 207, 229);
271
        dnsServersTable.setBackground(sysResButton.isSelected() ? greyColor : Color.WHITE);
370
        table.setBackground(sysEnabled ? greyColor : Color.WHITE);
272
        dnsServersTable.setSelectionBackground(sysResButton.isSelected() ? greyColor : blueColor);
371
        table.setSelectionBackground(sysEnabled ? greyColor : blueColor);
273
        addButton.setEnabled(custResButton.isSelected());
372
        addButton.setEnabled(custEnabled);
274
        deleteButton.setEnabled(custResButton.isSelected());
373
        deleteButton.setEnabled(custEnabled);
275
        if (custResButton.isSelected() && (dnsServersTableModel.getRowCount() > 0)) {
374
        if (custEnabled && (model.getRowCount() > 0)) {
276
            deleteButton.setEnabled(true);
375
            deleteButton.setEnabled(true);
277
            addButton.setEnabled(true);
376
            addButton.setEnabled(true);
278
        }
377
        }
378
    }
279
379
280
        if (action.equals(DELETE_COMMAND)) {
380
    private void addTableRow(JTable table, PowerTableModel model, JButton button) {
281
            if (dnsServersTableModel.getRowCount() > 0) {
381
        // If a table cell is being edited, we should accept the current
282
                // If a table cell is being edited, we must cancel the editing
382
        // value and stop the editing before adding a new row.
283
                // before deleting the row.
383
        GuiUtils.stopTableEditing(table);
284
                GuiUtils.cancelEditing(dnsServersTable);
285
384
286
                int rowSelected = dnsServersTable.getSelectedRow();
385
        model.addNewRow();
386
        model.fireTableDataChanged();
287
387
288
                if (rowSelected != -1) {
388
        if (!button.isEnabled()) {
289
                    dnsServersTableModel.removeRow(rowSelected);
389
            button.setEnabled(true);
290
                    dnsServersTableModel.fireTableDataChanged();
390
        }
291
391
292
                    if (dnsServersTableModel.getRowCount() == 0) {
392
        // Highlight (select) the appropriate row.
293
                        deleteButton.setEnabled(false);
393
        int rowToSelect = model.getRowCount() - 1;
294
                    }
394
        table.setRowSelectionInterval(rowToSelect, rowToSelect);
395
    }
295
396
296
                    else {
397
    private void deleteTableRow(JTable table, PowerTableModel model, JButton button) {
297
                        int rowToSelect = rowSelected;
398
        if (model.getRowCount() > 0) {
399
            // If a table cell is being edited, we must cancel the editing
400
            // before deleting the row.
401
            GuiUtils.cancelEditing(table);
298
402
299
                        if (rowSelected >= dnsServersTableModel.getRowCount()) {
403
            int rowSelected = table.getSelectedRow();
300
                            rowToSelect = rowSelected - 1;
301
                        }
302
404
303
                        dnsServersTable.setRowSelectionInterval(rowToSelect, rowToSelect);
405
            if (rowSelected != -1) {
304
                    }
406
                model.removeRow(rowSelected);
305
                }
407
                model.fireTableDataChanged();
306
            }
307
        } else if (action.equals(ADD_COMMAND)) {
308
            // If a table cell is being edited, we should accept the current
309
            // value and stop the editing before adding a new row.
310
            GuiUtils.stopTableEditing(dnsServersTable);
311
408
312
            dnsServersTableModel.addNewRow();
409
                if (model.getRowCount() == 0) {
313
            dnsServersTableModel.fireTableDataChanged();
410
                    button.setEnabled(false);
411
                }
314
412
315
            if (!deleteButton.isEnabled()) {
413
                else {
316
                deleteButton.setEnabled(true);
414
                    int rowToSelect = Math.min(rowSelected, model.getRowCount() - 1);
415
                    table.setRowSelectionInterval(rowToSelect, rowToSelect);
416
                }
317
            }
417
            }
318
319
            // Highlight (select) the appropriate row.
320
            int rowToSelect = dnsServersTableModel.getRowCount() - 1;
321
            dnsServersTable.setRowSelectionInterval(rowToSelect, rowToSelect);
322
        }
418
        }
323
    }
419
    }
324
}
420
}
325
- 

Return to bug 59174