You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by bl...@apache.org on 2001/09/05 14:41:23 UTC
cvs commit: jakarta-jmeter/xdocs/stylesheets project.xml
bloritsch 01/09/05 05:41:23
Modified: docs bugs.html changes.html contributing.html
extending.html how_to_use_jmeter.html
httpsamplercontroller.html index.html
installing.html jdbcsamplercontroller.html
license.html running.html todo.html
docs/extending index.html
docs/user_manual ftp_test.html index.html interleave.html
jdbc_test.html logical_controllers.html
loop_controller.html modification_manager.html
once_only.html proxy_server.html
ready_components.html rmi.html running.html
saving.html test_samples.html threadgroups.html
timers.html visualizers.html web_test.html
xdocs/stylesheets project.xml
Added: docs/user_manual sslmanager.html
Log:
Update docs with SSL Manager documentation incorporated
Revision Changes Path
1.13 +4 -0 jakarta-jmeter/docs/bugs.html
Index: bugs.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/bugs.html,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- bugs.html 2001/08/28 21:28:29 1.12
+++ bugs.html 2001/09/05 12:41:22 1.13
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,7 +102,9 @@
<tr><td>
<blockquote>
<p>
+
JMeter 1.6Alpha is just out. There are no known bugs currently (but plenty of things
+
to do still)</p>
</blockquote>
</p>
1.30 +143 -0 jakarta-jmeter/docs/changes.html
Index: changes.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/changes.html,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- changes.html 2001/08/28 21:28:29 1.29
+++ changes.html 2001/09/05 12:41:22 1.30
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,163 +102,304 @@
<tr><td>
<blockquote>
<p>
+
<b>Changes are chronologically ordered from top (most recent) to bottom
+
(least recent)</b>
+
</p>
<b>Changes:</b>
<h3>Current in CVS</h3>
<ul>
+
<li>Better XML support for special characters (Tushar Bhatia) </li>
+
<li>Non-GUI functioning & Non-GUI test plan execution (Tushar Bhatia)</li>
+
<li>Removing Swing dependence from base JMeter classes</li>
+
<li>Internationalization (Takashi Okamoto)</li>
+
<li>AllTests bug fix (neth6@atozasia.com)</li>
+
<li>ClassFinder bug fix (neth6@atozasia.com)</li>
+
<li>New Loop Controller</li>
+
<li>Proxy Server records HTTP samples from browser (and documented in the user manual)</li>
+
<li>Multipart Form support</li>
+
<li>HTTP Header class for Header customization</li>
+
<li>Extracting HTTP Header information from responses (Jamie Davidson)</li>
+
<li>Mailer Visualizer re-added to JMeter</li>
+
<li>JMeter now url encodes paramter names and values</li>
+
<li>listeners no longer give exceptions if their gui's haven't been initialized</li>
+
<li>HTTPS and Authorization working together</li>
+
<li>New Http sampling that automatically parses HTML response for images to download, and includes the downloading of
+
these images in total time for request (Neth neth6@atozasia.com) </li>
+
<li>HTTP responses from server can be parsed for links and forms, and dynamic data can be extracted and added to test
+
samples at run-time (documented)</li> </ul>
<h3>Version 1.6.1</h3>
<ul>
+
<li>Fixed saving and loading of test scripts (no more extra lines)</li>
+
<li>Can save and load special characters (such as "&" and "<").</li>
+
<li>Can save and load timers and listeners.</li>
+
<li>Minor bug fix for cookies (if you cookie value contained an "=", then it broke).</li>
+
<li>URL's can sample ports other than 80, and can test HTTPS, provided you have the necessary jars (JSSE)</li>
+
</ul>
<h3>Version 1.6 Alpha</h3>
<ul>
+
<li>New UI</li>
+
<li>Separation of GUI and Logic code</li>
+
<li>New Plug-in framework for new modules</li>
+
<li>Enhanced performance</li>
+
<li>Layering of test logic for greater flexibility</li>
+
<li>Added support for saving of test elements</li>
+
<li>Added support for distributed testing using a single client</li>
+
</ul>
<h3>Version 1.5.1</h3>
<ul>
+
<li>Fixed bug that caused cookies not to be read if header name case not as expected.</li>
+
<li>Clone entries before sending to sampler - prevents relocations from messing up information across threads</li>
+
<li>Minor bug fix to convenience dialog for adding paramters to test sample. Bug prevented entries in dialog from appearing in test sample.</li>
+
<li>Added xerces.jar to distribution</li>
+
<li>Added junit.jar to distribution and created a few tests.</li>
+
<li>Started work on new framework. New files in cvs, but do not effect program yet.</li>
+
<li>Fixed bug that prevent HTTPJMeterThread from delaying according to chosen timer.</li>
+
</ul>
<p>
+
<h3>Version 1.5</h3>
+
<ul>
+
<li>Abstracted out the concept of the Sampler, SamplerController, and TestSample.
+
A Sampler represents code that understands a protocol (such as HTTP, or FTP, RMI,
+
SMTP, etc..). It is the code that actually makes the connection to whatever is
+
being tested.
+
A SamplerController represents code that understands how to organize and run a group
+
of test samples. It is what binds together a Sampler and it's test samples and runs them.
+
A TestSample represents code that understands how to gather information from the
+
user about a particular test. For a website, it would represent a URL and any
+
information to be sent with the URL.</li>
+
<li>The UI has been updated to make entering test samples more convenient.</li>
+
<li>Thread groups have been added, allowing a user to setup multiple test to run
+
concurrently, and to allow sharing of test samples between those tests.</li>
+
<li>It is now possible to save and load test samples.</li>
+
<li>....and many more minor changes/improvements...</li>
+
</ul>
+
</p>
<p>
+
<b>Apache JMeter 1.4.1-dev</b>
+
(<a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>)
+
+
<ul>
+
<li>Cleaned up URLSampler code after tons of patches for better readability. (SM)</li>
+
<li>Made JMeter send a special "user-agent" identifier. (SM)</li>
+
<li>Fixed problems with redirection not sending cookies and authentication info and removed
+
a warning with jikes compilation. Thanks to <a href="mailto:wtanaka@yahoo.com">Wesley
+
Tanaka</a> for the patches (SM)</li>
+
<li>Fixed a bug in the URLSampler that caused to skip one URL when testing lists of URLs and
+
a problem with Cookie handling. Thanks to <a href="mailto:gjohnson@investlearning.com">Graham Johnson</a> for the patches (SM)</li>
+
<li>Fixed a problem with POST actions. Thanks to <a href="mailto:sschaub@bju.edu">Stephen
+
Schaub</a> for the patch (SM)</li>
+
</ul>
+
</p>
<p>
+
<b>Apache JMeter 1.4</b> - Jul 11 1999
+
(<a href="mailto:cimjpno@be.ibm.com">Jean-Pierre Norguet</a>, <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>)
+
+
<ul>
+
<li>Fixed a problem with POST actions. Thanks to <a href="mailto:bburns@labs.gte.com">Brendan
+
Burns</a> for the patch (SM)</li>
+
<li>Added close button to the About box for those window managers who don't provide it.
+
Thanks to Jan-Henrik Haukeland for pointing it out. (SM)</li>
+
<li>Added the simple Spline sample visualizer (JPN)</li>
+
</ul>
+
</p>
<p><b>Apache JMeter 1.3</b> - Apr 16 1999
+
(<a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>, <a href="mailto:luta.raphael@networks.vivendi.net">Rapha?Luta</a>)
+
+
<ul>
+
<li>Run the Garbage Collector and run finalization before starting to sampling to ensure
+
same state every time (SM)</li>
+
<li>Fixed some NullPointerExceptions here and there (SM)</li>
+
<li>Added HTTP authentication capabilities (RL)</li>
+
<li>Added windowed sample visualizer (SM)</li>
+
<li>Fixed stupid bug for command line arguments. Thanks to <a href="mailto:jbracer@infoneers.com">Jorge Bracer</a> for pointing this out (SM)</li>
+
</ul>
+
</p>
<p><b>Apache JMeter 1.2</b> - Mar 17 1999
+
(<a href="mailto:sdowd@arcmail.com">Sean Dowd</a>, <a href="mailto:stefano@apache.org">Stefano
+
Mazzocchi</a>)
+
+
<ul>
+
<li>Integrated cookie capabilities with JMeter (SM)</li>
+
<li>Added the Cookie manager and Netscape file parser (SD)</li>
+
<li>Fixed compilation error for JDK 1.1 (SD)</li>
+
</ul>
+
</p>
<p>
+
<b>Apache JMeter 1.1</b> - Feb 24 1999
+
(<a href="mailto:sdowd@arcmail.com">Sean Dowd</a>, <a href="mailto:stefano@apache.org">Stefano
+
Mazzocchi</a>)
+
+
<ul>
+
<li>Created the opportunity to create URL aliasing from the properties file as well as the
+
ability to associate aliases to URL sequences instead of single URLs (SM) Thanks to <a href="mailto:chatfield@evergreen.com">Simon Chatfield</a> for the very nice suggestions
+
and code examples.</li>
+
<li>Removed the TextVisualizer and replaced it with the much more useful FileVisualizer (SM)</li>
+
<li>Added the known bug list (SM)</li>
+
<li>Removed the Java Apache logo (SM)</li>
+
<li>Fixed a couple of typos (SM)</li>
+
<li>Added UNIX makefile (SD)</li>
+
</ul>
+
</p>
<p>
+
<b>Apache JMeter 1.0.1</b> - Jan 25 1999
+
(<a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>)
+
+
<ul>
+
<li>Removed pending issues doc issues (SM)</li>
+
<li>Fixed the unix script (SM)</li>
+
<li>Added the possibility of running the JAR directly using "java -jar
+
ApacheJMeter.jar" with Java 2 (SM)</li>
+
<li>Some small updates: fixed Swing location after Java 2(tm) release, license update and
+
small cleanups (SM)</li>
+
</ul>
+
</p>
<p>
+
<b>Apache JMeter 1.0</b> - Dec 15 1998
+
(<a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>)
+
<ul>
+
<li>Initial version. (SM)</li>
+
</ul>
+
</p>
</blockquote>
</p>
1.14 +11 -0 jakarta-jmeter/docs/contributing.html
Index: contributing.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/contributing.html,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- contributing.html 2001/08/28 21:28:29 1.13
+++ contributing.html 2001/09/05 12:41:22 1.14
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,16 +102,25 @@
<tr><td>
<blockquote>
<p>
+
The Jakarta Project is an open volunteer project. This means that anyone may
+
partecipate to the development process even actively (writing, discussing, proposing code)
+
or passively (listening and learning). You are more than welcome to join our group of
+
developers if you feel you are ready for it and wish to give a hand.
+
</p>
<p>
+
If you want more info about Jakarta development (mailing list, CVS info, code
+
style, subprojects, people to ask) check out our web site:
+
</p>
<a HREF="http://jakarta.apache.org">
+
<p>http://jakarta.apache.org</p></a>
</blockquote>
</p>
1.15 +2 -0 jakarta-jmeter/docs/extending.html
Index: extending.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/extending.html,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- extending.html 2001/08/28 21:28:29 1.14
+++ extending.html 2001/09/05 12:41:22 1.15
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.17 +2 -0 jakarta-jmeter/docs/how_to_use_jmeter.html
Index: how_to_use_jmeter.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/how_to_use_jmeter.html,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- how_to_use_jmeter.html 2001/08/28 21:28:29 1.16
+++ how_to_use_jmeter.html 2001/09/05 12:41:22 1.17
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.15 +2 -0 jakarta-jmeter/docs/httpsamplercontroller.html
Index: httpsamplercontroller.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/httpsamplercontroller.html,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- httpsamplercontroller.html 2001/08/28 21:28:29 1.14
+++ httpsamplercontroller.html 2001/09/05 12:41:22 1.15
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.27 +2 -0 jakarta-jmeter/docs/index.html
Index: index.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/index.html,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- index.html 2001/08/28 21:28:29 1.26
+++ index.html 2001/09/05 12:41:22 1.27
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.20 +2 -0 jakarta-jmeter/docs/installing.html
Index: installing.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/installing.html,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- installing.html 2001/08/28 21:28:29 1.19
+++ installing.html 2001/09/05 12:41:22 1.20
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.10 +2 -0 jakarta-jmeter/docs/jdbcsamplercontroller.html
Index: jdbcsamplercontroller.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/jdbcsamplercontroller.html,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- jdbcsamplercontroller.html 2001/08/28 21:28:29 1.9
+++ jdbcsamplercontroller.html 2001/09/05 12:41:22 1.10
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.8 +2 -0 jakarta-jmeter/docs/license.html
Index: license.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/license.html,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- license.html 2001/08/28 21:28:29 1.7
+++ license.html 2001/09/05 12:41:22 1.8
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.22 +3 -1 jakarta-jmeter/docs/running.html
Index: running.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/running.html,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- running.html 2001/08/30 17:19:01 1.21
+++ running.html 2001/09/05 12:41:22 1.22
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -145,7 +147,7 @@
</ul>
<p align="center"><font size="-1">Copyright (c) 1998-99 <a href="http://java.apache.org">The Java Apache
Project</a>.<br />
-$Id: running.html,v 1.21 2001/08/30 17:19:01 mstover1 Exp $</font> <br />
+$Id: running.html,v 1.22 2001/09/05 12:41:22 bloritsch Exp $</font> <br />
<font size="-1">All rights reserved.</font></p>
</blockquote>
</p>
1.15 +31 -0 jakarta-jmeter/docs/todo.html
Index: todo.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/todo.html,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- todo.html 2001/08/28 21:28:29 1.14
+++ todo.html 2001/09/05 12:41:22 1.15
@@ -79,6 +79,8 @@
</li>
<li> <a href="./user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="./user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,35 +102,64 @@
<tr><td>
<blockquote>
<p>
+
List of those things yet to do, wishes, dreams, etc.. (in no particular
+
order)
+
</p>
<ul>
+
<li><STRONG>New modules:</STRONG></li>
+
<ul>
+
<li>RMI</li>
+
<li>SMTP</li>
+
<li>JINI</li>
+
<li>Corba</li>
+
<li>HTTP-multiPart</li>
+
<li>Local Java Object</li>
+
</ul>
+
<li><strong>Adding reporters:</strong> Reporters would offer report generation based
+
on data collected by JMeter. For those looking for more information than
+
simply time per sample and average time, a reporter should be available.
+
Examples could include statistical reports, accuracy reports (eg what exactly
+
did the web page return - this could be used for QA testing).</li>
+
+
<li><strong>Dynamic control while JMeter runs</strong> Enable users to change
+
options while JMeter runs - ie change number of threads running, start and stop
+
thread groups individually, add test samples on the fly, etc.</li>
+
<li><strong>Drag n Drop</strong> allow users to move test elements around the tree
+
easily</li>
+
<li>Controllers that enable spidering and/or dynamic modification of test entries
+
based on responses from previous samples (<b>Currently being developed</b>)</li>
+
<li>Assertions - allowing users to assert what the results from test samples should look like, thus allowing
+
JMeter to act as an automated functional tester (<b>Currently being developed</b>)</li>
+
<li>Proxy server to enable recording of browser activity (<b>Currently being developed</b>)</li>
+
</ul>
</blockquote>
</p>
1.7 +332 -0 jakarta-jmeter/docs/extending/index.html
Index: index.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/extending/index.html,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- index.html 2001/08/28 21:28:29 1.6
+++ index.html 2001/09/05 12:41:22 1.7
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -101,414 +103,744 @@
<blockquote>
<h2>Extending JMeter</h2>
<p>There are several ways to extend JMeter and add functionality. JMeter is designed
+
to make this task easier.
+
</p>
<ul>
+
<li><a href="#timer">Creating your own Timer</a></li>
+
<li><a href="#listener">Creating your own SampleListener (such as a visualizer, or reporter)</a></li>
+
<li><a href="#config">Creating your own Config Element</a></li>
+
<li><a href="#logical">Creating your own logic SamplerController</a></li>
+
<li><a href="#testsample">Creating your own test sample SamplerController</a></li>
+
<li><a href="#sampler">Creating your own Sampler</a></li>
+
<li><a href="#uicomponent">Making your custom elements play nice as a JMeter UI component</a></li>
+
<li><a href="#saveable">Making your custom elements saveable and loadable from within JMeter</a></li>
+
</ul>
<hr />
<a name="timer" />
<h3>Creating your own Timer</h3>
<p>The timer interface:</p>
<pre>
+
public long delay();
+
</pre>
<p>Not too complicated. Your delay method must, each time it is called, return a
+
long representing the number of milliseconds to delay. The constant timer returns the
+
same number every time it's called. A random timer returns a different number each time.
+
</p>
<hr />
<a name="listener" />
<h3>Creating your own SampleListener</h3>
<p>The SampleListener interface:</p>
<pre>
+
public void sampleOccurred(SampleEvent e);
+
public void sampleStarted(SampleEvent e);
+
public void sampleStopped(SampleEvent e);
+
</pre>
<p>sampleOccurred is the method called when a sample is completed, and the data has been
+
collected. The SampleEvent object should contain all the information gathered
+
from the sample. If your sample listener is primarily concerned with collecting the
+
data from a test run, you can implement this method - the other two are for other purposes and
+
can be ignored (though the methods have to be there for your class to compile).
+
</p>
<p>sampleStarted and sampleStopped are used to indicate the state of the sampling thread.
+
This is useful for visualizers that show the user the state of all running threads
+
(ie, they are running and waiting for response, or they're stopped and waiting
+
to begin again).
+
</p>
<hr />
<a name="config" />
<h3>Creating your own Config Element</h3>
<p>The ConfigElement interface:</p>
<pre>
+
public void addConfigElement(ConfigElement config);
+
public boolean expectsModification();
+
public Object clone();
+
</pre>
<p>The ConfigElement interface is sparse. All ConfigElements are expected to implement
+
a public <b>clone()</b> method. The reason for this is that config elements will be cloned
+
for each different sampling thread, and most will be cloned for each sample. </p>
<p>If your config element expects to be modified in the process of a test run,
+
and you want those modifications to carry over from sample to sample (as in
+
a cookie manager - you want to save all cookies that gets set throughout
+
the test), then return true for the <b>expectsModification()</b> method. Your config element will not be
+
cloned for each sample. If your config elements are more static in nature,
+
return false. If in doubt, return false.</p>
<p><b>addConfigElement()</b> is required so that config elements can be layered. For
+
instance, let's say a user creates a URL entry that contains default values -
+
they might use this to specify a server. Then, all their test samples configure
+
individual test cases, but leave out the server field. This information is combined
+
via the <b>addConfigElement()</b> method. Your custom config elements should do the right
+
thing when this method is called. Normally, this involves ignoring such calls unless
+
the passed in ConfigElement is of the same type as yours, and then only merging in
+
values that are not already set in the object receiving the call (ie you probably
+
don't want to overwrite any values).
+
</p>
<p>You may have noticed there's no specification on how to get the config information
+
<b>out</b> of a ConfigElement. This raises the question, who is going to use it?
+
At the end of the line, there will be a Sampler that will need the information held
+
in your config element. The sampler that uses your config element needs to know more
+
about the class than the rest of JMeter - that information is not part of this interface.
+
</p>
<p>If at all possible, extend <b>AbstractConfigElement</b> when creating your own. By doing so,
+
and by following some simple rules, you will get cloning and saving to XML of your
+
config element for free (as in, you don't have to do anything!). <b>AbstractConfigElement</b>
+
stores all it's values in a Map, and provides getProperty and putProperty methods. Your
+
config element can provide <b>getXXX()</b> and <b>setXXX()</b> methods, but these should delegate
+
to <b>getProperty()</b> and <b>setProperty()</b>, probably using static Strings as keys in the Map.
+
<br />You can store any type of object, provided the objects are clonable and Saveable
+
(Strings, Integer, Long, Double, Float are all good in this regard).
+
</p>
<p>One caveat - if your config element has been restored from file, all the values
+
held in the Map will be String objects (except for elements that implement Saveable
+
on their own), and you may have to do casting and parsing. Example: an Integer will
+
have to be converted from a String to an int, so your getXXX() method should check
+
for this possibility to avoid exceptions.
+
</p>
<hr />
<a name="logical" />
<h3>Creating your own logic SamplerController</h3>
<p>The SamplerController interface looks as follows:</p>
<pre>
+
Entry nextEntry();
+
Collection getListeners();
+
void addSamplerController(SamplerController controller);
+
void addConfigElement(ConfigElement config);
+
Object clone();
+
</pre>
<p>Again, <b>clone()</b> is a method that must be implemented to all SamplerControllers to avoid
+
contamination between sampling threads.</p>
<p>The <b>nextEntry()</b> method is the essential job of a SamplerController - to deliver
+
Entry objects to be sampled. An Entry object encapsulates all the information needed
+
by a Sampler to do its job. The <b>nextEntry()</b> method should work like an iterator and
+
continuously return new Entry objects.
+
</p>
<p>There are two boundary conditions that need to be handled. If the Controller has no
+
more Entries to give, for the rest of the test, it should return <b>null</b>. Therefore,
+
if your Controller has sub-controllers it is receiving Entries from, it should remove
+
them from its list of controllers to get Entries from. The other condition is when
+
your controller reaches the end of its list of Entries, and it needs to start over
+
from the beginning. The parent Controller needs to know this so that it can move
+
on to its next controller in its list. Therefore, at the end of each iteration,
+
your SamplerController needs to return a CycleEntry object instead of a normal Entry.
+
Conversely, this means that if your Controller receives a CycleEntry object, it should
+
move on to the next Controller in its list.</p>
<p>A logic controller does not generate Entries on its own, but simply regulates
+
the flow of Entries from its sub-controllers. A logic controller might provide
+
looping logic, or it might modify the Entries that pass through it, or whatever.
+
GenericController provides an implementation that does absolutely nothing but
+
pass Entries on from its sub-controllers. This class is useful both for reference
+
purposes and to extend, since it provides a lot of methods you're likely to find
+
useful
+
</p>
<p><b>getListeners()</b> is an odd member of this Class. It's there to serve those who
+
want their controller to receive sample data. This would be useful for a controller
+
that modified Entry objects based on previous sample results (like an HTML spider
+
that dynamically reacted to previously sampled webpages for links and forms). The
+
responsibility of the controller implementer is to collect all potential listeners
+
from the sub-controller list, and add themselves if desired. Most SamplerControllers
+
that extend GenericController don't have to do anything.</p>
<p><b>addSamplerController(SamplerController controller)</b> is the method used to
+
add sub controllers to your SamplerController. </p>
<p><b>addConfigElement(ConfigElement config)</b> Your SamplerController should also
+
be capable of holding configuration elements and adding them to Entries as they
+
pass through your controller. Again, see GenericController for reference. Essentially,
+
all Entry objects that get returned by <b>nextEntry()</b> are handed all the ConfigElements
+
of the controller.
+
</p>
<hr />
<a name="testsample" />
<h3>Creating your own test sample SamplerController</h3>
<p>A SamplerController that generates Entry objects is just like a logic controller
+
except that it creates its own Entry objects instead of gathering them from
+
sub-controllers (although, to be fully correct, your test sample SamplerController
+
should handle both possibilities). Your test sample SamplerController can also
+
benefit from extending GenericController. By doing so, most of your cloning and
+
saving needs are handled (but probably not entirely). See HttpTestSample as
+
reference.</p>
<hr />
<a name="sampler" />
<h3>Creating your own Sampler</h3>
<p>The Sampler interface:</p>
<pre>
+
public SampleResult sample(Entry e)
+
</pre>
<p>Your Sampler has two responsibilities. Of lesser importance, it should do whatever
+
it is you want to do, given an Entry object that hopefully contains information
+
about what is to be sampled. Of greater importance, your sampler should return
+
a <b>SampleResult</b> object that holds information about the sampling. Information such
+
as how long the sample took, the text response from the sample (if appropriate), and
+
a string that describes the location of what was sampled. The SampleResult interface
+
is essentially a Map with public static Strings as keys. </p>
<hr />
<a name="uicomponent" />
<h3>Making your custom elements play nice as a JMeter UI component</h3>
<p>In order to take part in the JMeter UI, your component needs to implement the
+
JMeterComponentModel interface:</p>
<pre>
+
Class getGuiClass();
+
public String getName();
+
public void setName(String name);
+
public Collection getAddList();
+
public String getClassLabel();
+
public void uncompile();
+
</pre>
<p>Most of this stuff is easy, boring, and tedious. <b>getName()</b>, <b>setName()</b> is a simple
+
String property that is the name of the object. <b>getClassLabel()</b> should return
+
a String that describes the class. This string will be displayed to the user and
+
so should be short but meaningful. <b>getGuiClass()</b> should return a Class object for
+
the class that will be used as a GUI component. This class should be a subclass
+
of java.awt.Container, and preferably a subclass of <b>javax.swing.JComponent</b>.</p>
<p><b>getAddList()</b> should return a list of either Strings or JMenus. These Strings
+
represent the Classes that can be added to your SamplerController. Each String
+
should correspond to the target class's <b>getClassLabel()</b> String. <b>MenuFactory</b> is
+
a class that will return some preset menu lists (such as all available SamplerControllers,
+
all available ConfigElements, etc).</p>
<p><b>uncompile()</b> is a cleanup method used between sampling runs. When the user
+
hits "Start", JMeter "compiles" the objects in the tree. Child nodes are added
+
to their parent objects recursively until there is one TestPlan object, which is
+
then submitted for testing. Afterward, these elements have to un-added from their
+
parent objects, or uncompiled. To uncompile your class, simply clear all your
+
data structures that are holding sub-elements. For your SamplerController, this
+
will be the list of sub-controllers and the list of ConfigElements.</p>
<p>That's it, except for your GUI class. If your SamplerController has no
+
configuration needs, just return org.apache.jmeter.gui.NamePanel, and the user will
+
at least be able to change the name of your component. Otherwise, create a gui class
+
that implements the <b>ModelSupported</b> interface:</p>
<pre>
+
void setModel(Object model);
+
public void updateGui();
+
</pre>
<p><b>setModel()</b> is used to hand your JMeterModelComponent class to the GUI class when
+
it is instantiated. It is your responsibility for providing the means by which
+
the Gui class updates the values in the model class. For updating in the other
+
direction, there is <b>updateGui()</b>, which the model class can call if necessary.
+
Note, normally, this call is made for you automatically whenever the Gui is brought
+
to the screen. If you are creating a Visualizer, then you may need to use <b>updateGui()</b>.
+
For reference, refer to UrlConfigGui (in org.apache.jmeter.protocol.http.config.gui).</p>
<p>If you have done all this correctly, there's just one more step. If you compile
+
your classes into the ApacheJMeter.jar file, then you're done. Your classes will
+
be automatically found and used. Otherwise, you will need to modify jmeter.properties.
+
The <i>search_paths</i> property should be modified to include the path where your
+
classes are. This does not obviate the need for your classes to be in the JVM's
+
CLASSPATH - it is an additional requirement. Otherwise, your classes will not be
+
detected, and the Gui will not make them available to the user.</p>
<hr />
<a name="saveable" />
<h3>Making your custom elements saveable and loadable from within JMeter</h3>
<p>The Saveable interface has just one method:</p>
<pre>
+
public Class getTagHandlerClass()
+
</pre>
<p>This method simply returns the Class object that represents the Class that handles
+
the saving and loading of your component.</p>
<p>To write this SaveHandler, make a class that extends <b>TagHandler</b>
+
(from org.apache.jmeter.save.xml). Note, if your component extends AbstractConfigElement,
+
it is already fully Saveable - provided you only have information stored in
+
the Map from AbstractConfigElement.</p>
<p>To write your own TagHandler, you will have to implement the following methods:</p>
<pre>
+
public abstract void setAtts(Attributes atts) throws Exception
+
public String getPrimaryTagName()
+
public void save(Saveable objectToSave,Writer out) throws IOException
+
</pre>
<p><b>getPrimaryTagName()</b> should return the String that is the XML tagname that your
+
class handles. When you save your object, it should all be contained within an
+
XML tag of the same name. This will ensure that when JMeter's parser hits that tag,
+
your class will be called upon to handle the data.</p>
<p><b>setAtts(Attributes atts)</b> is called when the parser first hits your tag.
+
If this primary tag has any attributes, this method represents your chance to save
+
the information.</p>
<p><b>save(Saveable objectToSave,Writer out)</b> - when the user selects "Save",
+
JMeter will call this method and hand the Saveable object to be saved (it will be
+
the object that specified your TagHandler as the class responsible for it's saving).
+
This method should use the given Writer object to print all the XML necessary to
+
save the current state of the objectToSave.</p>
<p>There's more you have to do to handle creating a new Object when JMeter parses
+
an XML file. However, there's no standard interface you need to implement, but rather,
+
JMeter uses reflection to generate method calls into your class. When JMeter hits
+
a tag that corresponds to your PrimaryTagName, an instance of your TagHandler will
+
be created, and it's <b>setAtts()</b> method will get called. Thereafter, methods are called
+
depending on subsequent tags and character data. For every tag, JMeter calls
+
<b><tag-name>TagStart(Attributes atts)</b>, and for every end tag, JMeter calls
+
<b><tag-name>TagEnd()</b>.</p>
<p>Additionally, JMeter will call a method that corresponds to all tags that are
+
current. So, for instance, if JMeter runs into a tag name "foo", then
+
<b>foo(Attributes atts)</b> will be called. If JMeter then parses character data,
+
then <b>foo(String data)</b> will be called. If JMeter parses a tag within foo, called
+
"nestedFoo", then JMeter will call <b>foo_nestedFoo(Attributes atts)</b> and
+
<b>foo_nestedFoo(String data)</b>. And so on.
+
</p>
<p>An annotated example:</p>
<pre>
+
public class AbstractConfigElementHandler extends TagHandler
+
{
+
private AbstractConfigElement config;
+
private String currentProperty;
+
+
public AbstractConfigElementHandler()
+
{
+
}
+
+
<font color="blue">/**
+
* Returns the AbstractConfigElement object parsed from the XML. This method
+
* is required to fulfill the SaveHandler interface. It is used by the XML
+
* routines to gather all the saved objects.
+
*/</font>
+
public Object getModel()
+
{
+
return config;
+
}
+
+
<font color="blue">/**
+
* This is called when a tag is first encountered for this handler class to handle.
+
* The attributes of the tag are passed, and the SaveHandler object is expected
+
* to instantiate a new object.
+
*/</font>
+
public void setAtts(Attributes atts) throws Exception
+
{
+
String className = atts.getValue("type");
+
config = (AbstractConfigElement)Class.forName(className).newInstance();
+
}
+
+
<font color="blue">/**
+
* Called by reflection when a <property> tag is encountered. Again, the
+
* attributes are passed.
+
*/</font>
+
public void property(Attributes atts)
+
{
+
currentProperty = atts.getValue("name");
+
}
+
+
<font color="blue">/**
+
* Called by reflection when text between the begin and end <property>
+
* tag is encountered.
+
*/</font>
+
public void property(String data)
+
{
+
+
if(data != null && data.trim().length() > 0)
+
{
+
config.putProperty(currentProperty,data);
+
currentProperty = null;
+
}
+
}
+
+
<font color="blue">/**
+
* Called by reflection when the <property> tag is ended.
+
*/</font>
+
public void propertyTagEnd()
+
{
+
<font color="blue">// Here's a tricky bit. See below for explanation.</font>
+
List children = xmlParent.takeChildObjects(this);
+
if(children.size() == 1)
+
{
+
config.putProperty(currentProperty,((TagHandler)children.get(0)).getModel());
+
}
+
}
+
+
+
<font color="blue">/**
+
* Gets the tag name that will trigger the use of this object's TagHandler.
+
*/</font>
+
public String getPrimaryTagName()
+
{
+
return "ConfigElement";
+
}
+
+
<font color="blue">/**
+
* Tells the object to save itself to the given output stream.
+
*/</font>
+
public void save(Saveable obj,Writer out) throws IOException
+
{
+
AbstractConfigElement saved = (AbstractConfigElement)obj;
+
out.write("<ConfigElement type=\"");
+
out.write(saved.getClass().getName());
+
out.write("\">\n");
+
Iterator iter = saved.getPropertyNames().iterator();
+
while (iter.hasNext())
+
{
+
String key = (String)iter.next();
+
Object value = saved.getProperty(key);
+
writeProperty(out,key,value);
+
}
+
out.write(</ConfigElement>");
+
}
+
+
<font color="blue">/**
+
* Routine to write each property to xml.
+
*/</font>
+
private void writeProperty(Writer out,String key,Object value) throws IOException
+
{
+
out.write("<property name=\"");
+
out.write(key);
+
out.write("\">\n");
+
JMeterHandler.writeObject(value,out);
+
out.write("\n</property>\n");
+
}
+
</pre>
<p>
+
In the <b>propertyTagEnd()</b> method, <b>takeChildObjects()</b> is called on the xmlParent
+
instance variable. xmlParent is inherited from TagHandler - the DocumentHandler
+
object that is running the show. xmlParent takes an XML file that represents a portion of
+
the test configuration tree, and recreates a tree-like data structure. When it is
+
done, it will convert its tree-like data structure into the test configuration tree
+
structure.
+
</p>
<p>However, sometimes, a tree element has sub objects that you do not want represented
+
in the tree - rather, they are part of your object. But, they may
+
be complicated enough to warrant their own SaveHandler class, and thus, the xmlParent
+
picks them up as part of its tree. When the tag is done, and you know that there are
+
child objects you want to grab, you can call the <b>takeChildObjects()</b> method and get a
+
List object containing them all. This will remove them from the tree, and you can add
+
them to your object that you're creating.
+
</p>
<p>
+
UrlConfig is good example. It extends AbstractConfigElement, so it uses exactly the
+
code above to save and reload itself from XML. However, one of the pieces of data
+
that UrlConfig stores is an Arguments object. Arguments is too complicated to save
+
to file as a simple string, so it has its own Handler object (ArgumentsHandler). In
+
the above code, when the call to <b>JMeterHandler.writeObject(value,out)</b> is made, the
+
writeObject method detects whether the object implements Saveable, and if so, calls
+
the object's SaveHandler class to deal with it. This means, however, that when
+
reading that XML file, the Argument object will show up as a separate entity in
+
the data tree, whereas it originally was just part of the data of the UrlConfig
+
object. In order to preserve that relationship, it's necessary for the
+
AbstractConfigElementHandler to check after each property tag is done for child
+
objects in the tree, and take them for its own use.
+
</p>
<p>
+
Study the other SaveHandler objects and the TagHandler class to learn more
+
about how saving is accomplished. Once you understand the design, writing your
+
own SaveHandler is very easy.
+
</p>
</blockquote>
</p>
1.2 +9 -0 jakarta-jmeter/docs/user_manual/ftp_test.html
Index: ftp_test.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/ftp_test.html,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ftp_test.html 2001/08/28 21:28:30 1.1
+++ ftp_test.html 2001/09/05 12:41:22 1.2
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,13 +102,20 @@
<tr><td>
<blockquote>
<p>
+
The FTP Test controller is a generative controller whose function is to create a single test case for FTP applications.
+
The FTP Test allows you to configure an FTP sample:</p>
<ul>
+
<li><b>Server</b>: Host name of the server being tested.</li>
+
<li><b>Filename</b>: File to be downloaded via FTP</li>
+
<li><b>Username</b>: Username to use to connect to server</li>
+
<li><b>Password</b>: Password to user to connect to server</li>
+
</ul>
</blockquote>
</p>
1.9 +2 -0 jakarta-jmeter/docs/user_manual/index.html
Index: index.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/index.html,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- index.html 2001/08/30 17:19:01 1.8
+++ index.html 2001/09/05 12:41:22 1.9
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.4 +14 -0 jakarta-jmeter/docs/user_manual/interleave.html
Index: interleave.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/interleave.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- interleave.html 2001/08/28 21:28:30 1.3
+++ interleave.html 2001/09/05 12:41:22 1.4
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,18 +102,30 @@
<tr><td>
<blockquote>
<p>
+
The Interleave Controller filters test samples through one at a time for each iteration through the test. This means
+
that if the Interleave Controller has a Web Test sub-controller within it, which in turn holds three URL's to be tested,
+
rather than serve up all three URL's during each run through the test, the Interleave Controller will instead serve up
+
the first URL during the first iteration through the test, the second URL during the second iteration, and the third one
+
during the third iteration. On the fourth iteration, the first URL will again be served, and so on.
+
</p>
<p>An example of the usefulness of interleaving might be helpful. Let's say you have a search engine test that involves 3 steps. Step
+
one is always the same. Step two involves a URL request that follows a simple format, but the data can vary (think of a
+
search function - the request is always the same, except the actual search string can be different). Step three is also
+
always the same. If you wanted to test the search engine with, say, 10 different search strings, you could setup these
+
three steps and then repeat all three 10 times, modifying the second step in each to have a different search string. Or,
+
you could place the second step under an Interleave Controller, and put all 10 alternatives there. This would achieve the
+
same effect.</p>
</blockquote>
</p>
1.2 +13 -0 jakarta-jmeter/docs/user_manual/jdbc_test.html
Index: jdbc_test.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/jdbc_test.html,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- jdbc_test.html 2001/08/28 21:28:30 1.1
+++ jdbc_test.html 2001/09/05 12:41:22 1.2
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,17 +102,28 @@
<tr><td>
<blockquote>
<p>
+
The JDBC Test controller is a generative controller whose function is to create a single test case for FTP applications.
+
The JDBC Test allows you to configure an FTP sample:</p>
<ul>
+
<li><b>Username</b>: Username to use to connect to server</li>
+
<li><b>Password</b>: Password to user to connect to server</li>
+
<li><b>Database URL</b>: This includes the host name plus database name. It should be in the correct format for the database being tested (usually hostname/database name)</li>
+
<li><b>Sub Protocol</b>: The sub-protocol to use with your specific database (ie "mysql" for MySQL)</li>
+
<li><b>Driver Class</b>: The full class name of your driver (ie org.gjt.mm.mysql.Driver)</li>
+
<li><b>Number of Connections in Pool</b>: JMeter will use a pool of connections that you can configure. Set here how many connections you would like the pool to maintain</li>
+
<li><b>Max usage for each connection</b>: JMeter will automatically re-initialize SQL connections that have been used a certain number of times. You can change the max usage for each connection here.</li>
+
<li><b>SQL Query String</b>: Finally, the actual SQL query you want to test.</li>
+
</ul>
<p><b>Note:</b> If you were going to test multiple SQL queries, you would probably want to add a "Database Login" config element to the top of your test tree, and configure the username, password, database URL, sub-protocol, and Driver class in just the one place. You can similarly add a "Database Connection Pool" config element.</p>
</blockquote>
1.5 +2 -0 jakarta-jmeter/docs/user_manual/logical_controllers.html
Index: logical_controllers.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/logical_controllers.html,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- logical_controllers.html 2001/08/28 21:28:30 1.4
+++ logical_controllers.html 2001/09/05 12:41:22 1.5
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.4 +7 -0 jakarta-jmeter/docs/user_manual/loop_controller.html
Index: loop_controller.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/loop_controller.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- loop_controller.html 2001/08/28 21:28:30 1.3
+++ loop_controller.html 2001/09/05 12:41:22 1.4
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,10 +102,15 @@
<tr><td>
<blockquote>
<p>
+
The Loop Controller forces the test to iterate through certain
+
sub elements multiple times before going on to other test elements. All sub elements are
+
iterated through the specified number of times each time through the test cycle.
+
Users can configure the Loop Controller via its edit screen in the main panel.
+
</p>
</blockquote>
</p>
1.4 +46 -0 jakarta-jmeter/docs/user_manual/modification_manager.html
Index: modification_manager.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/modification_manager.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- modification_manager.html 2001/08/28 21:28:30 1.3
+++ modification_manager.html 2001/09/05 12:41:22 1.4
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,13 +102,20 @@
<tr><td>
<blockquote>
<p>
+
The Modification Manager can be used to introduce dynamic data into a test script. As test samples pass through the
+
Modification Manager, it has the opportunity to modify them. The Modification Manager holds Modifier elements which it
+
uses to control how it modifies test samples. If no Modifier elements are added, the Modification Manager has no effect.
+
</p>
<p>
+
There are two types of Modifiers. Regular Modifiers (currently there aren't any implemented Modifiers), and response
+
based Modifiers (there is one HTML response based Modifier).
+
</p>
</blockquote>
</p>
@@ -122,45 +131,82 @@
<tr><td>
<blockquote>
<p>
+
This modifier parses HTML response from the server and extracts
+
links and forms. A URL test sample that passes through this modifier will be examined to
+
see if it "matches" any of the links or forms extracted
+
from the immediately previous response. It would then replace the values in the URL
+
test sample with appropriate values from the matching link or form. Perl-type regular
+
expressions are used to find matches.
+
</p>
<p>
+
Consider a simple example: let's say you wanted JMeter to "spider" through your site,
+
hitting link after link parsed from the HTML returned from your server (this is not
+
actually the most useful thing to do, but it serves as a good example). You would create
+
a Modification Manager, and add the "HTML Link Parser" to it. Then, create a
+
Web Test controller, and set the domain to ".*", and the path likewise. This will
+
cause your test sample to match with any link found on the returned pages. If you wanted to
+
restrict the spidering to a particular domain, then change the domain value
+
to the one you want. Then, only links to that domain will be followed.
+
</p>
<p>
+
A more useful example: given a web polling application, you might have a page with
+
several poll options as radio buttons for the user to select. Let's say the values
+
of the poll options are very dynamic - maybe user generated. If you wanted JMeter to
+
test the poll, you could either create test samples with hardcoded values chosen, or you
+
could let the HTML Link Parser parse the form, and insert a random poll option into
+
your URL test sample. To do this, follow the above example, except, when configuring
+
your Web Test controller's URL options, be sure to choose "POST" as the
+
method. Put in hard-coded values for the domain, path, and any additional form parameters.
+
Then, for the actual radio button parameter, put in the name (let's say it's called "poll_choice"),
+
and then ".*" for the value of that parameter. When the modifier examines
+
this URL test sample, it will find that it "matches" the poll form (and
+
it shouldn't match any other form, given that you've specified all the other aspects of
+
the URL test sample), and it will replace your form parameters with the matching
+
parameters from the form. Since the regular expression ".*" will match with
+
anything, the modifier will probably have a list of radio buttons to choose from. It
+
will choose at random, and replace the value in your URL test sample. Each time through
+
the test, a new random value will be chosen.</p>
<p>
+
One important thing to remember is that you must create a test sample immediately
+
prior that will return an HTML page with the links and forms that are relevant to
+
your dynamic test sample.
+
</p>
</blockquote>
</p>
1.4 +10 -0 jakarta-jmeter/docs/user_manual/once_only.html
Index: once_only.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/once_only.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- once_only.html 2001/08/28 21:28:30 1.3
+++ once_only.html 2001/09/05 12:41:22 1.4
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,13 +102,21 @@
<tr><td>
<blockquote>
<p>
+
The Once Only Controller causes the controllers under it to deliver test cases only
+
once during a test run. Thereafter, those test cases are dropped from the test.
+
In other words, those test cases will be sampled only during the first iteration.
+
There is no configuration required (or possible) for this controller, so it is
+
very simple to use. One might find this controller useful to create a test plan
+
where a login page is sampled only once, and thereafter skipped - which is typical
+
user behavior.
+
</p>
</blockquote>
</p>
1.6 +42 -0 jakarta-jmeter/docs/user_manual/proxy_server.html
Index: proxy_server.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/proxy_server.html,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- proxy_server.html 2001/08/30 17:19:01 1.5
+++ proxy_server.html 2001/09/05 12:41:22 1.6
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,10 +102,14 @@
<tr><td>
<blockquote>
<p>To use the proxy server, create a Threadgroup in your testplan or workbench.
+
In the Threadgroup, <i>add</i> the Proxy Server (it will be an option under Config Elements).</p>
<p>
+
The Proxy Server allows JMeter to watch and record your actions while you browse your web application
+
with your normal browser (such as Internet Explorer). JMeter will create test sample objects and store them
+
directly into your test plan as you go (so you can view samples interactively while you make them).</p>
</blockquote>
</p>
@@ -119,37 +125,63 @@
<tr><td>
<blockquote>
<p>
+
There are a few simple options in the Proxy Server's configuration screen that give you some control over the Proxy's
+
behavior. First, you can select the port that the Proxy Server listens to. 8080 is the default, but you can change it
+
if that port is already in use on your machine.</p>
<p>
+
The Include and Exclude fields allow you to filter requests. If, for example, you left both fields blank, then JMeter
+
would record every action of your browser. This can often result in 20+ test samples being recorded for each web page
+
(it will record all image requests, CSS files, Javascript files, etc). This is probably not desirable (there are better
+
ways to tell JMeter to download the images from a page). The Include/Exclude fields give you some say over what gets
+
recorded. </p>
<p>
+
If the Include field is left empty, then all requests will "pass" the include test. If the Exclude field is
+
left empty, then all request will "pass" the exclude test. Once the Include field has at least one entry,
+
then only those requests that match at least one entry will "pass" ("pass" means "be
+
recorded"). </p>
<p>
+
If the Exclude field is left empty, then all requests (that have passed the Include field check) will pass. If there are
+
entries in the Exclude field, then any request that matches at least one entry will not be recorded.
+
</p>
<p>
+
To add an entry to the Include or Exclude field, type the entry into the text field, and hit "Enter" when done.
+
The text will be added to the List box to the right of the text field. To clear the text field, hit the "clear"
+
button. Currently, there is no way to individually select items and delete them.
+
</p>
<p>
+
These entries will be treated as Perl-type regular expressions. They will be matched against the host name + the path of
+
each browser request. Thus, if the URL you are browsing is http://jakarta.apache.org/jmeter/index.html?username=xxxx,
+
then the regular expression will be tested against the string: "jakarta.apache.org/jmeter/index.html". Thus,
+
if you wanted to include all .html files, you're regular expression might look like: ".*\.html". Using a
+
combination of includes and excludes, you should be able to record what you are interested in and skip what you are
+
not.</p>
<p>
+
When you are ready to begin, hit "start".</p>
</blockquote>
</p>
@@ -165,12 +197,19 @@
<tr><td>
<blockquote>
<p>
+
The samples will be recorded as Web Test controllers under any Simple Controller elements in your tree (note, if you have more than one
+
Simple Controller, they will all have duplicate Web Test controllers created for them). If your Simple Controller has a
+
Url Sample element with domain or path settings, then your Web Test controllers will be created with blank domain and/or path settings (provided
+
they match, of course). This allows you to simply create test plans with a single top level config element to control which server name is
+
being tested.<br />
+
If there are no Simple Controllers in your test plan, then no samples will be recorded.
+
</p>
</blockquote>
</p>
@@ -186,8 +225,11 @@
<tr><td>
<blockquote>
<p>
+
When you are done recording your test samples, stop the proxy server (hit the "stop" button). Remember to reset
+
your browser's proxy settings. Now, you may want to sort and re-order the test script, add timers, listeners, a
+
cookie manager, etc. </p>
</blockquote>
</p>
1.4 +2 -0 jakarta-jmeter/docs/user_manual/ready_components.html
Index: ready_components.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/ready_components.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ready_components.html 2001/08/28 21:28:30 1.3
+++ ready_components.html 2001/09/05 12:41:22 1.4
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.6 +2 -0 jakarta-jmeter/docs/user_manual/rmi.html
Index: rmi.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/rmi.html,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- rmi.html 2001/08/28 21:28:30 1.5
+++ rmi.html 2001/09/05 12:41:22 1.6
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.5 +2 -0 jakarta-jmeter/docs/user_manual/running.html
Index: running.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/running.html,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- running.html 2001/08/28 21:28:30 1.4
+++ running.html 2001/09/05 12:41:22 1.5
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.5 +2 -0 jakarta-jmeter/docs/user_manual/saving.html
Index: saving.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/saving.html,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- saving.html 2001/08/28 21:28:30 1.4
+++ saving.html 2001/09/05 12:41:22 1.5
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.5 +2 -0 jakarta-jmeter/docs/user_manual/test_samples.html
Index: test_samples.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/test_samples.html,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- test_samples.html 2001/08/28 21:28:30 1.4
+++ test_samples.html 2001/09/05 12:41:22 1.5
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.6 +2 -0 jakarta-jmeter/docs/user_manual/threadgroups.html
Index: threadgroups.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/threadgroups.html,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- threadgroups.html 2001/08/30 17:19:01 1.5
+++ threadgroups.html 2001/09/05 12:41:22 1.6
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.5 +2 -0 jakarta-jmeter/docs/user_manual/timers.html
Index: timers.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/timers.html,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- timers.html 2001/08/28 21:28:30 1.4
+++ timers.html 2001/09/05 12:41:22 1.5
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.5 +2 -0 jakarta-jmeter/docs/user_manual/visualizers.html
Index: visualizers.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/visualizers.html,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- visualizers.html 2001/08/28 21:28:30 1.4
+++ visualizers.html 2001/09/05 12:41:22 1.5
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
1.2 +16 -0 jakarta-jmeter/docs/user_manual/web_test.html
Index: web_test.html
===================================================================
RCS file: /home/cvs/jakarta-jmeter/docs/user_manual/web_test.html,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- web_test.html 2001/08/28 21:28:30 1.1
+++ web_test.html 2001/09/05 12:41:22 1.2
@@ -79,6 +79,8 @@
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
+ <li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
+</li>
</ul>
<p><strong>Community</strong></p>
<ul>
@@ -100,22 +102,36 @@
<tr><td>
<blockquote>
<p>
+
The Web Test controller is a generative controller whose function is to create a single test case for HTTP applications.
+
The Web Test allows you to configure a URL sample:</p>
<ul>
+
<li><b>Protocol</b>: HTTP or HTTPS</li>
+
<li><b>Method</b>: GET or POST</li>
+
<li><b>Domain</b>: Host name of the server being tested</li>
+
<li><b>Port</b>: Port to connect to the server on</li>
+
<li><b>Path</b>: File path. This represent the part of the URL following the domain name, but before any query string that may be involved</li>
+
<li><b>Paramter Table</b>: These are the arguments that will make up the query string. This string will be appended to the URL if Method=GET, and it will be sent in a separate stream if Method=POST.</li>
+
</ul>
<p>Additionally, there are two check selections that allow you to control whether JMeter will also download any images found on
+
the page returned by the server, or to tell JMeter that it should upload a file using multipart-form format. If you are uploading a file, JMeter requires three additional parameters:</p>
<ul>
+
<li><b>File</b>: The path to the file being uploaded</li>
+
<li><b>Field Name</b>: The name of the upload field (ie, if it were a web page, there would be an input field with a name - this is that name)</li>
+
<li><b>MimeType</b>: The mimetype of the document being uploaded</li>
+
</ul>
</blockquote>
</p>
1.1 jakarta-jmeter/docs/user_manual/sslmanager.html
Index: sslmanager.html
===================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- Content Stylesheet for Site -->
<!-- start the processing -->
<!-- ====================================================================== -->
<!-- Main Page Section -->
<!-- ====================================================================== -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<meta name="author" value="Berin Loritsch">
<meta name="email" value="bloritsch@apache.org">
<title>JMeter - Using the SSL Manager</title>
</head>
<body bgcolor="#ffffff" text="#000000" link="#525D76">
<table border="0" width="100%" cellspacing="0">
<!-- TOP IMAGE -->
<tr>
<td colspan="2">
<a href="http://jakarta.apache.org"><img src="http://jakarta.apache.org/images/jakarta-logo.gif" align="left" border="0"/></a>
</td>
</tr>
</table>
<table border="0" width="100%" cellspacing="4">
<tr><td colspan="2">
<hr noshade="" size="1"/>
</td></tr>
<tr>
<!-- LEFT SIDE NAVIGATION -->
<td width="20%" valign="top" nowrap="true">
<p><strong>About</strong></p>
<ul>
<li> <a href="../index.html">Overview</a>
</li>
<li> <a href="http://jakarta.apache.org/builds/jakarta-jmeter/">Download</a>
</li>
<li> <a href="../installing.html">Install</a>
</li>
<li> <a href="../running.html">Running</a>
</li>
<li> <a href="../extending/index.html">Extending</a>
</li>
<li> <a href="../changes.html">Changes</a>
</li>
<li> <a href="http://nagoya.apache.org/bugzilla/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfieldfrom=&chfieldto=Now&chfieldvalue=&product=JMeter&short_desc=&short_desc_type=substring&long_desc=&long_desc_type=substring&bug_file_loc=&bug_file_loc_type=substring&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&order=Reuse+same+sort+as+last+time">Known Bugs</a>
</li>
<li> <a href="../license.html">License</a>
</li>
<li> <a href="../todo.html">TODO</a>
</li>
</ul>
<p><strong>User Manual</strong></p>
<ul>
<li> <a href="../user_manual/index.html">Overview</a>
</li>
<li> <a href="../user_manual/threadgroups.html">ThreadGroups</a>
</li>
<li> <a href="../user_manual/test_samples.html">Generative Controls</a>
</li>
<li> <a href="../user_manual/logical_controllers.html">Logical Controls</a>
</li>
<li> <a href="../user_manual/visualizers.html">Visualizers</a>
</li>
<li> <a href="../user_manual/timers.html">Timers</a>
</li>
<li> <a href="../user_manual/running.html">Running a Test</a>
</li>
<li> <a href="../user_manual/saving.html">Saving/Loading</a>
</li>
<li> <a href="../user_manual/rmi.html">Distributed JMeter</a>
</li>
<li> <a href="../user_manual/proxy_server.html">Recording Browser Activity</a>
</li>
<li> <a href="../user_manual/ready_components.html">Built-in Components</a>
</li>
<li> <a href="../user_manual/sslmanager.html">Using the SSL Manager</a>
</li>
</ul>
<p><strong>Community</strong></p>
<ul>
<li> <a href="http://jakarta.apache.org/site/getinvolved.html">Get Involved</a>
</li>
<li> <a href="http://jakarta.apache.org/site/mail.html">Mailing Lists</a>
</li>
<li> <a href="http://jakarta.apache.org/site/cvsindex.html">CVS Repositories</a>
</li>
</ul>
</td>
<td width="80%" align="left" valign="top">
<table border="0" cellspacing="0" cellpadding="2" width="100%">
<tr><td bgcolor="#525D76">
<font color="#ffffff" face="arial,helvetica,sanserif">
<a name="What is the SSL Manager"><strong>What is the SSL Manager</strong></a>
</font>
</td></tr>
<tr><td>
<blockquote>
<p>
The SSL Manager is a way to select a client certificate so that you can test
applications that use Public Key Infrastructure (PKI). In order to use it,
you must have JSSE 1.0.2 installed. Unfortunately, there is no standard method
for controling who a client is--and that won't be introduced until JDK 1.4 is
officially available. The SSL Manager should still work with JDK 1.4, so this
is the best solution we could come up with.
</p>
</blockquote>
</p>
</td></tr>
<tr><td><br/></td></tr>
</table>
<table border="0" cellspacing="0" cellpadding="2" width="100%">
<tr><td bgcolor="#525D76">
<font color="#ffffff" face="arial,helvetica,sanserif">
<a name="Choosing a Client Certificate"><strong>Choosing a Client Certificate</strong></a>
</font>
</td></tr>
<tr><td>
<blockquote>
<p>
You may either use a Java Key Store (JKS) format key store, or a Public Key
Certificate Standard #12 (PKCS12) file for your client certificates. There
is a bug in the JSSE libraries that require you to have at least a six character
password on your key (at least for the keytool utility that comes with your
JDK).
</p>
<p>
To select the client certificate, choose Options->SSL Manager from the menu bar.
You will be presented with a file finder that looks for PKCS12 files by default.
Your PKCS12 file must have the extension '.p12' for SSL Manager to recognize it
as a PKCS12 file. Any other file will be treated like an average JKS key store.
If JSSE is correctly installed, you will be prompted for the password. The text
box does not hide the characters you type at this point--so make sure no one is
looking over your shoulder. The current implementation assumes that the password
for the keystore is also the password for the private key of the client you want
to authenticate as.
</p>
<p>
The next time you run your test, the SSL Manager will examine your key store to
see if it has more than one key available to it. If there is only one key, SSL
Manager will select it for you. If there is more than one key, you will be prompted
to select the alias you wish to authenticate as. If SSL Manager cannot detect
any keys in your keystore, it will give you a text box for the off chance you know
something it doesn't. Keep in mind that for the first run, you will be prompted
once per thread. Try to use only one thread for the first run to ensure everything
is working properly.
</p>
</blockquote>
</p>
</td></tr>
<tr><td><br/></td></tr>
</table>
<table border="0" cellspacing="0" cellpadding="2" width="100%">
<tr><td bgcolor="#525D76">
<font color="#ffffff" face="arial,helvetica,sanserif">
<a name="Things to Look Out For"><strong>Things to Look Out For</strong></a>
</font>
</td></tr>
<tr><td>
<blockquote>
<p>
You must have your Certificate Authority (CA) certificate installed properly
if it is not signed by one of the five CA certificates that ships with your
JDK. One method to install it is to import your CA certificate into a JKS
file, and name the JKS file "jssecacerts". Place the file in your JRE's
lib/security folder. This file will be read before the "cacerts" file in
the same directory. Keep in mind that as long as the "jssecacerts" file
exists, the certificates installed in "cacerts" will not be used. This may
cause problems for you. If you don't mind importing your CA certificate into
the "cacerts" file, then you can authenticate against all of the CA certificates
installed.
</p>
</blockquote>
</p>
</td></tr>
<tr><td><br/></td></tr>
</table>
</td>
</tr>
<!-- FOOTER -->
<tr><td colspan="2">
<hr noshade="" size="1"/>
</td></tr>
<tr><td colspan="2">
<div align="center"><font color="#525D76" size="-1"><em>
Copyright © 1999-2001, Apache Software Foundation
</em></font></div>
</td></tr>
</table>
</body>
</html>
<!-- end the processing -->
1.6 +1 -0 jakarta-jmeter/xdocs/stylesheets/project.xml
Index: project.xml
===================================================================
RCS file: /home/cvs/jakarta-jmeter/xdocs/stylesheets/project.xml,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- project.xml 2001/08/28 21:28:33 1.5
+++ project.xml 2001/09/05 12:41:23 1.6
@@ -30,6 +30,7 @@
<item name="Distributed JMeter" href="/user_manual/rmi.html"/>
<item name="Recording Browser Activity" href="/user_manual/proxy_server.html"/>
<item name="Built-in Components" href="/user_manual/ready_components.html"/>
+ <item name="Using the SSL Manager" href="/user_manual/sslmanager.html"/>
</menu>
<menu name="Community">
<item name="Get Involved" href="/site/getinvolved.html"/>
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org