mirror of https://github.com/apache/jmeter.git
Update to htmlparser 2.0
git-svn-id: https://svn.apache.org/repos/asf/jakarta/jmeter/branches/rel-2-2@512075 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
468b472050
commit
30ff6849e5
|
|
@ -0,0 +1,213 @@
|
||||||
|
Common Public License Version 1.0
|
||||||
|
|
||||||
|
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
|
||||||
|
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
|
||||||
|
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
|
||||||
|
|
||||||
|
1. DEFINITIONS
|
||||||
|
|
||||||
|
"Contribution" means:
|
||||||
|
|
||||||
|
a) in the case of the initial Contributor, the initial code and
|
||||||
|
documentation distributed under this Agreement, and
|
||||||
|
|
||||||
|
b) in the case of each subsequent Contributor:
|
||||||
|
|
||||||
|
i) changes to the Program, and
|
||||||
|
|
||||||
|
ii) additions to the Program;
|
||||||
|
|
||||||
|
where such changes and/or additions to the Program originate from and are
|
||||||
|
distributed by that particular Contributor. A Contribution 'originates' from a
|
||||||
|
Contributor if it was added to the Program by such Contributor itself or anyone
|
||||||
|
acting on such Contributor's behalf. Contributions do not include additions to
|
||||||
|
the Program which: (i) are separate modules of software distributed in
|
||||||
|
conjunction with the Program under their own license agreement, and (ii) are not
|
||||||
|
derivative works of the Program.
|
||||||
|
|
||||||
|
"Contributor" means any person or entity that distributes the Program.
|
||||||
|
|
||||||
|
"Licensed Patents " mean patent claims licensable by a Contributor which are
|
||||||
|
necessarily infringed by the use or sale of its Contribution alone or when
|
||||||
|
combined with the Program.
|
||||||
|
|
||||||
|
"Program" means the Contributions distributed in accordance with this Agreement.
|
||||||
|
|
||||||
|
"Recipient" means anyone who receives the Program under this Agreement,
|
||||||
|
including all Contributors.
|
||||||
|
|
||||||
|
2. GRANT OF RIGHTS
|
||||||
|
|
||||||
|
a) Subject to the terms of this Agreement, each Contributor hereby grants
|
||||||
|
Recipient a non-exclusive, worldwide, royalty-free copyright license to
|
||||||
|
reproduce, prepare derivative works of, publicly display, publicly perform,
|
||||||
|
distribute and sublicense the Contribution of such Contributor, if any, and such
|
||||||
|
derivative works, in source code and object code form.
|
||||||
|
|
||||||
|
b) Subject to the terms of this Agreement, each Contributor hereby grants
|
||||||
|
Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
|
||||||
|
Patents to make, use, sell, offer to sell, import and otherwise transfer the
|
||||||
|
Contribution of such Contributor, if any, in source code and object code form.
|
||||||
|
This patent license shall apply to the combination of the Contribution and the
|
||||||
|
Program if, at the time the Contribution is added by the Contributor, such
|
||||||
|
addition of the Contribution causes such combination to be covered by the
|
||||||
|
Licensed Patents. The patent license shall not apply to any other combinations
|
||||||
|
which include the Contribution. No hardware per se is licensed hereunder.
|
||||||
|
|
||||||
|
c) Recipient understands that although each Contributor grants the licenses
|
||||||
|
to its Contributions set forth herein, no assurances are provided by any
|
||||||
|
Contributor that the Program does not infringe the patent or other intellectual
|
||||||
|
property rights of any other entity. Each Contributor disclaims any liability to
|
||||||
|
Recipient for claims brought by any other entity based on infringement of
|
||||||
|
intellectual property rights or otherwise. As a condition to exercising the
|
||||||
|
rights and licenses granted hereunder, each Recipient hereby assumes sole
|
||||||
|
responsibility to secure any other intellectual property rights needed, if any.
|
||||||
|
For example, if a third party patent license is required to allow Recipient to
|
||||||
|
distribute the Program, it is Recipient's responsibility to acquire that license
|
||||||
|
before distributing the Program.
|
||||||
|
|
||||||
|
d) Each Contributor represents that to its knowledge it has sufficient
|
||||||
|
copyright rights in its Contribution, if any, to grant the copyright license set
|
||||||
|
forth in this Agreement.
|
||||||
|
|
||||||
|
3. REQUIREMENTS
|
||||||
|
|
||||||
|
A Contributor may choose to distribute the Program in object code form under its
|
||||||
|
own license agreement, provided that:
|
||||||
|
|
||||||
|
a) it complies with the terms and conditions of this Agreement; and
|
||||||
|
|
||||||
|
b) its license agreement:
|
||||||
|
|
||||||
|
i) effectively disclaims on behalf of all Contributors all warranties and
|
||||||
|
conditions, express and implied, including warranties or conditions of title and
|
||||||
|
non-infringement, and implied warranties or conditions of merchantability and
|
||||||
|
fitness for a particular purpose;
|
||||||
|
|
||||||
|
ii) effectively excludes on behalf of all Contributors all liability for
|
||||||
|
damages, including direct, indirect, special, incidental and consequential
|
||||||
|
damages, such as lost profits;
|
||||||
|
|
||||||
|
iii) states that any provisions which differ from this Agreement are offered
|
||||||
|
by that Contributor alone and not by any other party; and
|
||||||
|
|
||||||
|
iv) states that source code for the Program is available from such
|
||||||
|
Contributor, and informs licensees how to obtain it in a reasonable manner on or
|
||||||
|
through a medium customarily used for software exchange.
|
||||||
|
|
||||||
|
When the Program is made available in source code form:
|
||||||
|
|
||||||
|
a) it must be made available under this Agreement; and
|
||||||
|
|
||||||
|
b) a copy of this Agreement must be included with each copy of the Program.
|
||||||
|
|
||||||
|
Contributors may not remove or alter any copyright notices contained within the
|
||||||
|
Program.
|
||||||
|
|
||||||
|
Each Contributor must identify itself as the originator of its Contribution, if
|
||||||
|
any, in a manner that reasonably allows subsequent Recipients to identify the
|
||||||
|
originator of the Contribution.
|
||||||
|
|
||||||
|
4. COMMERCIAL DISTRIBUTION
|
||||||
|
|
||||||
|
Commercial distributors of software may accept certain responsibilities with
|
||||||
|
respect to end users, business partners and the like. While this license is
|
||||||
|
intended to facilitate the commercial use of the Program, the Contributor who
|
||||||
|
includes the Program in a commercial product offering should do so in a manner
|
||||||
|
which does not create potential liability for other Contributors. Therefore, if
|
||||||
|
a Contributor includes the Program in a commercial product offering, such
|
||||||
|
Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
|
||||||
|
every other Contributor ("Indemnified Contributor") against any losses, damages
|
||||||
|
and costs (collectively "Losses") arising from claims, lawsuits and other legal
|
||||||
|
actions brought by a third party against the Indemnified Contributor to the
|
||||||
|
extent caused by the acts or omissions of such Commercial Contributor in
|
||||||
|
connection with its distribution of the Program in a commercial product
|
||||||
|
offering. The obligations in this section do not apply to any claims or Losses
|
||||||
|
relating to any actual or alleged intellectual property infringement. In order
|
||||||
|
to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
|
||||||
|
Contributor in writing of such claim, and b) allow the Commercial Contributor to
|
||||||
|
control, and cooperate with the Commercial Contributor in, the defense and any
|
||||||
|
related settlement negotiations. The Indemnified Contributor may participate in
|
||||||
|
any such claim at its own expense.
|
||||||
|
|
||||||
|
For example, a Contributor might include the Program in a commercial product
|
||||||
|
offering, Product X. That Contributor is then a Commercial Contributor. If that
|
||||||
|
Commercial Contributor then makes performance claims, or offers warranties
|
||||||
|
related to Product X, those performance claims and warranties are such
|
||||||
|
Commercial Contributor's responsibility alone. Under this section, the
|
||||||
|
Commercial Contributor would have to defend claims against the other
|
||||||
|
Contributors related to those performance claims and warranties, and if a court
|
||||||
|
requires any other Contributor to pay any damages as a result, the Commercial
|
||||||
|
Contributor must pay those damages.
|
||||||
|
|
||||||
|
5. NO WARRANTY
|
||||||
|
|
||||||
|
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
|
||||||
|
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
|
||||||
|
NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
|
||||||
|
Recipient is solely responsible for determining the appropriateness of using and
|
||||||
|
distributing the Program and assumes all risks associated with its exercise of
|
||||||
|
rights under this Agreement, including but not limited to the risks and costs of
|
||||||
|
program errors, compliance with applicable laws, damage to or loss of data,
|
||||||
|
programs or equipment, and unavailability or interruption of operations.
|
||||||
|
|
||||||
|
6. DISCLAIMER OF LIABILITY
|
||||||
|
|
||||||
|
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
|
||||||
|
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
|
||||||
|
PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
|
||||||
|
GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
7. GENERAL
|
||||||
|
|
||||||
|
If any provision of this Agreement is invalid or unenforceable under applicable
|
||||||
|
law, it shall not affect the validity or enforceability of the remainder of the
|
||||||
|
terms of this Agreement, and without further action by the parties hereto, such
|
||||||
|
provision shall be reformed to the minimum extent necessary to make such
|
||||||
|
provision valid and enforceable.
|
||||||
|
|
||||||
|
If Recipient institutes patent litigation against a Contributor with respect to
|
||||||
|
a patent applicable to software (including a cross-claim or counterclaim in a
|
||||||
|
lawsuit), then any patent licenses granted by that Contributor to such Recipient
|
||||||
|
under this Agreement shall terminate as of the date such litigation is filed. In
|
||||||
|
addition, if Recipient institutes patent litigation against any entity
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that the Program
|
||||||
|
itself (excluding combinations of the Program with other software or hardware)
|
||||||
|
infringes such Recipient's patent(s), then such Recipient's rights granted under
|
||||||
|
Section 2(b) shall terminate as of the date such litigation is filed.
|
||||||
|
|
||||||
|
All Recipient's rights under this Agreement shall terminate if it fails to
|
||||||
|
comply with any of the material terms or conditions of this Agreement and does
|
||||||
|
not cure such failure in a reasonable period of time after becoming aware of
|
||||||
|
such noncompliance. If all Recipient's rights under this Agreement terminate,
|
||||||
|
Recipient agrees to cease use and distribution of the Program as soon as
|
||||||
|
reasonably practicable. However, Recipient's obligations under this Agreement
|
||||||
|
and any licenses granted by Recipient relating to the Program shall continue and
|
||||||
|
survive.
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute copies of this Agreement, but in
|
||||||
|
order to avoid inconsistency the Agreement is copyrighted and may only be
|
||||||
|
modified in the following manner. The Agreement Steward reserves the right to
|
||||||
|
publish new versions (including revisions) of this Agreement from time to time.
|
||||||
|
No one other than the Agreement Steward has the right to modify this Agreement.
|
||||||
|
IBM is the initial Agreement Steward. IBM may assign the responsibility to serve
|
||||||
|
as the Agreement Steward to a suitable separate entity. Each new version of the
|
||||||
|
Agreement will be given a distinguishing version number. The Program (including
|
||||||
|
Contributions) may always be distributed subject to the version of the Agreement
|
||||||
|
under which it was received. In addition, after a new version of the Agreement
|
||||||
|
is published, Contributor may elect to distribute the Program (including its
|
||||||
|
Contributions) under the new version. Except as expressly stated in Sections
|
||||||
|
2(a) and 2(b) above, Recipient receives no rights or licenses to the
|
||||||
|
intellectual property of any Contributor under this Agreement, whether
|
||||||
|
expressly, by implication, estoppel or otherwise. All rights in the Program not
|
||||||
|
expressly granted under this Agreement are reserved.
|
||||||
|
|
||||||
|
This Agreement is governed by the laws of the State of New York and the
|
||||||
|
intellectual property laws of the United States of America. No party to this
|
||||||
|
Agreement will bring a legal action under this Agreement more than one year
|
||||||
|
after the cause of action arose. Each party waives its rights to a jury trial in
|
||||||
|
any resulting litigation.
|
||||||
3
NOTICE
3
NOTICE
|
|
@ -32,8 +32,7 @@ For detailed information about HTMLParser, the project is
|
||||||
hosted on Sourceforge at http://htmlparser.sourceforge.net/
|
hosted on Sourceforge at http://htmlparser.sourceforge.net/
|
||||||
|
|
||||||
The developers of JMeter and Apache are grateful to the developers
|
The developers of JMeter and Apache are grateful to the developers
|
||||||
of HTMLParser for giving Apache Software Foundation a non-exclusive
|
of HTMLParser for re-releasing htmlparser under CPL V1.0
|
||||||
license to use HTMLParser under Apache 1 license.
|
|
||||||
|
|
||||||
HTMLParser was originally created by Somik Raha in 2000.
|
HTMLParser was originally created by Somik Raha in 2000.
|
||||||
Derrick Oswald is the current lead developer and was kind
|
Derrick Oswald is the current lead developer and was kind
|
||||||
|
|
|
||||||
160
build.xml
160
build.xml
|
|
@ -140,12 +140,6 @@
|
||||||
<sourcePath path="${src.jms}" />
|
<sourcePath path="${src.jms}" />
|
||||||
<sourcePath path="${src.report}" />
|
<sourcePath path="${src.report}" />
|
||||||
|
|
||||||
<!--
|
|
||||||
Uncomment the following 2 lines to include htmlparser in the analysis
|
|
||||||
<class location="${lib.dir}/htmlparser.jar" />
|
|
||||||
<sourcePath path="${src.htmlparser}" />
|
|
||||||
-->
|
|
||||||
|
|
||||||
<auxClasspath>
|
<auxClasspath>
|
||||||
<fileset dir="${lib.dir}">
|
<fileset dir="${lib.dir}">
|
||||||
<include name="*.jar"/>
|
<include name="*.jar"/>
|
||||||
|
|
@ -194,8 +188,6 @@
|
||||||
<property name="src.functions" value="src/functions"/>
|
<property name="src.functions" value="src/functions"/>
|
||||||
<property name="src.jorphan" value="src/jorphan"/>
|
<property name="src.jorphan" value="src/jorphan"/>
|
||||||
<property name="src.ldap" value="src/protocol/ldap"/>
|
<property name="src.ldap" value="src/protocol/ldap"/>
|
||||||
<property name="src.htmlparser" value="src/htmlparser"/>
|
|
||||||
<property name="src.htmlparser16" value="src/htmlparser16"/>
|
|
||||||
<property name="src.tcp" value="src/protocol/tcp"/>
|
<property name="src.tcp" value="src/protocol/tcp"/>
|
||||||
<property name="src.examples" value="src/examples"/>
|
<property name="src.examples" value="src/examples"/>
|
||||||
<property name="src.mail" value="src/protocol/mail"/>
|
<property name="src.mail" value="src/protocol/mail"/>
|
||||||
|
|
@ -221,8 +213,6 @@
|
||||||
<pathelement location="${src.junit}"/>
|
<pathelement location="${src.junit}"/>
|
||||||
<pathelement location="${src.jorphan}"/>
|
<pathelement location="${src.jorphan}"/>
|
||||||
<pathelement location="${src.ldap}"/>
|
<pathelement location="${src.ldap}"/>
|
||||||
<pathelement location="${src.htmlparser}"/>
|
|
||||||
<pathelement location="${src.htmlparser16}"/>
|
|
||||||
<pathelement location="${src.tcp}"/>
|
<pathelement location="${src.tcp}"/>
|
||||||
<pathelement location="${src.examples}"/>
|
<pathelement location="${src.examples}"/>
|
||||||
<pathelement location="${src.mail}"/>
|
<pathelement location="${src.mail}"/>
|
||||||
|
|
@ -245,8 +235,6 @@
|
||||||
<property name="build.jorphan" value="build/jorphan"/>
|
<property name="build.jorphan" value="build/jorphan"/>
|
||||||
<property name="build.ldap" location="build/protocol/ldap"/>
|
<property name="build.ldap" location="build/protocol/ldap"/>
|
||||||
<property name="build.mail" location="build/protocol/mail"/>
|
<property name="build.mail" location="build/protocol/mail"/>
|
||||||
<property name="build.htmlparser" location="build/htmlparser"/>
|
|
||||||
<property name="build.htmlparser16" location="build/htmlparser16"/>
|
|
||||||
<property name="build.tcp" location="build/protocol/tcp"/>
|
<property name="build.tcp" location="build/protocol/tcp"/>
|
||||||
<property name="build.examples" location="build/examples"/>
|
<property name="build.examples" location="build/examples"/>
|
||||||
<property name="build.monitor.components" location="build/monitor/components"/>
|
<property name="build.monitor.components" location="build/monitor/components"/>
|
||||||
|
|
@ -399,10 +387,9 @@
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- Build classpath (includes the optional jar directory) -->
|
<!-- Build classpath (includes the optional jar directory) -->
|
||||||
<!-- Exclude the htmlparser jars to prevent clashes between versions -->
|
|
||||||
<path id="classpath">
|
<path id="classpath">
|
||||||
<fileset dir="${lib.dir}" includes="*.jar" excludes="htmlparser*.jar"/>
|
<fileset dir="${lib.dir}" includes="*.jar"/>
|
||||||
<fileset dir="${lib.opt}" includes="*.jar" excludes="htmlparser*.jar"/>
|
<fileset dir="${lib.opt}" includes="*.jar"/>
|
||||||
</path>
|
</path>
|
||||||
|
|
||||||
<!-- Anakia classpath -->
|
<!-- Anakia classpath -->
|
||||||
|
|
@ -454,11 +441,6 @@
|
||||||
<available classname="bsh.Interpreter" property="beanshell.present">
|
<available classname="bsh.Interpreter" property="beanshell.present">
|
||||||
<classpath refid="classpath"/>
|
<classpath refid="classpath"/>
|
||||||
</available>
|
</available>
|
||||||
<available classname="org.htmlparser.Tag" property="htmlparser16.present">
|
|
||||||
<classpath>
|
|
||||||
<fileset dir="${lib.opt}" includes="htmlparser1_6.jar"/>
|
|
||||||
</classpath>
|
|
||||||
</available>
|
|
||||||
<available classname="javax.jms.Message" property="jms.present">
|
<available classname="javax.jms.Message" property="jms.present">
|
||||||
<classpath refid="classpath"/>
|
<classpath refid="classpath"/>
|
||||||
</available>
|
</available>
|
||||||
|
|
@ -479,16 +461,12 @@
|
||||||
<echo message="Classes for BeanShell support not found in classpath"/>
|
<echo message="Classes for BeanShell support not found in classpath"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="htmlparser16-message" depends="check-libs" unless="htmlparser16.present">
|
|
||||||
<echo message="Classes for HTMLParser 1.6 support not found in classpath"/>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="jms-message" depends="check-libs" unless="jms.present">
|
<target name="jms-message" depends="check-libs" unless="jms.present">
|
||||||
<echo message="Classes for JMS support not found in classpath"/>
|
<echo message="Classes for JMS support not found in classpath"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="report-missing-libs"
|
<target name="report-missing-libs"
|
||||||
depends="ssl-message,mail-message,beanshell-message,htmlparser16-message,jms-message"
|
depends="ssl-message,mail-message,beanshell-message,jms-message"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
@ -551,10 +529,9 @@
|
||||||
</javac>
|
</javac>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="compile-http" depends="compile-jorphan,compile-core,compile-components,compile-htmlparser" description="Compile components specific to HTTP sampling.">
|
<target name="compile-http" depends="compile-jorphan,compile-core,compile-components" description="Compile components specific to HTTP sampling.">
|
||||||
<mkdir dir="${build.http}"/>
|
<mkdir dir="${build.http}"/>
|
||||||
<!-- Directory needs to exist, or jar will fail -->
|
<!-- Directory needs to exist, or jar will fail -->
|
||||||
<mkdir dir="${build.htmlparser16}"/>
|
|
||||||
<javac srcdir="${src.http}" destdir="${build.http}" source="${src.java.version}" optimize="${optimize}" debug="on" target="${target.java.version}" deprecation="${deprecation}" encoding="${encoding}">
|
<javac srcdir="${src.http}" destdir="${build.http}" source="${src.java.version}" optimize="${optimize}" debug="on" target="${target.java.version}" deprecation="${deprecation}" encoding="${encoding}">
|
||||||
<include name="**/*.java"/>
|
<include name="**/*.java"/>
|
||||||
<exclude name="org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java" unless="javamail.complete"/>
|
<exclude name="org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java" unless="javamail.complete"/>
|
||||||
|
|
@ -563,27 +540,11 @@
|
||||||
<pathelement location="${build.jorphan}"/>
|
<pathelement location="${build.jorphan}"/>
|
||||||
<pathelement location="${build.core}"/>
|
<pathelement location="${build.core}"/>
|
||||||
<pathelement location="${build.components}"/>
|
<pathelement location="${build.components}"/>
|
||||||
<pathelement location="${build.htmlparser}"/>
|
|
||||||
<path refid="classpath"/>
|
<path refid="classpath"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
</javac>
|
</javac>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="compile-htmlparser16" depends="compile-http,compile-htmlparser" description="Compile htmlparser 1.6 support" if="htmlparser16.present">
|
|
||||||
<mkdir dir="${build.htmlparser16}"/>
|
|
||||||
<javac srcdir="${src.htmlparser16}" destdir="${build.htmlparser16}" optimize="${optimize}" debug="on" source="${src.java.version}" target="${target.java.version}" deprecation="${deprecation}" encoding="${encoding}">
|
|
||||||
<include name="**/*.java"/>
|
|
||||||
<classpath>
|
|
||||||
<pathelement location="${build.jorphan}"/>
|
|
||||||
<pathelement location="${build.core}"/>
|
|
||||||
<pathelement location="${build.http}"/>
|
|
||||||
<fileset dir="${lib.opt}" includes="htmlparser1_6.jar"/>
|
|
||||||
<pathelement location="${}"/>
|
|
||||||
<path refid="classpath"/>
|
|
||||||
</classpath>
|
|
||||||
</javac>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="compile-tests" description="Compile test components only">
|
<target name="compile-tests" description="Compile test components only">
|
||||||
<mkdir dir="${build.test}"/>
|
<mkdir dir="${build.test}"/>
|
||||||
<javac srcdir="${src.test}" destdir="${build.test}" source="${src.java.version}" optimize="${optimize}" debug="on" target="${target.java.version}" deprecation="${deprecation}" encoding="${encoding}">
|
<javac srcdir="${src.test}" destdir="${build.test}" source="${src.java.version}" optimize="${optimize}" debug="on" target="${target.java.version}" deprecation="${deprecation}" encoding="${encoding}">
|
||||||
|
|
@ -711,7 +672,7 @@
|
||||||
</javac>
|
</javac>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="compile-protocols" depends="compile-http,compile-htmlparser16,compile-ftp,compile-jdbc,compile-java,compile-ldap,compile-mail,compile-tcp" description="Compile all protocol-specific components."/>
|
<target name="compile-protocols" depends="compile-http,compile-ftp,compile-jdbc,compile-java,compile-ldap,compile-mail,compile-tcp" description="Compile all protocol-specific components."/>
|
||||||
|
|
||||||
<target name="compile-examples" depends="compile-jorphan,compile-core" description="Compile example components.">
|
<target name="compile-examples" depends="compile-jorphan,compile-core" description="Compile example components.">
|
||||||
<mkdir dir="${build.examples}"/>
|
<mkdir dir="${build.examples}"/>
|
||||||
|
|
@ -781,18 +742,6 @@
|
||||||
</rmic>
|
</rmic>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="compile-htmlparser" depends="" description="Compile htmlparser.">
|
|
||||||
<mkdir dir="${build.htmlparser}"/>
|
|
||||||
<javac srcdir="${src.htmlparser}" destdir="${build.htmlparser}" optimize="${optimize}" debug="on" source="${src.java.version}" target="${target.java.version}" deprecation="${deprecation}" encoding="${encoding}">
|
|
||||||
<include name="**/*.java"/>
|
|
||||||
<classpath>
|
|
||||||
<pathelement location="${build.jorphan}"/>
|
|
||||||
<pathelement location="${build.core}"/>
|
|
||||||
<path refid="classpath"/>
|
|
||||||
</classpath>
|
|
||||||
</javac>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="compile-jms" depends="compile-jorphan,compile-core,compile-components"
|
<target name="compile-jms" depends="compile-jorphan,compile-core,compile-components"
|
||||||
description="Compile components specific to JMS sampling."
|
description="Compile components specific to JMS sampling."
|
||||||
if="jms.present">
|
if="jms.present">
|
||||||
|
|
@ -808,7 +757,7 @@
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="compile"
|
<target name="compile"
|
||||||
depends="compile-core,compile-components,compile-functions,compile-protocols,compile-rmi,compile-htmlparser,compile-monitor,compile-junit,compile-jms,compile-report"
|
depends="compile-core,compile-components,compile-functions,compile-protocols,compile-rmi,compile-monitor,compile-junit,compile-jms,compile-report"
|
||||||
description="Compile everything."/>
|
description="Compile everything."/>
|
||||||
|
|
||||||
<target name="package" depends="compile, package-only"
|
<target name="package" depends="compile, package-only"
|
||||||
|
|
@ -899,10 +848,9 @@ some of its classes - at present JMeter can only run from jar files.
|
||||||
</manifest>
|
</manifest>
|
||||||
</jar>
|
</jar>
|
||||||
|
|
||||||
<!-- http without HtmlParserHTMLParser -->
|
<!-- http -->
|
||||||
<jar jarfile="${dest.jar}/ApacheJMeter_http.jar" manifest="MANIFEST">
|
<jar jarfile="${dest.jar}/ApacheJMeter_http.jar" manifest="MANIFEST">
|
||||||
<fileset dir="${build.http}" includes="**/*.class"
|
<fileset dir="${build.http}" includes="**/*.class"/>
|
||||||
excludes="**/HtmlParserHTMLParser.class"/>
|
|
||||||
<fileset dir="${src.http}" includes="**/*.properties" />
|
<fileset dir="${src.http}" includes="**/*.properties" />
|
||||||
<metainf dir="." includes="LICENSE,NOTICE"/>
|
<metainf dir="." includes="LICENSE,NOTICE"/>
|
||||||
<manifest>
|
<manifest>
|
||||||
|
|
@ -912,30 +860,6 @@ some of its classes - at present JMeter can only run from jar files.
|
||||||
<attribute name="X-Compile-Target-JDK" value="${target.java.version}"/>
|
<attribute name="X-Compile-Target-JDK" value="${target.java.version}"/>
|
||||||
</manifest>
|
</manifest>
|
||||||
</jar>
|
</jar>
|
||||||
|
|
||||||
<!-- HtmlParserHTMLParser -->
|
|
||||||
<jar jarfile="${lib.dir}/htmlparserparser.jar" manifest="MANIFEST">
|
|
||||||
<fileset dir="${build.http}" includes="**/HtmlParserHTMLParser.class"/>
|
|
||||||
<metainf dir="." includes="LICENSE,NOTICE"/>
|
|
||||||
<manifest>
|
|
||||||
<attribute name="Built-By" value="${user.name}"/>
|
|
||||||
<attribute name="Implementation-Version" value="${jmeter.version}"/>
|
|
||||||
<attribute name="X-Compile-Source-JDK" value="${src.java.version}"/>
|
|
||||||
<attribute name="X-Compile-Target-JDK" value="${target.java.version}"/>
|
|
||||||
</manifest>
|
|
||||||
</jar>
|
|
||||||
|
|
||||||
<!-- HtmlParserHTMLParser16 -->
|
|
||||||
<jar jarfile="${lib.dir}/htmlparserparser16.jar" manifest="MANIFEST">
|
|
||||||
<fileset dir="${build.htmlparser16}" includes="**/*.class"/>
|
|
||||||
<metainf dir="." includes="LICENSE,NOTICE"/>
|
|
||||||
<manifest>
|
|
||||||
<attribute name="Built-By" value="${user.name}"/>
|
|
||||||
<attribute name="Implementation-Version" value="${jmeter.version}"/>
|
|
||||||
<attribute name="X-Compile-Source-JDK" value="${src.java.version}"/>
|
|
||||||
<attribute name="X-Compile-Target-JDK" value="${target.java.version}"/>
|
|
||||||
</manifest>
|
|
||||||
</jar>
|
|
||||||
|
|
||||||
<!-- ftp -->
|
<!-- ftp -->
|
||||||
<jar jarfile="${dest.jar}/ApacheJMeter_ftp.jar" manifest="MANIFEST">
|
<jar jarfile="${dest.jar}/ApacheJMeter_ftp.jar" manifest="MANIFEST">
|
||||||
|
|
@ -1081,19 +1005,7 @@ some of its classes - at present JMeter can only run from jar files.
|
||||||
<attribute name="X-Compile-Target-JDK" value="${target.java.version}"/>
|
<attribute name="X-Compile-Target-JDK" value="${target.java.version}"/>
|
||||||
</manifest>
|
</manifest>
|
||||||
</jar>
|
</jar>
|
||||||
|
|
||||||
<jar jarfile="${lib.dir}/htmlparser.jar" manifest="MANIFEST">
|
|
||||||
<fileset dir="${build.htmlparser}" includes="**/*.class" excludes="org/htmlparser/tests/**/*.class"/>
|
|
||||||
<fileset dir="${src.htmlparser}" includes="**/*.properties" />
|
|
||||||
<metainf dir="." includes="LICENSE,NOTICE"/>
|
|
||||||
<manifest>
|
|
||||||
<attribute name="Built-By" value="${user.name}"/>
|
|
||||||
<attribute name="Implementation-Version" value="${jmeter.version}"/>
|
|
||||||
<attribute name="X-Compile-Source-JDK" value="${src.java.version}"/>
|
|
||||||
<attribute name="X-Compile-Target-JDK" value="${target.java.version}"/>
|
|
||||||
</manifest>
|
|
||||||
</jar>
|
|
||||||
|
|
||||||
<jar jarfile="${lib.dir}/jorphan.jar" manifest="MANIFEST">
|
<jar jarfile="${lib.dir}/jorphan.jar" manifest="MANIFEST">
|
||||||
<fileset dir="${build.jorphan}" includes="**/*.class"/>
|
<fileset dir="${build.jorphan}" includes="**/*.class"/>
|
||||||
<fileset dir="${src.jorphan}" includes="**/*.properties"/>
|
<fileset dir="${src.jorphan}" includes="**/*.properties"/>
|
||||||
|
|
@ -1143,7 +1055,6 @@ some of its classes - at present JMeter can only run from jar files.
|
||||||
<property name="javamail.complete" value="assume"/>
|
<property name="javamail.complete" value="assume"/>
|
||||||
<property name="beanshell.present" value="assume"/>
|
<property name="beanshell.present" value="assume"/>
|
||||||
<property name="jms.present" value="assume"/>
|
<property name="jms.present" value="assume"/>
|
||||||
<!--property name="htmlparser16.present" value="assume"/-->
|
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- list of files needed for a binary distribution (excluding library files) -->
|
<!-- list of files needed for a binary distribution (excluding library files) -->
|
||||||
|
|
@ -1172,9 +1083,8 @@ some of its classes - at present JMeter can only run from jar files.
|
||||||
<include name="${extras.dir}/**"/>
|
<include name="${extras.dir}/**"/>
|
||||||
<include name="${lib.dir}/bshclient.jar"/>
|
<include name="${lib.dir}/bshclient.jar"/>
|
||||||
<include name="${lib.dir}/jorphan.jar"/>
|
<include name="${lib.dir}/jorphan.jar"/>
|
||||||
<include name="${lib.dir}/htmlparser.jar"/>
|
<include name="${lib.dir}/htmllexer-2.0-20060923.jar"/>
|
||||||
<include name="${lib.dir}/htmlparserparser.jar"/>
|
<include name="${lib.dir}/htmlparser-2.0-20060923.jar"/>
|
||||||
<include name="${lib.dir}/htmlparserparser16.jar"/>
|
|
||||||
<include name="${lib.dir}/junit/test.jar"/>
|
<include name="${lib.dir}/junit/test.jar"/>
|
||||||
</patternset>
|
</patternset>
|
||||||
|
|
||||||
|
|
@ -1501,9 +1411,6 @@ some of its classes - at present JMeter can only run from jar files.
|
||||||
<target name="clean" description="Clean up to force a build from source.">
|
<target name="clean" description="Clean up to force a build from source.">
|
||||||
<delete file="${dest.jar.jmeter}/ApacheJMeter.jar"/>
|
<delete file="${dest.jar.jmeter}/ApacheJMeter.jar"/>
|
||||||
<delete quiet="true" file="${lib.dir}/jorphan.jar"/>
|
<delete quiet="true" file="${lib.dir}/jorphan.jar"/>
|
||||||
<delete quiet="true" file="${lib.dir}/htmlparser.jar"/>
|
|
||||||
<delete quiet="true" file="${lib.dir}/htmlparserparser.jar"/>
|
|
||||||
<delete quiet="true" file="${lib.dir}/htmlparserparser16.jar"/>
|
|
||||||
<delete quiet="true">
|
<delete quiet="true">
|
||||||
<fileset dir="${dest.jar}"/>
|
<fileset dir="${dest.jar}"/>
|
||||||
</delete>
|
</delete>
|
||||||
|
|
@ -1650,8 +1557,6 @@ some of its classes - at present JMeter can only run from jar files.
|
||||||
<classpath>
|
<classpath>
|
||||||
<fileset dir="${dest.jar}" includes="*.jar"/>
|
<fileset dir="${dest.jar}" includes="*.jar"/>
|
||||||
<pathelement location="${build.test}"/>
|
<pathelement location="${build.test}"/>
|
||||||
<fileset dir="${lib.dir}" includes="htmlparser.jar"/>
|
|
||||||
<fileset dir="${lib.dir}" includes="htmlparserparser.jar"/>
|
|
||||||
<path refid="classpath"/>
|
<path refid="classpath"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
<sysproperty key="java.awt.headless" value="${test.headless}"/>
|
<sysproperty key="java.awt.headless" value="${test.headless}"/>
|
||||||
|
|
@ -1662,22 +1567,6 @@ some of its classes - at present JMeter can only run from jar files.
|
||||||
</java>
|
</java>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="_test_htmlparser16" depends="check-libs" if="htmlparser16.present">
|
|
||||||
<junit printsummary="on" fork="yes" dir="${basedir}/bin">
|
|
||||||
<sysproperty key="htmlParser.className" value="org.apache.jmeter.protocol.http.parser.HtmlParserHTMLParser16"/>
|
|
||||||
<classpath>
|
|
||||||
<fileset dir="${dest.jar}" includes="*.jar"/>
|
|
||||||
<pathelement location="${build.test}"/>
|
|
||||||
<path refid="classpath"/>
|
|
||||||
<fileset dir="${lib.opt}" includes="htmlparser1_6.jar"/>
|
|
||||||
<fileset dir="${lib.dir}" includes="htmlparserparser16.jar"/>
|
|
||||||
</classpath>
|
|
||||||
<formatter type="plain" usefile="no"/>
|
|
||||||
<test name="org.apache.jmeter.protocol.http.parser.TestHTMLParser16"/>
|
|
||||||
</junit>
|
|
||||||
<echo>Done!</echo>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
In order to run JUnit, both junit.jar and optional.jar need to be on the Ant classpath
|
In order to run JUnit, both junit.jar and optional.jar need to be on the Ant classpath
|
||||||
optional.jar is normally found in ANT_HOME/lib
|
optional.jar is normally found in ANT_HOME/lib
|
||||||
|
|
@ -1712,30 +1601,5 @@ some of its classes - at present JMeter can only run from jar files.
|
||||||
<report format="frames" todir="reports"/>
|
<report format="frames" todir="reports"/>
|
||||||
</junitreport>
|
</junitreport>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Run the HTML Parser unit tests -->
|
|
||||||
<target name="testparser" description="run the JUnit tests">
|
|
||||||
<echo message="**********************************"/>
|
|
||||||
<echo message="* Running HtmlParser unit tests *"/>
|
|
||||||
<echo message="**********************************"/>
|
|
||||||
<!--
|
|
||||||
<javac srcdir="${src}" includes="org/htmlparser/tests/**" debug="on">
|
|
||||||
<classpath>
|
|
||||||
<pathelement location="src"/>
|
|
||||||
<pathelement location="${junit.jar}"/>
|
|
||||||
<pathelement location="${commons-logging.jar}"/>
|
|
||||||
</classpath>
|
|
||||||
</javac>
|
|
||||||
-->
|
|
||||||
<java classname="org.htmlparser.tests.AllTests" fork="yes" failonerror="yes">
|
|
||||||
<classpath>
|
|
||||||
<pathelement location="${build.htmlparser}"/>
|
|
||||||
<pathelement location="${lib.dir}/htmlparser.jar"/>
|
|
||||||
<pathelement location="${junit.jar}"/>
|
|
||||||
<pathelement location="${log-kit.jar}"/>
|
|
||||||
</classpath>
|
|
||||||
<arg value="-text"/>
|
|
||||||
</java>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,186 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership.
|
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
* (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.jmeter.protocol.http.parser;
|
|
||||||
|
|
||||||
import java.net.MalformedURLException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
import org.apache.jorphan.logging.LoggingManager;
|
|
||||||
import org.apache.log.Logger;
|
|
||||||
import org.htmlparser.Node;
|
|
||||||
import org.htmlparser.Parser;
|
|
||||||
import org.htmlparser.Tag;
|
|
||||||
import org.htmlparser.tags.AppletTag;
|
|
||||||
import org.htmlparser.tags.BaseHrefTag;
|
|
||||||
import org.htmlparser.tags.BodyTag;
|
|
||||||
import org.htmlparser.tags.CompositeTag;
|
|
||||||
import org.htmlparser.tags.FrameTag;
|
|
||||||
import org.htmlparser.tags.ImageTag;
|
|
||||||
import org.htmlparser.tags.InputTag;
|
|
||||||
import org.htmlparser.tags.LinkTag;
|
|
||||||
import org.htmlparser.tags.ScriptTag;
|
|
||||||
import org.htmlparser.util.NodeIterator;
|
|
||||||
import org.htmlparser.util.ParserException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* HtmlParser implementation using SourceForge's HtmlParser.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class HtmlParserHTMLParser16 extends HTMLParser {
|
|
||||||
private static final Logger log = LoggingManager.getLoggerForClass();
|
|
||||||
|
|
||||||
static{
|
|
||||||
org.htmlparser.scanners.ScriptScanner.STRICT = false; // Try to ensure that more javascript code is processed OK ...
|
|
||||||
}
|
|
||||||
protected HtmlParserHTMLParser16() {
|
|
||||||
super();
|
|
||||||
log.info("Using htmlparser version 1.6");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isReusable() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
*
|
|
||||||
* @see org.apache.jmeter.protocol.http.parser.HtmlParser#getEmbeddedResourceURLs(byte[],
|
|
||||||
* java.net.URL)
|
|
||||||
*/
|
|
||||||
public Iterator getEmbeddedResourceURLs(byte[] html, URL baseUrl, URLCollection urls) throws HTMLParseException {
|
|
||||||
if (log.isDebugEnabled()) log.debug("Parsing html of: " + baseUrl);
|
|
||||||
|
|
||||||
Parser htmlParser = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
String contents = new String(html);
|
|
||||||
htmlParser = new Parser();
|
|
||||||
htmlParser.setInputHTML(contents);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new HTMLParseException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now parse the DOM tree
|
|
||||||
try {
|
|
||||||
// we start to iterate through the elements
|
|
||||||
parseNodes(htmlParser.elements(), new URLPointer(baseUrl), urls);
|
|
||||||
log.debug("End : parseNodes");
|
|
||||||
} catch (ParserException e) {
|
|
||||||
throw new HTMLParseException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return urls.iterator();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A dummy class to pass the pointer of URL.
|
|
||||||
*/
|
|
||||||
private static class URLPointer {
|
|
||||||
private URLPointer(URL newUrl) {
|
|
||||||
url = newUrl;
|
|
||||||
}
|
|
||||||
private URL url;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursively parse all nodes to pick up all URL s.
|
|
||||||
* @see e the nodes to be parsed
|
|
||||||
* @see baseUrl Base URL from which the HTML code was obtained
|
|
||||||
* @see urls URLCollection
|
|
||||||
*/
|
|
||||||
private void parseNodes(final NodeIterator e,
|
|
||||||
final URLPointer baseUrl, final URLCollection urls)
|
|
||||||
throws HTMLParseException, ParserException {
|
|
||||||
while(e.hasMoreNodes()) {
|
|
||||||
Node node = e.nextNode();
|
|
||||||
// a url is always in a Tag.
|
|
||||||
if (!(node instanceof Tag)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Tag tag = (Tag) node;
|
|
||||||
String tagname=tag.getTagName();
|
|
||||||
String binUrlStr = null;
|
|
||||||
|
|
||||||
// first we check to see if body tag has a
|
|
||||||
// background set
|
|
||||||
if (tag instanceof BodyTag) {
|
|
||||||
binUrlStr = tag.getAttribute(ATT_BACKGROUND);
|
|
||||||
} else if (tag instanceof BaseHrefTag) {
|
|
||||||
BaseHrefTag baseHref = (BaseHrefTag) tag;
|
|
||||||
String baseref = baseHref.getBaseUrl().toString();
|
|
||||||
try {
|
|
||||||
if (!baseref.equals(""))// Bugzilla 30713
|
|
||||||
{
|
|
||||||
baseUrl.url = new URL(baseUrl.url, baseHref.getBaseUrl());
|
|
||||||
}
|
|
||||||
} catch (MalformedURLException e1) {
|
|
||||||
throw new HTMLParseException(e1);
|
|
||||||
}
|
|
||||||
} else if (tag instanceof ImageTag) {
|
|
||||||
ImageTag image = (ImageTag) tag;
|
|
||||||
binUrlStr = image.getImageURL();
|
|
||||||
} else if (tag instanceof AppletTag) {
|
|
||||||
// look for applets
|
|
||||||
|
|
||||||
// This will only work with an Applet .class file.
|
|
||||||
// Ideally, this should be upgraded to work with Objects (IE)
|
|
||||||
// and archives (.jar and .zip) files as well.
|
|
||||||
AppletTag applet = (AppletTag) tag;
|
|
||||||
binUrlStr = applet.getAppletClass();
|
|
||||||
} else if (tag instanceof InputTag) {
|
|
||||||
// we check the input tag type for image
|
|
||||||
if (ATT_IS_IMAGE.equalsIgnoreCase(tag.getAttribute(ATT_TYPE))) {
|
|
||||||
// then we need to download the binary
|
|
||||||
binUrlStr = tag.getAttribute(ATT_SRC);
|
|
||||||
}
|
|
||||||
} else if (tag instanceof LinkTag) {
|
|
||||||
LinkTag link = (LinkTag) tag;
|
|
||||||
if (link.getChild(0) instanceof ImageTag) {
|
|
||||||
ImageTag img = (ImageTag) link.getChild(0);
|
|
||||||
binUrlStr = img.getImageURL();
|
|
||||||
}
|
|
||||||
} else if (tag instanceof ScriptTag) {
|
|
||||||
binUrlStr = tag.getAttribute(ATT_SRC);
|
|
||||||
} else if (tag instanceof FrameTag) {
|
|
||||||
binUrlStr = tag.getAttribute(ATT_SRC);
|
|
||||||
} else if (tagname.equalsIgnoreCase(TAG_EMBED)
|
|
||||||
|| tagname.equalsIgnoreCase(TAG_BGSOUND)){
|
|
||||||
binUrlStr = tag.getAttribute(ATT_SRC);
|
|
||||||
} else if (tagname.equalsIgnoreCase(TAG_LINK)) {
|
|
||||||
// Putting the string first means it works even if the attribute is null
|
|
||||||
if (STYLESHEET.equalsIgnoreCase(tag.getAttribute(ATT_REL))) {
|
|
||||||
binUrlStr = tag.getAttribute(ATT_HREF);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
binUrlStr = tag.getAttribute(ATT_BACKGROUND);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (binUrlStr != null) {
|
|
||||||
urls.addURL(binUrlStr, baseUrl.url);
|
|
||||||
}
|
|
||||||
// second, if the tag was a composite tag,
|
|
||||||
// recursively parse its children.
|
|
||||||
if (tag instanceof CompositeTag) {
|
|
||||||
CompositeTag composite = (CompositeTag) tag;
|
|
||||||
parseNodes(composite.elements(), baseUrl, urls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -18,7 +18,6 @@
|
||||||
|
|
||||||
package org.apache.jmeter.protocol.http.parser;
|
package org.apache.jmeter.protocol.http.parser;
|
||||||
|
|
||||||
import java.io.StringReader;
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
@ -27,44 +26,33 @@ import org.apache.jorphan.logging.LoggingManager;
|
||||||
import org.apache.log.Logger;
|
import org.apache.log.Logger;
|
||||||
|
|
||||||
import org.htmlparser.Node;
|
import org.htmlparser.Node;
|
||||||
import org.htmlparser.NodeReader;
|
|
||||||
import org.htmlparser.Parser;
|
import org.htmlparser.Parser;
|
||||||
import org.htmlparser.scanners.AppletScanner;
|
import org.htmlparser.Tag;
|
||||||
import org.htmlparser.scanners.BaseHrefScanner;
|
|
||||||
import org.htmlparser.scanners.BgSoundScanner;
|
|
||||||
import org.htmlparser.scanners.BodyScanner;
|
|
||||||
import org.htmlparser.scanners.FrameScanner;
|
|
||||||
import org.htmlparser.scanners.InputTagScanner;
|
|
||||||
import org.htmlparser.scanners.LinkScanner;
|
|
||||||
import org.htmlparser.scanners.LinkTagScanner;
|
|
||||||
import org.htmlparser.scanners.ScriptScanner;
|
|
||||||
import org.htmlparser.tags.AppletTag;
|
import org.htmlparser.tags.AppletTag;
|
||||||
import org.htmlparser.tags.BaseHrefTag;
|
import org.htmlparser.tags.BaseHrefTag;
|
||||||
import org.htmlparser.tags.BgSoundTag;
|
|
||||||
import org.htmlparser.tags.BodyTag;
|
import org.htmlparser.tags.BodyTag;
|
||||||
|
import org.htmlparser.tags.CompositeTag;
|
||||||
import org.htmlparser.tags.FrameTag;
|
import org.htmlparser.tags.FrameTag;
|
||||||
import org.htmlparser.tags.ImageTag;
|
import org.htmlparser.tags.ImageTag;
|
||||||
import org.htmlparser.tags.InputTag;
|
import org.htmlparser.tags.InputTag;
|
||||||
import org.htmlparser.tags.LinkTag;
|
import org.htmlparser.tags.LinkTag;
|
||||||
import org.htmlparser.tags.LinkTagTag;
|
|
||||||
import org.htmlparser.tags.ScriptTag;
|
import org.htmlparser.tags.ScriptTag;
|
||||||
import org.htmlparser.tags.Tag;
|
|
||||||
import org.htmlparser.util.DefaultParserFeedback;
|
|
||||||
import org.htmlparser.util.NodeIterator;
|
import org.htmlparser.util.NodeIterator;
|
||||||
import org.htmlparser.util.ParserException;
|
import org.htmlparser.util.ParserException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HtmlParser implementation using SourceForge's HtmlParser.
|
* HtmlParser implementation using SourceForge's HtmlParser.
|
||||||
*
|
*
|
||||||
* @version $Revision$ updated on $Date$
|
|
||||||
*/
|
*/
|
||||||
class HtmlParserHTMLParser extends HTMLParser {
|
public class HtmlParserHTMLParser extends HTMLParser {
|
||||||
/** Used to store the Logger (used for debug and error messages). */
|
private static final Logger log = LoggingManager.getLoggerForClass();
|
||||||
private static final Logger log = LoggingManager.getLoggerForClass();
|
|
||||||
|
|
||||||
protected HtmlParserHTMLParser() {
|
static{
|
||||||
|
org.htmlparser.scanners.ScriptScanner.STRICT = false; // Try to ensure that more javascript code is processed OK ...
|
||||||
|
}
|
||||||
|
protected HtmlParserHTMLParser() {
|
||||||
super();
|
super();
|
||||||
log.info("Using htmlparser implementation provided with JMeter");
|
log.info("Using htmlparser version 2.0");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isReusable() {
|
protected boolean isReusable() {
|
||||||
|
|
@ -84,108 +72,16 @@ class HtmlParserHTMLParser extends HTMLParser {
|
||||||
Parser htmlParser = null;
|
Parser htmlParser = null;
|
||||||
try {
|
try {
|
||||||
String contents = new String(html);
|
String contents = new String(html);
|
||||||
StringReader reader = new StringReader(contents);
|
htmlParser = new Parser();
|
||||||
NodeReader nreader = new NodeReader(reader, contents.length());
|
htmlParser.setInputHTML(contents);
|
||||||
htmlParser = new Parser(nreader, new DefaultParserFeedback());
|
|
||||||
addTagListeners(htmlParser);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new HTMLParseException(e);
|
throw new HTMLParseException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now parse the DOM tree
|
// Now parse the DOM tree
|
||||||
|
|
||||||
// look for applets
|
|
||||||
|
|
||||||
// This will only work with an Applet .class file.
|
|
||||||
// Ideally, this should be upgraded to work with Objects (IE)
|
|
||||||
// and archives (.jar and .zip) files as well.
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// we start to iterate through the elements
|
// we start to iterate through the elements
|
||||||
for (NodeIterator e = htmlParser.elements(); e.hasMoreNodes();) {
|
parseNodes(htmlParser.elements(), new URLPointer(baseUrl), urls);
|
||||||
Node node = e.nextNode();
|
|
||||||
String binUrlStr = null;
|
|
||||||
|
|
||||||
// first we check to see if body tag has a
|
|
||||||
// background set and we set the NodeIterator
|
|
||||||
// to the child elements inside the body
|
|
||||||
if (node instanceof BodyTag) {
|
|
||||||
BodyTag body = (BodyTag) node;
|
|
||||||
binUrlStr = body.getAttribute(ATT_BACKGROUND);
|
|
||||||
// if the body tag exists, we get the elements
|
|
||||||
// within the body tag. if we don't we won't
|
|
||||||
// see the body of the page. The only catch
|
|
||||||
// with this is if there are images after the
|
|
||||||
// closing body tag, it won't get parsed. If
|
|
||||||
// someone puts it outside the body tag, it
|
|
||||||
// is probably a mistake. Plus it's bad to
|
|
||||||
// have important content after the closing
|
|
||||||
// body tag. Peter Lin 10-9-03
|
|
||||||
e = body.elements();
|
|
||||||
} else if (node instanceof BaseHrefTag) {
|
|
||||||
BaseHrefTag baseHref = (BaseHrefTag) node;
|
|
||||||
String baseref = baseHref.getBaseUrl();
|
|
||||||
try {
|
|
||||||
if (!baseref.equals(""))// Bugzilla 30713 // $NON-NLS-1$
|
|
||||||
{
|
|
||||||
baseUrl = new URL(baseUrl, baseref);
|
|
||||||
}
|
|
||||||
} catch (MalformedURLException e1) {
|
|
||||||
throw new HTMLParseException(e1);
|
|
||||||
}
|
|
||||||
} else if (node instanceof ImageTag) {
|
|
||||||
ImageTag image = (ImageTag) node;
|
|
||||||
binUrlStr = image.getImageURL();
|
|
||||||
} else if (node instanceof AppletTag) {
|
|
||||||
AppletTag applet = (AppletTag) node;
|
|
||||||
binUrlStr = applet.getAppletClass();
|
|
||||||
} else if (node instanceof InputTag) {
|
|
||||||
InputTag input = (InputTag) node;
|
|
||||||
// we check the input tag type for image
|
|
||||||
String strType = input.getAttribute(ATT_TYPE);
|
|
||||||
if (ATT_IS_IMAGE.equalsIgnoreCase(strType)) {
|
|
||||||
// then we need to download the binary
|
|
||||||
binUrlStr = input.getAttribute(ATT_SRC);
|
|
||||||
}
|
|
||||||
} else if (node instanceof LinkTag) {
|
|
||||||
LinkTag link = (LinkTag) node;
|
|
||||||
if (link.getChild(0) instanceof ImageTag) {
|
|
||||||
ImageTag img = (ImageTag) link.getChild(0);
|
|
||||||
binUrlStr = img.getImageURL();
|
|
||||||
}
|
|
||||||
} else if (node instanceof ScriptTag) {
|
|
||||||
ScriptTag script = (ScriptTag) node;
|
|
||||||
binUrlStr = script.getAttribute(ATT_SRC);
|
|
||||||
} else if (node instanceof FrameTag) {
|
|
||||||
FrameTag tag = (FrameTag) node;
|
|
||||||
binUrlStr = tag.getAttribute(ATT_SRC);
|
|
||||||
} else if (node instanceof LinkTagTag) {
|
|
||||||
LinkTagTag script = (LinkTagTag) node;
|
|
||||||
if (STYLESHEET.equalsIgnoreCase(script.getAttribute(ATT_REL))) {
|
|
||||||
binUrlStr = script.getAttribute(ATT_HREF);
|
|
||||||
}
|
|
||||||
} else if (node instanceof FrameTag) {
|
|
||||||
FrameTag script = (FrameTag) node;
|
|
||||||
binUrlStr = script.getAttribute(ATT_SRC);
|
|
||||||
} else if (node instanceof BgSoundTag) {
|
|
||||||
BgSoundTag script = (BgSoundTag) node;
|
|
||||||
binUrlStr = script.getAttribute(ATT_SRC);
|
|
||||||
} else if (node instanceof Tag) {
|
|
||||||
Tag tag = (Tag) node;
|
|
||||||
String tagname=tag.getTagName();
|
|
||||||
if (tagname.equalsIgnoreCase(TAG_EMBED)){
|
|
||||||
binUrlStr = tag.getAttribute(ATT_SRC);
|
|
||||||
} else {
|
|
||||||
binUrlStr = tag.getAttribute(ATT_BACKGROUND);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (binUrlStr == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
urls.addURL(binUrlStr, baseUrl);
|
|
||||||
}
|
|
||||||
log.debug("End : parseNodes");
|
log.debug("End : parseNodes");
|
||||||
} catch (ParserException e) {
|
} catch (ParserException e) {
|
||||||
throw new HTMLParseException(e);
|
throw new HTMLParseException(e);
|
||||||
|
|
@ -193,36 +89,99 @@ class HtmlParserHTMLParser extends HTMLParser {
|
||||||
|
|
||||||
return urls.iterator();
|
return urls.iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Returns a node representing a whole xml given an xml document.
|
* A dummy class to pass the pointer of URL.
|
||||||
*
|
|
||||||
* @param text
|
|
||||||
* an xml document
|
|
||||||
* @return a node representing a whole xml
|
|
||||||
*
|
|
||||||
* @throws SAXException
|
|
||||||
* indicates an error parsing the xml document
|
|
||||||
*/
|
*/
|
||||||
private static void addTagListeners(Parser parser) {
|
private static class URLPointer {
|
||||||
log.debug("Start : addTagListeners");
|
private URLPointer(URL newUrl) {
|
||||||
// add body tag scanner
|
url = newUrl;
|
||||||
parser.addScanner(new BodyScanner());
|
}
|
||||||
// add BaseHRefTag scanner
|
private URL url;
|
||||||
parser.addScanner(new BaseHrefScanner());
|
}
|
||||||
// add ImageTag and BaseHrefTag scanners
|
|
||||||
LinkScanner linkScanner = new LinkScanner(LinkTag.LINK_TAG_FILTER);
|
/**
|
||||||
// parser.addScanner(linkScanner);
|
* Recursively parse all nodes to pick up all URL s.
|
||||||
parser.addScanner(linkScanner.createImageScanner(ImageTag.IMAGE_TAG_FILTER));
|
* @see e the nodes to be parsed
|
||||||
parser.addScanner(linkScanner.createBaseHREFScanner("-b")); // $NON-NLS-1$
|
* @see baseUrl Base URL from which the HTML code was obtained
|
||||||
// Taken from org.htmlparser.Parser
|
* @see urls URLCollection
|
||||||
// add input tag scanner
|
*/
|
||||||
parser.addScanner(new InputTagScanner());
|
private void parseNodes(final NodeIterator e,
|
||||||
// add applet tag scanner
|
final URLPointer baseUrl, final URLCollection urls)
|
||||||
parser.addScanner(new AppletScanner());
|
throws HTMLParseException, ParserException {
|
||||||
parser.addScanner(new ScriptScanner());
|
while(e.hasMoreNodes()) {
|
||||||
parser.addScanner(new LinkTagScanner());
|
Node node = e.nextNode();
|
||||||
parser.addScanner(new FrameScanner());
|
// a url is always in a Tag.
|
||||||
parser.addScanner(new BgSoundScanner());
|
if (!(node instanceof Tag)) {
|
||||||
}
|
continue;
|
||||||
|
}
|
||||||
|
Tag tag = (Tag) node;
|
||||||
|
String tagname=tag.getTagName();
|
||||||
|
String binUrlStr = null;
|
||||||
|
|
||||||
|
// first we check to see if body tag has a
|
||||||
|
// background set
|
||||||
|
if (tag instanceof BodyTag) {
|
||||||
|
binUrlStr = tag.getAttribute(ATT_BACKGROUND);
|
||||||
|
} else if (tag instanceof BaseHrefTag) {
|
||||||
|
BaseHrefTag baseHref = (BaseHrefTag) tag;
|
||||||
|
String baseref = baseHref.getBaseUrl().toString();
|
||||||
|
try {
|
||||||
|
if (!baseref.equals(""))// Bugzilla 30713
|
||||||
|
{
|
||||||
|
baseUrl.url = new URL(baseUrl.url, baseHref.getBaseUrl());
|
||||||
|
}
|
||||||
|
} catch (MalformedURLException e1) {
|
||||||
|
throw new HTMLParseException(e1);
|
||||||
|
}
|
||||||
|
} else if (tag instanceof ImageTag) {
|
||||||
|
ImageTag image = (ImageTag) tag;
|
||||||
|
binUrlStr = image.getImageURL();
|
||||||
|
} else if (tag instanceof AppletTag) {
|
||||||
|
// look for applets
|
||||||
|
|
||||||
|
// This will only work with an Applet .class file.
|
||||||
|
// Ideally, this should be upgraded to work with Objects (IE)
|
||||||
|
// and archives (.jar and .zip) files as well.
|
||||||
|
AppletTag applet = (AppletTag) tag;
|
||||||
|
binUrlStr = applet.getAppletClass();
|
||||||
|
} else if (tag instanceof InputTag) {
|
||||||
|
// we check the input tag type for image
|
||||||
|
if (ATT_IS_IMAGE.equalsIgnoreCase(tag.getAttribute(ATT_TYPE))) {
|
||||||
|
// then we need to download the binary
|
||||||
|
binUrlStr = tag.getAttribute(ATT_SRC);
|
||||||
|
}
|
||||||
|
} else if (tag instanceof LinkTag) {
|
||||||
|
LinkTag link = (LinkTag) tag;
|
||||||
|
if (link.getChild(0) instanceof ImageTag) {
|
||||||
|
ImageTag img = (ImageTag) link.getChild(0);
|
||||||
|
binUrlStr = img.getImageURL();
|
||||||
|
}
|
||||||
|
} else if (tag instanceof ScriptTag) {
|
||||||
|
binUrlStr = tag.getAttribute(ATT_SRC);
|
||||||
|
} else if (tag instanceof FrameTag) {
|
||||||
|
binUrlStr = tag.getAttribute(ATT_SRC);
|
||||||
|
} else if (tagname.equalsIgnoreCase(TAG_EMBED)
|
||||||
|
|| tagname.equalsIgnoreCase(TAG_BGSOUND)){
|
||||||
|
binUrlStr = tag.getAttribute(ATT_SRC);
|
||||||
|
} else if (tagname.equalsIgnoreCase(TAG_LINK)) {
|
||||||
|
// Putting the string first means it works even if the attribute is null
|
||||||
|
if (STYLESHEET.equalsIgnoreCase(tag.getAttribute(ATT_REL))) {
|
||||||
|
binUrlStr = tag.getAttribute(ATT_HREF);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
binUrlStr = tag.getAttribute(ATT_BACKGROUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binUrlStr != null) {
|
||||||
|
urls.addURL(binUrlStr, baseUrl.url);
|
||||||
|
}
|
||||||
|
// second, if the tag was a composite tag,
|
||||||
|
// recursively parse its children.
|
||||||
|
if (tag instanceof CompositeTag) {
|
||||||
|
CompositeTag composite = (CompositeTag) tag;
|
||||||
|
parseNodes(composite.elements(), baseUrl, urls);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,212 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership.
|
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
* (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.jmeter.protocol.http.parser;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
import java.util.Vector;
|
|
||||||
|
|
||||||
import org.apache.jmeter.junit.JMeterTestCase;
|
|
||||||
import org.apache.jorphan.logging.LoggingManager;
|
|
||||||
import org.apache.log.Logger;
|
|
||||||
|
|
||||||
import junit.framework.TestSuite;
|
|
||||||
|
|
||||||
public class TestHTMLParser16 extends JMeterTestCase {
|
|
||||||
private static final Logger log = LoggingManager.getLoggerForClass();
|
|
||||||
|
|
||||||
public TestHTMLParser16(String arg0) {
|
|
||||||
super(arg0);
|
|
||||||
}
|
|
||||||
private String parserName;
|
|
||||||
|
|
||||||
private int testNumber = 0;
|
|
||||||
|
|
||||||
public TestHTMLParser16(String name, int test) {
|
|
||||||
super(name);
|
|
||||||
testNumber = test;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TestHTMLParser16(String name, String parser, int test) {
|
|
||||||
super(name);
|
|
||||||
testNumber = test;
|
|
||||||
parserName = parser;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class TestData {
|
|
||||||
private String fileName;
|
|
||||||
|
|
||||||
private String baseURL;
|
|
||||||
|
|
||||||
private String expectedSet;
|
|
||||||
|
|
||||||
private String expectedList;
|
|
||||||
|
|
||||||
private TestData(String f, String b, String s, String l) {
|
|
||||||
fileName = f;
|
|
||||||
baseURL = b;
|
|
||||||
expectedSet = s;
|
|
||||||
expectedList = l;
|
|
||||||
}
|
|
||||||
|
|
||||||
// private TestData(String f, String b, String s) {
|
|
||||||
// this(f, b, s, null);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
// List of parsers to test. Should probably be derived automatically
|
|
||||||
private static final String[] PARSERS = {
|
|
||||||
"org.apache.jmeter.protocol.http.parser.HtmlParserHTMLParser16",
|
|
||||||
};
|
|
||||||
|
|
||||||
private static final TestData[] TESTS = new TestData[] {
|
|
||||||
new TestData("testfiles/HTMLParserTestCase.html",
|
|
||||||
"http://localhost/mydir/myfile.html",
|
|
||||||
"testfiles/HTMLParserTestCase.set",
|
|
||||||
"testfiles/HTMLParserTestCase.all"),
|
|
||||||
new TestData("testfiles/HTMLParserTestCaseWithBaseHRef.html",
|
|
||||||
"http://localhost/mydir/myfile.html",
|
|
||||||
"testfiles/HTMLParserTestCaseBase.set",
|
|
||||||
"testfiles/HTMLParserTestCaseBase.all"),
|
|
||||||
new TestData("testfiles/HTMLParserTestCaseWithBaseHRef2.html",
|
|
||||||
"http://localhost/mydir/myfile.html",
|
|
||||||
"testfiles/HTMLParserTestCaseBase.set",
|
|
||||||
"testfiles/HTMLParserTestCaseBase.all"),
|
|
||||||
new TestData("testfiles/HTMLParserTestCaseWithMissingBaseHRef.html",
|
|
||||||
"http://localhost/mydir/images/myfile.html",
|
|
||||||
"testfiles/HTMLParserTestCaseBase.set",
|
|
||||||
"testfiles/HTMLParserTestCaseBase.all"),
|
|
||||||
new TestData("testfiles/HTMLParserTestCase2.html",
|
|
||||||
"http:", "", ""), // Dummy as the file has no entries
|
|
||||||
new TestData("testfiles/HTMLParserTestCase3.html",
|
|
||||||
"http:", "", ""), // Dummy as the file has no entries
|
|
||||||
new TestData("testfiles/HTMLParserTestCaseWithComments.html",
|
|
||||||
"http://localhost/mydir/myfile.html",
|
|
||||||
"testfiles/HTMLParserTestCaseBase.set",
|
|
||||||
"testfiles/HTMLParserTestCaseBase.all"),
|
|
||||||
new TestData("testfiles/HTMLScript.html",
|
|
||||||
"http://localhost/",
|
|
||||||
"testfiles/HTMLScript.set",
|
|
||||||
"testfiles/HTMLScript.all"),
|
|
||||||
new TestData("testfiles/HTMLParserTestFrames.html",
|
|
||||||
"http://localhost/",
|
|
||||||
"testfiles/HTMLParserTestFrames.all",
|
|
||||||
"testfiles/HTMLParserTestFrames.all"),
|
|
||||||
};
|
|
||||||
|
|
||||||
public static junit.framework.Test suite() {
|
|
||||||
TestSuite suite = new TestSuite("TestHTMLParser");
|
|
||||||
for (int i = 0; i < PARSERS.length; i++) {
|
|
||||||
TestSuite ps = new TestSuite(PARSERS[i]);// Identify subtests
|
|
||||||
for (int j = 0; j < TESTS.length; j++) {
|
|
||||||
TestSuite ts = new TestSuite(TESTS[j].fileName);
|
|
||||||
ts.addTest(new TestHTMLParser16("testParserSet", PARSERS[i], j));
|
|
||||||
ts.addTest(new TestHTMLParser16("testParserList", PARSERS[i], j));
|
|
||||||
ps.addTest(ts);
|
|
||||||
}
|
|
||||||
suite.addTest(ps);
|
|
||||||
}
|
|
||||||
return suite;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testParserSet() throws Exception {
|
|
||||||
HTMLParser p = HTMLParser.getParser(parserName);
|
|
||||||
filetest(p, TESTS[testNumber].fileName, TESTS[testNumber].baseURL, TESTS[testNumber].expectedSet, null,
|
|
||||||
false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testParserList() throws Exception {
|
|
||||||
HTMLParser p = HTMLParser.getParser(parserName);
|
|
||||||
filetest(p, TESTS[testNumber].fileName, TESTS[testNumber].baseURL, TESTS[testNumber].expectedList,
|
|
||||||
new Vector(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void filetest(HTMLParser p, String file, String url, String resultFile, Collection c,
|
|
||||||
boolean orderMatters) // Does the order matter?
|
|
||||||
throws Exception {
|
|
||||||
String parserName = p.getClass().getName().substring("org.apache.jmeter.protocol.http.parser.".length());
|
|
||||||
String fname = file.substring(file.indexOf("/")+1);
|
|
||||||
log.debug("file " + file);
|
|
||||||
File f = findTestFile(file);
|
|
||||||
byte[] buffer = new byte[(int) f.length()];
|
|
||||||
int len = new FileInputStream(f).read(buffer);
|
|
||||||
assertEquals(len, buffer.length);
|
|
||||||
Iterator result;
|
|
||||||
if (c == null) {
|
|
||||||
result = p.getEmbeddedResourceURLs(buffer, new URL(url));
|
|
||||||
} else {
|
|
||||||
result = p.getEmbeddedResourceURLs(buffer, new URL(url), c);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* TODO: Exact ordering is only required for some tests; change the
|
|
||||||
* comparison to do a set compare where necessary.
|
|
||||||
*/
|
|
||||||
Iterator expected;
|
|
||||||
if (orderMatters) {
|
|
||||||
expected = getFile(resultFile).iterator();
|
|
||||||
} else {
|
|
||||||
// Convert both to Sets
|
|
||||||
expected = new TreeSet(getFile(resultFile)).iterator();
|
|
||||||
TreeSet temp = new TreeSet(new Comparator() {
|
|
||||||
public int compare(Object o1, Object o2) {
|
|
||||||
return (o1.toString().compareTo(o2.toString()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
while (result.hasNext()) {
|
|
||||||
temp.add(result.next());
|
|
||||||
}
|
|
||||||
result = temp.iterator();
|
|
||||||
}
|
|
||||||
|
|
||||||
while (expected.hasNext()) {
|
|
||||||
Object next = expected.next();
|
|
||||||
assertTrue(fname+"::"+parserName + "::Expecting another result " + next, result.hasNext());
|
|
||||||
try {
|
|
||||||
assertEquals(fname+"::"+parserName + "(next)", next, ((URL) result.next()).toString());
|
|
||||||
} catch (ClassCastException e) {
|
|
||||||
fail(fname+"::"+parserName + "::Expected URL, but got " + e.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assertFalse(fname+"::"+parserName + "::Should have reached the end of the results", result.hasNext());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get expected results as a List
|
|
||||||
private static List getFile(String file) throws Exception {
|
|
||||||
ArrayList al = new ArrayList();
|
|
||||||
if (file != null && file.length() > 0) {
|
|
||||||
BufferedReader br = new BufferedReader(new FileReader(findTestFile(file)));
|
|
||||||
String line = br.readLine();
|
|
||||||
while (line != null) {
|
|
||||||
al.add(line);
|
|
||||||
line = br.readLine();
|
|
||||||
}
|
|
||||||
br.close();
|
|
||||||
}
|
|
||||||
return al;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -64,6 +64,7 @@ has been removed.
|
||||||
<li>Bug 33964 - send file as entire post body if name/type are omitted</li>
|
<li>Bug 33964 - send file as entire post body if name/type are omitted</li>
|
||||||
<li>HTTP Mirror Server Workbench element</li>
|
<li>HTTP Mirror Server Workbench element</li>
|
||||||
<li>Bug 41253 - extend XPathExtractor to work with non-NodeList XPath expressions</li>
|
<li>Bug 41253 - extend XPathExtractor to work with non-NodeList XPath expressions</li>
|
||||||
|
<li>Change to htmlparser 2.0</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h4>Bug fixes:</h4>
|
<h4>Bug fixes:</h4>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue