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

(-)bin/saveservice.properties (+2 lines)
Lines 111-116 Link Here
111
CriticalSectionControllerGui=org.apache.jmeter.control.gui.CriticalSectionControllerGui
111
CriticalSectionControllerGui=org.apache.jmeter.control.gui.CriticalSectionControllerGui
112
CounterConfigGui=org.apache.jmeter.modifiers.gui.CounterConfigGui
112
CounterConfigGui=org.apache.jmeter.modifiers.gui.CounterConfigGui
113
CSVDataSet=org.apache.jmeter.config.CSVDataSet
113
CSVDataSet=org.apache.jmeter.config.CSVDataSet
114
DNSCacheManager=org.apache.jmeter.protocol.http.control.DNSCacheManager
115
DNSCachePanel=org.apache.jmeter.protocol.http.gui.DNSCachePanel
114
DebugPostProcessor=org.apache.jmeter.extractor.DebugPostProcessor
116
DebugPostProcessor=org.apache.jmeter.extractor.DebugPostProcessor
115
DebugSampler=org.apache.jmeter.sampler.DebugSampler
117
DebugSampler=org.apache.jmeter.sampler.DebugSampler
116
DistributionGraphVisualizer=org.apache.jmeter.visualizers.DistributionGraphVisualizer
118
DistributionGraphVisualizer=org.apache.jmeter.visualizers.DistributionGraphVisualizer
(-)xdocs/usermanual/component_reference.xml (-5 / +25 lines)
Lines 153-159 Link Here
153
         </li>
153
         </li>
154
         <li>It does not support virtual hosts.</li>
154
         <li>It does not support virtual hosts.</li>
155
         </ul>
155
         </ul>
156
         <p>Note: the FILE protocol is intended for testing purposes only. 
156
         <p>Note: the FILE protocol is intended for testing purposes only.
157
         It is handled by the same code regardless of which HTTP Sampler is used.</p>
157
         It is handled by the same code regardless of which HTTP Sampler is used.</p>
158
        <p>If the request requires server or proxy login authorization (i.e. where a browser would create a pop-up dialog box),
158
        <p>If the request requires server or proxy login authorization (i.e. where a browser would create a pop-up dialog box),
159
         you will also have to add an <complink name="HTTP Authorization Manager"/> Configuration Element.
159
         you will also have to add an <complink name="HTTP Authorization Manager"/> Configuration Element.
Lines 2521-2531 Link Here
2521
2521
2522
<component name="Critical Section Controller" index="&sect-num;.2.17" width="469" height="129" screenshot="logic-controller/critical-section-controller.png">
2522
<component name="Critical Section Controller" index="&sect-num;.2.17" width="469" height="129" screenshot="logic-controller/critical-section-controller.png">
2523
<description>
2523
<description>
2524
<p>The Critical Section Controller ensures that its children elements (samplers/controllers, etc) will be executed 
2524
<p>The Critical Section Controller ensures that its children elements (samplers/controllers, etc) will be executed
2525
by only one thread as a named lock will be taken before executing children of controller.</p>
2525
by only one thread as a named lock will be taken before executing children of controller.</p>
2526
</description>
2526
</description>
2527
<p>
2527
<p>
2528
    The figure below shows an example of using Critical Section Controller, in the figure below 2 Critical Section Controllers ensure 
2528
    The figure below shows an example of using Critical Section Controller, in the figure below 2 Critical Section Controllers ensure
2529
    that:
2529
    that:
2530
    <ul>
2530
    <ul>
2531
        <li>DS2-${__threadNum} is executed only by one thread at a time</li>
2531
        <li>DS2-${__threadNum} is executed only by one thread at a time</li>
Lines 3556-3562 Link Here
3556
<ul>
3556
<ul>
3557
<li>kerberos.spnego.strip_port=false</li>
3557
<li>kerberos.spnego.strip_port=false</li>
3558
</ul>
3558
</ul>
3559
</pre> 
3559
</pre>
3560
</p>
3560
</p>
3561
<br></br>
3561
<br></br>
3562
<b>Controls:</b>
3562
<b>Controls:</b>
Lines 3637-3642 Link Here
3637
</properties>
3637
</properties>
3638
</component>
3638
</component>
3639
3639
3640
<component name="DNS Cache Manager" index="&sect-num;.4.4"  width="513" height="383" screenshot="http-config/dns-cache-manager.png">
3641
    <note>DNS Cache Manager is designed for using in the root of Thread Group or Test Plan. Do not place it as child element of particular HTTP Sampler
3642
    </note>
3643
    <description><p>The DNS Cache Manager element allows to test applications, which have several servers behind load balancers(CDN,etc), when user receives content from different IP's. By default JMeter uses JVM DNS cache. That's why
3644
    only one server from the cluster receives load. DNS Cache Manager resolves name for each thread separately each iteration and
3645
    saves results of resolving to its internal DNS Cache, which independent from both JVM and OS DNS caches.
3646
    </p>
3647
    </description>
3648
    <properties>
3649
    <property name="Name" required="No">Descriptive name for this element that is shown in the tree. </property>
3650
    <property name="Clear cache each Iteration" required="Yes">If selected, DNS cache of every  Thread is cleared each time new iteration is started.</property>
3651
    <property name="Use system DNS resolver" required="N/A">System DNS resolver will be used. For correct work edit
3652
        $JAVA_HOME/jre/lib/security/java.security: add "networkaddress.cache.ttl=0"
3653
    </property>
3654
    <property name="Use custom DNS resolver" required="N/A">Custom DNS resolver(from dnsjava library) will be used.</property>
3655
    <property name="Add Button" required="N/A">Add an entry to the DNS servers table.</property>
3656
    <property name="Delete Button" required="N/A">Delete the currently selected table entry.</property>
3657
    </properties>
3658
</component>
3659
3640
<component name="HTTP Cookie Manager" index="&sect-num;.4.4"  width="513" height="383" screenshot="http-config/http-cookie-manager.png">
3660
<component name="HTTP Cookie Manager" index="&sect-num;.4.4"  width="513" height="383" screenshot="http-config/http-cookie-manager.png">
3641
3661
3642
<note>If there is more than one Cookie Manager in the scope of a Sampler,
3662
<note>If there is more than one Cookie Manager in the scope of a Sampler,
Lines 4756-4762 Link Here
4756
Only a forced stop will stop it. Setting Timeout in milliseconds is an option to consider in this case.
4776
Only a forced stop will stop it. Setting Timeout in milliseconds is an option to consider in this case.
4757
</note>
4777
</note>
4758
<note>
4778
<note>
4759
Synchronizing timer blocks only within one JVM, so if using Distributed testing ensure you never set "Number of Simultaneous Users to Group by" to a value superior to the number of users 
4779
Synchronizing timer blocks only within one JVM, so if using Distributed testing ensure you never set "Number of Simultaneous Users to Group by" to a value superior to the number of users
4760
of its containing Thread group considering 1 injector only.
4780
of its containing Thread group considering 1 injector only.
4761
</note>
4781
</note>
4762
4782
(-)build.properties (+6 lines)
Lines 347-349 Link Here
347
commons-lang.jar            = commons-lang-${commons-lang.version}.jar
347
commons-lang.jar            = commons-lang-${commons-lang.version}.jar
348
commons-lang.loc            = ${maven2.repo}/commons-lang/commons-lang/${commons-lang.version}
348
commons-lang.loc            = ${maven2.repo}/commons-lang/commons-lang/${commons-lang.version}
349
commons-lang.md5            = 4d5c1693079575b362edf41500630bbd
349
commons-lang.md5            = 4d5c1693079575b362edf41500630bbd
350
351
# dnsjava for DNSCacheManager
352
dnsjava.version             = 2.1.6
353
dnsjava.jar                 = dnsjava-${dnsjava.version}.jar
354
dnsjava.loc                 = ${maven2.repo}/dnsjava/dnsjava/${dnsjava.version}
355
dnsjava.md5                 = 4f95b291e738bb7c5a8773b22749afc3
(-)src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java (-2 / +13 lines)
Lines 74-79 Link Here
74
import org.apache.http.client.params.CookiePolicy;
74
import org.apache.http.client.params.CookiePolicy;
75
import org.apache.http.client.protocol.ResponseContentEncoding;
75
import org.apache.http.client.protocol.ResponseContentEncoding;
76
import org.apache.http.conn.ConnectionKeepAliveStrategy;
76
import org.apache.http.conn.ConnectionKeepAliveStrategy;
77
import org.apache.http.conn.DnsResolver;
77
import org.apache.http.conn.params.ConnRoutePNames;
78
import org.apache.http.conn.params.ConnRoutePNames;
78
import org.apache.http.conn.scheme.Scheme;
79
import org.apache.http.conn.scheme.Scheme;
79
import org.apache.http.conn.scheme.SchemeRegistry;
80
import org.apache.http.conn.scheme.SchemeRegistry;
Lines 89-94 Link Here
89
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
90
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
90
import org.apache.http.impl.client.DefaultHttpClient;
91
import org.apache.http.impl.client.DefaultHttpClient;
91
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
92
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
93
import org.apache.http.impl.conn.PoolingClientConnectionManager;
94
import org.apache.http.impl.conn.SchemeRegistryFactory;
95
import org.apache.http.impl.conn.SystemDefaultDnsResolver;
92
import org.apache.http.message.BasicNameValuePair;
96
import org.apache.http.message.BasicNameValuePair;
93
import org.apache.http.params.BasicHttpParams;
97
import org.apache.http.params.BasicHttpParams;
94
import org.apache.http.params.CoreConnectionPNames;
98
import org.apache.http.params.CoreConnectionPNames;
Lines 633-640 Link Here
633
        if (httpClient == null){ // One-time init for this client
637
        if (httpClient == null){ // One-time init for this client
634
638
635
            HttpParams clientParams = new DefaultedHttpParams(new BasicHttpParams(), DEFAULT_HTTP_PARAMS);
639
            HttpParams clientParams = new DefaultedHttpParams(new BasicHttpParams(), DEFAULT_HTTP_PARAMS);
636
            
640
637
            httpClient = new DefaultHttpClient(clientParams){
641
            DnsResolver resolver= this.testElement.getDNSResolver();
642
            if(resolver==null){
643
                resolver= new SystemDefaultDnsResolver();
644
            }
645
            PoolingClientConnectionManager poolingClientConnectionManager=
646
                    new PoolingClientConnectionManager(SchemeRegistryFactory.createDefault(),resolver);
647
648
            httpClient = new DefaultHttpClient(poolingClientConnectionManager, clientParams) {
638
                @Override
649
                @Override
639
                protected HttpRequestRetryHandler createHttpRequestRetryHandler() {
650
                protected HttpRequestRetryHandler createHttpRequestRetryHandler() {
640
                    return new DefaultHttpRequestRetryHandler(RETRY_COUNT, false); // set retry count
651
                    return new DefaultHttpRequestRetryHandler(RETRY_COUNT, false); // set retry count
(-)src/protocol/http/org/apache/jmeter/protocol/http/control/DNSCacheManager.java (+221 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
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.control;
20
21
import org.apache.http.conn.DnsResolver;
22
import org.apache.http.impl.conn.SystemDefaultDnsResolver;
23
import org.apache.jmeter.config.ConfigTestElement;
24
import org.apache.jmeter.engine.event.LoopIterationEvent;
25
import org.apache.jmeter.testelement.TestIterationListener;
26
import org.apache.jmeter.testelement.property.BooleanProperty;
27
import org.apache.jmeter.testelement.property.CollectionProperty;
28
import org.apache.jmeter.testelement.property.PropertyIterator;
29
import org.apache.jmeter.threads.JMeterContextService;
30
import org.apache.jorphan.logging.LoggingManager;
31
import org.apache.log.Logger;
32
import org.xbill.DNS.Cache;
33
import org.xbill.DNS.Lookup;
34
import org.xbill.DNS.Resolver;
35
import org.xbill.DNS.ExtendedResolver;
36
import org.xbill.DNS.Record;
37
import org.xbill.DNS.Type;
38
import org.xbill.DNS.TextParseException;
39
import org.xbill.DNS.SimpleResolver;
40
import org.xbill.DNS.ARecord;
41
42
import java.io.Serializable;
43
import java.net.InetAddress;
44
import java.net.UnknownHostException;
45
import java.util.*;
46
47
/**
48
 * This config element provides ability to have flexible control over DNS caching function.
49
 * Depending on option from @see {@link org.apache.jmeter.protocol.http.gui.DNSCachePanel},
50
 * either system or custom resolver can be used. Custom resolver uses dnsjava library, and gives
51
 * ability to bypass both OS and JVM cache. It allows to use paradigm
52
 * "1 virtual user - 1 DNS cache" in performance tests.
53
 *
54
 * @since 2.12
55
 */
56
57
public class DNSCacheManager extends ConfigTestElement implements TestIterationListener, Serializable,
58
        DnsResolver {
59
    private static final long serialVersionUID = 233L;
60
    private static final Logger log = LoggingManager.getLoggerForClass();
61
    private SystemDefaultDnsResolver systemDefaultDnsResolver=null;
62
    private Map<String,InetAddress[]> cache = null;
63
    private Resolver resolver = null;
64
    //++ JMX tag values
65
    private static final String CLEAR = "JMeterDNSResolver.clearEachIteration";// $NON-NLS-1$
66
    //-- JMX tag values
67
    private static final String SERVERS = "JMeterDNSResolver.servers";// $NON-NLS-1$
68
    private static final String IS_CUSTOM_RESOLVER = "isCustomResolver";// $NON-NLS-1$
69
    private final transient Cache lookupCache;
70
71
    // ensure that the initial DNSServers are copied to the per-thread instances
72
73
    public DNSCacheManager() {
74
        setProperty(new CollectionProperty(SERVERS, new ArrayList<String>()));
75
        //disabling cache
76
        lookupCache = new Cache();
77
        lookupCache.setMaxCache(0);
78
        lookupCache.setMaxEntries(0);
79
    }
80
81
    /**
82
     * {@inheritDoc}
83
     */
84
    @Override
85
    public Object clone() {
86
        DNSCacheManager clone = (DNSCacheManager) super.clone();
87
        clone.systemDefaultDnsResolver=new SystemDefaultDnsResolver();
88
        clone.cache=new LinkedHashMap<String,InetAddress[]>();
89
        CollectionProperty dnsServers = getServers();
90
        try {
91
            clone.resolver=new ExtendedResolver();
92
            PropertyIterator dnsServIt = dnsServers.iterator();
93
            while (dnsServIt.hasNext()) {
94
                String dnsServer = dnsServIt.next().getStringValue();
95
                ((ExtendedResolver) clone.resolver).addResolver(new SimpleResolver(dnsServer));
96
            }
97
            // resolvers will be chosen via round-robin
98
            ((ExtendedResolver) clone.resolver).setLoadBalance(true);
99
        } catch (UnknownHostException uhe) {
100
            log.warn("Failed to create Extended resolver: " + uhe.getMessage());
101
        }
102
        return clone;
103
    }
104
105
    /**
106
     * Clean DNS cache each iteration
107
     * @return
108
     */
109
    public boolean getClearEachIteration() {
110
        return getPropertyAsBoolean(CLEAR);
111
    }
112
113
    /**
114
     * Clean DNS cache each iteration
115
     *
116
     */
117
    public void setClearEachIteration(boolean clear) {
118
        setProperty(new BooleanProperty(CLEAR, clear));
119
    }
120
121
122
    /**
123
     *
124
     * Resolves address using system or custom DNS resolver
125
     */
126
127
    public InetAddress[] resolve(String host) throws UnknownHostException {
128
        if(cache.containsKey(host)){
129
            if(log.isDebugEnabled()){
130
                log.debug("Cache hit thr#" + JMeterContextService.getContext().getThreadNum() + ": " + host + "=>" + Arrays.toString(cache.get(host)));
131
            }
132
           return cache.get(host);
133
        }else{
134
            InetAddress[] addresses = requestLookup(host);
135
            if(log.isDebugEnabled()){
136
                log.debug("Cache miss thr#" + JMeterContextService.getContext().getThreadNum() + ": " + host + "=>" + Arrays.toString(addresses));
137
            }
138
            cache.put(host,addresses);
139
            return addresses;
140
        }
141
    }
142
143
    /**
144
     * Sends DNS request via system or custom DNS resolver
145
146
     */
147
    private InetAddress[] requestLookup(String host) throws UnknownHostException {
148
        InetAddress[] addresses = null;
149
        if (getIsCustResolver() && ((ExtendedResolver) resolver).getResolvers().length > 1) {
150
            try {
151
                Lookup lookup = new Lookup(host, Type.A);
152
                lookup.setCache(lookupCache);
153
                lookup.setResolver(resolver);
154
                Record[] records = lookup.run();
155
                if (records.length == 0) {
156
                    throw new UnknownHostException("Failed to resolve host name: " + host);
157
                }
158
                addresses = new InetAddress[records.length];
159
                for (int i = 0; i < records.length; i++) {
160
                    addresses[i] = ((ARecord) records[i]).getAddress();
161
                }
162
            } catch (TextParseException tpe) {
163
                log.debug("Failed to create Lookup object: " + tpe);
164
            }
165
        } else {
166
            addresses = systemDefaultDnsResolver.resolve(host);
167
            if (log.isDebugEnabled()) {
168
                log.debug("Cache miss: " + host + " Thread #" + JMeterContextService.getContext().getThreadNum()
169
                        + ", resolved with system resolver into " + Arrays.toString(addresses));
170
            }
171
        }
172
        return addresses;
173
    }
174
175
    /**
176
     * {@inheritDoc}
177
     * Clean DNS cache if appropriate check-box was selected
178
     */
179
    @Override
180
    public void testIterationStart(LoopIterationEvent event) {
181
        if (getClearEachIteration()) {
182
            this.cache.clear();
183
        }
184
    }
185
186
    public CollectionProperty getServers() {
187
        return (CollectionProperty) getProperty(SERVERS);
188
    }
189
190
    /**
191
     * {@inheritDoc}
192
     */
193
    @Override
194
    public void clear() {
195
        super.clear();
196
        clearServers(); // ensure data is set up OK initially
197
    }
198
199
200
    public boolean getIsCustResolver() {
201
        return this.getPropertyAsBoolean(IS_CUSTOM_RESOLVER, true);
202
    }
203
204
    public void setIsCustomResolver(boolean isCustomResolver) {
205
        this.setProperty(IS_CUSTOM_RESOLVER, isCustomResolver);
206
    }
207
208
209
    /**
210
     * Remove all the servers.
211
     */
212
    private void clearServers() {
213
        log.debug("Clear all servers from store");
214
        setProperty(new CollectionProperty(SERVERS, new ArrayList<String>()));
215
    }
216
217
    public void addServer(String dnsServer) {
218
        getServers().addItem(dnsServer);
219
    }
220
221
}
(-)src/core/org/apache/jmeter/resources/messages_fr.properties (+5 lines)
Lines 208-213 Link Here
208
csvread_file_file_name=Fichier CSV pour obtenir les valeurs de | *alias
208
csvread_file_file_name=Fichier CSV pour obtenir les valeurs de | *alias
209
cut=Couper
209
cut=Couper
210
cut_paste_function=Fonction de copier/coller de cha\u00EEne de caract\u00E8re
210
cut_paste_function=Fonction de copier/coller de cha\u00EEne de caract\u00E8re
211
clear_cache_each_iteration=Clear cache each iteration
211
database_conn_pool_max_usage=Utilisation max pour chaque connexion\:
212
database_conn_pool_max_usage=Utilisation max pour chaque connexion\:
212
database_conn_pool_props=Pool de connexions \u221A\u2020 la base de donn\u221A\u00A9es
213
database_conn_pool_props=Pool de connexions \u221A\u2020 la base de donn\u221A\u00A9es
213
database_conn_pool_size=Nombre de Connexions dans le Pool\:
214
database_conn_pool_size=Nombre de Connexions dans le Pool\:
Lines 240-245 Link Here
240
distribution_graph_title=Graphique de distribution (alpha)
241
distribution_graph_title=Graphique de distribution (alpha)
241
distribution_note1=Ce graphique se mettra \u00E0 jour tous les 10 \u00E9chantillons
242
distribution_note1=Ce graphique se mettra \u00E0 jour tous les 10 \u00E9chantillons
242
dn=Racine DN \:
243
dn=Racine DN \:
244
dns_cache_manager_title=Gestionnaire de cache DNS
245
dns_cache_manager=DNS Cache Manager
243
domain=Domaine \:
246
domain=Domaine \:
244
done=Fait
247
done=Fait
245
down=Descendre
248
down=Descendre
Lines 1146-1151 Link Here
1146
url_multipart_config_title=Requ\u00EAte HTTP Multipart par d\u00E9faut
1149
url_multipart_config_title=Requ\u00EAte HTTP Multipart par d\u00E9faut
1147
urldecode_string=Cha\u00EEne de style URL \u00E0 d\u00E9coder
1150
urldecode_string=Cha\u00EEne de style URL \u00E0 d\u00E9coder
1148
urlencode_string=Cha\u00EEne de caract\u00E8res \u00E0 encoder en style URL
1151
urlencode_string=Cha\u00EEne de caract\u00E8res \u00E0 encoder en style URL
1152
use_system_dns_resolver=Use system DNS resolver
1153
use_custom_dns_resolver=Use custom DNS resolver
1149
use_expires=Utiliser les ent\u00EAtes Cache-Control/Expires lors du traitement des requ\u00EAtes GET
1154
use_expires=Utiliser les ent\u00EAtes Cache-Control/Expires lors du traitement des requ\u00EAtes GET
1150
use_keepalive=Connexion persist.
1155
use_keepalive=Connexion persist.
1151
use_multipart_for_http_post=Multipart/form-data
1156
use_multipart_for_http_post=Multipart/form-data
(-)src/core/org/apache/jmeter/resources/messages.properties (+5 lines)
Lines 214-219 Link Here
214
csvread_file_file_name=CSV file to get values from | *alias
214
csvread_file_file_name=CSV file to get values from | *alias
215
cut=Cut
215
cut=Cut
216
cut_paste_function=Copy and paste function string
216
cut_paste_function=Copy and paste function string
217
clear_cache_each_iteration=Clear cache each iteration
217
database_conn_pool_max_usage=Max Usage For Each Connection\:
218
database_conn_pool_max_usage=Max Usage For Each Connection\:
218
database_conn_pool_props=Database Connection Pool
219
database_conn_pool_props=Database Connection Pool
219
database_conn_pool_size=Number of Connections in Pool\:
220
database_conn_pool_size=Number of Connections in Pool\:
Lines 246-251 Link Here
246
distribution_graph_title=Distribution Graph (alpha)
247
distribution_graph_title=Distribution Graph (alpha)
247
distribution_note1=The graph will update every 10 samples
248
distribution_note1=The graph will update every 10 samples
248
dn=DN
249
dn=DN
250
dns_cache_manager_title=DNS Cache Manager
251
dns_cache_manager=DNS Cache Manager
249
domain=Domain
252
domain=Domain
250
done=Done
253
done=Done
251
down=Down
254
down=Down
Lines 1153-1158 Link Here
1153
url_multipart_config_title=HTTP Multipart Request Defaults
1156
url_multipart_config_title=HTTP Multipart Request Defaults
1154
urldecode_string=String with URL encoded chars to decode
1157
urldecode_string=String with URL encoded chars to decode
1155
urlencode_string=String to encode in URL encoded chars
1158
urlencode_string=String to encode in URL encoded chars
1159
use_system_dns_resolver=Use system DNS resolver
1160
use_custom_dns_resolver=Use custom DNS resolver
1156
use_expires=Use Cache-Control/Expires header when processing GET requests
1161
use_expires=Use Cache-Control/Expires header when processing GET requests
1157
use_keepalive=Use KeepAlive
1162
use_keepalive=Use KeepAlive
1158
use_multipart_for_http_post=Use multipart/form-data for POST
1163
use_multipart_for_http_post=Use multipart/form-data for POST
(-)src/protocol/http/org/apache/jmeter/protocol/http/gui/DNSCachePanel.java (+308 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
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
(-)src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java (+20 lines)
Lines 55-60 Link Here
55
import org.apache.jmeter.protocol.http.control.Cookie;
55
import org.apache.jmeter.protocol.http.control.Cookie;
56
import org.apache.jmeter.protocol.http.control.CookieManager;
56
import org.apache.jmeter.protocol.http.control.CookieManager;
57
import org.apache.jmeter.protocol.http.control.HeaderManager;
57
import org.apache.jmeter.protocol.http.control.HeaderManager;
58
import org.apache.jmeter.protocol.http.control.DNSCacheManager;
58
import org.apache.jmeter.protocol.http.parser.HTMLParseException;
59
import org.apache.jmeter.protocol.http.parser.HTMLParseException;
59
import org.apache.jmeter.protocol.http.parser.HTMLParser;
60
import org.apache.jmeter.protocol.http.parser.HTMLParser;
60
import org.apache.jmeter.protocol.http.util.ConversionUtils;
61
import org.apache.jmeter.protocol.http.util.ConversionUtils;
Lines 105-110 Link Here
105
                    "org.apache.jmeter.protocol.http.config.gui.HttpDefaultsGui",
106
                    "org.apache.jmeter.protocol.http.config.gui.HttpDefaultsGui",
106
                    "org.apache.jmeter.config.gui.SimpleConfigGui",
107
                    "org.apache.jmeter.config.gui.SimpleConfigGui",
107
                    "org.apache.jmeter.protocol.http.gui.HeaderPanel",
108
                    "org.apache.jmeter.protocol.http.gui.HeaderPanel",
109
                    "org.apache.jmeter.protocol.http.control.DNSCacheManager",
110
                    "org.apache.jmeter.protocol.http.gui.DNSCachePanel",
108
                    "org.apache.jmeter.protocol.http.gui.AuthPanel",
111
                    "org.apache.jmeter.protocol.http.gui.AuthPanel",
109
                    "org.apache.jmeter.protocol.http.gui.CacheManagerGui",
112
                    "org.apache.jmeter.protocol.http.gui.CacheManagerGui",
110
                    "org.apache.jmeter.protocol.http.gui.CookiePanel"}));
113
                    "org.apache.jmeter.protocol.http.gui.CookiePanel"}));
Lines 120-125 Link Here
120
123
121
    public static final String HEADER_MANAGER = "HTTPSampler.header_manager"; // $NON-NLS-1$
124
    public static final String HEADER_MANAGER = "HTTPSampler.header_manager"; // $NON-NLS-1$
122
125
126
    public static final String DNS_CACHE_MANAGER = "HTTPSampler.dns_cache_manager"; // $NON-NLS-1$
127
123
    public static final String DOMAIN = "HTTPSampler.domain"; // $NON-NLS-1$
128
    public static final String DOMAIN = "HTTPSampler.domain"; // $NON-NLS-1$
124
129
125
    public static final String PORT = "HTTPSampler.port"; // $NON-NLS-1$
130
    public static final String PORT = "HTTPSampler.port"; // $NON-NLS-1$
Lines 622-627 Link Here
622
            setHeaderManager((HeaderManager) el);
627
            setHeaderManager((HeaderManager) el);
623
        } else if (el instanceof AuthManager) {
628
        } else if (el instanceof AuthManager) {
624
            setAuthManager((AuthManager) el);
629
            setAuthManager((AuthManager) el);
630
        } else if (el instanceof DNSCacheManager) {
631
            setDNSResolver((DNSCacheManager) el);
625
        } else {
632
        } else {
626
            super.addTestElement(el);
633
            super.addTestElement(el);
627
        }
634
        }
Lines 834-839 Link Here
834
    public CacheManager getCacheManager() {
841
    public CacheManager getCacheManager() {
835
        return (CacheManager) getProperty(CACHE_MANAGER).getObjectValue();
842
        return (CacheManager) getProperty(CACHE_MANAGER).getObjectValue();
836
    }
843
    }
844
845
    public DNSCacheManager getDNSResolver() {
846
        return (DNSCacheManager) getProperty(DNS_CACHE_MANAGER).getObjectValue();
847
    }
848
849
    public void setDNSResolver(DNSCacheManager cacheManager) {
850
        DNSCacheManager mgr = getDNSResolver();
851
        if (mgr != null) {
852
            log.warn("Existing DNSCacheManager " + mgr.getName() + " superseded by " + cacheManager.getName());
853
        }
854
        setProperty(new TestElementProperty(DNS_CACHE_MANAGER, cacheManager));
855
    }
856
837
857
838
    public boolean isImageParser() {
858
    public boolean isImageParser() {
839
        return getPropertyAsBoolean(IMAGE_PARSER, false);
859
        return getPropertyAsBoolean(IMAGE_PARSER, false);
(-)res/maven/ApacheJMeter_parent.pom (+7 lines)
Lines 106-111 Link Here
106
      <javamail.version>1.5.0-b01</javamail.version>
106
      <javamail.version>1.5.0-b01</javamail.version>
107
      <jms.version>1.1.1</jms.version>
107
      <jms.version>1.1.1</jms.version>
108
      <velocity.version>1.7</velocity.version>
108
      <velocity.version>1.7</velocity.version>
109
      <dnsjava.version>2.1.6</dnsjava.version>
109
    </properties>
110
    </properties>
110
111
111
    <dependencies>
112
    <dependencies>
Lines 393-398 Link Here
393
        <version>${velocity.version}</version>
394
        <version>${velocity.version}</version>
394
      </dependency>
395
      </dependency>
395
       -->
396
       -->
397
<dependency>
398
	<groupId>dnsjava</groupId>
399
	<artifactId>dnsjava</artifactId>
400
	<version>${dnsjava.version}</version>
401
</dependency>
402
396
    </dependencies>
403
    </dependencies>
397
404
398
    <repositories>
405
    <repositories>
(-)eclipse.classpath (+1 lines)
Lines 56-61 Link Here
56
	<classpathentry kind="lib" path="lib/commons-lang3-3.3.2.jar"/>
56
	<classpathentry kind="lib" path="lib/commons-lang3-3.3.2.jar"/>
57
	<classpathentry kind="lib" path="lib/commons-logging-1.2.jar"/>
57
	<classpathentry kind="lib" path="lib/commons-logging-1.2.jar"/>
58
	<classpathentry kind="lib" path="lib/commons-net-3.3.jar"/>
58
	<classpathentry kind="lib" path="lib/commons-net-3.3.jar"/>
59
	<classpathentry kind="lib" path="lib/dnsjava-2.1.6.jar"/>
59
	<classpathentry kind="lib" path="lib/excalibur-datasource-2.1.jar"/>
60
	<classpathentry kind="lib" path="lib/excalibur-datasource-2.1.jar"/>
60
	<classpathentry kind="lib" path="lib/excalibur-instrument-1.0.jar"/>
61
	<classpathentry kind="lib" path="lib/excalibur-instrument-1.0.jar"/>
61
	<classpathentry kind="lib" path="lib/excalibur-logger-1.1.jar"/>
62
	<classpathentry kind="lib" path="lib/excalibur-logger-1.1.jar"/>
(-)build.xml (+2 lines)
Lines 438-443 Link Here
438
    <pathelement location="${lib.dir}/${commons-lang3.jar}"/>
438
    <pathelement location="${lib.dir}/${commons-lang3.jar}"/>
439
    <pathelement location="${lib.dir}/${commons-logging.jar}"/>
439
    <pathelement location="${lib.dir}/${commons-logging.jar}"/>
440
    <pathelement location="${lib.dir}/${commons-net.jar}"/>
440
    <pathelement location="${lib.dir}/${commons-net.jar}"/>
441
    <pathelement location="${lib.dir}/${dnsjava.jar}"/>
441
    <pathelement location="${lib.dir}/${excalibur-datasource.jar}"/>
442
    <pathelement location="${lib.dir}/${excalibur-datasource.jar}"/>
442
    <pathelement location="${lib.dir}/${excalibur-instrument.jar}"/>
443
    <pathelement location="${lib.dir}/${excalibur-instrument.jar}"/>
443
    <pathelement location="${lib.dir}/${excalibur-logger.jar}"/>
444
    <pathelement location="${lib.dir}/${excalibur-logger.jar}"/>
Lines 2889-2894 Link Here
2889
    conditional execution (it would be a lot easier if antcall supported if/unless).
2890
    conditional execution (it would be a lot easier if antcall supported if/unless).
2890
    -->
2891
    -->
2891
    <target name="_process_all_jars">
2892
    <target name="_process_all_jars">
2893
        <process_jarfile jarname="dnsjava"/>
2892
        <process_jarfile jarname="apache-bsf"/>
2894
        <process_jarfile jarname="apache-bsf"/>
2893
        <process_jarfile jarname="avalon-framework"/>
2895
        <process_jarfile jarname="avalon-framework"/>
2894
        <process_jarfile jarname="bcmail" dest.dir="${lib.api}"/>
2896
        <process_jarfile jarname="bcmail" dest.dir="${lib.api}"/>

Return to bug 56841